CE 的中断

CE 的中断

(2008-10-26 20:59:04)

转载

标签:

杂谈

分类: CEstudynote

中断

WCE有两种私有的中断表,一种是物理中断——中断请求(IRQs),另一种是逻辑中断——SYSINTR值。WinCE必须将一个物理中断和一个逻辑中断关联起来。而且,这两者必须是唯一的,而且是delicated.

物理中断号for example:

#define IRQ_GPIO0_WIFI      IRQ_BULVERDE_MAX+9

#define OAL_INTR_IRQ_MAXIMUM    64

该值表示物理中断——IRQs的最大值,现在最大只支持到64。

逻辑中断号定义在:for example:

#define SYSINTR_WIFI   SYSINTR_FIRMWARE+16  sysintr_firmware 也代表最大值。

两个中断表,定义在platform\c8090\platform\src\common\intr\base\map.c

static UINT32  g_oalSysIntr2Irq[SYSINTR_MAXIMUM];

static UINT32  g_oalIrq2SysIntr[OAL_INTR_IRQ_MAXIMUM];

#define SYSINTR_DEVICES     8

#define SYSINTR_MAX_DEVICES 64

#define SYSINTR_MAXIMUM     (SYSINTR_DEVICES+SYSINTR_MAX_DEVICES)

1. define IRQ and sysintr

OEM Adaptation Layer——OAL初始化函数是OEMInit(),它是WinCE的OAL层初始化函数,在基本初始化完成之后,由内核调用,定义在:

platform\c8090\platform\mainstoneii\src\kernel\oal\init.c。

在这里调用中断初始化函数:OALIntrInit(),该函数定义在:

platform\c8090\platform\common\src\arm\intel\pxa27x\intr\intr.c中,该函数首先调用函数OALIntrMapInit(),初始化前面提到的两个数组表g_oalSysIntr2Irq和goalIrq2SysIntr。该函数定义在platform\c8090\platform\common\src\common\intr\base\map.c,源码如下:

for (i = 0; i < SYSINTR_MAXIMUM; i++) {

g_oalSysIntr2Irq[i] = OAL_INTR_IRQ_UNDEFINED;

}

for (i = 0; i < OAL_INTR_IRQ_MAXIMUM; i++) {

g_oalIrq2SysIntr[i] = SYSINTR_UNDEFINED;

}

2. map IRQ to sysintr

然后调用函数BSPIntrInit()将物理中断和逻辑中断关联起来,该函数定义在:

platform\c8090\platform\mainstoneii\src\kernel\oal\intr.c中。

关联代码例子如下:

OALIntrStaticTranslate(SYSINTR_PMIC, IRQ_GPIO0);

OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_USBOHCI);

OALIntrStaticTranslate(SYSINTR_TOUCH, IRQ_GPIOXX_WM9712);

OALIntrStaticTranslate(SYSINTR_TOUCH_CHANGED, IRQ_OSMR1);

OALIntrStaticTranslate(SYSINTR_KEYPAD, IRQ_KEYPAD);

前面都是逻辑中断,后面是物理中断。OALIntrStaticTranslate函数定义在:

platform\c8090\platform\common\src\common\intr\base\map.c,源码如下:

if (irq < OAL_INTR_IRQ_MAXIMUM && sysIntr < SYSINTR_MAXIMUM) {

g_oalSysIntr2Irq[sysIntr] = irq;

g_oalIrq2SysIntr[irq] = sysIntr;

}

3.  interrupt initialize

set GPIO configuration

set interrupt information including IRQ,system interrupt, IST function and so on.

setup interrupt: Use ISR to process interrupt

1. create interrupt event to interruptevent:

if(!(pMyIntrInfo->hIntrEvent = CreateEvent( NULL, FALSE, FALSE, NULL))) {         DEBUGMSG(1, (TEXT("CreateEvent() FAILED")));         goto errFuncRet;     }

2. convert the irq into sysinterrupt (kernelIoControl()accesses kernel to transfer OEMIoControl.   OEMIoControl use I/O to achieve some function.)

IOCTL_HAL_REQUEST_SYSINTR makes OAL return the relative sysintr according to irq.

if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &pMyIntrInfo->irq, sizeof(DWORD),

&pMyIntrInfo->dwSysIntr, sizeof(pMyIntrInfo->dwSysIntr), NULL))

3. create IST according to sysintr.

pMyIntrInfo->hISTHandle = CreateThread((LPSECURITY_ATTRIBUTES)NULL,                                          0,                                           myIST,                                           pMyIntrInfo,                                           CREATE_SUSPENDED,                                           &threadID);

4. set the priority to the IST.

CeSetThreadPriority(pMyIntrInfo->hISTHandle, DEFAULT_IST_PRIORITY);

5. mask the other interrupt with the same or lower level.(OEMIterruptDisable)

InterruptDisable(pMyIntrInfo->dwSysIntr);

interrupt service controller program (ISCP) transfers OEMinterruptDisable to close the relative interrupt pin.( mask controller)

6. use interruptinitialize to make kernel transfer OEMInterruptEnable to create mapping between ISR and IST.

