当前位置:嗨网首页>书籍在线阅读

05-申请和释放中断

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

10.3.1 申请和释放中断

在Linux设备驱动中,使用中断的设备需要申请和释放对应的中断,分别使用内核提供的request_irq()和free_irq()函数。

1.申请IRQ

int request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char devname, void dev_id)

irq是要申请的硬件中断号。

handler是向系统登记的中断处理函数(顶半部),是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。

irqflags是中断处理的属性,可以指定中断的触发方式以及处理方式。在触发方式方面,可以是IRQF_TRIGGER_RISING、IRQF_TRIGGER_FALLING、IRQF_TRIGGER_HIGH、IRQFTRIGGER LOW等。在处理方式方面,若设置了IRQF_DISABLED,表明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序则不会屏蔽其他设备的驱动;若设置了IRQF_SHARED,则表示多个设备共享中断,dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。

request_irq()返回0表示成功,返回-EINVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。

顶半部handler的类型irq_handler_t定义为:

typedef irqreturn_t (irq_handler_t)(int, void );

typedef int irqreturn_t;

2.释放IRQ

与request_irq()相对应的函数为free_irq(),free_irq()的原型为:

void free_irq(unsigned int irq,void *dev_id);

free_irq()中参数的定义与request_irq()相同。