分类: LINUX
2012-04-01 09:25:23
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)
irq:软件中断号, 使用软件中断号可以减少linux OS对硬件平台的依赖性,使之更具有灵活性和可配置性。
handler (ExternalInput): 外部中断处理例程
软件中断号:Linux下的概念,为了支持多平台的关系,Linux不直接用硬件中断号索引中断描述符表(irq_desc)。所以当外部中断发生时,在外部中断处理程序(ExternalInput)中会通过读取PIC来获得本次中断的硬件中断号,获得硬件中断号后,会将其映射成对应的软件中断号来索引irq_desc数组,从而获得该软件中断号上的中断处理例程(外部中断处理例程)。
硬件中断号:当中断发生时,处理器从外部的PIC上读到的数值,也就是设备树dts文件中传过来的值。
三个表:
中断映射表:struct irq_map_entry irq_map[NR_IRQS] ≈ irq_map[virq]=hwirq
反向中断映射表:unsigned int *revmap ≈ int revmap[hwirq]=virq
中断描述符表:struct irq_desc *desc ≈ desc[virq]
用它来描述中断源,作为连接硬件中断和驱动程序中request_irq函数,注册的中断处理例程之间的桥梁
两个过程:
硬中号映射软中号过程 (线性映射)
外部中断响应处理的过程
级联中断
上面是多级中断级联的例子cpu是通过gpio与cpld相连,cpld下又挂了几个设备(网络,pci桥,串口....)