Linux2.6 中断处理函数和申请中断函数的变化
2009-07-29 08:46
今天练习了中断。
Linux设备驱动开发技术及应用 ,作者使用的是2.6.4,现在看来也很古老了, 按照书上的例子,免不了很多错。 例如代码里 自己定义的中断处理函数 irqreturn_t int_interrupt(int irq,void * dev_id,struct pt_regs *regs); 注册中断函数 request_irq(PRINT_IRQ,int_interrupt,SA_INTERRUPT,INT_DEV_NAME,NULL); 编译提示 警告:‘deprecated_irq_flag’ 已过时(于 include/linux/interrupt.h:64 声明) 警告:传递参数 2 (属于 ‘request_irq’)时在不兼容的指针类型间转换 既然如此,那就到头文件里看看request_irq, http://lxr.linux.no/linux+v2.6.23.10/include/linux/interrupt.h#L94 extern int __must_check request_irq(unsigned int, irq_handler_t handler, unsigned long, const char *, void *); 没发现什么,再看看 typedef irqreturn_t (*irq_handler_t)(int, void *); 原来中断处理函数现在只有2个参数了,第三个参数struct pt_regs *regs保存的是中断发生时寄存器的值, 但是通常没有用,最后还是被取消了。 修改irqreturn_t int_interrupt(int irq,void * dev_id,struct pt_regs *regs); 为irqreturn_t int_interrupt(int irq,void * dev_id); 之后还是警告 原来头文件里没有SA_INTERRUPT了,一般使用IRQF_SHARED 了。 request_irq(PRINT_IRQ,int_interrupt,IRQF_SHARED,INT_DEV_NAME,NULL); 这样就可以了。网上看到很多人编译驱动也是这个问题,我想以后我做驱动移植的时候就可以直接改代码解决问题。 Linux内核给源代码,每个版本之间的变化,就像你写的代码,进行了修改,就需要修改其他的相关代码来配合变化。 既是折磨又是享受。 |