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

📄 keypad.c

📁 Samsung 241x Windows CE 6.0 BSP, include touch panel driver, display driver, OAL, EBOOT, Keypad driv
💻 C
字号:
#include <windows.h>
#include <s3c2410x.h>
#include <nkintr.h>

#ifdef DEBUG

DBGPARAM dpCurSettings = {
    _T("KEYPAD"), 
    {
        _T("Errors"), _T("Warnings"), _T("Info"), _T(""), 
        _T(""), _T(""), _T(""), _T(""),
        _T(""),_T(""),_T(""),_T(""),
        _T(""),_T(""),_T(""),_T("") 
    },
    0x1
}; 

#endif

#define ZONE_ERR	DEBUGZONE(0)
#define ZONE_WARN	DEBUGZONE(1)
#define ZONE_INFO	DEBUGZONE(2)


volatile S3C2410X_IOPORT_REG * v_pIOPregs;

enum {Kscan0, Kscan1, Kscan2, Kscan3} KscanSwitch;

typedef struct 
{
	UINT32	RetryTimes;
	UINT32  *LatestRetryTimes;
} KeyPadContext, *PKeyPadContext;

BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch (dwReason) {
    	case DLL_PROCESS_ATTACH: 
            DEBUGREGISTER(hInstDll);
            break;
    }     
	return TRUE;
}

UINT32 DetectKscan(PVOID pArg) 
{
	UINT32 i;
	PKeyPadContext pKeyPadContext = (PKeyPadContext)pArg;
	for(i =0; i < pKeyPadContext->RetryTimes; i++) 
	{
		//Kscan CON = input, Read DAT
		//Kscan0 - GPE11
		v_pIOPregs->GPECON  &= ~(0x3 << 22);
		if( v_pIOPregs->GPEDAT & (0x1 << 11) )
			return Kscan0;
			
		v_pIOPregs->GPGCON  &= ~(0x3 << 12);
		if( v_pIOPregs->GPGDAT & (0x1 << 6) )
			return Kscan1;
		
		v_pIOPregs->GPECON  &= ~(0x3 << 26);
		if( v_pIOPregs->GPEDAT & (0x1 << 13) )
			return Kscan2;
			
		v_pIOPregs->GPGCON  &= ~(0x3 << 4);
		if( v_pIOPregs->GPGDAT & (0x1 << 2) )
			return Kscan3;
			
		DEBUGMSG(ZONE_WARN, (TEXT( "Detect Kscan: %d times" ), i + 1));
	}
	DEBUGMSG( ZONE_ERR, (TEXT("Kscan Detection Failed!")));
	return -1;
}

void EnableKscan() 
{
	//Kscan CON = output, DAT = 0
	//Kscan0 - GPE11
	v_pIOPregs->GPECON  &= ~(0x3 << 22);
	v_pIOPregs->GPECON  |=  (0x1 << 22);
	v_pIOPregs->GPEDAT  &=  ~(0x1 << 11);
	
	//Kscan1 - GPG6
    v_pIOPregs->GPGCON  &= ~(0x3 << 12);
	v_pIOPregs->GPGCON  |=  (0x1 << 12);
	v_pIOPregs->GPGDAT  &=  ~(0x1 << 6);
	
	//Kscan2 - GPE13
    v_pIOPregs->GPECON  &= ~(0x3 << 26);
	v_pIOPregs->GPECON  |=  (0x1 << 26);
	v_pIOPregs->GPEDAT  &=  ~(0x1 << 13);
		
	//Kscan3 - GPG2
    v_pIOPregs->GPGCON  &= ~(0x3 << 4);
	v_pIOPregs->GPGCON  |=  (0x1 << 4);
	v_pIOPregs->GPGDAT  &=  ~(0x1 << 2);		
}
DWORD KeyPadIST(PVOID pArg)
{

	UINT32 KeyPadIrq = IRQ_EINT0;
	UINT32 KeyPadSysIntr = 0x20;
	
	HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
	
//	if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &KeyPadIrq, sizeof(UINT32), &KeyPadSysIntr, sizeof(UINT32), NULL))
//    {
//        RETAILMSG(1, (TEXT("KeyPadIST:Failed to request sysintr value.\r\n")));
//        return(0);
//    }
    
	if (!(InterruptInitialize
		(KeyPadSysIntr, event, 0, 0))) 
	{
		RETAILMSG(1, (TEXT("KeyPadIST: InterruptInitialize failed.\r\n")));
	}
	
	while(TRUE) 
	{
		WaitForSingleObject(event, INFINITE);
		
		//detect Kscan
		switch(DetectKscan(pArg)) 
		{
			case Kscan0:
				RETAILMSG(1, (TEXT("Button K10 is pressed!!!\r\n")));
				TouchCalibrate();
			break;
			case Kscan1:
				RETAILMSG(1, (TEXT("Button K11 is pressed!!!\r\n")));
			break;
			case Kscan2:
				RETAILMSG(1, (TEXT("Button K12 is pressed!!!\r\n")));
			break;
			case Kscan3:
				RETAILMSG(1, (TEXT("Button K16 is pressed!!!\r\n")));
			break;
			default:
				RETAILMSG(1, (TEXT("Detection Failed.\r\n")));
		}
		EnableKscan();

		InterruptDone(KeyPadSysIntr);
	}
	
	return 0;
}


