request_irq() | 注册中断服务

在2.4内核和2.6内核中都使用request_irq()函数来注册中断服务函数。在2.4内核中,需要包含的头文件是#include<linux/sched.h>,2.6内核中需要包含的头文件则是#include<linux/interrupt.h>。函数原型如下:

·2.4内核

intrequest_irq(unsignedintirq,void(*handler)(int,void*,structpt_regs*),unsignedlongfrags,constchar*device,void*dev_id);

·2.6内核

request_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev);参数说明:在发生对应于第1个参数irq的中断时,则调用第2个参数handler指定的中断服务函数(也就是把自定义的handler()中断服务函数注册到内核中)。第3个参数flags指定了快速中断或中断共享等中断处理属性。在2.6教新的内核里(我的是2.6.27~2.6.31),在linux/interrupt.h中定义操作这个参数的宏如下:

引用

/**Theseflagsusedonlybythekernelaspartofthe*irqhandlingroutines.**IRQF_DISABLED-keepirqsdisabledwhencallingtheactionhandler*IRQF_SAMPLE_RANDOM-irqisusedtofeedtherandomgenerator*IRQF_SHARED-allowsharingtheirqamongseveraldevices*IRQF_PROBE_SHARED-setbycallerswhentheyexpectsharingmismatchestooccur*IRQF_TIMER-Flagtomarkthisinterruptastimerinterrupt*IRQF_PERCPU-Interruptispercpu*IRQF_NOBALANCING-Flagtoexcludethisinterruptfromirqbalancing*IRQF_IRQPOLL-Interruptisusedforpolling(onlytheinterruptthatis*registeredfirstinansharedinterruptisconsideredfor*performancereasons)*/#defineIRQF_DISABLED0x00000020#defineIRQF_SAMPLE_RANDOM0x00000040#defineIRQF_SHARED0x00000080#defineIRQF_PROBE_SHARED0x00000100#defineIRQF_TIMER0x00000200#defineIRQF_PERCPU0x00000400#defineIRQF_NOBALANCING0x00000800#defineIRQF_IRQPOLL0x00001000

早期一点的2.6内核这里一般以SA_前缀开头,如:SA_INTERRUPT表示禁止其他中断;(对应于IRQF_DISABLED)SA_SHIRQ表示共享相同的中断号(对应于IRQF_SHARED)SA_SAMPLE_RANDOM此宏会影响到RANDOM的处理(对应于IRQF_SAMPLE_RANDOM)。第4个参数name通常是设备驱动程序的名称。改值用在/proc/interrupt系统(虚拟)文件上,或内核发生中断错误时使用,自定义“XXX”。第5个参数dev_id可作为共享中断时的中断区别参数,也可以用来指定中断服务函数需要参考的数据地址。返回值:函数运行正常时返回0,否则返回对应错误的负值。示例代码片段:

引用

irqreturn_txxx_interrupt(intirq,void*dev_id){…return(IRQ_HANDLED);}intxxx_open(structinode*inode,structfile*filp){if(!request_irq(XXX_IRQ,xxx_interruppt,IRQF_DISABLED,”xxx”,NULL)){/*正常注册*/}return(0);}

============================================================================

没有人会帮你一辈子,所以你要奋斗一生。

request_irq() | 注册中断服务

相关文章:

你感兴趣的文章:

标签云: