📄 keypad.c
字号:
#include <windows.h>
#include <s3c2410x.h>
#include <nkintr.h>
//#include <s3c2410x_ioport.h>
//#include <s3c2410x_base_regs.h>
#ifdef DEBUG
#define ZONE_ERR DEBUGZONE(0)
#define ZONE_WARN DEBUGZONE(1)
#define ZONE_INFO DEBUGZONE(2)
DBGPARAM dpCurSettings = {
_T("KEYPAD"),
{
_T("Errors"), _T("Warnings"), _T("Info"), _T(""),
_T(""), _T(""), _T(""), _T(""),
_T(""),_T(""),_T(""),_T(""),
_T(""),_T(""),_T(""),_T("")
},
//As a default,turn on Errors // & Warnings & Info debug zone
0x1
};
#endif
volatile S3C2410X_IOPORT_REG * v_pIOPregs;
typedef struct
{
UINT32 RetryTimes;
UINT32* LatestRetryTimes;
}KeyPadContext, *PKeyPadContext;
enum {Kscan0,Kscan1,Kscan2,Kscan3} KscanSwitch;
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
//registered with debug zone subsystem
//register the dpCurSettings structure
DEBUGREGISTER(hInstDll);
break;
}
return TRUE;
}
VOID EnableKscan()
{
//kscan0(GPE11) - CON = output & DAT = 0
v_pIOPregs->GPECON &= ~(0x3 << 22);
v_pIOPregs->GPECON |= (0x1 << 22);
v_pIOPregs->GPEDAT &= ~(0x1 << 11);
//kscan1(GPG6) - CON = output & DAT = 0
v_pIOPregs->GPGCON &= ~(0x3 << 12);
v_pIOPregs->GPGCON |= (0x1 << 12);
v_pIOPregs->GPGDAT &= ~(0x1 << 6);
//kscan2(GPE13) - CON = output & DAT = 0
v_pIOPregs->GPECON &= ~(0x3 << 26);
v_pIOPregs->GPECON |= (0x1 << 26);
v_pIOPregs->GPEDAT &= ~(0x1 << 13);
//kscan3(GPG2) - CON = output & DAT = 0
v_pIOPregs->GPGCON &= ~(0x3 << 4);
v_pIOPregs->GPGCON |= (0x1 << 4);
v_pIOPregs->GPGDAT &= ~(0x1 << 2);
}
UINT32 DetectKscan(PVOID pArg)
{
PKeyPadContext pKeyPadContext = (PKeyPadContext)pArg;
UINT32 i = 0;
for (i = 0; i< (pKeyPadContext->RetryTimes); i++)
{
//kscan0(GPE11) - CON = input,Read DAT
v_pIOPregs->GPECON &= ~(0x3 << 22);
if (v_pIOPregs->GPEDAT & (0x1 << 11))
return Kscan0;
//kscan1(GPG6) - CON = input,Read DAT
v_pIOPregs->GPGCON &= ~(0x3 << 12);
if (v_pIOPregs->GPGDAT & (0x1 << 6))
return Kscan1;
//kscan2(GPE13) - CON = input,Read DAT
v_pIOPregs->GPECON &= ~(0x3 << 26);
if (v_pIOPregs->GPEDAT & (0x1 << 13))
return Kscan2;
//kscan3(GPG2) - CON = input,Read DAT
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("Detect Detection Failed")));
return -1;
}
DWORD KeyPadIST(PVOID pArg)
{
//InterruptInitialize()
UINT32 KeyPadIrq = IRQ_EINT0; // Determined by SMDK2410 board layout.
//UINT32 KeyPadSysIntr = SYSINTR_UNDEFINED; //kernel mode
UINT32 KeyPadSysIntr = 0x20; //user mode
HANDLE Event = CreateEvent(NULL,FALSE,FALSE,NULL);
// Request a SYSINTR value from the OAL.
//if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&KeyPadIrq,sizeof(UINT32),&KeyPadSysIntr,sizeof(UINT32),NULL))
//{
// RETAILMSG(1,(TEXT("KeyPad: Failed to request sysintr value for KeyPad interrupt.\r\n")));
// return(0);
//}
//user mode need refactor service to do this.
if (!(InterruptInitialize(
KeyPadSysIntr, //interrupt id
Event, //interrupt event
0, 0)))
{
RETAILMSG(1, (TEXT("KeyPad: Interrupt initialize failed.\r\n")));
}
while (TRUE)
{
//WaitForSingleObject()
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("Fail to detect\r\n")));
break;
}
EnableKscan();
//Handle interrupt
//RETAILMSG(1,(TEXT("Button is pressed\r\n")));
//InterruptDone
InterruptDone(KeyPadSysIntr);
}
return 0;
}
DWORD KPD_Init(LPCTSTR pDeviceContext,DWORD dwBusContext)
{
BOOL RetValue = TRUE;
PKeyPadContext pKeyPadContext;
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
{
//>> 8 regular:(PAGE_PHYSICAL) physical map virtual must to do
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;
}
else RETAILMSG (1, (TEXT("::: PBT_InitializeAddresses - Success\r\n") ));
//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 |= (0x2 << 0);
EnableKscan();
//v_pIOPregs = *(DWORD*)0x12345678;
//Create IST
CreateThread(0,0,
(LPTHREAD_START_ROUTINE)KeyPadIST,
(LPVOID)pKeyPadContext,0,NULL);
return (DWORD)pKeyPadContext;
}
BOOL KPD_Deinit(DWORD hDeviceContext)
{
// future: pointer to the per disk structure
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 hOpenContext, LPVOID pBuffer, DWORD dwNumBytes)
{
PKeyPadContext pKeyPadContext = (PKeyPadContext)hOpenContext;
if (pBuffer == NULL || dwNumBytes < 4)
return -1;
else
{
*(UINT32*)pBuffer = pKeyPadContext->RetryTimes;
return sizeof(UINT32);
}
return 0;
}
DWORD KPD_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD dwNumBytes)
{
PKeyPadContext pKeyPadContext = (PKeyPadContext)hOpenContext;
if (pBuffer == NULL || dwNumBytes < 4)
return -1;
else
{
pKeyPadContext->RetryTimes = *(UINT32 *)pBuffer;
return sizeof(UINT32);
}
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;
switch (dwIoControlCode)
{
case IOCTL_FILE_CALLER_BUFFER:
{
HRESULT hr = CeOpenCallerBuffer(&pMarshalled,pKeyPadContext->LatestRetryTimes,4,ARG_O_PTR,FALSE);
if (FAILED(hr))
RETAILMSG(1,(TEXT("Failed to open buffer.")));
else
RETAILMSG(1,(TEXT("Succeeded to open buffer.")));
//Handle buffer
CeCloseCallerBuffer(pMarshalled,pKeyPadContext->LatestRetryTimes,4,NULL);
}
break;
default:
break;
}
return TRUE;
}
DWORD KPD_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
return 0;
}
void KPD_PowerUp(DWORD hDeviceContext)
{
return;
}
void KPD_PowerDown(DWORD hDeviceContext)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -