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

📄 keyboard.c.bak

📁 基于WinCE操作系统、SMDK2410硬件开发平台下的键盘程序——通过串口传输键值
💻 BAK
字号:
/*******************************************************************************
 *  S3C2410 BSP (Windows CE.NET)
 *
 *  keyboard Driver
 *
 *  author:  ajis
 *  
 *  version: 0.90
 *
 *  date:    2005/08/02
 *
 *  Log: uart1 set to interrupt mode
 *	    use the variable gRecBuffer as receiver buffer , the recbuffer value change only when a 
 *      
 ******************************************************************************
*/

#include <windows.h>
#include <types.h>
#include <tchar.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <diskio.h>
#include <nkintr.h>
#include <oalintr.h>
#include <windev.h>
#include "s2410.h"

#define PUBLIC
static unsigned char gRecBuffer;
static unsigned char gPowerFlag;
//static unsigned char gPowerkey;
//static unsigned char g_poweronflag;
static volatile IOPreg * v_pIOPregs;
static volatile UART1reg *v_pUART1regs;
static volatile INTreg *v_pINTregs;
static BOOL KEY_InitializeAddressesIO(VOID);
static BOOL KEY_InitializeAddressesINT(VOID);
static BOOL KEY_InitializeAddresses(VOID);

static HANDLE gKeyBoardIntrEvent;
static HANDLE gKeyBoardIntrThread;
typedef DWORD (*KEY_SetSystemKeyboardState)(LPCWSTR, DWORD, DWORD);
KEY_SetSystemKeyboardState gpfnSetSystemKeyboardState;

CRITICAL_SECTION Crit;

static HANDLE gKeyEvent;


void inituart1(void)
{
    unsigned int pclk = S2410PCLK;
    unsigned int baud = 9600 ,i;

    v_pIOPregs->rGPHCON |= 0x0a00;                  //set gph4&5 to tx1&rx1       
    
    
    v_pUART1regs->rUFCON = 0x0;//v_pUART1regs->rUFCON = 0x3;//v_pUART1regs->rUFCON = 0x0;                     //UFCON1 0x50004008  UART FIFO CONTROL REGISTER
    v_pUART1regs->rULCON = 0x3;                     //ULCON1 0x50004000  UART LINE CONTROL REGISTER
    v_pUART1regs->rUCON = 0x05;//0x0203;//v_pUART1regs->rUCON = 0x01;                     //UCON1  0x50004004  UART CONTROL REGISTER
    v_pUART1regs->rUBRDIV = ((int)(pclk / 16./baud) - 1);//UBRDIV1 0x50004028  UART BAUD RATE DIVISOR REGISTER

    i = v_pUART1regs->rUERSTAT;
}



DWORD
KEY_IntrThread(PVOID pArg)
{
    int rec,recflag;
    KEY_InitializeAddresses();
    KEY_InitializeAddressesIO();
    KEY_InitializeAddressesINT();
    inituart1();
    
    gKeyBoardIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!(InterruptInitialize(SYSINTR_KEYBOARD, gKeyBoardIntrEvent, 0, 0)))  //usart1 interrupt Initialize
    {
        ;//RETAILMSG(1, (TEXT("::: KEYBOARD INTERRUPT Init Fail\r\n")));
    }
    CeSetThreadPriority(GetCurrentThread(), 146);                            //set(improve) Priority
    while (1) 
    {
        ResetEvent(gKeyEvent);                                           //disable read buffer
        WaitForSingleObject(gKeyBoardIntrEvent, INFINITE);               //wait for interrupt
        recflag=1;//v_pIOPregs->rGPFDAT ^= 0x80;
        rec = v_pUART1regs->rUERSTAT;
        v_pINTregs->rINTMSK |= 0x800000;
        v_pINTregs->rINTSUBMSK |= 0x038;
        //v_pINTregs->rSRCPND = 0x800000 ;                          //clear interrupt flag
        //v_pINTregs->rSUBSRCPND = 0x008 ;
        //v_pINTregs->rINTPND = 0x800000 ;
        if (v_pUART1regs->rUTRSTAT& (1 << 0))	                    //receive interrupt
        {
            rec=v_pUART1regs->rURXH&0x0ff;                        //receive data
            if( gRecBuffer == 0xfa )                             //data is available
            {
                EnterCriticalSection(&Crit);                      //data send to buffer
                gRecBuffer = (char)(v_pUART1regs->rURXH&0x0ff); 
                LeaveCriticalSection(&Crit);
            }
        }
        v_pINTregs->rSRCPND = 0x800000 ;                          //clear interrupt flag
        v_pINTregs->rSUBSRCPND = 0x008 ;
        v_pINTregs->rINTPND = 0x800000 ;
        v_pINTregs->rINTMSK &= ~0x800000;
        v_pINTregs->rINTSUBMSK &= ~0x008;
        if(recflag)
            SetEvent(gKeyEvent);
        else
        {
            EnterCriticalSection(&Crit);
            gRecBuffer = 0xfa;
            LeaveCriticalSection(&Crit);
        }
        InterruptDone(SYSINTR_KEYBOARD);	                         //interrupt return
    }        	
}
//********************************************************************
PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{    
    switch ( dwReason )
    {
        case DLL_PROCESS_ATTACH:
            //RETAILMSG(1, (TEXT("keyboard : DLL_PROCESS_ATTACH\r\n")));
            DisableThreadLibraryCalls((HMODULE) hInstDll);
            break;
    }
    return (TRUE);
}
//**************************************************************************************************
DWORD
KEY_Init(DWORD dwContext)
{
    WORD RetValue = 1;
    DWORD   IDThread;
    HMODULE hmCore;
    
    gKeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    
    InitializeCriticalSection(&Crit);
    hmCore = (HMODULE) LoadLibrary(_T("coredll.dll"));// need it ????
    if(hmCore != NULL) 
    {
        gpfnSetSystemKeyboardState = (KEY_SetSystemKeyboardState)GetProcAddress(hmCore, _T("SetSystemKeyboardState"));
        if(gpfnSetSystemKeyboardState == NULL) 
        {
            FreeLibrary(hmCore);
        }
    }
    do 
    {
        gKeyBoardIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) KEY_IntrThread, 0, 0, &IDThread);
        //RETAILMSG(1, (TEXT("::: KEY_IntrThread ID = %x\r\n"), IDThread));
        if (gKeyBoardIntrThread == 0) 
        {
            //RETAILMSG(1, (TEXT(":::keyboard CreateThread() Fail\r\n")));
            break;
        }
        //LeaveCriticalSection(&Crit);
    }
    while (0);
    gPowerFlag = 0x0;
    //g_poweronflag = 0x0;
    RetValue = 1;
    return RetValue;
}

