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

📄 keyboarddriver.cpp

📁 wince ARM9三星2440下的按键驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -