if(request_irq(irqn, my_interrupt, IRQF_SHARED, "my_device", my_dev)){ printk(KERN_ERR "my_device: cannot register IRQ %d\n", irqn); return -EIO; } 1. 2. 3. 4. 5. irqn时请求的中断线,my_interrupt是中断处理程序,IRQF_SHARED设置中断线可以共享,设备名“my_device”,将my_dev传递给...
int setup_irq(unsigned int irq, struct irqaction *new) { struct irq_desc *desc = irq_desc + irq; //根据中断号找到irq_ desc[irq] ... ... p = &desc->action; //指向desc->action old = *p; if (old) { //判断action是否为空 /*判断这个中断是否支持共享 (IRQF_SHARED)*/ if (!(...
request_irq()成功返回0,如果返回非0,就表示有错误发生,这个时候你可以考虑当前中断是否被占用了,所以可以加上IRQF_SHARED标志 3、中断处理程序 这里延续上面的handler指针,原型如下: Staticirqreturn_t intr_handler(int irq, void *dev) 这里唠叨一下,不知道大家面试时候有没有遇到像这样的题目 __interrupt double...
指定IRQF_SHARED标志以调用request_irq()时,只有在以下两种情况下才可能成功:中断线当前未被注册,或者在该线上的所有已注册处理程序都指定了IRQF_SHARED。注意,在这一点上2.6版与以前的内核是不同的,共享的处理程序可以混用 IRQF_DISABLED 中断处理程序的触发 内核接收一个中断后,它将依次调用在该中断线上...
struct irq_desc *desc = irq_desc + irq; //根据中断号找到irq_ desc[irq] ... ... p = &desc->action; //指向desc->action old = *p; if (old) { //判断action是否为空 /*判断这个中断是否支持共享 (IRQF_SHARED)*/ if (!((old->flags & new->flags) & IRQF_SHARED) || ...
irqflags是中断处理的属性,若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版zhon已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDO...
request_irq 函数的返回值是一个整数,用于指示注册是否成功或发生了哪种错误。 返回0:表示中断注册成功。 返回非0值:表示注册失败,具体的非0值代表不同的错误类型。3. request_irq 在不同情况下的返回值 返回-EBUSY:表示指定的中断号已经被占用,无法再次注册。此时可以考虑使用 IRQF_SHARED 标志来共享中断。 返回...
IRQF_SHARED 多个设备同享一个中止线,同享的一切中止都必须指定此标志。假如运用同享中止的话, request_...
request_irq(1, my_interrupt, IRQF_SHARED, "my_interrupt", NULL); ``` 2. 注册一个中断处理程序,当IRQ5号中断发生时,调用my_interrupt函数进行处理,并共享该中断: ```c request_irq(5, my_interrupt, IRQF_SHARED, "my_interrupt",NULL); ``` 3. 注册一个中断处理程序,当IRQ7号中断发生时,调用...
request_irq()成功返回0,如果返回⾮0,就表⽰有错误发⽣,这个时候你可以考虑当前中断是否被占⽤了,所以可以加上IRQF_SHARED标志 3、中断处理程序 这⾥延续上⾯的handler指针,原型如下:Static irqreturn_t intr_handler(int irq, void *dev)这⾥唠叨⼀下,不知道⼤家⾯试时候有没有遇到像...