BOOL
KEY_Close( DWORD hOpenContext )
{
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_Close\n")));
    return TRUE;
}   // KEY_Close

BOOL
KEY_Deinit ( DWORD hDeviceContext )
{
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_Deinit\n")));
    return TRUE;
}   // KEY_Deinit

DWORD
KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    DWORD dwRet = 1;
    EnterCriticalSection(&Crit);
    gRecBuffer = 0xfa;
    LeaveCriticalSection(&Crit);
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_Open\n")));
    return dwRet ;
}   // KEY_Open

BOOL
KEY_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
    BOOL bRet = TRUE;
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_IOControl\n")));
    return bRet;
}   // KEY_IOControl

DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
    //unsigned char kBuffer[2];
    PUCHAR tmp = pBuffer;
    if (*tmp != 1)
    {
        //RETAILMSG(1,(TEXT("Key tmp != 1\n")));
        if (gRecBuffer != 0xfa)
        {
            NULL;
        }	
        else
        {
            if(gPowerFlag == 0x1)
            {
                gPowerFlag = 0x0;
                *tmp = 0xff;
                gRecBuffer = 0xfa;
                //RETAILMSG(1,(TEXT("gPowerFlag  gRecBuffer = %d\n"),gRecBuffer));
                return 1;
            }
            else 
            {
                //RETAILMSG(1,(TEXT("Keyboard wait\n")));
                WaitForSingleObject(gKeyEvent, INFINITE);
                //RETAILMSG(1,(TEXT("Keyboard readout\n")));
                if(gPowerFlag == 0x1)
                {
                    gPowerFlag = 0x0;
                    *tmp = 0xff;
                    //gRecBuffer = 0xfa;
                    //RETAILMSG(1,(TEXT("gPowerFlag  gRecBuffer = %d\n"),gRecBuffer));
                    return 1;
                }
            }
        }
        //RETAILMSG(1,(TEXT("get key: %d\n"), gRecBuffer));
        *tmp = gRecBuffer;
        gRecBuffer = 0xfa;
        return 1;
    }
    else 
    {
        //RETAILMSG(1,(TEXT("gRecBuffer  = %d\n"),gRecBuffer));
        if(gPowerFlag == 0x1)
            *tmp = 0xff;
        else
            *tmp = gRecBuffer;
        return 0;
    }	
}

DWORD KEY_Write(DWORD hOpenContext, int *pBuffer, DWORD NumberOfBytes)
{
    
    //EnterCriticalSection(&Crit);
    //gRecBuffer = 0xfa;
    //LeaveCriticalSection(&Crit);
    int senddata = *pBuffer, i = 0;
	  //    TCHAR buf[5];
    
  //RETAILMSG(1,(TEXT("KEYBOARD: KEY_Write, %d, %x, %x\n"), senddata, (char)senddata, (v_pUART1regs->rUTRSTAT & 0x2)));
    
    if ( senddata == 0xff00ff00)
    {
        TerminateThread(gKeyBoardIntrThread,0x255);
    }
		
		for(i = 0; i < 3;)
		{
			if (v_pUART1regs->rUTRSTAT & 0x2)
			{
				v_pUART1regs->rUTXH = (char)senddata;
				i = i + 1;
			}
		}
    return 1;
}

DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_Seek\n")));	
    return 0;
}

void KEY_PowerUp(DWORD hDeviceContext)
{
    inituart1();
    
    v_pINTregs->rSRCPND = 0x800000 ;                          //clear interrupt flag
    v_pINTregs->rSUBSRCPND = 0x008 ;
    v_pINTregs->rINTPND = 0x800000 ;
    v_pINTregs->rINTMSK &= ~0x800000;
    v_pINTregs->rINTSUBMSK &= ~0x008;
        
    //g_poweronflag = 0x1;
    //gPowerFlag = 0x1;
    //gRecBuffer = 0xff;
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_PowerUp\n")));
    return;
}

void KEY_PowerDown(DWORD hDeviceContext)
{
    //RETAILMSG(1,(TEXT("KEYBOARD: KEY_PowerDown\n")));
    return;
}

//*****************************88
static BOOL
KEY_InitializeAddressesIO(VOID)
{
    BOOL    RetValue = TRUE;
    v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
    if (v_pIOPregs == NULL) 
    {
        //ERRORMSG(1,(TEXT("For KEY_IOPregs : VirtualAlloc failed!\r\n")));
        RetValue = FALSE;
    }
    else 
    {
        if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE)) 
        {
            //ERRORMSG(1,(TEXT("For KEY_IOPregs: VirtualCopy failed!\r\n")));
            RetValue = FALSE;
        }
    }
    if (!RetValue) 
    {
        //RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Fail!!\r\n") ));
        if (v_pIOPregs) 
        {
            VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
        }
        v_pIOPregs = NULL;
    }
    else 
    {
        ;
        //RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Success\r\n") ));
    }
    return(RetValue);
}


static BOOL
KEY_InitializeAddressesINT(VOID)
{
    BOOL RetValue = TRUE;
    v_pINTregs = (volatile INTreg *)VirtualAlloc(0, sizeof(INTreg), MEM_RESERVE, PAGE_NOACCESS);
    if (v_pINTregs == NULL) 
    {
        //ERRORMSG(1,(TEXT("For KEY_INTregs : VirtualAlloc failed!\r\n")));
        RetValue = FALSE;
    }
    else 
    {
        if (!VirtualCopy((PVOID)v_pINTregs, (PVOID)(INT_BASE), sizeof(INTreg), PAGE_READWRITE | PAGE_NOCACHE)) 
        {
            //ERRORMSG(1,(TEXT("For KEY_INTregs: VirtualCopy failed!\r\n")));
            RetValue = FALSE;
        }
    }
    if (!RetValue) 
    {
        //RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Fail!!\r\n") ));
        if (v_pINTregs) 
        {
            VirtualFree((PVOID) v_pINTregs, 0, MEM_RELEASE);
        }
        v_pINTregs = NULL;
    }
    else 
    {
        ;
        //RETAILMSG (1, (TEXT("::: KEY_InitializeAddresses - Success\r\n") ));
    }
    return(RetValue);
}

static BOOL
KEY_InitializeAddresses(VOID)
{
    BOOL RetValue = TRUE;
    //RETAILMSG (1, (TEXT("KEY_InitializeAddresses \r\n") ));
    v_pUART1regs = (volatile UART1reg *)VirtualAlloc(0, sizeof(UART1reg), MEM_RESERVE, PAGE_NOACCESS);
    if (v_pUART1regs == NULL) 
    {
        //ERRORMSG(1,(TEXT("For KEYBOARD_UART1regs : VirtualAlloc failed!\r\n")));
        RetValue = FALSE;
    }
    else 
    {
        if (!VirtualCopy((PVOID)v_pUART1regs, (PVOID)(UART1_BASE), sizeof(UART1reg), PAGE_READWRITE | PAGE_NOCACHE)) 
        {
            //ERRORMSG(1,(TEXT("For KEYBOARD_UART1regs: VirtualCopy failed!\r\n")));
            RetValue = FALSE;
        }
    }
    if (!RetValue) 
    {
        //RETAILMSG (1, (TEXT("::: KEYBOARD_InitializeAddresses - Fail!!\r\n") ));
        if (v_pUART1regs) 
        {
            VirtualFree((PVOID) v_pUART1regs, 0, MEM_RELEASE);
        }
        v_pUART1regs = NULL;
    }
    else 
    {
        ;
        //RETAILMSG (1, (TEXT("KEYBOARD_InitializeAddresses - Success\r\n") ));
    }
    return(RetValue);
}

⌨️ 快捷键说明

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