if (! InterruptInitialize(pMyIntrInfo->dwSysIntr, pMyIntrInfo->hIntrEvent, NULL, 0)) {   DEBUGMSG(1, (TEXT("%s - InterruptInitialize(%d,%08x) Failed\r\n"),

generate IST process the interrupt.

1. get the thread start

ResumeThread(pMyIntrInfo->hISTHandle);

2. wait for interrupt event

dwStatus = WaitForSingleObject(pMyIntrInfo->hIntrEvent, INFINITE);

3. process IST    res = pMyIntrInfo->pIstFunc(pMyIntrInfo->param);

4. finish interrupt to clear the mask of interrupt(OEMInterruptDone)

InterruptDone(pMyIntrInfo->dwSysIntr);

then, host can receive the same interrupt again.

时间: 2024-07-31 11:27:05

CE 的中断的相关文章

bsp开发之驱动开发

驱动程序是能够管理虚拟设备或者物理设备,协议,服务等得软件模块,操作系统只有通过驱动程序才能访问硬件.针对windows ce开发设备驱动,就是通过platform builder创建一个新的平台,然后根据硬件平台的需要插入或者移除驱动,需要修改的文件有platform.bib,platform.reg. 按加载方式和接口分类,基于windows ce的驱动程序可以分为一下三类: (1)      本机驱动程序 它是微软开发并由系统直接支持,适用于集成到ce平台的设备. (2)      流接口

e可劲儿靠天靠地

http://www.wasu.cn/Search/show/k/%E2%96%A0%E5%95%86%E6%B4%9B%E5%86%B0%E6%AF%92%E5%9C%A8%E5%93%AA%E9%87%8C%E4%B9%B0Q%EF%BC%91%EF%BC%95%EF%BC%97%EF%BC%93%EF%BC%91%EF%BC%95%EF%BC%99%EF%BC%93%E3%80%92 http://www.wasu.cn/Search/show/k/%E2%96%83%E5%85%B4%E

170322计算机硬件介绍&amp;&amp;时钟&amp;&amp;中断&amp;&amp;内核态、用户态与系统功能调用&amp;&amp;操作系统分类

一.冯诺依曼计算机 1.1 对第一台电脑提出: (1)二进制代替十进制: (2)程序与数据一起放入内存中运行. 1.2示例:控制(操作码)与数据信息(操作数) 1.3一个典型的PC总线(Bus)结构 1.4华硕P5VD2-MX (1)主芯片组:VIA P4M890/VIA VT8237A(2)内存规格内存类型DDRII(3)总线频率(MHz) FSB 1066MHz(4)扩展插槽 ①显卡插槽PCI-E 16X ②PCI 插槽2条PCI 插槽 ③1条PCI-E 1X(5)IDE 插槽二个IDE插槽

window ce操作系统的启动过程

一 当bootloader启动任务完成后,内核kernel接管了cpu的控制权,cpu的执行将跳转到内核的入口函数kernelStart.KernelStart负责配置虚拟内存管理器,初始化中断向量表,然后,kernelStart向下回调HAL(硬件抽象层),执行OEMInit例程. 二 oeminit由oem提供.oeminit的工作是初始化oem硬件,包括挂起中断,初始化中断向量表等.oeminit调用initclock()设置时钟为操作系统的滴答时钟.调用initdisplay()初始化l

CE SD卡驱动开发(Zylonite)(转)

2008-06-05 09:45 1. WINCE 下的SD卡驱动架构 Wince 下SD卡驱动协议栈组成 : HOST硬件底层部分 (主控制端驱动)       SDHC_XXX.DLL BUS 中间逻辑命令层 (总线驱动)         SDBUS.DLL CLIENT上层(客户端驱动)                SDMEMORY.DLL 主控制端驱动    主控制端驱动控制包含主控制器硬件,遵循主控制端驱动接口,它被用于总线驱动通信和设置操作参数.主控制器驱动接口提供一个硬件提取层,

1_中断提权

1 使用pchunter查看系统中断表(中断描述符表) 1.1 那些中断处理地址内核高2GB ,所以中断处理环境坑定在0环 利用分析: 那我们把自己得处理函数放在这里面,那经过这个表调用就能获得高权限; 注意: 代码 应该把随机基址关闭,并且使用release版本,这样地址稳定一些,debug 即使不开随机基址,可能运行中 子函数的地址会因为重构(当你改变内容的时候,可能编译器判断换个地址更优)而改变. 注意:选择项目属性:工具集 vs-2015xp兼容,并MFC静态编译(因为缺少一个dll,当

LCD实验学习笔记(八):中断控制器

s3c2440有60个中断源(其中15个为子中断源). 程序状态寄存器(PSR)的F位设为1,禁用快速中断(FRQ). 程序状态寄存器(PSR)的I位设为1,禁用普通中断(IRQ). 相反,PSR寄存器F位为0开FRQ中断,I位为0开IRQ中断. s3c2440中断控制器中有五个控制寄存器:中断源等待寄存器(SRCPND),中断模式寄存器(INTMOD),屏蔽寄存器(INTMSK),优先级寄存器(PRIORITY),中断等待寄存器(INTPND). SRCPND寄存器各位对应不同的中断,其中外部

Java阻塞中断和LockSupport

在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING? 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么? LockSupport.park()和unpark(),与object.wait()和notify()的区

照明产品CE EMC标准测试项目

Disturbance voltage Radiated disturbance (9K to 30M) Radiated disturbance (30m to 300M) ESD静电放电 Radio frequency electromagnetic fields (辐射抗扰度) Surge 雷击,浪涌 Injected current 传导抗绕度 Voltage dips and interruptions 电压跌落/电压中断