📄 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) ; // 李琼用GPG11,所以要保留GPG0-GPG10共22位,GPG11初始化
v_pIOPregs->rGPGCON |= (0x02<<22) ; // 李琼23,24位为10,10表示特殊功能
v_pINTreg->rINTMSK &=~(BIT_EINT8_23) ; // 李琼 0=允许响应中断
v_pIOPregs->rEINTMASK &= ~(1<<19) ; //GPG11 对应EINT19
v_pIOPregs->rEXTINT2 &= ~(0x07<<12) ; // 12/4=3,所以对应第4个,为16,17,18,19,EINT19
v_pIOPregs->rEXTINT2 |= (0x03<<12) ; //01X ,为下降沿触发
// v_pIOPregs->rGPGUP &= ~(1<<11); //上拉 0为上拉,1为不上拉
//--------------中断方式 //GPG3(K2) ---------------
v_pIOPregs->rGPGCON &= ~(0x03<<6) ; //GPG3(K2)
v_pIOPregs->rGPGCON |= (0x02<<6) ; //3
v_pINTreg->rINTMSK &=~(BIT_EINT8_23) ; //开中断
v_pIOPregs->rEINTMASK &= ~(1<<11) ; // GPG3 对应EINT11
v_pIOPregs->rEXTINT1 &= ~(0x07<<12) ;
v_pIOPregs->rEXTINT1 |= (0x03<<12) ; //为下降沿触发
//------------------初始化LED口----------------------
v_pIOPregs->rGPBCON &= ~(2 << 12); // 李琼为0X XXXX XXXX XXXX 用GPB6
v_pIOPregs->rGPBCON |= (1 << 12); // 李琼 为01 XXXX XXXX XXXX 01表示输出
v_pIOPregs->rGPBUP &= ~(1 << 6); //上拉
v_pIOPregs->rGPBDAT |= (1 << 6); //LED 2 off 李琼输出为1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -