4803|11

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急问:键盘驱动打不开 [复制链接]

evc应用程序打不开我自己写的按键驱动。
HANDLE hReadKeyThread;
        //打开key驱动
        hFile=CreateFile(TEXT("KEY:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
        if(hFile==INVALID_HANDLE_VALUE)
        {
                MessageBox(_T("打开KEY驱动失败!"));
                return;
        }

一直显示打开驱动失败。


控制台的加载信息如下:
Windows CE Firmware Init
INFO: Initializing system interrupts...
----------------------------
----------------------------
----------------------------
OEMInitInterrupts----------------------------
INFO: Initializing system clock(s)...
INFO: Initializing driver globals area...
SDMMC config current rGPGCON: 26a98a
SDMMC config set rGPGCON: 26a98a
SDMMC config Init Done.
OEMInit Done...
Sp=ffffc7cc
OEMSetRealTime: Year: 3, Month: 1, Day: 1, Hour: 12, Minute: 0, second: 0 rcnr=1h
Prescaler:2
384 clock
FMD::FMD_Init
FMD::FMD_OEMIoControl = 0x71c24
CAN_DllEntry attach--------------
CAN_Init----
USB:OhcdPdd_Init
++InitializeOHCI
USB:*pIrq=11, *pioPortBase=0x230000
OHCD: MapIrq2SysIntr(11): 27
OHCD: Memory Object
--InitializeOHCI
[dm9: Chip signature is 2BFF2901
DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\BuiltIn\AFD). Driver cannot be unloaded.
Key: DLL_PROCESS_ATTACH.
>>> EINT_initalization address..set..
::: EINT_InitializeAddresses - Success
::: KEY_Init Sucessfully!
Key: OPEN...
DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\BuiltIn\PPP). Driver cannot be unloaded.
::: SYSINTR_KEYTHREE OEMInterruptEnable
DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\BuiltIn\SDBusDriver). Driver cannot be unloaded.
        charlie::SDIO::SDHOST::SDCSDCardDllEntry::DLL_PROCESS_ATTACH
::: SYSINTR_SDMMC    OEMInterruptDisable
::: SYSINTR_DMA0    OEMInterruptDisable
::: SYSINTR_SDMMC_CARD_DETECT    OEMInterruptEnable
::: SYSINTR_SDMMC_SDIO_INTERRUPT    OEMInterruptEnable
--S3C2410DISP::InitializeHardware
Lyg.p: Layout Manager successfully initialized to  2
Touch Init
Maximum Allowed Error 7:
MSIM: IM_ReadRegistry read KB 5
Explorer(V2.0) taskbar thread started.
NDISPWR:: Found adapter [CS89001]
Indicated RS232 Cable Event
AUTORAS:: Dialer notifies: [1] [Dialer Start]
Posting WM_NETCONNECT(TRUE) message
AUTORAS:: Dialer notifies: [4] [Dialer Connected]
OEMSetRealTime: Year: 10, Month: 5, Day: 21, Hour: 17, Minute: 21, second: 17 rcnr=1h

这样显示应该是加载成功。



最新回复

你应该把程序贴出来,这么点看不出来  详情 回复 发表于 2010-5-26 22:54
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我的应用程序如下:
#include
#include
#include
#include

#include  
#include "EINTKey.h"


#define PRIVATE                        static
#define PUBLIC

/* 读按键事件*/
PRIVATE HANDLE gReadKeyEvent[2];      

PRIVATE DWORD gReadKeyValue;
/* 按键按下中断事件 */
PRIVATE HANDLE gWaitEvent;

/* 是否退出中断服务线程 */
PRIVATE UINT32 g_bKillIST = FALSE;

/* 中断处理线程 */
PRIVATE HANDLE gEINTIntrThread;

/* 驱动打开计数器 */
PRIVATE UINT32 gOpenCount = 0;

/* GPIO 寄存器对应的虚拟地址 */
PRIVATE volatile IOPreg * v_pIOPregs;

/*******************************************************************************************
函数名称: EINT_ConfigInterruptPin
描    述: 配置外部中断引脚并使能为 下降 沿触发
输入参数: 无       
输出参数: 无
返    回: 无
********************************************************************************************/
PRIVATE VOID EINT_ConfigInterruptPin(VOID)
{
  v_pIOPregs->rGPGCON &=~(0x3<<6);//EINT11(GPG3)
v_pIOPregs->rGPGCON |= (0x2<<6);

v_pIOPregs->rEXTINT1 &=~(0x7<<12);
v_pIOPregs->rEXTINT1 |= (0x2<<12);

  v_pIOPregs->rGPECON &=~(0x3<<22);//set GPE11 output
v_pIOPregs->rGPECON |=(0x1<<22);

v_pIOPregs->rGPECON &=~(0x3<<26);//set GPE13 output
v_pIOPregs->rGPECON |=(0x1<<26);

v_pIOPregs->rGPGCON &=~(0x3<<12);//set GPG6 output
v_pIOPregs->rGPGCON |=(0x1<<12);

v_pIOPregs->rGPGCON &=~(0x3<<4);//set GPG2 output
v_pIOPregs->rGPGCON |=(0x1<<4);

v_pIOPregs->rGPEDAT &=~(0x01<<11);//set PGE11 0
v_pIOPregs->rGPEDAT &=~(0x01<<13);
v_pIOPregs->rGPGDAT &=~(0x01<<2);
v_pIOPregs->rGPGDAT &=~(0x01<<6);
}