DWORD KPD_Init(LPCTSTR pContext, DWORD dwBusContext)
{
	PKeyPadContext pKeyPadContext;
	DWORD RetValue = TRUE;
	
	pKeyPadContext = (PKeyPadContext)LocalAlloc( LPTR, sizeof(KeyPadContext) );
	pKeyPadContext->RetryTimes = 3;

	v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (v_pIOPregs == NULL) 
	{
		ERRORMSG(1,(TEXT("KPD_Init: VirtualAlloc failed!\r\n")));
		RetValue = FALSE;
	}
	else 
	{
		if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2410X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 
		{
			ERRORMSG(1,(TEXT("KPD_Init: VirtualCopy failed!\r\n")));
			RetValue = FALSE;
		}
	}
	
	if (!RetValue) 
	{
		if (v_pIOPregs) 
		{
			VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
		}

		v_pIOPregs = NULL;
	}
	
	//EINT0 - falling edge interrupt
	v_pIOPregs->GPFCON  &= ~(0x3 << 0);		/* Set EINT0(GPF0) as EINT0							*/
	v_pIOPregs->GPFCON  |=  (0x2 << 0);

    v_pIOPregs->EXTINT0 &= ~(0x7 << 0);		/* Configure EINT0 as Falling Edge Mode				*/
    v_pIOPregs->EXTINT0 |=  (0x3 << 0);
	
	EnableKscan();
	
	//Create IST
	CreateThread(0, 0, 
	(LPTHREAD_START_ROUTINE) KeyPadIST, 
	(LPVOID)pKeyPadContext, 0, NULL);
	
	return (DWORD)pKeyPadContext;
}

BOOL KPD_Deinit( DWORD hDeviceContext )
{
    return TRUE;
}

DWORD KPD_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    DWORD hOpenContext = hDeviceContext;
    return hOpenContext;
}
BOOL KPD_Close( DWORD hOpenContext )
{
    return TRUE;
}
DWORD KPD_Read(DWORD hDeviceContext, LPVOID pBuffer, DWORD dwNumBytes)
{
	PKeyPadContext pKeyPadContext = (PKeyPadContext)hDeviceContext;
	if( pBuffer == NULL || dwNumBytes < 4 )
		return -1;
	else
	{
		*(UINT32 *)pBuffer = pKeyPadContext->RetryTimes;
		return sizeof(UINT32);
	}
	return 0;
}
DWORD KPD_Write(DWORD hDeviceContext, LPCVOID pBuffer, DWORD dwNumBytes)
{
	PKeyPadContext pKeyPadContext = (PKeyPadContext)hDeviceContext;
	if( pBuffer == NULL || dwNumBytes < 4 )
		return -1;
	else 
	{
		pKeyPadContext->RetryTimes = *(UINT32 *)pBuffer;
		return sizeof(UINT32);
	}
	return 0;
}
DWORD KPD_Seek(DWORD hDeviceContext, long lDistance, DWORD dwMoveMethod)
{
	return 0;
}

#define IOCTL_FILE_CALLER_BUFFER 0x87654321

BOOL KPD_IOControl(
    DWORD hDeviceContext,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
    PKeyPadContext pKeyPadContext = (PKeyPadContext)pInBuf;
    PVOID pMarshalled;
    HRESULT hr;
    
    switch(dwIoControlCode) 
    {
    	case IOCTL_FILE_CALLER_BUFFER:
    		hr = CeOpenCallerBuffer( &pMarshalled, 
    			pKeyPadContext->LatestRetryTimes, 
    			4, ARG_O_PTR, FALSE);
			
			if( FAILED(hr) )
				RETAILMSG(1, (TEXT("Failed to open buffer.")));
			else
				RETAILMSG(1, (TEXT("Suceed to open buffer.")));
			
			//Handle buffer....
    		CeCloseCallerBuffer( pMarshalled, 
    			pKeyPadContext->LatestRetryTimes, 
    			4, ARG_O_PTR);
    		
    		break;	
    }
    return TRUE;
}

void KPD_PowerUp( DWORD hDeviceContext )
{
	return;
}

void KPD_PowerDown( DWORD hDeviceContext )
{
	return;
}

⌨️ 快捷键说明

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