📄 keyboard.c.bak
字号:
/*******************************************************************************
* S3C2410 BSP (Windows CE.NET)
*
* keyboard Driver
*
* author: ajis
*
* version: 0.90
*
* date: 2005/08/02
*
* Log: uart1 set to interrupt mode
* use the variable gRecBuffer as receiver buffer , the recbuffer value change only when a
*
******************************************************************************
*/
#include <windows.h>
#include <types.h>
#include <tchar.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <diskio.h>
#include <nkintr.h>
#include <oalintr.h>
#include <windev.h>
#include "s2410.h"
#define PUBLIC
static unsigned char gRecBuffer;
static unsigned char gPowerFlag;
//static unsigned char gPowerkey;
//static unsigned char g_poweronflag;
static volatile IOPreg * v_pIOPregs;
static volatile UART1reg *v_pUART1regs;
static volatile INTreg *v_pINTregs;
static BOOL KEY_InitializeAddressesIO(VOID);
static BOOL KEY_InitializeAddressesINT(VOID);
static BOOL KEY_InitializeAddresses(VOID);
static HANDLE gKeyBoardIntrEvent;
static HANDLE gKeyBoardIntrThread;
typedef DWORD (*KEY_SetSystemKeyboardState)(LPCWSTR, DWORD, DWORD);
KEY_SetSystemKeyboardState gpfnSetSystemKeyboardState;
CRITICAL_SECTION Crit;
static HANDLE gKeyEvent;
void inituart1(void)
{
unsigned int pclk = S2410PCLK;
unsigned int baud = 9600 ,i;
v_pIOPregs->rGPHCON |= 0x0a00; //set gph4&5 to tx1&rx1
v_pUART1regs->rUFCON = 0x0;//v_pUART1regs->rUFCON = 0x3;//v_pUART1regs->rUFCON = 0x0; //UFCON1 0x50004008 UART FIFO CONTROL REGISTER
v_pUART1regs->rULCON = 0x3; //ULCON1 0x50004000 UART LINE CONTROL REGISTER
v_pUART1regs->rUCON = 0x05;//0x0203;//v_pUART1regs->rUCON = 0x01; //UCON1 0x50004004 UART CONTROL REGISTER
v_pUART1regs->rUBRDIV = ((int)(pclk / 16./baud) - 1);//UBRDIV1 0x50004028 UART BAUD RATE DIVISOR REGISTER
i = v_pUART1regs->rUERSTAT;
}
DWORD
KEY_IntrThread(PVOID pArg)
{
int rec,recflag;
KEY_InitializeAddresses();
KEY_InitializeAddressesIO();
KEY_InitializeAddressesINT();
inituart1();
gKeyBoardIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!(InterruptInitialize(SYSINTR_KEYBOARD, gKeyBoardIntrEvent, 0, 0))) //usart1 interrupt Initialize
{
;//RETAILMSG(1, (TEXT("::: KEYBOARD INTERRUPT Init Fail\r\n")));
}
CeSetThreadPriority(GetCurrentThread(), 146); //set(improve) Priority
while (1)
{
ResetEvent(gKeyEvent); //disable read buffer
WaitForSingleObject(gKeyBoardIntrEvent, INFINITE); //wait for interrupt
recflag=1;//v_pIOPregs->rGPFDAT ^= 0x80;
rec = v_pUART1regs->rUERSTAT;
v_pINTregs->rINTMSK |= 0x800000;
v_pINTregs->rINTSUBMSK |= 0x038;
//v_pINTregs->rSRCPND = 0x800000 ; //clear interrupt flag
//v_pINTregs->rSUBSRCPND = 0x008 ;
//v_pINTregs->rINTPND = 0x800000 ;
if (v_pUART1regs->rUTRSTAT& (1 << 0)) //receive interrupt
{
rec=v_pUART1regs->rURXH&0x0ff; //receive data
if( gRecBuffer == 0xfa ) //data is available
{
EnterCriticalSection(&Crit); //data send to buffer
gRecBuffer = (char)(v_pUART1regs->rURXH&0x0ff);
LeaveCriticalSection(&Crit);
}
}
v_pINTregs->rSRCPND = 0x800000 ; //clear interrupt flag
v_pINTregs->rSUBSRCPND = 0x008 ;
v_pINTregs->rINTPND = 0x800000 ;
v_pINTregs->rINTMSK &= ~0x800000;
v_pINTregs->rINTSUBMSK &= ~0x008;
if(recflag)
SetEvent(gKeyEvent);
else
{
EnterCriticalSection(&Crit);
gRecBuffer = 0xfa;
LeaveCriticalSection(&Crit);
}
InterruptDone(SYSINTR_KEYBOARD); //interrupt return
}
}
//********************************************************************
PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
//RETAILMSG(1, (TEXT("keyboard : DLL_PROCESS_ATTACH\r\n")));
DisableThreadLibraryCalls((HMODULE) hInstDll);
break;
}
return (TRUE);
}
//**************************************************************************************************
DWORD
KEY_Init(DWORD dwContext)
{
WORD RetValue = 1;
DWORD IDThread;
HMODULE hmCore;
gKeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
InitializeCriticalSection(&Crit);
hmCore = (HMODULE) LoadLibrary(_T("coredll.dll"));// need it ????
if(hmCore != NULL)
{
gpfnSetSystemKeyboardState = (KEY_SetSystemKeyboardState)GetProcAddress(hmCore, _T("SetSystemKeyboardState"));
if(gpfnSetSystemKeyboardState == NULL)
{
FreeLibrary(hmCore);
}
}
do
{
gKeyBoardIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) KEY_IntrThread, 0, 0, &IDThread);
//RETAILMSG(1, (TEXT("::: KEY_IntrThread ID = %x\r\n"), IDThread));
if (gKeyBoardIntrThread == 0)
{
//RETAILMSG(1, (TEXT(":::keyboard CreateThread() Fail\r\n")));
break;
}
//LeaveCriticalSection(&Crit);
}
while (0);
gPowerFlag = 0x0;
//g_poweronflag = 0x0;
RetValue = 1;
return RetValue;
}
BOOL
KEY_Close( DWORD hOpenContext )
{
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_Close\n")));
return TRUE;
} // KEY_Close
BOOL
KEY_Deinit ( DWORD hDeviceContext )
{
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_Deinit\n")));
return TRUE;
} // KEY_Deinit
DWORD
KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
DWORD dwRet = 1;
EnterCriticalSection(&Crit);
gRecBuffer = 0xfa;
LeaveCriticalSection(&Crit);
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_Open\n")));
return dwRet ;
} // KEY_Open
BOOL
KEY_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
BOOL bRet = TRUE;
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_IOControl\n")));
return bRet;
} // KEY_IOControl
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
//unsigned char kBuffer[2];
PUCHAR tmp = pBuffer;
if (*tmp != 1)
{
//RETAILMSG(1,(TEXT("Key tmp != 1\n")));
if (gRecBuffer != 0xfa)
{
NULL;
}
else
{
if(gPowerFlag == 0x1)
{
gPowerFlag = 0x0;
*tmp = 0xff;
gRecBuffer = 0xfa;
//RETAILMSG(1,(TEXT("gPowerFlag gRecBuffer = %d\n"),gRecBuffer));
return 1;
}
else
{
//RETAILMSG(1,(TEXT("Keyboard wait\n")));
WaitForSingleObject(gKeyEvent, INFINITE);
//RETAILMSG(1,(TEXT("Keyboard readout\n")));
if(gPowerFlag == 0x1)
{
gPowerFlag = 0x0;
*tmp = 0xff;
//gRecBuffer = 0xfa;
//RETAILMSG(1,(TEXT("gPowerFlag gRecBuffer = %d\n"),gRecBuffer));
return 1;
}
}
}
//RETAILMSG(1,(TEXT("get key: %d\n"), gRecBuffer));
*tmp = gRecBuffer;
gRecBuffer = 0xfa;
return 1;
}
else
{
//RETAILMSG(1,(TEXT("gRecBuffer = %d\n"),gRecBuffer));
if(gPowerFlag == 0x1)
*tmp = 0xff;
else
*tmp = gRecBuffer;
return 0;
}
}
DWORD KEY_Write(DWORD hOpenContext, int *pBuffer, DWORD NumberOfBytes)
{
//EnterCriticalSection(&Crit);
//gRecBuffer = 0xfa;
//LeaveCriticalSection(&Crit);
int senddata = *pBuffer, i = 0;
// TCHAR buf[5];
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_Write, %d, %x, %x\n"), senddata, (char)senddata, (v_pUART1regs->rUTRSTAT & 0x2)));
if ( senddata == 0xff00ff00)
{
TerminateThread(gKeyBoardIntrThread,0x255);
}
for(i = 0; i < 3;)
{
if (v_pUART1regs->rUTRSTAT & 0x2)
{
v_pUART1regs->rUTXH = (char)senddata;
i = i + 1;
}
}
return 1;
}
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_Seek\n")));
return 0;
}
void KEY_PowerUp(DWORD hDeviceContext)
{
inituart1();
v_pINTregs->rSRCPND = 0x800000 ; //clear interrupt flag
v_pINTregs->rSUBSRCPND = 0x008 ;
v_pINTregs->rINTPND = 0x800000 ;
v_pINTregs->rINTMSK &= ~0x800000;
v_pINTregs->rINTSUBMSK &= ~0x008;
//g_poweronflag = 0x1;
//gPowerFlag = 0x1;
//gRecBuffer = 0xff;
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_PowerUp\n")));
return;
}
void KEY_PowerDown(DWORD hDeviceContext)
{
//RETAILMSG(1,(TEXT("KEYBOARD: KEY_PowerDown\n")));
return;
}
//*****************************88
static BOOL
KEY_InitializeAddressesIO(VOID)
{
BOOL RetValue = TRUE;
v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPregs == NULL)
{
//ERRORMSG(1,(TEXT("For KEY_IOPregs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE))
{
//ERRORMSG(1,(TEXT("For KEY_IOPregs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
//RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Fail!!\r\n") ));
if (v_pIOPregs)
{
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
}
v_pIOPregs = NULL;
}
else
{
;
//RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Success\r\n") ));
}
return(RetValue);
}
static BOOL
KEY_InitializeAddressesINT(VOID)
{
BOOL RetValue = TRUE;
v_pINTregs = (volatile INTreg *)VirtualAlloc(0, sizeof(INTreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pINTregs == NULL)
{
//ERRORMSG(1,(TEXT("For KEY_INTregs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pINTregs, (PVOID)(INT_BASE), sizeof(INTreg), PAGE_READWRITE | PAGE_NOCACHE))
{
//ERRORMSG(1,(TEXT("For KEY_INTregs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
//RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Fail!!\r\n") ));
if (v_pINTregs)
{
VirtualFree((PVOID) v_pINTregs, 0, MEM_RELEASE);
}
v_pINTregs = NULL;
}
else
{
;
//RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Success\r\n") ));
}
return(RetValue);
}
static BOOL
KEY_InitializeAddresses(VOID)
{
BOOL RetValue = TRUE;
//RETAILMSG (1, (TEXT("KEY_InitializeAddresses \r\n") ));
v_pUART1regs = (volatile UART1reg *)VirtualAlloc(0, sizeof(UART1reg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pUART1regs == NULL)
{
//ERRORMSG(1,(TEXT("For KEYBOARD_UART1regs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pUART1regs, (PVOID)(UART1_BASE), sizeof(UART1reg), PAGE_READWRITE | PAGE_NOCACHE))
{
//ERRORMSG(1,(TEXT("For KEYBOARD_UART1regs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
//RETAILMSG (1, (TEXT("::: KEYBOARD_InitializeAddresses - Fail!!\r\n") ));
if (v_pUART1regs)
{
VirtualFree((PVOID) v_pUART1regs, 0, MEM_RELEASE);
}
v_pUART1regs = NULL;
}
else
{
;
//RETAILMSG (1, (TEXT("KEYBOARD_InitializeAddresses - Success\r\n") ));
}
return(RetValue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -