📄 keypad.c
字号:
}
DWORD
KPD_IntrThread2(PVOID pArg)
{
RETAILMSG(1, (TEXT("+ KPD_IntrThread2\r\n")));
KPD_InitializeAddresses();
// KPD_SetKscanLow();
KPD_EnableInterrupt();
g_hKeypadIntrEvent[2] = CreateEvent(NULL,
FALSE, //the system automatically resets the state to nonsignaled after a single waiting thread has been released
FALSE, //the initial state of the event object. If TRUE, the initial state is signaled; otherwise, it is nonsignaled.
NULL);
if (g_hKeypadIntrEvent[2] == NULL) {
RETAILMSG(1, (TEXT("KPD_IntrThread2 : CreateEvent return failure\r\n")));
return FALSE;
}
// Request a SYSINTR value from the OAL.
//
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, // [in] I/O control code
&g_KeypadIrq[2], // [out] Pointer to a buffer that contains the data required to perform the operation
sizeof(UINT32), // [in] Size, in bytes, of the buffer pointed to by lpInBuf.
&g_KeypadSysIntr[2], // [out] Pointer to a buffer that receives the output data for the operation
sizeof(UINT32), // [in] size of the buffer pointed to by g_KeypadSysIntr
NULL)) { // an operation produces no output data
RETAILMSG(1, (TEXT("KPD_IntrThread2 : Failed to request sysintr value for power button interrupt.\r\n")));
return 0;
}
RETAILMSG(1,(TEXT("KPD_IntrThread2 : Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_KeypadIrq[2], g_KeypadSysIntr[2]));
if (!(InterruptInitialize(g_KeypadSysIntr[2], // Interrupt identifier to be associated with this interrupt service thread (IST)
g_hKeypadIntrEvent[2], // Event to be signaled when the interrupt is triggered
0,
0))) {
RETAILMSG(1, (TEXT("KPD_IntrThread2 : Interrupt initialize failed.\r\n")));
return 0;
}
while (1)
{
KPD_SetKscanLow();
WaitForSingleObject(g_hKeypadIntrEvent[2], INFINITE);
// KPD_IsPushed();
switch (KPD_DebounceReadKscan()) {
case KSCAN0:
RETAILMSG(1, (TEXT("keypad K4 is pressed\r\n")));
break;
case KSCAN1:
RETAILMSG(1, (TEXT("keypad K5 is pressed\r\n")));
break;
case KSCAN2:
RETAILMSG(1, (TEXT("keypad K6 is pressed\r\n")));
break;
case KSCAN3:
RETAILMSG(1, (TEXT("keypad K14 is pressed\r\n")));
break;
default:
//RETAILMSG(1, (TEXT("unknown keypad is pressed\r\n")));
break;
}
InterruptDone(g_KeypadSysIntr[2]);
}
}
DWORD
KPD_IntrThread3(PVOID pArg)
{
RETAILMSG(1, (TEXT("+ KPD_IntrThread3\r\n")));
KPD_InitializeAddresses();
// KPD_SetKscanLow();
KPD_EnableInterrupt();
g_hKeypadIntrEvent[3] = CreateEvent(NULL,
FALSE, //the system automatically resets the state to nonsignaled after a single waiting thread has been released
FALSE, //the initial state of the event object. If TRUE, the initial state is signaled; otherwise, it is nonsignaled.
NULL);
if (g_hKeypadIntrEvent[3] == NULL) {
RETAILMSG(1, (TEXT("KPD_IntrThread3 : CreateEvent return failure\r\n")));
return FALSE;
}
// Request a SYSINTR value from the OAL.
//
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, // [in] I/O control code
&g_KeypadIrq[3], // [out] Pointer to a buffer that contains the data required to perform the operation
sizeof(UINT32), // [in] Size, in bytes, of the buffer pointed to by lpInBuf.
&g_KeypadSysIntr[3], // [out] Pointer to a buffer that receives the output data for the operation
sizeof(UINT32), // [in] size of the buffer pointed to by g_KeypadSysIntr
NULL)) { // an operation produces no output data
RETAILMSG(1, (TEXT("KPD_IntrThread3 : Failed to request sysintr value for power button interrupt.\r\n")));
return 0;
}
RETAILMSG(1,(TEXT("KPD_IntrThread3 : Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_KeypadIrq[3], g_KeypadSysIntr[3]));
if (!(InterruptInitialize(g_KeypadSysIntr[3], // Interrupt identifier to be associated with this interrupt service thread (IST)
g_hKeypadIntrEvent[3], // Event to be signaled when the interrupt is triggered
0,
0))) {
RETAILMSG(1, (TEXT("KPD_IntrThread3 : Interrupt initialize failed.\r\n")));
return 0;
}
while (1)
{
KPD_SetKscanLow();
WaitForSingleObject(g_hKeypadIntrEvent[3], INFINITE);
// KPD_IsPushed();
switch (KPD_DebounceReadKscan()) {
case KSCAN0:
RETAILMSG(1, (TEXT("keypad K1 is pressed\r\n")));
break;
case KSCAN1:
RETAILMSG(1, (TEXT("keypad K2 is pressed\r\n")));
break;
case KSCAN2:
RETAILMSG(1, (TEXT("keypad K3 is pressed\r\n")));
break;
case KSCAN3:
RETAILMSG(1, (TEXT("keypad K13 is pressed\r\n")));
break;
default:
//RETAILMSG(1, (TEXT("unknown keypad is pressed\r\n")));
break;
}
InterruptDone(g_KeypadSysIntr[3]);
}
}
DWORD
KPD_Init(DWORD dwContext)
{
HANDLE hThread[4];
DWORD IDThread[4];
INT i;
RETAILMSG(1, (TEXT("+ Keypad : KPD_Init \r\n")));
hThread[0] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) KPD_IntrThread0,
0,
0,
&IDThread[0]);
hThread[1] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) KPD_IntrThread1,
0,
0,
&IDThread[0]);
hThread[2] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) KPD_IntrThread2,
0,
0,
&IDThread[2]);
hThread[3] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) KPD_IntrThread3,
0,
0,
&IDThread[3]);
for (i = 0; i < 4; ++i)
if (hThread[i] == NULL) {
RETAILMSG(1, (TEXT("::: CreateThread() Fail\r\n")));
return FALSE;
}
else
RETAILMSG(1, (TEXT(" Keypad : KPD_IntrThread ID = %x\r\n"), IDThread[i]));
RETAILMSG(1, (TEXT("- Keypad : KPD_Init \r\n")));
return TRUE;
}
//
// Device deinit - devices are expected to close down.
// The device manager does not check the return code.
//
BOOL
KPD_Deinit(
DWORD dwContext // future: pointer to the per disk structure
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_Deinit \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_Deinit \r\n")));
return TRUE;
} // DSK_Deinit
//
// Returns handle value for the open instance.
//
DWORD
KPD_Open(
DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_Open \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_Open \r\n")));
return 0;
} // DSK_Open
BOOL
KPD_Close(
DWORD Handle
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_Close \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_Close \r\n")));
return TRUE;
} // DSK_Close
//
// I/O Control function - responds to info, read and write control codes.
// The read and write take a scatter/gather list in pInBuf
//
BOOL
KPD_IOControl(
DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_IOControl \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_IOControl \r\n")));
return FALSE;
} // DSK_IOControl
DWORD
KPD_Read(
DWORD Handle,
LPVOID pBuffer,
DWORD dwNumBytes
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_Read \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_Read \r\n")));
return 0;
}
DWORD
KPD_Write(
DWORD Handle,
LPCVOID pBuffer,
DWORD dwNumBytes
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_Write \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_Write \r\n")));
return 0;
}
DWORD
KPD_Seek(
DWORD Handle,
long lDistance,
DWORD dwMoveMethod
)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_Seek \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_Seek \r\n")));
return 0;
}
void
KPD_PowerUp(void)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_PowerUp \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_PowerUp \r\n")));
return;
}
void
KPD_PowerDown(void)
{
RETAILMSG(1, (TEXT("+ Keypad : KPD_PowerDown \r\n")));
RETAILMSG(1, (TEXT("- Keypad : KPD_PowerDown \r\n")));
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -