📄 keyboarddriver.cpp
字号:
// KeyBoard.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "KeyBoardDriver.h"
//驱动程序的动态入口 WINAPI DllEntry APIENTRY DllMain
BOOL WINAPI DllEntry( HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved )
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGMSG(1, (TEXT("DllEntry: DLL_PROCESS_ATTACH\r\n")));
//DEBUGREGISTER(hInst); //This macro registers the current module (a DLL or process) and its associated debug zone with the kernel debug subsystem
DisableThreadLibraryCalls ((HINSTANCE)hModule); //挂载成功 (HINSTANCE)hModule; //代表应用程序载入的模块
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(1, (TEXT("DllEntry: DLL_PROCESS_DETACH\r\n"))); //卸载成功
break;
}
return TRUE;
}
//申请GPIO寄存器地址对应的虚拟空间
static BOOL EINT_InitalizeAddresses(void)
{
BOOL RetValue = TRUE ;
//----------------------------------------------------------------------------------------------
v_pIOPregs = (IOPreg*) VirtualAlloc((LPVOID)NULL, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS) ;
if(v_pIOPregs == NULL)
{
RetValue = FALSE ;
RETAILMSG(1, (TEXT("v_pIOPregs: VirtualAlloc v_pIOPregs failed!\r\n")));
}
else
{
if(!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE_PHY>>8),
sizeof(IOPreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RetValue = FALSE ;
RETAILMSG(1, (TEXT("v_pIOPregs: VirtualCopy v_pIOPregs failed!\r\n")));
}
}
//----------------------------------------------------------------------------------------------
v_pINTreg = (INTreg*) VirtualAlloc(NULL, sizeof(INTreg), MEM_RESERVE, PAGE_NOACCESS) ;
if (v_pINTreg == NULL)
{
RetValue = FALSE ;
RETAILMSG(1, (TEXT("v_pIOPregs: VirtualAlloc v_pINTreg failed!\r\n")));
}
else
{
if(!VirtualCopy((PVOID)v_pINTreg, (PVOID)(INT_BASE_PHY>>8),
sizeof(INTreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RetValue = FALSE ;
RETAILMSG(1, (TEXT("INTreg: VirtualCopy v_pINTreg failed!\r\n")));
}
}
//----------------------------------------------------------------------------------------------
v_pPWMreg = (PWMreg*) VirtualAlloc((LPVOID)NULL, sizeof(PWMreg), MEM_RESERVE, PAGE_NOACCESS) ;
if(v_pPWMreg == NULL)
{
RetValue = FALSE ;
RETAILMSG(1, (TEXT("v_pPWMreg: VirtualAlloc v_pPWMreg failed!\r\n")));
}
else
{
if(!VirtualCopy((PVOID)v_pPWMreg, (PVOID)(PWM_BASE_PHY>>8),
sizeof(IOPreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RetValue = FALSE ;
RETAILMSG(1, (TEXT("v_pPWMreg: VirtualCopy v_pPWMreg failed!\r\n")));
}
}
//----------------------------------------------------------------------------------------------
if(! RetValue)
{
RETAILMSG(1, (TEXT("EINT_InitalizeAddresses failed!\r\n")));
if(v_pIOPregs)
{
VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
}
v_pIOPregs = NULL;
}
RETAILMSG(1, (TEXT("EINT_InitalizeAddresses Success!\r\n")));
return RetValue ;
}
static void ENIT_ConfigInterruptPin(void)
{
//--------------中断方式 //GPG11(K1) ---------------
v_pIOPregs->rGPGCON &= ~(0x03<<22) ;
v_pIOPregs->rGPGCON |= (0x02<<22) ;
v_pINTreg->rINTMSK &=~(BIT_EINT8_23) ;
v_pIOPregs->rEINTMASK &= ~(1<<19) ;
v_pIOPregs->rEXTINT2 &= ~(0x07<<12) ;
v_pIOPregs->rEXTINT2 |= (0x03<<12) ; //为下降沿触发
// v_pIOPregs->rGPGUP &= ~(1<<11); //上拉
//--------------中断方式 //GPG3(K2) ---------------
v_pIOPregs->rGPGCON &= ~(0x03<<6) ; //GPG3(K2)
v_pIOPregs->rGPGCON |= (0x02<<6) ;
v_pINTreg->rINTMSK &=~(BIT_EINT8_23) ;
v_pIOPregs->rEINTMASK &= ~(1<<11) ;
v_pIOPregs->rEXTINT1 &= ~(0x07<<12) ;
v_pIOPregs->rEXTINT1 |= (0x03<<12) ; //为下降沿触发
//------------------初始化LED口----------------------
v_pIOPregs->rGPBCON &= ~(2 << 12);
v_pIOPregs->rGPBCON |= (1 << 12);
v_pIOPregs->rGPBUP &= ~(1 << 6); //上拉
v_pIOPregs->rGPBDAT |= (1 << 6); //LED 2 off
//-------------------定时器0初始化-----------------------
v_pIOPregs->rGPBCON &= ~0x03 ; //定时器功能
v_pIOPregs->rGPBCON |= 0x01 ; //设置为输出
v_pIOPregs->rGPBUP &= ~0x01 ; //上拉
v_pIOPregs->rGPBDAT &= ~0x01 ; //设为低电平
v_pINTreg->rINTMSK |= BIT_TIMER0; // Mask timer0 interrupt.
v_pINTreg->rSRCPND = BIT_TIMER0; // Clear pending bit
v_pINTreg->rINTPND = BIT_TIMER0;
v_pPWMreg->rTCFG0 &= ~0xFF ;
v_pPWMreg->rTCFG0 |= (PRESCALER);
v_pPWMreg->rTCFG1 &= ~0x0F ; //0000 0000 0000 XXXX XXXX XXXX XXXX 0001,Select MUX input for PWM Timer0. 0001 = 1/4
#if( SYS_TIMER_DIVIDER == 2 )
v_pPWMreg->rTCFG1 |= 0x00 ; // 1/2
#elif( SYS_TIMER_DIVIDER == 4 )
v_pPWMreg->rTCFG1 |= 0x1 ; // 1/4
#elif( SYS_TIMER_DIVIDER == 8 )
v_pPWMreg->rTCFG1 |= 0x02 ; // 1/8
#elif( SYS_TIMER_DIVIDER == 16 )
v_pPWMreg->rTCFG1 |= 0x03 ; // 1/16
#endif
// S2440PCLK = 0x2faf080, PRESCALER = 0x18, SYS_TIMER_DIVIDER = 0x02.
v_pPWMreg->rTCNTB0 = (10 * (S2440PCLK / (PRESCALER+1) / SYS_TIMER_DIVIDER)) / 1000;
v_pPWMreg->rTCMPB0 = 0x0;
/*
unsigned int TmpTCON ;
TmpTCON = v_pPWMreg->rTCON; // get TCON value to temp TCON register
TmpTCON &= ~0x0F; // clear fields of Timer 0
TmpTCON |= 0x02; // interval mode(auto reload), update TCVNTB0, stop
v_pPWMreg->rTCON = TmpTCON; // put the value to TCON register
TmpTCON = v_pPWMreg->rTCON; // get TCON value to temp TCON register
TmpTCON &= ~0x0F; // clear fields of Timer 0
TmpTCON |= 0x01; // interval mode, no operation, start for Timer 0
v_pPWMreg->rTCON = TmpTCON; // put the value to TCON register
*/
v_pPWMreg->rTCON &= ~0x0F;
v_pPWMreg->rTCON |= 0x02;
v_pPWMreg->rTCON &= ~0x0F;
v_pPWMreg->rTCON |= 0x01;
v_pINTreg->rINTMSK &= ~BIT_TIMER0; //开中断
//-------------------- PWM output-------------------------------
/* v_pIOPregs->rGPBCON &= ~0x03 ;
v_pIOPregs->rGPBCON |= 0x02 ; //设置为PWM 输出
v_pIOPregs->rGPBUP &= ~0x01 ; //上拉
v_pIOPregs->rGPBDAT &= ~0x01 ; //设为低电平
v_pPWMreg->rTCON &= ~0x000F ; // clear manual update bit, stop Timer0
// v_pPWMreg->rTCFG0 &= ~0x00FF ;
// v_pPWMreg->rTCFG0 |= 0x00FF;
v_pPWMreg->rTCFG1 &= ~0x0F ; //0000 0000 0000 XXXX XXXX XXXX XXXX 0001,Select MUX input for PWM Timer0. 0001 = 1/4
v_pPWMreg->rTCFG1 |= 0x03 ; //1/4
v_pPWMreg->rTCNTB0 = 0xFFF0 ;
v_pPWMreg->rTCMPB0 = 0x8FFF ;
v_pPWMreg->rTCNTO0 = 0xFFF0 ;
v_pPWMreg->rTCON |= 0x000B ;
v_pPWMreg->rTCON &= ~0x0002 ;
*/
//------------------------- AIN0 -------------------------------
// RETAILMSG(1, (TEXT("ENIT_ConfigInterruptPin Success!\r\n")));
}
BOOL Key_IsPushed(void)
{
KeyValue = 0 ;
// return (((v_pIOPregs->rGPGDAT & 0x0800) ? FALSE : TRUE) || ((v_pIOPregs->rGPGDAT & 0x0008) ? FALSE : TRUE)) ;
RETAILMSG(1, (TEXT("v_pINTreg->rSRCPND: 0x%x.\r\n"),v_pINTreg->rSRCPND));
RETAILMSG(1, (TEXT("v_pIOPregs->rEINTPEND: 0x%x.\r\n"),v_pIOPregs->rEINTPEND));
if(((v_pIOPregs->rEINTPEND) >>19) && 0x01) //K1 v_pIOPregs->rEINTPEND v_pINTreg->rSRCPND
{
KeyValue = Key1Value ;
return 1;
}
else if(((v_pIOPregs->rEINTPEND) >>11) && 0x01) //K2
{
KeyValue = Key2Value ;
return 1;
}
else if(((v_pINTreg->rSRCPND) >> 10) && 0x01 )
{
KeyValue = Time0Value ;
return 1;
}
else return 0;
}
//外部中断中断服务线程 WINAPI
DWORD WINAPI EINTKey_IntrThread(PVOID pArg)
{
DWORD ret;
//创建外部中断事件
gWaitEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
// RETAILMSG(1, (TEXT("EINTKey_IntrThread: gWaitEvent is 0x%x.\r\n"), gWaitEvent));
//-----------------------------------------------------------------------------------
//被始化外部按键中断,注册中断事件,允许外部中断
if(! (InterruptInitialize(g_EINTSysIntr19, gWaitEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("EINTKey_IntrThread: g_EINTSysIntr19 InterruptInitialize failed! g_EINTSysIntr19 is 0x%x.\r\n"), gWaitEvent));
CloseHandle(gWaitEvent) ;
return 0 ;
}
// RETAILMSG(1, (TEXT("EINTKey_IntrThread: EINTKey_IntrThread g_EINTSysIntr Success!\r\n")));
//-----------------------------------------------------------------------------------
if(! (InterruptInitialize(g_EINTSysIntr11, gWaitEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("EINTKey_IntrThread: g_EINTSysIntr11 InterruptInitialize failed! g_EINTSysIntr11 is 0x%x.\r\n"), gWaitEvent));
CloseHandle(gWaitEvent) ;
return 0 ;
}
// RETAILMSG(1, (TEXT("EINTKey_IntrThread: EINTKey_IntrThread g_EINTSysIntr11 Success!\r\n")));
//-----------------------------------------------------------------------------------
if(! (InterruptInitialize(g_EINTSysTime0, gWaitEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("EINTKey_IntrThread: g_EINTSysTime0 InterruptInitialize failed! g_EINTSysTime0 is 0x%x.\r\n"), gWaitEvent));
CloseHandle(gWaitEvent) ;
return 0 ;
}
// RETAILMSG(1, (TEXT("EINTKey_IntrThread: EINTKey_IntrThread g_EINTSysIntr11 Success!\r\n")));
//-----------------------------------------------------------------------------------
ENIT_ConfigInterruptPin() ;
//外部按键中断线程开始运行
while(1)
{
RETAILMSG(1, (TEXT("EINTKey_IntrThread: waitting Success!\r\n")));
ret = WaitForSingleObject(gWaitEvent, INFINITE) ; //函数用来检测hHandle事件的信号状态,当函数的执行时间超过INFINITE就返回
// RETAILMSG(1, (TEXT("EINTKey_IntrThread: ret is 0x%x.\r\n"), ret));
if((ret == WAIT_OBJECT_0) && (g_bKillIST == FALSE))
{
// RETAILMSG(1, (TEXT("EINTKey_IntrThread!\r\n")));
if(Key_IsPushed())
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -