6923|24

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince中断流驱动的问题 [复制链接]

我参照教程上编写的流驱动,采用外部中断,显示挂载成功,但是XXX_int()好像没有执行,我在该函数入口处输出了打印信息,结果没有显示,另外我感觉
DWORD PBT_IntrThread(PVOID pArg)
{
          DWORD ret;
         
        gPwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

  

        if (!(InterruptInitialize(g_PwrButtonSysIntr, gPwrButtonIntrEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
                CloseHandle(gPwrButtonIntrEvent);
                return 0;
        }
         
       
        while (1)
        {
                 ret = WaitForSingleObject(gPwrButtonIntrEvent, INFINITE);
               
                 if((ret==WAIT_OBJECT_0)&&(g_bKillIST))
                   {
                              if(PBT_IsPushed())
                             {
                                 Sleep(20);
                                 if(PBT_IsPushed())
                                    {
                                            SetEvent(gReadKeyEvent[0]);
                                           
                                           
                                    }
                              }
           
                    }
                    else {
           
                              CloseHandle(gPwrButtonIntrEvent);
                              return 0;
           
                    }
                    InterruptDone(g_PwrButtonIrq);
          }
   
    return 1;
}
函数执行是不是有问题呢?中断服务线程应该是一只执行啊,if((ret==WAIT_OBJECT_0)&&(g_bKillIST))此条件不满足以后线程不就退出了???中断触发或者线程关闭,大家看看是不是有问题??
有一点我不明白的就是为什么我的XXX_INT也没有执行呢?挂载已经成功了,此函数不是在驱动加载的时候就执行的吗???请各位大侠解惑一下啊
此帖出自WindowsCE论坛

最新回复

或者是两个中断关联到同一个事件,就是怕这一点不行才这样弄的,我试下看看可以不,谢谢先  , 呵呵  详情 回复 发表于 2010-1-22 17:02
点赞 关注
 

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
把你的DEF文件,注册表中关于这个驱动的内容,以及XXX_Init都帖出来看一下。

如果XXX_Init都没执行,后边的中断当然都不行了
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断线程应该是在XXX_Init初始化的吧,如果XXX_Init没执行后边肯定都没用,所以先要让XXX_Init执行成功。
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
在应用程序里用createfile打开总是失败,DllEntry有信息输出  注册表里也有,但是XXX_INIT里的打印信息却没有输出,入口第一条语句就是…………
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
注册表中要有"Prefix"="XXX"的内容,def文件中要有XXX_Init导出声明,驱动源文件中要有XXX_Init函数,且这三个地方的XXX要保持一致,要三个字符。
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
/**********************************/
PUBLIC DWORD  DSK_Init(DWORD dwContext)
{
        //PDISK           pDisk;
        DWORD    IDThread;
  //HMODULE  hmCore;
  
  RETAILMSG(1,(TEXT("INFO: PwrButton: lth modify!~~~01")));
  //while(1);  //LTH modify
  if(PBT_InitializeAddresses()==FALSE )
          return 0;
          RETAILMSG(1,(TEXT("INFO: PwrButton: lth modify!~~~02")));
  PBT_EnableInterrupt();
  RETAILMSG(1,(TEXT("INFO: PwrButton: lth modify!~~~03")));
  //从OAL请求一个SYSINTR值
  if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_PwrButtonIrq, sizeof(UINT32), &g_PwrButtonSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: PwrButton: Failed to request sysintr value for sw_reset button interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: PwrButton: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_PwrButtonIrq, g_PwrButtonSysIntr));
  

  //RETAILMSG(1,(TEXT("PwrButton Initialize ...")));
  
         
                gPwrButtonIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) PBT_IntrThread, 0, 0, &IDThread);

                RETAILMSG(1, (TEXT(":::PwrButton  PBT_IntrThread ID = %x\r\n"), IDThread));

                if (gPwrButtonIntrThread == NULL)
                {
                        RETAILMSG(1, (TEXT(":::PwrButton  CreateThread() Fail\r\n")));
                        KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&g_PwrButtonSysIntr,sizeof(UINT32),NULL,0,NULL);
                        return 0;
                }
                gReadKeyEvent[0] = CreateEvent(NULL,FALSE,FALSE,NULL);
          gReadKeyEvent[1] = CreateEvent(NULL,FALSE,FALSE,NULL);
          RETAILMSG(1,(TEXT(":::pwrButton Initialize OK!!!!! ...")));
        return TRUE;
}
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 

