| |
================================
Author: taoyuetao
Email: tao_yuetao@yahoo.com.cn
Blog: http://www.eetop.cn/blog/?11145
2006-01-15
================================
Initialize interrupt mapping tables. These are two private OAL tables that map between physical interrupts — interrupt requests (IRQs) — and logical interrupts — SYSINTR values.WinCE有两种私有的中断表,一种是物理中断——中断请求(IRQs),另一种是逻辑中断——SYSINTR值。WinCE必须将一个物理中断和一个逻辑中断关联起来。
物理中断号定义在platform\c8090\pubic\csp\arm\intel\pxa27x\inc\Bulverde_intr.h。
逻辑中断号定义在platform\c8090\platform\mainstoneii\src/inc\Bsp_cfg.h。
两个中断表定义在platform\c8090\platform\src\common\intr\base\map.c
static UINT
static UINT
OAL_INTR_IRQ_MAXIMUM定义在platform\c8090\common\src\inc\oal_intr.h,
#define OAL_INTR_IRQ_MAXIMUM 64
该值表示物理中断——IRQs的最大值,现在最大只支持到64。
SYSINTR_MAXIMUM定义在wm522\public\common\oak\inc\nkintr.h
#define SYSINTR_DEVICES 8
#define SYSINTR_MAX_DEVICES 64
#define SYSINTR_MAXIMUM (SYSINTR_DEVICES+SYSINTR_MAX_DEVICES)
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;
}
然后调用函数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;
}