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

📄 keyboarddriver.cpp

📁 wince ARM9三星2440下的按键驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				Sleep(20);
				if(Key_IsPushed())  //外部按键是否被接下
				{	
					if(KeyValue == Time0Value)
			            v_pIOPregs->rGPBDAT ^= 0x01 ;
					SetEvent(gReadKeyEvent[0]);  //The SetEvent function sets the specified event object to the signaled state.
					RETAILMSG(1, (TEXT("EINTKey_IntrThread: Key Pushed Success two!\r\n")));
				}
			}
		}
		else 
		{
			CloseHandle(gWaitEvent);
			RETAILMSG(1, (TEXT("EINTKey_IntrThread exit!\r\n")));
			return 0;
		}
//		RETAILMSG(1, (TEXT("EINTKey_IntrThread exit!\r\n")));
	}
	return 1;
}
//======================================================================
// KEY_Init - Driver initialization function
//
DWORD KEY_Init (DWORD dwContext, LPCVOID lpvBusContext) 
{
	DWORD IDThread ;
//	MessageBox(NULL, _T("program requires Windows NT!"),_T("error"), MB_ICONERROR);

	//取得GPIO相关寄存器的虚拟地址空间
	if(EINT_InitalizeAddresses() == FALSE)
		return 0;

//---------------------------------------K1--------------------------------------------    
	//从OAL请求一个SYSINTR值   IOCTL_HAL_TRANSLATE_IRQ    IOCTL_HAL_REQUEST_SYSINTR
	if(! KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTIrq19, sizeof(UINT32), &g_EINTSysIntr19,sizeof(UINT32), NULL))
	{
		RETAILMSG(1, (TEXT("ERROR: Failed to request sysintr value for EINT interrupt!\r\n")));
		return 0;
	}
//	RETAILMSG(1, (TEXT("Infomation: EINTKey: Mapped Irq 0x%x to sysIntr 0x%x.\r\n"), g_EINTIrq, g_EINTSysIntr));
//---------------------------------------K2--------------------------------------------     
	if(! KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTIrq11, sizeof(UINT32), &g_EINTSysIntr11,sizeof(UINT32), NULL))
	{
		RETAILMSG(1, (TEXT("ERROR: Failed to request sysintr value for EINT interrupt!\r\n")));
		return 0;
	}
//	RETAILMSG(1, (TEXT("Infomation: EINTKey: Mapped Irq 0x%x to sysIntr 0x%x.\r\n"), g_EINTIrq11, g_EINTSysIntr11));
//---------------------------------------Time0 --------------------------------------------     
	if(! KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTTime0, sizeof(UINT32), &g_EINTSysTime0,sizeof(UINT32), NULL))
	{
		RETAILMSG(1, (TEXT("ERROR: Failed to request sysintr value for time0 interrupt!\r\n")));
		return 0;
	}
//	RETAILMSG(1, (TEXT("Infomation: EINTKey: Mapped Irq 0x%x to sysIntr 0x%x.\r\n"), g_EINTTime0, g_EINTSysTime0));

	//创建一个外部中断处理线程IST
	gEINTIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)EINTKey_IntrThread, 0, 0, &IDThread) ;
	if(gEINTIntrThread == NULL)
	{
		RETAILMSG(1, (TEXT("KEY_Init: CreateThread() Failed!\r\n")));
		//IOCTL_HAL_TRANSLATE_IRQ    IOCTL_HAL_REQUEST_SYSINTR
        KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr19, sizeof(UINT32), NULL, NULL, NULL);
        KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr11, sizeof(UINT32), NULL, NULL, NULL);
        KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysTime0, sizeof(UINT32), NULL, NULL, NULL);
	    return 0;
	}
	gReadKeyEvent[0] = CreateEvent(NULL, FALSE, FALSE,NULL);
	gReadKeyEvent[1] = CreateEvent(NULL, FALSE, FALSE,NULL);
    RETAILMSG(1, (TEXT("KEY_Init: CreateThread() Suceess!\r\n")));

	OpenCount = 0;
	return (DWORD)gEINTIntrThread ;
}

