1.irq_desc 内核中记录一个irq_desc的数组,数组的每一项对应一个中断或者一组中断(使用同一中断号)。一句话,irq_desc几乎记录所有中断相关的东西,这个结构是中断的核心。其中包括两个重要的数据结构irq_chip和irqaction。 include/linux/irq.h struct irq_desc irq_desc[NR_IRQS]; /** * struct irq_desc - ...
就是下图中的irq_num Linux内核中定义了名为irq_desc的中断例程描述符表来描述中断服务例程,每一个irq_desc对象数组中的下标就是软中断号。其中的struct irqaction对象描述了这个中断服务例程的中断的具体信息。 //include/linux/irqdesc.h 40 struct irq_desc { 41 struct irq_data irq_data; 42 unsigned int...
**p;irq_desc_t*desc=irq_desc+irq;...spin_lock_irqsave(&desc->lock,flags);p=&desc->action;if((old=*p)!=NULL){if(!(old->flags&new->flags&SA_SHIRQ)){spin_unlock_irqrestore(&desc->lock,flags);return-EBUSY;}do{p=&old->next;old=*p;}while(old);shared=1...
高层主要为中断linux流程处理,底层与硬件密切相关,如desc->handle_irq为linux高层流程处理,而desc->action为底层硬件处理从而需要用户实现,又如中断处理完成后chip->eoi为底层流程结束时处理函数(主要操作芯片寄存器),而chip->end为高层流程中断结束时处理函数。 三.中断注册流程 >>request_irq() include/linux/interru...
Linux内核将所有的中断统一编号,使用一个irq_desc结构数组来描述这些中断;每个数组项对应一个中断,也可能是一组中断,它们共用相同的中断号,里面记录了中断的名称、中断状态、中断标记(比如中断类型、是否共享中断等),并提供了中断的低层硬件访问函数(清除、屏蔽、使能中断),提供了这个中断的处理函数入口,通过它可以调用...
下面介绍一下 irq_desc_t 结构各个字段的作用: status: IRQ线的状态。 handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是 hw_interrupt_type 中的 ack 函数。
}irq_desc_t; 下面介绍一下 irq_desc_t 结构各个字段的作用: status : IRQ线的状态。 handler : 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是 hw_interrupt_type 中的 ack ...
1.irq_desc数组 irq_desc结构体在include/linux/irqdesc.h中定义,主要内容如下图: 每一个irq_desc数组项中都有一个函数:handle_irq,还有一个action链表。要理解它们,需要先看中断结构图: 外部设备1、外部设备n共享一个GPIO中断B,多个GPIO中断汇聚到GIC(通用中断控制器)的A号中断,GIC再去中断CPU。那么软件处理...
2.2、irq_desc linux为了开发方便,定义了虚拟的中断号,一般写成irq,并且用irq_desc结构体来表示这一个虚拟中断号所对应的外设中断。 当我们需要使用一个外设的中断时候,就需要在linux中为他分配一个虚拟中断号。通过创建irq_desc,我们就能获取到虚拟中断号。
的common_interrupt接口中,执行完中断执行环境建立后,会进入generic interrupt layer执行,其首先通过vector查找到irq和对应的irq_desc结构,并执行该结构的handle_irq接口,这个接口就是generic interrupt layer的通用逻辑接口,比如handle_edge_irq/handle_level_irq等;在中断执行的通用逻辑接口中,会通过irq_desc::action...