taoyuetao的个人空间 https://blog.eetop.cn/taoyuetao [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

[原创] 读Windows Mobile中断的一点心得

已有 2094 次阅读| 2007-1-15 14:21 |个人分类:【 WinCE & Mobile 】

天气: 晴朗
心情: 高兴

================================

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 UINT32  g_oalSysIntr2Irq[SYSINTR_MAXIMUM];

static UINT32  g_oalIrq2SysIntr[OAL_INTR_IRQ_MAXIMUM];

 

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(),它是WinCEOAL层初始化函数,在基本初始化完成之后,由内核调用,定义在:

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

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

platform\c8090\platform\common\src\arm\intel\pxa27x\intr\intr.c中,该函数首先调用函数OALIntrMapInit(),初始化前面提到的两个数组表g_oalSysIntr2IrqgoalIrq2SysIntr。该函数定义在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;

}       

 


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 0

    粉丝
  • 0

    好友
  • 0

    获赞
  • 1075

    评论
  • 4435

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 20:55 , Processed in 0.020790 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部