📄 keyboarddriver.cpp
字号:
Sleep(20);
if(Key_IsPushed()) //外部按键是否被接下
{
if(KeyValue == Time0Value)
v_pIOPregs->rGPBDAT ^= 0x01 ;
SetEvent(gReadKeyEvent[0]); //The SetEvent function sets the specified event object to the signaled state.
RETAILMSG(1, (TEXT("EINTKey_IntrThread: Key Pushed Success two!\r\n")));
}
}
}
else
{
CloseHandle(gWaitEvent);
RETAILMSG(1, (TEXT("EINTKey_IntrThread exit!\r\n")));
return 0;
}
// RETAILMSG(1, (TEXT("EINTKey_IntrThread exit!\r\n")));
}
return 1;
}
//======================================================================
// KEY_Init - Driver initialization function
//
DWORD KEY_Init (DWORD dwContext, LPCVOID lpvBusContext)
{
DWORD IDThread ;
// MessageBox(NULL, _T("program requires Windows NT!"),_T("error"), MB_ICONERROR);
//取得GPIO相关寄存器的虚拟地址空间
if(EINT_InitalizeAddresses() == FALSE)
return 0;
//---------------------------------------K1--------------------------------------------
//从OAL请求一个SYSINTR值 IOCTL_HAL_TRANSLATE_IRQ IOCTL_HAL_REQUEST_SYSINTR
if(! KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTIrq19, sizeof(UINT32), &g_EINTSysIntr19,sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: Failed to request sysintr value for EINT interrupt!\r\n")));
return 0;
}
// RETAILMSG(1, (TEXT("Infomation: EINTKey: Mapped Irq 0x%x to sysIntr 0x%x.\r\n"), g_EINTIrq, g_EINTSysIntr));
//---------------------------------------K2--------------------------------------------
if(! KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTIrq11, sizeof(UINT32), &g_EINTSysIntr11,sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: Failed to request sysintr value for EINT interrupt!\r\n")));
return 0;
}
// RETAILMSG(1, (TEXT("Infomation: EINTKey: Mapped Irq 0x%x to sysIntr 0x%x.\r\n"), g_EINTIrq11, g_EINTSysIntr11));
//---------------------------------------Time0 --------------------------------------------
if(! KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTTime0, sizeof(UINT32), &g_EINTSysTime0,sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: Failed to request sysintr value for time0 interrupt!\r\n")));
return 0;
}
// RETAILMSG(1, (TEXT("Infomation: EINTKey: Mapped Irq 0x%x to sysIntr 0x%x.\r\n"), g_EINTTime0, g_EINTSysTime0));
//创建一个外部中断处理线程IST
gEINTIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)EINTKey_IntrThread, 0, 0, &IDThread) ;
if(gEINTIntrThread == NULL)
{
RETAILMSG(1, (TEXT("KEY_Init: CreateThread() Failed!\r\n")));
//IOCTL_HAL_TRANSLATE_IRQ IOCTL_HAL_REQUEST_SYSINTR
KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr19, sizeof(UINT32), NULL, NULL, NULL);
KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr11, sizeof(UINT32), NULL, NULL, NULL);
KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysTime0, sizeof(UINT32), NULL, NULL, NULL);
return 0;
}
gReadKeyEvent[0] = CreateEvent(NULL, FALSE, FALSE,NULL);
gReadKeyEvent[1] = CreateEvent(NULL, FALSE, FALSE,NULL);
RETAILMSG(1, (TEXT("KEY_Init: CreateThread() Suceess!\r\n")));
OpenCount = 0;
return (DWORD)gEINTIntrThread ;
}
void EINT_ConfigPinDefault(void)
{
v_pINTreg->rINTMSK |= BIT_EINT8_23 ;
v_pIOPregs->rGPGCON &= ~(0x03<<22) ; //设置为输入
v_pIOPregs->rGPGCON &= ~(0x03<<6) ; //设置为输入
v_pIOPregs->rGPBCON &= ~0x03 ;
// v_pIOPregs->rGPBCON |= 0x02 ; //设置为输出
v_pIOPregs->rGPBDAT |= (1 << 6); //LED 2 off
v_pIOPregs->rGPBDAT |= 0x01 ; //设为高电平
// RETAILMSG(1, (TEXT("EINT_ConfigPinDefault: EINT_ConfigPinDefault SUCCESS!\r\n")));
}
//======================================================================
// KEY_Deinit - Driver de-initialization function
//
BOOL KEY_Deinit (DWORD dwContext)
{
SetEvent(gWaitEvent); //通知中断服务线程退出
g_bKillIST = TRUE;
Sleep(200);
SetEvent(gReadKeyEvent[1]);
//释放中断资源
//InterruptDone(g_EINTSysIntr19) ;
InterruptDisable(g_EINTSysIntr19);
//InterruptDone(g_EINTSysIntr11) ;
InterruptDisable(g_EINTSysIntr11);
//InterruptDone(g_EINTSysTime0) ;
InterruptDisable(g_EINTSysTime0);
//IOCTL_HAL_TRANSLATE_IRQ IOCTL_HAL_REQUEST_SYSINTR
KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr19, sizeof(UINT32), NULL, 0, NULL);
KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr11, sizeof(UINT32), NULL, 0, NULL);
KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysTime0, sizeof(UINT32), NULL, 0, NULL);
//恢复外总中断引角为GPIO
EINT_ConfigPinDefault();
//释放申请的虚拟空间
if(v_pIOPregs)
{
VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
RETAILMSG(1, (TEXT("KEY_Deinit: VirtualFree v_pIOPregs Success!\r\n")));
}
if(v_pINTreg)
{
VirtualFree((PVOID)v_pINTreg, 0, MEM_RELEASE);
RETAILMSG(1, (TEXT("KEY_Deinit: VirtualFree v_pINTreg Success!\r\n")));
}
if(v_pPWMreg)
{
VirtualFree((PVOID)v_pPWMreg, 0, MEM_RELEASE);
RETAILMSG(1, (TEXT("KEY_Deinit: VirtualFree v_pPWMreg Success!\r\n")));
}
OpenCount = 0;
CloseHandle(gReadKeyEvent[0]); //关闭相关事件
CloseHandle(gReadKeyEvent[1]);
RETAILMSG(1, (TEXT("KEY_Deinit: KEY_Deinit Success!\r\n")));
return 1;
}
//======================================================================
// KEY_Open - CalLED when driver opened
//
DWORD KEY_Open (DWORD dwContext, DWORD dwAccess, DWORD dwShare)
{
if( OpenCount > 0)
{
RETAILMSG(1, (TEXT("KEY_Open failed, it is not the first open!\r\n")));
return 0;
}
OpenCount ++ ;
return OpenCount ;
}
//======================================================================
// KEY_Close - CalKEY when driver closed
//
BOOL KEY_Close (DWORD dwOpen)
{
if( OpenCount > 0)
{
SetEvent(gReadKeyEvent[1]); //通知读函数线程驱动已经关闭
}
OpenCount = 0;
RETAILMSG(1, (TEXT("KEY_Close Success!\r\n")));
return 1 ;
}
//======================================================================
// KEY_Read - CalKEY when driver read
//
DWORD KEY_Read (DWORD Handle, LPVOID pBuffer, DWORD dwCount)
{
DWORD ret;
uchar* pReadBuffer;//返回应用程序的数据
if((pBuffer == NULL) || (dwCount <= 0))
{
RETAILMSG(1, (TEXT("KEY_Read failed \r\n")));
return 0;
}
//映射应用程序传递过来的地址
pReadBuffer = (uchar*)MapPtrToProcess(pBuffer, GetCallerProcess()); //returns a mapped version of the LPVOID pointer
*pReadBuffer = 0;
RETAILMSG(1, (TEXT("KEY_Read one \r\n")));
//挂起当前线程,直到KEY1按下或驱逐动关闭
ret = WaitForMultipleObjects(2, gReadKeyEvent, FALSE, INFINITE) ;
// RETAILMSG(1, (TEXT("KEY_Read: ret is 0x%x.\r\n"), ret));
if(ret == WAIT_OBJECT_0)
{
ResetEvent(gReadKeyEvent[0]); //The SetEvent function sets the specified event object to the signaled state.
*pReadBuffer = KeyValue;
RETAILMSG(1, (TEXT("KEY_Read: KeyValue is 0x%x.\r\n"), KeyValue));
if(KeyValue == Key1Value)
{
InterruptDone(g_EINTSysIntr19) ;
// v_pPWMreg->rTCON &= ~0x0F;
v_pPWMreg->rTCON |= 0x02;
v_pPWMreg->rTCON &= ~0x0F;
v_pPWMreg->rTCON |= 0x01;
}
else if(KeyValue == Key2Value)
{
InterruptDone(g_EINTSysIntr11) ;
// v_pPWMreg->rTCON &= ~0x0F;
v_pPWMreg->rTCON |= 0x02;
v_pPWMreg->rTCON &= ~0x0F;
v_pPWMreg->rTCON |= 0x01;
}
// if(KeyValue == Time0Value)
InterruptDone(g_EINTSysTime0) ;
v_pINTreg->rSRCPND &= ~BIT_TIMER0;
return 1;
}
else if(ret == WAIT_OBJECT_0 + 1)
{
ResetEvent(gReadKeyEvent[1]);
RETAILMSG(1, (TEXT("KEY_Read exit! \r\n")));
*pReadBuffer = 0;
return 1;
}
return 0 ;
}
//======================================================================
// KEY_Write - CalKEY when driver written
//
DWORD KEY_Write (DWORD dwOpen, LPVOID pBuffer, DWORD dwCount)
{
v_pIOPregs->rGPBDAT &= ~(1 << 6); //LED 2 on
return true ;
}
//======================================================================
// KEY_Seek - CalKEY when SetFilePtr calKEY
//
DWORD KEY_Seek (DWORD dwOpen, long lDelta, WORD wType)
{
return true ;
}
//======================================================================
// KEY_IOControl - CalKEY when DeviceIOControl calKEY
//
DWORD KEY_IOControl (DWORD dwOpen, DWORD dwCode, PBYTE pBufferIn, DWORD dwLengthIn,
PBYTE pBufferOut, DWORD dwLengthOut, DWORD pdwBytesWritten)
{
if((int)dwCode == 10)
v_pIOPregs->rGPBDAT |= (1 << 6); //LED 2 off
return true ;
}
//======================================================================
// KEY_PowerDown - CalKEY when system suspends
//
void KEY_PowerDown (DWORD dwContext)
{
return;
}
//======================================================================
// KEY_PowerUp - CalKEY when resumes
//
void KEY_PowerUp (DWORD dwContext)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -