📄 keypad.c
字号:
#include <windows.h>
#include <s3c2410x.h>
#include <nkintr.h>
#ifdef DEBUG
DBGPARAM dpCurSettings = {
_T("KEYPAD"),
{
_T("Errors"), _T("Warnings"), _T("Info"), _T(""),
_T(""), _T(""), _T(""), _T(""),
_T(""),_T(""),_T(""),_T(""),
_T(""),_T(""),_T(""),_T("")
},
0x1
};
#endif
#define ZONE_ERR DEBUGZONE(0)
#define ZONE_WARN DEBUGZONE(1)
#define ZONE_INFO DEBUGZONE(2)
volatile S3C2410X_IOPORT_REG * v_pIOPregs;
enum {Kscan0, Kscan1, Kscan2, Kscan3} KscanSwitch;
typedef struct
{
UINT32 RetryTimes;
UINT32 *LatestRetryTimes;
} KeyPadContext, *PKeyPadContext;
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
DEBUGREGISTER(hInstDll);
break;
}
return TRUE;
}
UINT32 DetectKscan(PVOID pArg)
{
UINT32 i;
PKeyPadContext pKeyPadContext = (PKeyPadContext)pArg;
for(i =0; i < pKeyPadContext->RetryTimes; i++)
{
//Kscan CON = input, Read DAT
//Kscan0 - GPE11
v_pIOPregs->GPECON &= ~(0x3 << 22);
if( v_pIOPregs->GPEDAT & (0x1 << 11) )
return Kscan0;
v_pIOPregs->GPGCON &= ~(0x3 << 12);
if( v_pIOPregs->GPGDAT & (0x1 << 6) )
return Kscan1;
v_pIOPregs->GPECON &= ~(0x3 << 26);
if( v_pIOPregs->GPEDAT & (0x1 << 13) )
return Kscan2;
v_pIOPregs->GPGCON &= ~(0x3 << 4);
if( v_pIOPregs->GPGDAT & (0x1 << 2) )
return Kscan3;
DEBUGMSG(ZONE_WARN, (TEXT( "Detect Kscan: %d times" ), i + 1));
}
DEBUGMSG( ZONE_ERR, (TEXT("Kscan Detection Failed!")));
return -1;
}
void EnableKscan()
{
//Kscan CON = output, DAT = 0
//Kscan0 - GPE11
v_pIOPregs->GPECON &= ~(0x3 << 22);
v_pIOPregs->GPECON |= (0x1 << 22);
v_pIOPregs->GPEDAT &= ~(0x1 << 11);
//Kscan1 - GPG6
v_pIOPregs->GPGCON &= ~(0x3 << 12);
v_pIOPregs->GPGCON |= (0x1 << 12);
v_pIOPregs->GPGDAT &= ~(0x1 << 6);
//Kscan2 - GPE13
v_pIOPregs->GPECON &= ~(0x3 << 26);
v_pIOPregs->GPECON |= (0x1 << 26);
v_pIOPregs->GPEDAT &= ~(0x1 << 13);
//Kscan3 - GPG2
v_pIOPregs->GPGCON &= ~(0x3 << 4);
v_pIOPregs->GPGCON |= (0x1 << 4);
v_pIOPregs->GPGDAT &= ~(0x1 << 2);
}
DWORD KeyPadIST(PVOID pArg)
{
UINT32 KeyPadIrq = IRQ_EINT0;
UINT32 KeyPadSysIntr = 0x20;
HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
// if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &KeyPadIrq, sizeof(UINT32), &KeyPadSysIntr, sizeof(UINT32), NULL))
// {
// RETAILMSG(1, (TEXT("KeyPadIST:Failed to request sysintr value.\r\n")));
// return(0);
// }
if (!(InterruptInitialize
(KeyPadSysIntr, event, 0, 0)))
{
RETAILMSG(1, (TEXT("KeyPadIST: InterruptInitialize failed.\r\n")));
}
while(TRUE)
{
WaitForSingleObject(event, INFINITE);
//detect Kscan
switch(DetectKscan(pArg))
{
case Kscan0:
RETAILMSG(1, (TEXT("Button K10 is pressed!!!\r\n")));
TouchCalibrate();
break;
case Kscan1:
RETAILMSG(1, (TEXT("Button K11 is pressed!!!\r\n")));
break;
case Kscan2:
RETAILMSG(1, (TEXT("Button K12 is pressed!!!\r\n")));
break;
case Kscan3:
RETAILMSG(1, (TEXT("Button K16 is pressed!!!\r\n")));
break;
default:
RETAILMSG(1, (TEXT("Detection Failed.\r\n")));
}
EnableKscan();
InterruptDone(KeyPadSysIntr);
}
return 0;
}
DWORD KPD_Init(LPCTSTR pContext, DWORD dwBusContext)
{
PKeyPadContext pKeyPadContext;
DWORD RetValue = TRUE;
pKeyPadContext = (PKeyPadContext)LocalAlloc( LPTR, sizeof(KeyPadContext) );
pKeyPadContext->RetryTimes = 3;
v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPregs == NULL)
{
ERRORMSG(1,(TEXT("KPD_Init: VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2410X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("KPD_Init: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
if (v_pIOPregs)
{
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
}
v_pIOPregs = NULL;
}
//EINT0 - falling edge interrupt
v_pIOPregs->GPFCON &= ~(0x3 << 0); /* Set EINT0(GPF0) as EINT0 */
v_pIOPregs->GPFCON |= (0x2 << 0);
v_pIOPregs->EXTINT0 &= ~(0x7 << 0); /* Configure EINT0 as Falling Edge Mode */
v_pIOPregs->EXTINT0 |= (0x3 << 0);
EnableKscan();
//Create IST
CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) KeyPadIST,
(LPVOID)pKeyPadContext, 0, NULL);
return (DWORD)pKeyPadContext;
}
BOOL KPD_Deinit( DWORD hDeviceContext )
{
return TRUE;
}
DWORD KPD_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
DWORD hOpenContext = hDeviceContext;
return hOpenContext;
}
BOOL KPD_Close( DWORD hOpenContext )
{
return TRUE;
}
DWORD KPD_Read(DWORD hDeviceContext, LPVOID pBuffer, DWORD dwNumBytes)
{
PKeyPadContext pKeyPadContext = (PKeyPadContext)hDeviceContext;
if( pBuffer == NULL || dwNumBytes < 4 )
return -1;
else
{
*(UINT32 *)pBuffer = pKeyPadContext->RetryTimes;
return sizeof(UINT32);
}
return 0;
}
DWORD KPD_Write(DWORD hDeviceContext, LPCVOID pBuffer, DWORD dwNumBytes)
{
PKeyPadContext pKeyPadContext = (PKeyPadContext)hDeviceContext;
if( pBuffer == NULL || dwNumBytes < 4 )
return -1;
else
{
pKeyPadContext->RetryTimes = *(UINT32 *)pBuffer;
return sizeof(UINT32);
}
return 0;
}
DWORD KPD_Seek(DWORD hDeviceContext, long lDistance, DWORD dwMoveMethod)
{
return 0;
}
#define IOCTL_FILE_CALLER_BUFFER 0x87654321
BOOL KPD_IOControl(
DWORD hDeviceContext,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
{
PKeyPadContext pKeyPadContext = (PKeyPadContext)pInBuf;
PVOID pMarshalled;
HRESULT hr;
switch(dwIoControlCode)
{
case IOCTL_FILE_CALLER_BUFFER:
hr = CeOpenCallerBuffer( &pMarshalled,
pKeyPadContext->LatestRetryTimes,
4, ARG_O_PTR, FALSE);
if( FAILED(hr) )
RETAILMSG(1, (TEXT("Failed to open buffer.")));
else
RETAILMSG(1, (TEXT("Suceed to open buffer.")));
//Handle buffer....
CeCloseCallerBuffer( pMarshalled,
pKeyPadContext->LatestRetryTimes,
4, ARG_O_PTR);
break;
}
return TRUE;
}
void KPD_PowerUp( DWORD hDeviceContext )
{
return;
}
void KPD_PowerDown( DWORD hDeviceContext )
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -