|
1:如果加载驱动不成功 首先注意你的XXX_Open() 那3个XXX是否大写
2:对于WINCE4.2以上的版本,动态加载中断流是不成功的啊
但是我的版本是WINCE5.0,而且我大小写都注意了,我就是用CE驱动调试助手激活我的中断驱动就是不成功啊
希望大侠们指点
放出我的程序
[code]
/*******************************************************************
** 函数: DLL程序入口
** 功能: 驱动形式是DLL的
********************************************************************/
BOOL WINAPI DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID /* lpvReserved */)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}
BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL ret=true;
RETAILMSG(1,(TEXT("WZQ_KEY:KEY_Deinit......\r\n")));
//屏蔽系统逻辑按键中断
InterruptDisable(SYSINTR_USER_KEY);
CloseHandle(g_hEINTIntrThread);
for(int i=0; i<4; i++)
{
CloseHandle(g_ahKeyEvent);
}
//释放虚拟内存空间
VirtualFree((void*)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);
return TRUE;
}
BOOL KeyGpioInit()
{
RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x3 << 0); // Falling-edge triggered.
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x6)) | (0x2 << 0x6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x3 << 12); // Falling-edge triggered.
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x10)) | (0x2 << 0x10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x3 << 20); // Falling-edge triggered.
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x12)) | (0x2 << 0x12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x3 << 24); // Falling-edge triggered.
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x14)) | (0x2 << 0x14); // GPG7 == EINT15
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 28)) | (0x3 << 28); // Falling-edge triggered.
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x22)) | (0x2 << 0x22); // GPG11 == EINT19
s2440IOP->rEXTINT2 = (s2440IOP->rEXTINT2 & ~(0x7<< 12)) | (0x3 << 12); // Falling-edge triggered.
return TRUE;
}
BOOL InitInterruptThread(void)
{
DWORD threadID;
DWORD ret;
g_hKeyEvent=CreateEvent(NULL, FALSE, FALSE, NULL);
if(!g_hKeyEvent)
{
RETAILMSG(1,(TEXT("Fail to g_hKeyEvent=CreateEvent(NULL, FALSE, FALSE, NULL);\r\n")));
return FALSE;
}
ret=InterruptInitialize(SYSINTR_USER_KEY, g_hKeyEvent, NULL, 0);
if(!ret)
{
RETAILMSG(1,(TEXT("Fail to ret=InterruptInitialize(SYSINTR_USER_KEY, g_hKeyEvent, NULL, 0);\r\n")));
return FALSE;
}
g_hEINTIntrThread=CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)EintThread,
0,
0,
&threadID
);
if(NULL == g_hEINTIntrThread)
{
RETAILMSG(1,(TEXT("Fail to g_hEINTIntrThread\r\n")));
return FALSE;
}
RETAILMSG(1,(_T("UserKey.DLL::InterruptThread Initialized.\r\n")));
return TRUE;
}
DWORD KEY_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("KEY_Init----\r\n")));
// 1. Virtual Alloc
EINT_InitAddress();
KeyGpioInit();
for(int i=0; i<4; i++)
{
g_ahKeyEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
}
if (!InitInterruptThread())
{
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
//mInitialized = TRUE;
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
RETAILMSG(1,(TEXT("KEY:Ioctl code = 0x%x\r\n"), dwCode));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_Open\r\n")));
RETAILMSG(1,(TEXT("USERKEY: KEY_Open---------\r\n")));
RETAILMSG(1,(TEXT("USERKEY: KEY_Open----------\r\n")));
RETAILMSG(1,(TEXT("USERKEY: KEY_Open-----------\r\n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_Close(DWORD hOpenContext)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_Close\r\n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerDown(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_PowerDown\r\n")));
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerUp(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_PowerUp\r\n")));
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
DWORD dwRet;
uchar *pReadBuf;
RETAILMSG(1,(TEXT("USERKEY: KEY_Read\r\n")));
if(pBuffer==NULL || Count==0)
{
return FALSE;
}
pReadBuf=(uchar *)MapPtrToProcess(pBuffer,GetCallerProcess());
*pReadBuf=0;
//挂起当前线程直到有按键按下为止
dwRet=WaitForMultipleObjects(4,g_ahKeyEvent,FALSE,INFINITE);
if(dwRet==WAIT_OBJECT_0)
{
ResetEvent(g_ahKeyEvent[KEY1_EVENT]);
*pReadBuf=KEY1_DOWN;
}
else if(dwRet==WAIT_OBJECT_0+1)
{
ResetEvent(g_ahKeyEvent[KEY2_EVENT]);
*pReadBuf=KEY2_DOWN;
}
else if(dwRet==WAIT_OBJECT_0+2)
{
ResetEvent(g_ahKeyEvent[KEY3_EVENT]);
*pReadBuf=KEY3_DOWN;
}
else if(dwRet==WAIT_OBJECT_0+3)
{
ResetEvent(g_ahKeyEvent[KEY4_EVENT]);
*pReadBuf=KEY4_DOWN;
}
return (TRUE);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_Seek\r\n")));
return 0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_Write\r\n")));
return 0;
}
|
|