2416的按键驱动 for wince6
来源:互联网 发布:淘宝主播介绍怎么写 编辑:程序博客网 时间:2024/06/18 17:37
1.userkey.cpp
此处实现了GPG1引脚的按键返回给应用程序
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <bsp.h>
#include "Mmsystem.h"
#include <s3c2416_intr.h>
#include <pm.h>
#include <DrvLib.h>
//#include <s3c6410_gpio.h>
#include <s3c2416_base_regs.h>
#pragma comment(lib,"ceddk.lib")
#include "pmplatform.h"
#include "Pkfuncs.h"
#define KEY_COUNT 1
volatile S3C2416_IOPORT_REG *g_pGPIOReg = NULL;// GPIO registers (needed to enable I2S and SPI)
static HANDLE KeyThread;
static HANDLE KeyEvent;
static HANDLE APIEvent;
static BYTE KeyValues[KEY_COUNT] = { 0 };
static void Virtual_Alloc(); // Virtual allocation
static DWORD UserKeyProcessThread(void);
static const TCHAR szevtUserInput[] = L"FriendlyARM/ButtonEvent";
static inline void GetKeyValues(BYTE values[])
{
values[0] = !(g_pGPIOReg->GPGDAT & 0x02U); //GPG1
}
static DWORD UserKeyProcessThread(void)
{
UINT32 IRQ;
//HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
while(1)
{
Sleep(80);//防抖
BYTE Keys[KEY_COUNT];
bool Changed = false;
GetKeyValues(Keys);
for (int i = 0; i < KEY_COUNT; i++) {
if (Keys[i] != KeyValues[i]) {
KeyValues[i] = Keys[i];
Changed = true;
}
}
if (!Changed) {
continue;
}
//WaitForSingleObject(KeyEvent, INFINITE);
SetEvent(UserInputEvent);
SetEvent(APIEvent);
}
}
static void Virtual_Alloc()
{
g_pGPIOReg = (S3C2416_IOPORT_REG *)DrvLib_MapIoSpace(S3C2416_BASE_REG_PA_IOPORT, sizeof(S3C2416_IOPORT_REG), FALSE);
if (g_pGPIOReg == NULL) {
RETAILMSG(0,(TEXT("BUTTON: VirtualAlloc failed\r\n")));
}
}
BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID Reserved/* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}
BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;
RETAILMSG(0,(TEXT("USERKEY: KEY_Deinit\r\n")));
CloseHandle(KeyThread);
CloseHandle(KeyEvent);
CloseHandle(APIEvent);
return TRUE;
}
BOOL KeyGpioInit()
{
RETAILMSG(0,(TEXT("Key_Gpio_Setting----\r\n")));
// GPIO and EINT config
return TRUE;
}
DWORD KEY_Init(DWORD dwContext)//按键初始化
{
DWORD threadID; // thread ID
RETAILMSG(0,(TEXT("KEY_Init----\r\n")));
// 1. Virtual Alloc
Virtual_Alloc();
KeyGpioInit();
KeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!KeyEvent) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create event.\r\n")));
return FALSE;
}
APIEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!APIEvent) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create API event.\r\n")));
return FALSE;
}
KeyThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UserKeyProcessThread, 0, 0, &threadID);
if (NULL == KeyThread ) {
RETAILMSG(1,(TEXT("ERROR: failed to Create Key Thread!\r\n")));
return FALSE;
}
return TRUE;
}
static bool ShutDownRead;
//-----------------------------------------------------------------------------
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
ShutDownRead = false;
SetEvent(APIEvent);
RETAILMSG(0,(TEXT("USERKEY: KEY_Open\r\n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_Close(DWORD hOpenContext)
{
RETAILMSG(0,(TEXT("USERKEY: KEY_Close\r\n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerDown(DWORD hDeviceContext)
{
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerUp(DWORD hDeviceContext)
{
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
RETAILMSG(0,(TEXT("USERKEY: KEY_Read\r\n")));
if (Count < 1 || pBuffer == NULL) {
SetLastError(ERROR_INVALID_DATA);
return -1;
}
DWORD total = Count;
if (total > KEY_COUNT) {
total = KEY_COUNT;
}
DWORD ret = WaitForSingleObject(APIEvent, INFINITE);
if (ret != WAIT_OBJECT_0) {
SetLastError(WAIT_TIMEOUT);
return -1;
}
if (ShutDownRead) {
//RETAILMSG(1,(TEXT("USERKEY: be asked to close\r\n")));
SetLastError(ERROR_HANDLE_EOF);
return -1;
}
RETAILMSG(0,(TEXT("USERKEY: Reset count is %d\r\n"), Count));
BYTE Keys[KEY_COUNT];
GetKeyValues(Keys);
memcpy(pBuffer, Keys, total);
return total;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}
BOOL KEY_PreClose(DWORD hOpenContext)
{
ShutDownRead = true;
SetEvent(APIEvent);
//RETAILMSG(1,(TEXT("USERKEY: PreClose\r\n")));
return TRUE;
}
BOOL KEY_PreDeinit(DWORD hOpenContext)
{
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
return 0;
}
2.userkey.h
#ifndef __USERKEY_H_
#define __USERKEY_H_
#ifdef __cplusplus
extern "C" {
#endif
BOOL KEY_Close(DWORD hOpenContext);
BOOL KEY_Deinit(DWORD hDeviceContext);
DWORD KEY_Init(DWORD dwContext);
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);
void KEY_PowerUp(DWORD hDeviceContext);
void KEY_PowerDown(DWORD hDeviceContext);
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type);
BOOL KEY_PreClose(DWORD hOpenContext);
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes);
BOOL KEY_PreDeinit(DWORD hOpenContext);
BOOL KEY_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut);
#ifdef __cplusplus
}
#endif
#endif /* __CAMERA_H_ */
3.platform.bib添加
;------------- userkey Driver -------------------------------------------------------------
userkey.dll $(_FLATRELEASEDIR)\userkey.dll NK SHK
;------------- userkey Driver -------------------------------------------------------------
4.platform.reg添加
;================ userkey ===========
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\userkey]
"Prefix"="KEY"
"Dll"="userkey.dll"
"Order"="200"
5.应用程序读取
初始化程序时添加
m_Device = CreateFile(L"KEY1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
m_ReadThread = CreateThread(0, 0, ReadButtonDeviceProc, this, 0, NULL);
函数,应用程序名称为a1,
DWORD WINAPI Ca1Dlg::ReadButtonDeviceProc(__in LPVOID lp)
{
Ca1Dlg *me = (Ca1Dlg *)lp;
while (1) {
DWORD retLen;
BOOL ret = ReadFile(me->m_Device, me->ButtonMap, sizeof (me->ButtonMap), &retLen, NULL);
if (!ret) {
break;
}
me->SendMessage (WM_WININICHANGE, 0, 0);
}
return 0;
}
void Ca1Dlg::OnWinIniChange(LPCTSTR lpszSection)
{
CDialog::OnWinIniChange(lpszSection);
wchar_t Text[10];
memset(Text, 0, sizeof Text);
for (unsigned i = 0; i < sizeof (ButtonMap) / sizeof (ButtonMap[0]); i++) {
Text[i] = ButtonMap[i] != 0 ? L'X' : L'0';
}
if (Text[0] != L'0')
{
OpenReset();
Restartsys();
}
ButtonMapLabel.SetWindowText(Text);
// TODO: Add your message handler code here
}
void Ca1Dlg::OnDestroy()
{
CloseHandle(m_Device);
WaitForSingleObject(m_ReadThread, INFINITE);
RETAILMSG(1, (L"sub-Thread Closed!\r\n"));
}
LRESULT Ca1Dlg::OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam)//消息接收执行
{
UpdateData(TRUE);//把框数据转换到值
return true;
}
// Ca1Dlg 对话框
//软件启动定义
Ca1Dlg::Ca1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(Ca1Dlg::IDD, pParent)
, m_ReadThread(NULL)
, m_Device(NULL)
添加此定义
a1dlg.h添加定义
private:
unsigned char ButtonMap[8];
HANDLE m_ReadThread;
HANDLE m_Device;
static DWORD WINAPI ReadButtonDeviceProc(__in LPVOID);
public:
afx_msg void OnWinIniChange(LPCTSTR lpszSection);
afx_msg void OnDestroy();
afx_msg LRESULT OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam);
- 2416的按键驱动 for wince6
- 2416的LED驱动 for wince6
- WINCE6.0的中断驱动
- WINCE6.0的NANDFLASH驱动
- dm9000aep,cep for wince6 驱动修改和读取注册表mac的方法
- mini2440的按键驱动
- mini2440的按键驱动
- OK6410的按键驱动
- WINCE6 驱动
- wince6下6410的I2C驱动问题
- 基于WINCE6.0+S3C2443的camera驱动
- WINCE6.0+S3C6410下的DM9000A驱动
- 基于WINCE6.0+S3C6410的背光驱动
- WINCE6.0+S3C6410的触摸屏驱动
- WINCE6.0+S3C6410的触摸屏驱动
- 基于WINCE6.0+S3C6410的背光驱动
- 基于WINCE6.0+S3C2443的camera驱动
- WINCE6.0+S3C6410的触摸屏驱动
- 50个常用sql语句
- Maven - 安装 配置
- oracle查询通配符做普通字符使用
- checkbox click 事件改变当前url时候的问题
- 2012-07-04_云成互动
- 2416的按键驱动 for wince6
- uva 10879 - Code Refactoring
- C#基础知识整理:.NET知识
- C#数据类型
- 刘殷为相
- ubuntu下如何 安装jdk
- 在网络传输过程中解决加载图片过多,过大问题
- 嵌入式系统的知识体系、学习误区、学习建议
- 降级论