setup_irq函数的定义如下: int setup_irq(unsigned int irq, struct irqaction *new); 其中,irq是中断号,而irqaction结构体定义了中断处理程序的相关信息,包括中断处理函数、中断标志位等。通过调用setup_irq函数,可以将新的中断处理函数注册到指定的中断号上,从而实现对中断事件的处理。 在使用setup_irq函数时,需...
__setup_irq是用于设置和注册中断的核心函数,它是request_threaded_irq等函数的内部实现。 1.1. irqaction handler和thread_fn是struct irqaction的两个重要成员,由程序员指定或在__setup_irq中自动设置, 在中断发生后的处理函数被调用。 /// include/linux/interrupt.h /** * struct irqaction - per interrup...
分两步,第一步是与硬件和平台无关的通用逻辑层处理,其本质就是一个for循环执行一个函数desc_set_defaults(),为所有的irq_desc填充默认值。其关键点是为这些irq_desc注册的中断控制器全部先填充为一个所谓no_irq_chip。 ---kernel/irq/irqdesc.c--->staticvoiddesc_set_defaults(unsignedintirq,structirq_desc...
intsetup_irq(unsigned int irq,struct irqaction*new){int shared=0;unsigned long flags;struct irqaction*old,**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(...
status: IRQ线的状态。 handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是 hw_interrupt_type 中的 ack 函数。
1.1.1中断描述符结构irq_desc irq_desc:中断全局描述符 struct irq_desc { unsigned int irq;注释:表示此中断描述符的中断号 struct timer_rand_state *timer_rand_state;注释:timer伪随机数状态结构指针 unsigned int *kstat_irqs; #ifdef CONFIG_INTR_REMAP ...
2、setup_irq函数 代码块如下: intsetup_irq(unsigned int irq,structirqaction*new) {/* 根据中断号找到对应的数组项 */structirq_desc*desc = irq_desc + irq;structirqaction*old, **p;constchar*old_name = NULL; unsigned long flags; int shared =0;if(irq >= NR_IRQS)return-EINVAL;if(desc-...
2、 acpi_register_gsi:其主要功能由__acpi_register_gsi来完成,该函数指针在ACPI模式下被设置为acpi_register_gsi_ioapic,acpi_register_gsi_ioapic的执行过程如下:mp_register_gsi===>io_apic_set_pci_routing===>io_apic_set_pci_routing===>io_apic_setup_irq_pin_once===>io_apic_setup_irq_pin=...
ret =setup_irq_thread(new, irq,false);if(ret)gotoout_mput;if(new- >secondary) { ret =setup_irq_thread(new- >secondary, irq,true);if(ret)gotoout_thread; } }if(!desc- >action) {//第一次安装,需要申请resourcesret =irq_request_resources(desc);if(ret) {pr_err("Failedto request res...
retval = __setup_irq(irq, desc, action); ---(5) chip_bus_sync_unlock(desc); } (1)对于那些需要共享的中断,在request irq的时候需要给出dev id,否则会出错退出。为何对于IRQF_SHARED的中断必须要给出dev id呢?实际上,在共享的情况下,一个IRQ number对应若干个irqaction,当操作irqaction的时候,仅仅...