void EINT_ConfigPinDefault(void)
{
	 v_pINTreg->rINTMSK |= BIT_EINT8_23 ;
     v_pIOPregs->rGPGCON &= ~(0x03<<22) ;   //设置为输入
     v_pIOPregs->rGPGCON &= ~(0x03<<6) ;   //设置为输入
	 v_pIOPregs->rGPBCON &= ~0x03 ;   
//    v_pIOPregs->rGPBCON |= 0x02 ;   //设置为输出


	 v_pIOPregs->rGPBDAT |=  (1 << 6);     //LED 2 off
	 v_pIOPregs->rGPBDAT |=  0x01 ;  //设为高电平
//	 RETAILMSG(1, (TEXT("EINT_ConfigPinDefault: EINT_ConfigPinDefault SUCCESS!\r\n")));
}

//======================================================================
// KEY_Deinit - Driver de-initialization function
//
BOOL KEY_Deinit (DWORD dwContext) 
{	
    SetEvent(gWaitEvent);  //通知中断服务线程退出
   
	g_bKillIST = TRUE;
	Sleep(200);
    SetEvent(gReadKeyEvent[1]); 

	//释放中断资源
	//InterruptDone(g_EINTSysIntr19) ;
    InterruptDisable(g_EINTSysIntr19);

	//InterruptDone(g_EINTSysIntr11) ;
    InterruptDisable(g_EINTSysIntr11);

	//InterruptDone(g_EINTSysTime0) ;
    InterruptDisable(g_EINTSysTime0);

	//IOCTL_HAL_TRANSLATE_IRQ    IOCTL_HAL_REQUEST_SYSINTR
    KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr19, sizeof(UINT32), NULL, 0, NULL);
    KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysIntr11, sizeof(UINT32), NULL, 0, NULL);
	KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ, &g_EINTSysTime0, sizeof(UINT32), NULL, 0, NULL);
	//恢复外总中断引角为GPIO
	EINT_ConfigPinDefault();
	//释放申请的虚拟空间
	if(v_pIOPregs)
	{
		VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
	    RETAILMSG(1, (TEXT("KEY_Deinit: VirtualFree v_pIOPregs Success!\r\n")));
	}
	if(v_pINTreg)
	{
		VirtualFree((PVOID)v_pINTreg, 0, MEM_RELEASE);
	    RETAILMSG(1, (TEXT("KEY_Deinit: VirtualFree v_pINTreg Success!\r\n")));
	}
	if(v_pPWMreg)
	{
		VirtualFree((PVOID)v_pPWMreg, 0, MEM_RELEASE);
	    RETAILMSG(1, (TEXT("KEY_Deinit: VirtualFree v_pPWMreg Success!\r\n")));
	}

	OpenCount = 0;
	CloseHandle(gReadKeyEvent[0]);   //关闭相关事件
	CloseHandle(gReadKeyEvent[1]);
	RETAILMSG(1, (TEXT("KEY_Deinit: KEY_Deinit Success!\r\n")));
	return 1;
}

//======================================================================
// KEY_Open - CalLED when driver opened
//
DWORD KEY_Open (DWORD dwContext, DWORD dwAccess, DWORD dwShare) 
{	
	if(	OpenCount > 0)
	{
		RETAILMSG(1, (TEXT("KEY_Open failed, it is not the first open!\r\n")));
		return 0;	
	}
    OpenCount ++ ;
	return OpenCount ;
}

//======================================================================
// KEY_Close - CalKEY when driver closed
//
BOOL KEY_Close (DWORD dwOpen) 
{	
	if(	OpenCount > 0)
	{
		SetEvent(gReadKeyEvent[1]);  //通知读函数线程驱动已经关闭
	}
	OpenCount = 0;
	RETAILMSG(1, (TEXT("KEY_Close Success!\r\n")));
	return 1 ;
}

