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);


原创粉丝点击