求高人指点WINCE6的外部中断使用
自己按照IIC总线驱动改的
#include "stdafx.h"
#include <s3c6410.h>
#include <types.h>
#include <DrvLib.h>
#include <winuser.h>
#include "windows.h"
#include <oal_intr.h>
#include <nkintr.h>
#include <pm.h>
#include <bsp_cfg.h>
#include "ANY.h"
#define MSG_ERROR 1
#define KEY_RUN 10
#define KEY_STOP 0
static volatile S3C6410_GPIO_REG *g_pGPIOReg;
static volatile S3C6410_SYSCON_REG *g_pSYSCONReg;
static HANDLE g_hKeyEvent;
static HANDLE g_hKeyThread;
static DWORD g_IntrKey=SYSINTR_NOP;
static DWORD KEY_IST(LPVOID Context);
static DWORD pInitContext;
//----------------------------------------------------------------------------//
// DLL entry //
//----------------------------------------------------------------------------//
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break;
}
return TRUE;
}
void InitializeGPIOPort(void)
{
g_pGPIOReg->GPNCON = (g_pGPIOReg->GPNCON & ~(0xf)) | (0x2);
g_pGPIOReg->GPNPUD = (g_pGPIOReg->GPNPUD & ~(0x3)) | (0x0);
}
DWORD ANY_Init(LPCTSTR pContext, LPCVOID lpvBusContext) {
unsigned int Irq;
pInitContext=KEY_RUN;
g_pGPIOReg = (S3C6410_GPIO_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO,sizeof(S3C6410_GPIO_REG),FALSE);
g_pSYSCONReg = (S3C6410_SYSCON_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_SYSCON,sizeof(S3C6410_SYSCON_REG), FALSE);
InitializeGPIOPort();
g_hKeyEvent = CreateEvent(0,FALSE,FALSE,NULL);
Irq = IRQ_EINT0;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &g_IntrKey, sizeof(UINT32), NULL))
{
g_IntrKey= SYSINTR_UNDEFINED;
return 0;
}
if( !InterruptInitialize(g_IntrKey, g_hKeyEvent, NULL, 0) )
{
return(FALSE);
}
if ( (g_hKeyThread = CreateThread(NULL, 0, KEY_IST, (LPVOID)pInitContext, 0, NULL)) == NULL)
{
return(FALSE);
}
if ( !CeSetThreadPriority(g_hKeyThread, 100))
{
return(FALSE);
}
return 1;
}
BOOL ANY_Deinit(DWORD hDeviceContext) {
VirtualFree((PVOID)g_pGPIOReg, 0, MEM_RELEASE);
g_pGPIOReg = NULL;
return TRUE;
}
DWORD ANY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) {
OutputDebugString(L"LED - LED Open\n");
return 1;
}
BOOL ANY_Close(DWORD hOpenContext) {
OutputDebugString(L"LED - LED Close\n");
return TRUE;
}
DWORD ANY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) {
return 1;
}
DWORD ANY_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) {
return 1;
}
VOID ANY_PowerUp(DWORD hDeviceContext) {
}
VOID ANY_PowerDown(DWORD hDeviceContext) {
}
DWORD ANY_Seek(DWORD hOpenContext, long Amount, DWORD Type) {
return 0;
}
BOOL ANY_IOControl(DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned) {
return 0;
}
static DWORD
KEY_IST(
LPVOID Context
)
{
static DWORD dwTimeOut = INFINITE;
static DWORD pInitContext =(DWORD)Context;
while(1)
{
DWORD we;
we = WaitForSingleObject(g_hKeyEvent, dwTimeOut);
}
return 0;
}