求高人指点WINCE6的外部中断使用

MEIDANZON 2011-04-19 01:56:34
自己按照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;
}

...全文
51 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
当我遇上-你 2011-04-19
  • 打赏
  • 举报
回复
LZ你把问题说明白点,用的什么芯片?看芯片的手册上中断有讲的
  • 打赏
  • 举报
回复
不太明白你什么意思?你是说如何打开中断XEINT0吗?这个要配置下中断寄存器了。具体的要看6410的芯片手册。VICINTENABLE寄存器,EINT0MASK寄存器,还有键盘使用的GPIO口等。
MEIDANZON 2011-04-19
  • 打赏
  • 举报
回复
这些是我会的,关于如何IO口用的XEINT0,是个按键,但是不知道在哪设置外部中断?高人们有例子不给一个看看

19,519

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