求高人指点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;
}
#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;
}
...全文
相关推荐
wince 6.0 外部中断驱动
### WinCE 6.0 外部中断驱动深入解析#### 一、中断处理机制概述Windows Embedded CE 6.0(以下简称WinCE 6.0)作为一种嵌入式操作系统,其外部中断处理机制是系统设计中至关重要的一部分
WINCE6.0游戏
标题中的“WINCE6.0游戏”指的是在Windows Embedded Compact 6.0(简称WinCE 6.0)操作系统上运行的游戏应用。
winCE外部中断按键驱动
本话题将详细讨论如何在基于S3C6410处理器和WinCE 6.0平台下实现外部中断模式的按键驱动。
wince6.0 音频播放器
在WinCE 6.0上,由于其内置对WAV的支持,开发相对简单,可以直接使用系统提供的API进行读取和播放。
导航仪CE6进WINCE桌面工具
标题中的“导航仪CE6进WINCE桌面工具”指的是针对基于Windows CE 6.0(简称CE6)操作系统的导航设备开发的一种实用程序,旨在帮助用户更方便地进入和使用WinCE的桌面环境。