/*******************************************************************************************
函数名称: EINT_ConfigPinDefault
描    述: 配置外部中断引脚恢复为输入引脚
输入参数: 无       
输出参数: 无
返    回: 无
********************************************************************************************/
PRIVATE VOID EINT_ConfigPinDefault( )
{
v_pIOPregs->rGPGCON &= ~(0X3<<6);  //配置GPG3/EINT11为输入引脚

}
/*PRIVATE VOID EINT_ConfigPinEint(DWORD pinNo )
{
   
        v_pIOPregs->rGPFCON   =  0xAA55;
        v_pIOPregs->rGPFDAT  &= ~(0x0f);
}*/

/*******************************************************************************************
函数名称: Key_IsPushed
描    述: 查询按键是否已按下
输入参数: 无       
输出参数: 无
返    回: FALSE: 按键未按下    TRUE: 按键已按下
*******************************************************************************************/
PRIVATE BOOL Key_IsPushed()
{
return ((v_pIOPregs->rGPGDAT & (1 << 3)) ? FALSE : TRUE);
}


/*******************************************************************************************
函数名称: EINT_InitializeAddresses
描    述: 取得相关寄存器的虚拟地址
输入参数: 无       
输出参数: 无
返    回: > 0 分配得到的虚拟地址;  FALSE: 分配失败  
*******************************************************************************************/
PRIVATE BOOL EINT_InitializeAddresses(VOID)
{
        BOOL        RetValue = TRUE;

        RETAILMSG(1, (TEXT(">>> EINT_initalization address..set..\r\n")));
               
        /* IO Register Allocation */
        v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
        if (v_pIOPregs == NULL)
        {
                ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
                RetValue = FALSE;
        }
        else
        {
                if (!VirtualCopy((PVOID)v_pIOPregs,  (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE))
                {
                        ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
                        RetValue = FALSE;
                }
        }
       
        if (!RetValue)
        {
                RETAILMSG (1, (TEXT("::: EINT_InitializeAddresses - Fail!!\r\n") ));
                if (v_pIOPregs)
                {
                        VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
                }

                v_pIOPregs = NULL;
        }
        else RETAILMSG (1, (TEXT("::: EINT_InitializeAddresses - Success\r\n") ));   
        return(RetValue);
}
/*******************************************************************************************
函数名称: KEY_Scan
描    述: 键盘扫描程序
输入参数:无
输出参数: 无
返    回: NULL
*******************************************************************************************/
BOOL KEY_Scan(VOID)
{
        v_pIOPregs->rGPEDAT &=~(0x01<<11);
    v_pIOPregs->rGPGDAT |=(0x01<<6);
        v_pIOPregs->rGPEDAT |=(0x01<<13);
        v_pIOPregs->rGPGDAT |=(0x01<<2);
        if (v_pIOPregs->rGPGDAT&(1<<3)==0)
        {
                gReadKeyValue=4;
        }
        v_pIOPregs->rGPEDAT |=(0x01<<11);
    v_pIOPregs->rGPGDAT &=~(0x01<<6);
        v_pIOPregs->rGPEDAT |=(0x01<<13);
        v_pIOPregs->rGPGDAT |=(0x01<<2);
        if (v_pIOPregs->rGPGDAT&(1<<3) == 0)
        {
                gReadKeyValue=5;
        }
        v_pIOPregs->rGPEDAT |=(0x01<<11);
    v_pIOPregs->rGPGDAT |=(0x01<<6);
        v_pIOPregs->rGPEDAT &=~(0x01<<13);
        v_pIOPregs->rGPGDAT |=(0x01<<2);
    if (v_pIOPregs->rGPGDAT&(1<<3) == 0)
        {
                gReadKeyValue=6;
        }
        else
        {
                gReadKeyValue=14;
        }
}
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
/*******************************************************************************************
函数名称: EINTKey_IntrThread
描    述: 外部中断按键服务线程
输入参数: PVOID pArg:          线程输入参数
输出参数: 无
返    回: 1 或 0
*******************************************************************************************/
DWORD EINTKey_IntrThread(PVOID pArg)
{
        DWORD ret;
    DWORD pressRowNo;
        DWORD pressColNo;


        // 创建外部中断中断事件
        gWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);               

        // 初始化外部按键中断: 注册中断事件, 允许外部中断
        if (!(InterruptInitialize(SYSINTR_Key, gWaitEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: EINTKey: InterruptInitialize failed.\r\n")));
                CloseHandle(gWaitEvent);
                return 0;
        }

        // 外部按键中断线程开始运行
        while (1)
        {
                ret = WaitForSingleObject(gWaitEvent, INFINITE);
               
                if ((ret == WAIT_OBJECT_0 ) && (g_bKillIST == FALSE))
                {
                        if(Key_IsPushed())
                        {
                                Sleep(20);
                                if(Key_IsPushed())
                                {
                                        EINT_ConfigPinDefault( );
                                        KEY_Scan();
                                        SetEvent(gReadKeyEvent[0]);       
                                        RETAILMSG(1,(TEXT(":::The Key PUshed.\r\n")));
                                }
                        }
                }
                else
                {       
                        CloseHandle(gWaitEvent);
                        RETAILMSG(1, (TEXT("::: EINTKey_IntrThread Exit. \r\n")));
                        return 0;       
                } //if (ret != WAIT_OBJECT_0) or Error occurs

                InterruptDone(SYSINTR_Key);           /* 通知内核: 中断处理结束 */
        }      
         
          return 1;
}


/*******************************************************************************************
函数名称: KEY_Init
描    述: 驱动程序初始化函数
输入参数: DWORD dwContext: 设备管理器传递给本驱动的参数, 通常为流接口驱动在注册表内的位置        
输出参数: 无
返    回: 驱动程序句柄
*******************************************************************************************/
PUBLIC DWORD KEY_Init(DWORD dwContext)
{
        DWORD IDThread;

        // 取得 GPIO 相关寄存器的虚拟地址空间
        if (EINT_InitializeAddresses() == FALSE)
           return 0;               

       
        EINT_ConfigInterruptPin();

    // 从 OAL 请求一个 SYSINTR 值
/*#if 0
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_EINTIrq, sizeof(UINT32), &g_EINTSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: EINTKey: Failed to request sysintr value for EINT interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: EINTKey: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_EINTIrq, g_EINTSysIntr));
#endif*/
    // 创建一个外部中断处理线程 IST
        gEINTIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) EINTKey_IntrThread, 0, 0, &IDThread);
        if (gEINTIntrThread == NULL)
        {
                RETAILMSG(1, (TEXT("::: KEY_Init: CreateThread() Fail.\r\n")));
        //        KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_EINTSysIntr, sizeof(UINT32), NULL, 0, NULL);
                return 0;
        }

        gReadKeyEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
        gReadKeyEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
       
  
    RETAILMSG(1, (TEXT("::: KEY_Init Sucessfully! \r\n")));
   
    // 返回不为0的数
        return (DWORD)gEINTIntrThread;
}


/*******************************************************************************************
函数名称: DllEntry
描    述: 驱动程序动态库入口
输入参数:        
输出参数:
返    回:
*******************************************************************************************/
PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch ( dwReason )
        {
        case DLL_PROCESS_ATTACH:
            RETAILMSG(1, (TEXT("Key: DLL_PROCESS_ATTACH. \r\n")));
                    DisableThreadLibraryCalls((HMODULE) hInstDll);
            break;

        case DLL_PROCESS_DETACH:
            RETAILMSG(1, (TEXT("Key: DLL_PROCESS_DETACH. \r\n")));
            break;   
    }

    return (TRUE);
}


/*******************************************************************************************
函数名称: KEY_Close
描    述: 驱动程序关闭函数
输入参数: DWORD Handle:驱动程序句柄
输出参数: 无
返    回: FALSE: 失败    TRUE: 成功
*******************************************************************************************/
BOOL KEY_Close(DWORD Handle)
{
        if (gOpenCount > 0)
                SetEvent(gReadKeyEvent[1]);               
                                /* 通知调用读函数的线程, 驱动已经关闭 */
   RETAILMSG(1, (TEXT("Key: close... \r\n")));
        gOpenCount = 0;

        return TRUE;
}   // KEY_Close



/*******************************************************************************************
函数名称: KEY_Deinit
描    述: 驱动程序卸载函数
输入参数: DWORD dwContext: 驱动程序句柄
输出参数: 无
返    回: FALSE: 失败    TRUE: 成功
*******************************************************************************************/
BOOL KEY_Deinit(DWORD dwContext)
{
        SetEvent(gWaitEvent);                                                                /* 通知中断服务线程退出 */
    g_bKillIST = TRUE;                                                           
        Sleep(200);                                                                                        /* 等待中断服务线程退出 */
   
        SetEvent(gReadKeyEvent[1]);                                                        /* 通知调用读函数的线程, 驱动已经关闭 */

        // 释放中断资源
        InterruptDone(SYSINTR_Key);
        InterruptDisable(SYSINTR_Key);
//        KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_EINTSysIntr, sizeof(UINT32), NULL, 0, NULL);
       
        // 恢复外部中断引脚为输入 GPIO
        EINT_ConfigPinDefault();
   
             
        // 释放申请的虚拟空间      
        if (v_pIOPregs)
                VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);   
    gOpenCount = 0;

          CloseHandle(gReadKeyEvent[0]);                                                /* 关闭相关事件 */
        CloseHandle(gReadKeyEvent[1]);

        return TRUE;
}   // KEY_Deinit


