阅读:1436回复:7
关于Irq和Sysirq问题,很急(给分) (wxl_50685330请进)
问题:
1。为了把irq和ISR中断处理程序勾连起来,是不是在驱动的XXX_Init()函数中直接调用LoadIntChainHander()就可以了?还需要修改OAL层吗?如需修改,如何修改? 2。为了把sysirq和特定的事件关联起来,是不是在驱动的XXX_Init()函数中直接调用InerrruptInitialize()就可以了?还需要修改OAL层吗?如需修改,如何修改? 3。如果不硬编码sysirq,如何根据irq得到对应的sysirq?调用哪个函数?同时还需要修改OAL层吗?如何修改? 请高手逐个问题指点迷津!多谢了 [编辑 - 11/23/04 by wwei_wang] |
|
|
论坛版主
|
沙发#
发布于: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 |
|
板凳#
发布于:2004-11-24 15:09
谢谢wxl_50685330大哥的指点,我用的是x86处理器。不过还有一个问题不是很清楚:
irq 和 sysintr的对应关系是怎么定义的?在哪个文件里定义的?通过什么函数定义?最好能给我举个例子,假设我用的硬件中断号为9号。先谢谢了!:) |
|
|
论坛版主
|
地板#
发布于: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) |
|
地下室#
发布于:2004-11-24 16:17
也就是说只要我的ISR处理完后返回与我的IST关联的sysirq就可以了(事先已调用InterruptInitialize将IST, Sysirq以及Event)。irq与 sysirq的关系完全是自定义的。对吧?:)
|
|
|
论坛版主
|
5楼#
发布于:2004-11-24 16:42
对头!:)))
|
|
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嘛?好迷惑,不知道该怎么做? |
|
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. |
|
|