LIBRARY PWRBUT2440

EXPORTS DSK_Init
        DSK_Deinit
        DSK_Open
        DSK_Close
        DSK_Read
        DSK_Write
        DSK_Seek
        DSK_IOControl
        DSK_PowerDown
        DSK_PowerUp
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
哦,我再试一下,我的不一致好像
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 
注册表中用的是"Prefix"="DSK"吗?Index是多少,是不是和其它的注册表冲突了?


DSK通常都是用来表示存储系统的驱动,你的按键驱动怎么也用这个啊。


把你注册表中这个驱动的内容也帖出来
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 
我感觉中断线程是不是有点问题?我的理解是WaitForSingleObject(gPwrButtonIntrEvent, INFINITE); 在一定时间里等待EVENT事件,若不发生,线程就退出了,可能是对WaitForSingleObject这个函数理解的不够吧
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
以前是用DSK,我把"Prefix"="DSK改成DKS了,DSK和其他的注册表有冲突,我把前缀改成DKS试试
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
Prefix冲突没关系,重要的是Prefix+Index不要冲突
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢Veabol,现在能打开流驱动了,只是我在应用程序里检测按键好像还是没有反应,下面是代码

void CDrivertestDlg::OnButton6()
{
        // TODO: Add your control notification handler code here
        DWORD IDThread;
        HANDLE hReadKeyThread;
   

        hFille = CreateFile(TEXT("DKS1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
        if(hFille==INVALID_HANDLE_VALUE)
        {
        MessageBox(_T("打开KEY驱动失败!"));
                return;
        }
        else
        {
        MessageBox(_T("打开成功!"));

        }

        //创建读KEY状态线程
        hReadKeyThread = CreateThread(0,0,ReadKeyThread,this,0,&IDThread);
        if(hReadKeyThread ==NULL)
        {
        CloseHandle(hReadKeyThread);
        hFille = INVALID_HANDLE_VALUE;

                MessageBox(_T("创建线程失败!"));
                return;

        }
        CloseHandle(hReadKeyThread);

   
}

//读KEY状态线程代码,
DWORD CDrivertestDlg::ReadKeyThread(LPVOID lparam)
{
     int status;
         DWORD actlen;
         CString strCount;

     CDrivertestDlg *pDlg = (CDrivertestDlg*)lparam;
     CStatic *pCountStatic = (CStatic *)pDlg->GetDlgItem(IDC_STATIC);

                     // KeyCount++;
                                 // strCount.Format(_T("%d"),KeyCount);
                                 // pCountStatic->SetWindowText(strCount);

         while(TRUE)
         {
          if(hFille == INVALID_HANDLE_VALUE)
                  {
              break;              
                  }
                  if(ReadFile(hFille,&status,1,&actlen,NULL)==TRUE)
                  {
              if(status==1)
                          {
                  KeyCount++;
                                  strCount.Format(_T("%d"),KeyCount);
                                  pCountStatic->SetWindowText(strCount);

                  
                          }
                          else
                          {
                   break;
                          }

                  }
                  else   break;

         }
          
       return 1;
}
按下按键以后没有反应,是不是应用程序有问题啊?我检查了一下驱动里的IO配置,没有错误;另外对ReadFile()和XXX_Read()之间的参数传递不是很了解?哪位讲解一下,函数原型在哪儿找啊
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
DWORD DKS_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
        DWORD ret;
        uchar *pReadBuffer;
       
        RETAILMSG(1,(TEXT("DKS_Read executed!!!!\r\n")));
       
        if((pBuffer==NULL)||(dwNumBytes<=0))
                {
                        RETAILMSG(1,(TEXT("pwrbut down,but read return!!!!\r\n")));
                        return 0;
                }
       
        pReadBuffer = MapPtrToProcess(pBuffer,GetCallerProcess());
        *pReadBuffer = 0;
       
        /*挂起当前线程,直到Key键按下或驱动关闭*/
        ret = WaitForMultipleObjects(2,gReadKeyEvent,FALSE,INFINITE);
        if(ret==WAIT_OBJECT_0)
                {
                        ResetEvent(gReadKeyEvent[0]);
                        *pReadBuffer = 1;                  //按键按下
                        return 1;                       
                }
        else if(ret==(WAIT_OBJECT_0+1))
                {
                        ResetEvent(gReadKeyEvent[1]);
                        *pReadBuffer = 0;
                        return 1;
                }
               
                return 0;
}
此帖出自WindowsCE论坛
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

15
 
呵呵。我也是参考这一套GPIO的中断来做的。你检查下你的驱动上GPIO中断初始化是否做对了。。。。
一般情况是你的驱动的问题。
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 5 楼 lth93 的回复:
/**********************************/
PUBLIC DWORD? DSK_Init(DWORD dwContext)
{
        //PDISK        ?  pDisk;
        DWORD? ? IDThread;
? //HMODULE? hmCore;

? RETAILMSG(1,(TEXT("INFO: PwrButton: lth modify!~~~01")));
? //while(1);? //LTH modify
? if(PBT_InitializeAddresses()==FALSE )
?         return 0;
?         RETAILMSG(1,(TEXT("INFO: PwrButton: lth modify!~~~02")));
? PBT_EnableInterrupt();
? RETAILMSG(1,(TEXT("INFO: PwrButton: lth modify!~~~03")));
? //从OAL请求一个SYSINTR值
? if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_PwrButtonIrq, sizeof(UINT32), &g_PwrButtonSysIntr, sizeof(UINT32), NULL))
? ? {
? ? ? ? RETAILMSG(1, (TEXT("ERROR: PwrButton: Failed to request sysintr value for sw_reset button interrupt.\r\n")));
? ? ? ? return(0);
? ? }
? ? RETAILMSG(1,(TEXT("INFO: PwrButton: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_PwrButtonIrq, g_PwrButtonSysIntr));


? //RETAILMSG(1,(TEXT("PwrButton Initialize ...")));


                gPwrButtonIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) PBT_IntrThread, 0, 0, &IDThread);

                RETAILMSG(1, (TEXT(":::PwrButton? PBT_IntrThread ID = %x\r\n"), IDThread));

                if (gPwrButtonIntrThread == NULL)
                {
                        RETAILMSG(1, (TEXT(":::PwrButton? CreateThread() Fail\r\n")));
                        KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&g_PwrButtonSysIntr,sizeof(UINT32),NULL,0,NULL);
                        return 0;
                }
                gReadKeyEvent[0] = CreateEvent(NULL,FALSE,FALSE,NULL);
        ? gReadKeyEvent[1] = CreateEvent(NULL,FALSE,FALSE,NULL);
        ? RETAILMSG(1,(TEXT(":::pwrButton Initialize OK!!!!! ...")));
        return TRUE;
}


你参考下你的BSP包中其他的GPIO中断是如何写的。初始化的地方一定要写对。
关键的是一个xxx_init,一个是线程中断服务IST部分,这两部份写好了就可以了。
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

17
 
程序上目前没看出来什么问题,你检查下初始化中断GPIO上是不是有错。我估计是在初始化init上有问题。
[/code]
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 
MARK,我也来学习下。
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

19
 
我只用IOControl了,没用过Read 和Write
此帖出自WindowsCE论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

20
 
用法很奇怪,为什么要在READ函数里边Waitfor......
中断初始化了没?系统中断申请了没?中断和事件关联了没?
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表