📄 interruptdrv.cpp
字号:
// KeyDrv.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <s3c2410x.h>
#pragma comment(lib,"ceddk.lib")
volatile S3C2410X_IOPORT_REG * g_pIOPregs;
volatile static DWORD g_intrcount = 0;
UINT32 g_ExtKeyIrq = IRQ_EINT6;
UINT32 g_ExtKeySysIntr = SYSINTR_UNDEFINED;
HANDLE g_IntrEvent = NULL;
void KEY_EnableInterrupt();
UINT IntrThreadProc(LPVOID);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
DWORD KEY_Init(DWORD dwContext)
{
PHYSICAL_ADDRESS PA;
RETAILMSG(1, (TEXT("***ExtKey: ExtKey_Init\r\n")));
PA.QuadPart = S3C2410X_BASE_REG_PA_IOPORT;
g_pIOPregs = (S3C2410X_IOPORT_REG *)MmMapIoSpace(PA,sizeof(S3C2410X_IOPORT_REG),FALSE);
g_IntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if(g_IntrEvent)
{
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_ExtKeyIrq, sizeof(UINT32), &g_ExtKeySysIntr, sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: ExtKey: Failed to request sysintr value for ExtKey interrupt.\r\n")));
return(0);
}
RETAILMSG(1,(TEXT("INFO: ExtKey: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_ExtKeyIrq, g_ExtKeySysIntr));
if(InterruptInitialize(g_ExtKeySysIntr, g_IntrEvent, NULL, 0) )
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
if( CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)IntrThreadProc, NULL, 0, NULL))
{
RETAILMSG(1, (TEXT("***ExtKEY: KEY_Init CreateThread OK\r\n")));
return TRUE;
}
}
CloseHandle(g_IntrEvent);
}
RETAILMSG(1, (TEXT("***ExtKEY: KEY_Init fail\r\n")));
return FALSE;
}
BOOL KEY_Deinit(DWORD hDeviceContext)
{
RETAILMSG(1, (TEXT("***KEY: KEY_Deinit\r\n")));
MmUnmapIoSpace((PVOID)g_pIOPregs,sizeof(S3C2410X_IOPORT_REG));
return TRUE;
}
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1, (TEXT("***KEY: KEY_Open\r\n")));
KEY_EnableInterrupt();
return TRUE;
}
BOOL KEY_Close(DWORD hOpenContext)
{
RETAILMSG(1, (TEXT("***KEY: KEY_Close\r\n")));
return TRUE;
}
BOOL KEY_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
return TRUE;
}
void KEY_PowerDown(DWORD hDeviceContext)
{
}
void KEY_PowerUp(DWORD hDeviceContext)
{
}
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
*((DWORD*)pBuffer) = g_intrcount;
return sizeof(unsigned short);
}
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD NumberOfBytes)
{
RETAILMSG(1, (TEXT("***KEY: KEY_Write\r\n")));
g_intrcount = 0;
return sizeof(DWORD);
}
VOID KEY_EnableInterrupt()
{
g_pIOPregs->GPFCON &= ~(0x3 << 12);
g_pIOPregs->GPFCON |= (0x2 << 12);
g_pIOPregs->EXTINT0 &= ~(0x7 << 24);
g_pIOPregs->EXTINT0 |= (0x4 << 24);
}
UINT IntrThreadProc(LPVOID ptr)
{
RETAILMSG(1, (TEXT("***IntrThreadProc: \r\n")));
while(1)
{
WaitForSingleObject(g_IntrEvent, INFINITE);
g_intrcount++;
Sleep(500);
InterruptDone(g_ExtKeySysIntr);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -