2通过Kn控制LEDn(中断)说明文档
功能描述:按下Kn的时候LEDn亮(n=14) 一、 驱动程序(KeyLed.cpp) #include //#include #include //#include #include #include “pmplat.h“ #include “Pkfuncs.h“ #include “s2440.h“ volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE; volatile INTreg*s2440INT = (INTreg *)INT_BASE; HANDLE KeyThread; HANDLE KeyEvent; UINT32 g_KeySysIntr[4]; void Virtual_Alloc();// Virtual allocation DWORD UserKeyProcessThread(void); const TCHAR szevtUser[] = L“FriendlyARM/ButtonEvent“; DWORD UserKeyProcessThread(void) { DWORD IRQ; // 创建一个事务 KeyEvent = CreateEvent(NULL,FALSE,FALSE,NULL); if (!KeyEvent) { RETAILMSG(1,(TEXT(“ERROR:KEL:Failed to create event.\r\n“))); return FALSE; } // 将物理中断号转换为逻辑中断号 // IRQ 物理中断号;g_KeySysIntr逻辑中断号 IRQ = 36; if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, return FALSE; } IRQ = 39; if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, return FALSE; } IRQ = 41; if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, return FALSE; } IRQ = 42; if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, return FALSE; } // 通知系统使能这个中断(g_KeySysIntr),并且当这个中断产生时产生一个事务、 if (!InterruptInitialize(g_KeySysIntr[0],KeyEvent,NULL,0)) { RETAILMSG(1,(TEXT(“Fail to initialize key interrupt event\r\n“))); return FALSE; } if (!InterruptInitialize(g_KeySysIntr[1],KeyEvent,NULL,0)) { RETAILMSG(1,(TEXT(“Fail to initialize key interrupt event\r\n“))); return FALSE; } if (!InterruptInitialize(g_KeySysIntr[2],KeyEvent,NULL,0)) { RETAILMSG(1,(TEXT(“Fail to initialize key interrupt event\r\n“))); return FALSE; } if (!InterruptInitialize(g_KeySysIntr[3],KeyEvent,NULL,0)) { RETAILMSG(1,(TEXT(“Fail to initialize key interrupt event\r\n“))); return FALSE; } while(1) { // 等待中断发生 WaitForSingleObject(KeyEvent,INFINITE); const char nIndex[] = { 0, 3, 5, 6}; const char nIndex2[]= { 5, 6, 7, 8}; // 扫描Kn(14)的状态并赋给LEDn(14) for (int i=0;irGPGDAT & (0 x01 rGPBDAT | (0 x01 rGPBDAT &~ (0 x01