/*******************************************************************************************
函数名称: KEY_Open
描    述: 打开驱动程序
输入参数: DWORD dwData     : 驱动程序引用事例句柄
          DWORD dwAccess   : 访问请求代码,是读和写的组合
          DWORD dwShareMode: 共享模式  
输出参数:
返    回: 驱动程序引用事例句柄
*******************************************************************************************/
DWORD KEY_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
        RETAILMSG(1, (TEXT("Key: OPEN... \r\n")));
    if (gOpenCount > 0)
        return 0;                // 本驱动只允许单一访问

    gOpenCount = 1;  
    return gOpenCount;
}   // KEY_Open


/*******************************************************************************************
函数名称: KEY_IOControl
描    述: 驱动程序 I/O 请求
输入参数:
输出参数:
返    回: 本驱动不支持该请求,返回 FALSE
*******************************************************************************************/
BOOL
KEY_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
    return FALSE;
}   // KEY_IOControl



/*******************************************************************************************
函数名称: KEY_Read
描    述: 读取按键状态
输入参数: DWORD Handle    : 驱动程序引用事例句柄
          LPVOID pBuffer  : 接收缓冲区
          DWORD dwNumBytes: 要读的字节数
输出参数: 无
返    回: 实际读到字节数
*******************************************************************************************/
DWORD KEY_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
        DWORD ret;
        DWORD waitMillSec;
        DWORD *pReadBuffer;

        if ((pBuffer == NULL) || (dwNumBytes <= 0))
                return 0;

        pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());
        *pReadBuffer = 0;

        /* 根据 等待的时间值调整等待*/
/*        if( * (pReadBuffer+1)==0)
        {//无限等待
            RETAILMSG(1, (TEXT(":::  Wait Key Infine. \r\n")));
                waitMillSec=INFINITE;
        }
        else
        {
                waitMillSec=* (pReadBuffer+1);
        }*/

        ret = WaitForMultipleObjects(2, gReadKeyEvent, FALSE, waitMillSec);       
        if (ret == WAIT_OBJECT_0)
        {
                ResetEvent(gReadKeyEvent[0]);
                *pReadBuffer = gReadKeyValue;                                                                               
                return 1;
        }
        else if (ret == WAIT_OBJECT_0+1)
        {
                ResetEvent(gReadKeyEvent[1]);
                *pReadBuffer = 0;                                                                               
                return 1;
        }
       
       
        return 0;
}   // KEY_Read


/*******************************************************************************************
函数名称: KEY_Write
描    述: 写函数,本驱动不支持
输入参数:
输出参数:
返    回:
*******************************************************************************************/
DWORD KEY_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
        return 0;
}   // KEY_Write


/*******************************************************************************************
函数名称: KEY_Seek
描    述: 对设备的数据指针进行操作,本驱动不支持该函数
输入参数:
输出参数:
返    回:
*******************************************************************************************/
DWORD KEY_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
        return 0;
}  // KEY_Seek


/*******************************************************************************************
函数名称: KEY_PowerUp
描    述: 电源上电驱动处理函数
输入参数:
输出参数:
返    回: 无
*******************************************************************************************/
void KEY_PowerUp(void)
{
        return;
}  // KEY_PowerUp


/*******************************************************************************************
函数名称: KEY_PowerDown
描    述: 电源下电驱动处理函数
输入参数:
输出参数:
返    回: 无
*******************************************************************************************/
void
KEY_PowerDown(void)
{
        return;
}  // KEY_PowerDown
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
一步一步调试,从驱动的加载开始,到打开,到动作
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
名字错,hFile=CreateFile(TEXT("KEY:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
中的"KEY:"不合法,这个名字应该写成"KEY1:"
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼上说的对,KEY后面还有一数字,就是你的注册表里对应的index值,如果没有写的话一般默认是1
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

9
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

97

帖子

7

TA的资源

一粒金砂(初级)

11
 
查看本帖全部讨论,请登录或者注册
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
查看本帖全部讨论,请登录或者注册
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表