⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboarddriver.cpp

📁 wince ARM9三星2440下的按键驱动
💻 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 + -