谢谢,楼上的,我参考了那文章,那问题解决了!!出现新问题了!!
static DWORD g_dwSysIntr_Keybd[MAX_HDKEY] = {SYSINTR_EINT13,SYSINTR_EINT14,SYSINTR_EINT17,SYSINTR_EINT19,SYSINTR_EINT20,SYSINTR_EINT21};
我定义的中断号
BOOL Ps2Keybd::IsrThreadProc(DWORD index)
{
DWORD dwPriority;
//add wy
DWORD dwIrq_Keybd = dwIrq_Keybdbuf[index];
// HANDLE m_hevInterrupt;
RETAILMSG(DEBUGMODE, (TEXT("call IsrThreadProc:\r\n")));
// look for our priority in the registry -- this routine sets it to zero if
// it can't find it.
ReadRegDWORD( TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("Priority256"), &dwPriority );
RETAILMSG(DEBUGMODE, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\Priority256: %x\r\n"), dwPriority));
if(dwPriority == 0) {
// dwPriority = 145; // default value is 145
dwPriority = 240; // default value is 145
}
// RETAILMSG(DEBUGMODE, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\Priority256: %x\r\n"), dwPriority));
DEBUGMSG(1, (TEXT("IsrThreadProc:\r\n")));
m_hevInterrupt = CreateEvent(NULL,FALSE,FALSE,NULL);
if (m_hevInterrupt == NULL) {
DEBUGMSG(1, (TEXT("IsrThreadProc: InterruptInitialize\r\n")));
goto leave;
}
RETAILMSG(DEBUGMODE, (TEXT("KEYBD\CreateEvent\m_hevInterrupt: %x\r\n"), m_hevInterrupt ));
//ReadRegDWORD( TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("SysIntr"), &dwSysIntr_Keybd );
// RETAILMSG(DEBUGMODE, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\SysIntr: %x\r\n"), dwSysIntr_Keybd));
/*#if 0
while (1)
{
if ( WaitForSingleObject(m_hevInterrupt, INFINITE) == WAIT_TIMEOUT )
DEBUGMSG(1, (TEXT("timeout\r\n")));
else
DEBUGMSG(1, (TEXT("I got one\r\n")));
InterruptDone(dwSysIntr_Keybd);
}
#endif*/
if (!InterruptInitialize(g_dwSysIntr_Keybd[index],m_hevInterrupt,NULL,0)) {
RETAILMSG(1, (TEXT("IsrThreadProc: KeybdInterruptEnable\r\n")));
goto leave;
}
RETAILMSG(1,(TEXT("[KBD]m_hevInterrupt[%d]=0x%08x,irq=%d,sysIntr=% d\r\n"),index,m_hevInterrupt,dwIrq_Keybd,g_dwSysIntr_Keybd[index]));
// update the IST priority
CeSetThreadPriority(GetCurrentThread(), (int)dwPriority);
extern UINT v_uiPddId;
extern PFN_KEYBD_EVENT v_pfnKeybdEvent;
KEYBD_IST keybdIst;
keybdIst.hevInterrupt = m_hevInterrupt;
keybdIst.dwSysIntr_Keybd = g_dwSysIntr_Keybd[index]; //dwSysIntr_Keybd;
keybdIst.uiPddId = v_uiPddId;
keybdIst.pfnGetKeybdEvent = KeybdPdd_GetEventEx2;
keybdIst.pfnKeybdEvent = v_pfnKeybdEvent;
RETAILMSG(DEBUGMODE, (TEXT("IsrThreadProc Call KeybdIstLoop()\r\n")));
KeybdIstLoop(&keybdIst);
leave:
return 0;
}
DWORD Ps2KeybdIsrThread(Ps2Keybd *pp2k)
{
DEBUGMSG(1,(TEXT("Ps2KeybdIsrThread:\r\n")));
RETAILMSG(DEBUGMODE,(TEXT("call Ps2KeybdIsrThread:\r\n")));
pp2k->IsrThreadProc(pp2k->key_index);
return 0;
}
BOOL Ps2Keybd::IsrThreadStart()
{
HANDLE hthrd;
DEBUGMSG(1,(TEXT("IsrThreadStart:\r\n")));
while((key_index<(MAX_HDKEY))&&(key_index>=0))
{
hthrd = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Ps2KeybdIsrThread,this,0,NULL);
// Since we don't need the handle, close it now.
CloseHandle(hthrd);
Sleep(1);
key_index ++;
}
return TRUE;
}
只有SYSINTR_EINT13 调用InterruptInitialize()成功,其他的全失败了,和SYSINTR_EINT13在数组中的位置无关,在CFW.C和arminit.c中它们的相应实现时一样的啊,为什么啊,有其他好的方法实现矩阵键盘的吗?