linux2.6.26内核中ARM中断实现详解
0、INT_ADC等中断的注册。下面看看这些带有子中断的中断号对应的处理函数的内容。以IRQ_EINT4t7为例,其它情况类似。
/*arch/arm/plat-s3c24xx/irq.c*/
s3c_irq_demux_extint4t7(unsigned int irq,
struct irq_desc *desc)
{
unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);
eintpnd &= ~eintmsk;
eintpnd &= 0xff; /* only lower irqs */
/* eintpnd中可以有多个位同时置1,这一点和intpnd的只能有1个位置1是不一样的 */
while (eintpnd) { //循环执行所有置位的子中断
irq = __ffs(eintpnd); //算出第一个不为0的位,类似arm v5后的clz前导0的作用
eintpnd &= ~(1
desc_handle_irq(irq, irq_desc + irq);//执行对应子中断的注册函数
}
}
从上面的函数可以看出子中断是如何注册及被调用到的。有人可能会问为何不在include/asm/arch-s3c2410/entry-macro.s 文件中get_irqnr_and_base函数判断中断号时,直接算出对应的子中断号,就可以直接找到子中断处理了呢?
原因是: get_irqnr_and_base是平台给系统提供的函数,对于多个子中断同时置位的情况无法通过一个值返回(因为子中断中,如eintpnd是可以多个位同时置位的))。而intpnd则没有这个问题。
linux2 6 26内核ARM中断实 相关文章:
- Linux2.6.36移植到飞凌S3C6410开发板 步骤(11-23)
- Linux2.6.22内核移植(11-21)
- 基于3c2410的linux2.6.22移植(3)(11-20)
- 基于3c2410的linux2.6.22移植(2)(11-20)
- 基于3c2410的linux2.6.22移植(6)(11-20)
- 基于3c2410的linux2.6.22移植(5)(11-20)