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

📄 keypad.c

📁 Sam sung2410 Wince的修改过的Keypad driver.给初学者上课用的,简单好入门
💻 C
字号:
#include <windows.h>
#include <s3c2410x.h>
#include <nkintr.h>

//#include <s3c2410x_ioport.h>
//#include <s3c2410x_base_regs.h>
#ifdef DEBUG

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

DBGPARAM dpCurSettings = {
    _T("KEYPAD"), 
    {
        _T("Errors"), _T("Warnings"), _T("Info"), _T(""), 
        _T(""), _T(""), _T(""), _T(""),
        _T(""),_T(""),_T(""),_T(""),
        _T(""),_T(""),_T(""),_T("") 
    },
	//As a default,turn on Errors // & Warnings & Info debug zone
    0x1
}; 

#endif


volatile S3C2410X_IOPORT_REG * v_pIOPregs;

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

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

BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		//registered with debug zone subsystem
		//register the dpCurSettings structure 
		DEBUGREGISTER(hInstDll);
		break;
	}

	return TRUE;
}
VOID	 EnableKscan()
{
	//kscan0(GPE11) - CON = output & DAT = 0
	v_pIOPregs->GPECON  &= ~(0x3 << 22);
	v_pIOPregs->GPECON  |=  (0x1 << 22);
	v_pIOPregs->GPEDAT  &= ~(0x1 << 11);

	//kscan1(GPG6) - CON = output & DAT = 0
	v_pIOPregs->GPGCON  &= ~(0x3 << 12);
	v_pIOPregs->GPGCON  |=  (0x1 << 12);
	v_pIOPregs->GPGDAT  &= ~(0x1 << 6);

	//kscan2(GPE13) - CON = output & DAT = 0
	v_pIOPregs->GPECON  &= ~(0x3 << 26);
	v_pIOPregs->GPECON  |=  (0x1 << 26);
	v_pIOPregs->GPEDAT  &= ~(0x1 << 13);

	//kscan3(GPG2) - CON = output & DAT = 0
	v_pIOPregs->GPGCON  &= ~(0x3 << 4);
	v_pIOPregs->GPGCON  |=  (0x1 << 4);	
	v_pIOPregs->GPGDAT  &= ~(0x1 << 2);

}

UINT32	DetectKscan(PVOID pArg)
{

	PKeyPadContext pKeyPadContext = (PKeyPadContext)pArg;

	UINT32 i = 0;
	for (i = 0; i< (pKeyPadContext->RetryTimes); i++)
	{
		//kscan0(GPE11) - CON = input,Read DAT
		v_pIOPregs->GPECON  &= ~(0x3 << 22);
		if (v_pIOPregs->GPEDAT & (0x1 << 11))
			return Kscan0;

		//kscan1(GPG6) - CON = input,Read DAT
		v_pIOPregs->GPGCON  &= ~(0x3 << 12);
		if (v_pIOPregs->GPGDAT & (0x1 << 6))
			return Kscan1;

		//kscan2(GPE13) - CON = input,Read DAT
		v_pIOPregs->GPECON  &= ~(0x3 << 26);
		if (v_pIOPregs->GPEDAT & (0x1 << 13))
			return Kscan2;

		//kscan3(GPG2) - CON = input,Read DAT
		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("Detect Detection Failed")));

	return -1;
}


DWORD	KeyPadIST(PVOID pArg)
{
	//InterruptInitialize()

	UINT32 KeyPadIrq = IRQ_EINT0;	// Determined by SMDK2410 board layout.
	//UINT32 KeyPadSysIntr = SYSINTR_UNDEFINED; //kernel mode
	UINT32 KeyPadSysIntr = 0x20; //user mode
	HANDLE Event = CreateEvent(NULL,FALSE,FALSE,NULL);

    // Request a SYSINTR value from the OAL.
	//if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&KeyPadIrq,sizeof(UINT32),&KeyPadSysIntr,sizeof(UINT32),NULL))
    //{
    //    RETAILMSG(1,(TEXT("KeyPad: Failed to request sysintr value for KeyPad interrupt.\r\n")));
    //    return(0);
    //}

	//user mode need refactor service to do this.
	if (!(InterruptInitialize(
							KeyPadSysIntr,	//interrupt id
							Event,			//interrupt event
							0, 0))) 
	{
		RETAILMSG(1, (TEXT("KeyPad: Interrupt initialize failed.\r\n")));
	}

	while (TRUE)
	{
		//WaitForSingleObject()
		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("Fail to detect\r\n")));
				break;
		}

		EnableKscan();
		//Handle interrupt
		//RETAILMSG(1,(TEXT("Button is pressed\r\n")));

		//InterruptDone
		InterruptDone(KeyPadSysIntr);
	}

	return 0;
}

DWORD	KPD_Init(LPCTSTR pDeviceContext,DWORD dwBusContext)
{
	BOOL RetValue = TRUE;



	PKeyPadContext pKeyPadContext;
	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 
	{
		//>> 8  regular:(PAGE_PHYSICAL) physical map virtual must to do
		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;
	}
	else RETAILMSG (1, (TEXT("::: PBT_InitializeAddresses - Success\r\n") ));

	//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 |=  (0x2 << 0);

	EnableKscan();
	//v_pIOPregs = *(DWORD*)0x12345678;


	//Create IST
	CreateThread(0,0, 
	(LPTHREAD_START_ROUTINE)KeyPadIST,
	(LPVOID)pKeyPadContext,0,NULL);

	return (DWORD)pKeyPadContext;
}

BOOL	KPD_Deinit(DWORD hDeviceContext)
{     
	// future: pointer to the per disk structure
    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 hOpenContext, LPVOID pBuffer, DWORD dwNumBytes)
{
	PKeyPadContext pKeyPadContext = (PKeyPadContext)hOpenContext;
	if (pBuffer == NULL || dwNumBytes < 4)
		return -1;
	else
	{
		*(UINT32*)pBuffer = pKeyPadContext->RetryTimes;
		return sizeof(UINT32);
	}

	return 0;

}
DWORD	KPD_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD dwNumBytes)
{
	PKeyPadContext pKeyPadContext = (PKeyPadContext)hOpenContext;
	if (pBuffer == NULL || dwNumBytes < 4)
		return -1;
	else
	{
		pKeyPadContext->RetryTimes = *(UINT32 *)pBuffer;
		return sizeof(UINT32);
	}
	

	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;
	
	switch (dwIoControlCode)
	{
		case IOCTL_FILE_CALLER_BUFFER:
		{
			HRESULT hr = CeOpenCallerBuffer(&pMarshalled,pKeyPadContext->LatestRetryTimes,4,ARG_O_PTR,FALSE);
			if (FAILED(hr))
				RETAILMSG(1,(TEXT("Failed to open buffer.")));	
			else
				RETAILMSG(1,(TEXT("Succeeded to open buffer.")));	

			//Handle buffer

			CeCloseCallerBuffer(pMarshalled,pKeyPadContext->LatestRetryTimes,4,NULL);
		}
		break;

	default:
		break;
	}

    return TRUE;
}

DWORD	KPD_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
	return 0;
}

void	KPD_PowerUp(DWORD hDeviceContext)
{
	return;
}

void	KPD_PowerDown(DWORD hDeviceContext)
{
	return;
}

⌨️ 快捷键说明

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