//======================================================================
// KEY_Read - CalKEY when driver read
//
DWORD KEY_Read (DWORD Handle, LPVOID pBuffer, DWORD dwCount) 
{
	DWORD ret;
	uchar* pReadBuffer;//返回应用程序的数据

	if((pBuffer == NULL) || (dwCount <= 0))
	{
		RETAILMSG(1, (TEXT("KEY_Read failed \r\n")));
		return 0;
	}
	//映射应用程序传递过来的地址
    pReadBuffer = (uchar*)MapPtrToProcess(pBuffer, GetCallerProcess());  //returns a mapped version of the LPVOID  pointer
	*pReadBuffer = 0;

	RETAILMSG(1, (TEXT("KEY_Read one \r\n")));

	//挂起当前线程,直到KEY1按下或驱逐动关闭 
	ret = WaitForMultipleObjects(2, gReadKeyEvent, FALSE, INFINITE) ;
//  RETAILMSG(1, (TEXT("KEY_Read: ret is 0x%x.\r\n"), ret));
    if(ret == WAIT_OBJECT_0)
	{
		ResetEvent(gReadKeyEvent[0]);   //The SetEvent function sets the specified event object to the signaled state.
		*pReadBuffer = KeyValue;		   
		RETAILMSG(1, (TEXT("KEY_Read: KeyValue is 0x%x.\r\n"), KeyValue));

		if(KeyValue == Key1Value)
		{
			InterruptDone(g_EINTSysIntr19) ;
//	        v_pPWMreg->rTCON &= ~0x0F;
	        v_pPWMreg->rTCON |= 0x02;
	        v_pPWMreg->rTCON &= ~0x0F;
	        v_pPWMreg->rTCON |= 0x01;
		}
		else if(KeyValue == Key2Value)
		{
			InterruptDone(g_EINTSysIntr11) ;
//			v_pPWMreg->rTCON &= ~0x0F;
	        v_pPWMreg->rTCON |= 0x02;
	        v_pPWMreg->rTCON &= ~0x0F;
	        v_pPWMreg->rTCON |= 0x01;
		}
//		if(KeyValue == Time0Value)
		InterruptDone(g_EINTSysTime0) ;
		v_pINTreg->rSRCPND &= ~BIT_TIMER0;	
		return 1;
	}
	else if(ret == WAIT_OBJECT_0 + 1)
	{
		ResetEvent(gReadKeyEvent[1]);
		RETAILMSG(1, (TEXT("KEY_Read exit! \r\n")));
		*pReadBuffer = 0;
		return 1;
	}
	return 0 ;
}

//======================================================================
// KEY_Write - CalKEY when driver written
//
DWORD KEY_Write (DWORD dwOpen, LPVOID pBuffer, DWORD dwCount) 
{
	v_pIOPregs->rGPBDAT &=  ~(1 << 6);     //LED 2 on
	return true ;
}

//======================================================================
// KEY_Seek - CalKEY when SetFilePtr calKEY
//
DWORD KEY_Seek (DWORD dwOpen, long lDelta, WORD wType) 
{
	return true ;
}

//======================================================================
// KEY_IOControl - CalKEY when DeviceIOControl calKEY
// 
DWORD KEY_IOControl (DWORD dwOpen, DWORD dwCode, PBYTE pBufferIn, DWORD dwLengthIn,
					 PBYTE pBufferOut, DWORD dwLengthOut, DWORD pdwBytesWritten) 
{
    if((int)dwCode == 10)
        v_pIOPregs->rGPBDAT |= (1 << 6);     //LED 2 off
	return true ;
}

//======================================================================
// KEY_PowerDown - CalKEY when system suspends
//
void KEY_PowerDown (DWORD dwContext) 
{
	return;
}

//======================================================================
// KEY_PowerUp - CalKEY when resumes
//
void KEY_PowerUp (DWORD dwContext) 
{
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -