有很多Linux 的驱动都是通过中断的方式来进行内核和硬件的交互。
在 Linux 设备驱动中,使用中断的设备需要申请和释放对应的中断,分别使用内核提供的request_irq()
和free_irq()函数。
驱动程序申请中断和释放中断的调用在include/linux/sched.h里声明。
request_irq()调用的定义:
int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags,const char * devname,oid *dev_id);
irq 是要申请的硬件中断号。在Intel 平台,范围是0~15。
handler 是向系统登记的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参数包括硬件中断号,device id,寄存器值。
dev_id就是下面的request_irq时传递给系统的参数dev_id。
irqflags 是中断处理的一些属性(下降沿/上升沿的触发)。比较重要的有SA_INTERRUPT,标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不 设置SA_INTERRUPT)。 快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有一个SA_SHIRQ 属性,设置了以后运行多个设备共享中断。
dev_id 在中断共享时会用到。一般设置为这个设备的device结构本身或者NULL。中断处理程序可以用dev_id找到相应的控制这个中断的设备,或者用irq2dev_map找到中断对 应的设备。void free_irq(unsigned int irq,void *dev_id);
时间: 2024-10-06 01:00:08