wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1436回复:7

关于Irq和Sysirq问题,很急(给分) (wxl_50685330请进)

楼主#
更多 发布于:2004-11-22 16:40
问题:

1。为了把irq和ISR中断处理程序勾连起来,是不是在驱动的XXX_Init()函数中直接调用LoadIntChainHander()就可以了?还需要修改OAL层吗?如需修改,如何修改?
2。为了把sysirq和特定的事件关联起来,是不是在驱动的XXX_Init()函数中直接调用InerrruptInitialize()就可以了?还需要修改OAL层吗?如需修改,如何修改?
3。如果不硬编码sysirq,如何根据irq得到对应的sysirq?调用哪个函数?同时还需要修改OAL层吗?如何修改?

请高手逐个问题指点迷津!多谢了




[编辑 -  11/23/04 by  wwei_wang]
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-24 13:48
问题好多:),我说错了大家更正哈:)
1.
是否使用LoadIntChainHander()需要看你的处理器,如果是arm这种不是同过中断向量表来区分中断的处理器,他只有一个中断入口,那么所有isr全部写在OEMInterruptHandler,这时你需要修改oal的中断服务处理函数。(顺便说一句,arm处理器也用LoadIntChainHander不知道能不能工作,我没有仔细看中断处理这部分的内核代码,从实现角度我觉得其实统一用这个函数也未尝不可)。如果是x86处理器,应该就用这个函数将isr挂入到中断向量表中吧,对于mips和shx我不了解他们的中断机制。兄弟更具情况判断吧
2.
这个问题你说的对,就这样做,不过你需要注意sysintr需要和你的事件关联,并且也要和物理中断号关联,关系是irq->sysintr->evnet。也就是你需要自己定义哪个物理中断处理完成返回sysintr,这是屏蔽物理中断号的一级映射。所以可能需要动oal的isr函数。
3.
这个问题我刚才说过了,irq->sysintr的对应关系是你自己定的

good luck
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-24 15:09
谢谢wxl_50685330大哥的指点,我用的是x86处理器。不过还有一个问题不是很清楚:

irq 和 sysintr的对应关系是怎么定义的?在哪个文件里定义的?通过什么函数定义?最好能给我举个例子,假设我用的硬件中断号为9号。先谢谢了!:)
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-24 15:28
这个完全是自由的,看看msdn的帮助哪些号是ms保留的,除此之外你可以自己指定。比如规定9号中断返回sysintr_xxx,只要你自己明白就行了,这个sysintr_xxx和物理号关联,再和事件关联就可以工作了。

还有就是你自己定的时候不要重复了,nkintr.h里面有系统定义的逻辑中断号

你定义的 比如:
#define SYSINTR_KEYBOARD                (SYSINTR_FIRMWARE+0)
#define SYSINTR_TOUCH                   (SYSINTR_FIRMWARE+1)
#define SYSINTR_ADC                     (SYSINTR_FIRMWARE+2)
#define SYSINTR_SERIAL                  (SYSINTR_FIRMWARE+3)
#define SYSINTR_AUDIO                   (SYSINTR_FIRMWARE+4)
#define SYSINTR_PCMCIA_STATE            (SYSINTR_FIRMWARE+5)
#define SYSINTR_PCMCIA_EDGE             (SYSINTR_FIRMWARE+6)
#define SYSINTR_PCMCIA_LEVEL            (SYSINTR_FIRMWARE+7)
#define SYSINTR_TOUCH_CHANGED           (SYSINTR_FIRMWARE+8)
#define SYSINTR_IR                      (SYSINTR_FIRMWARE+9)
#define SYSINTR_ETHER                   (SYSINTR_FIRMWARE+10)
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-24 16:17
也就是说只要我的ISR处理完后返回与我的IST关联的sysirq就可以了(事先已调用InterruptInitialize将IST, Sysirq以及Event)。irq与 sysirq的关系完全是自定义的。对吧?:)
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-24 16:42
对头!:)))
根据地的兄弟们,团结就是力量
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-25 09:27
借这个问题我也提一个问题
我要在扩展GPIO中处理一个中断,比如GPIO18中断处理,
1 在oalintr中定义了中断号SYSINTR_DETECT
2 它的ISR也已经写好,当中断产生后,它能返回SYSINTR_DETECT
3 我的驱动分为MDD和PDD层,而且在MDD层中有创建event和中断联系起来,但是它会接受到我自己定义的那个中断号SYSINTR_DETECT嘛?
我的IST应该写在PDD层的,我的那个SYSINTR_DETECT能透过mdd层进入我的IST嘛?好迷惑,不知道该怎么做?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-25 12:48
可以的。
When an ISR notifies the kernel of a specific logical interrupt value, the kernel examines an internal table to map the logical interrupt value to an event handle then the kernel wakes the IST by signaling the event.
Come on, let us drive the world.
游客

返回顶部