#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
/*
myirqs{
interrupt-parent = <&gpiof>;
interrupts = <9 0>,<7 0>,<8 0>;
};
*/
struct device_node* node;
unsigned int irqno;
//一:创建一个tasklet对象
struct tasklet_struct mytask;
//四:填充tasklet处理函数
void tasklet_callback(struct tasklet_struct* task){
//此处写具体代码块
}
//4.填充中断处理函数
irqreturn_t key_irq_handle(int irq, void* dev){
//三:调用tasklet执行
tasklet_schedule(&mytask);
//注意返回值
return IRQ_HANDLED;
}
static int __init mycdev_init(void){
int ret;
//二:初始化tasklet
tasklet_setup(&mytask,tasklet_callback);
//1.获取节点
node = of_find_node_by_path("/myirq");
if(NULL == node){
printk("of_find_node_by_path error");
return -EINVAL;
}
//2.根据节点获得软中断号
irqno = irq_of_parse_and_map(node, 0);
if(0 == irqno){
printk("irq_of_parse_and_map error");
return -EAGAIN;
}
//3.注册中断
ret = request_irq(irqno,key_irq_handle,IRQF_TRIGGER_FALLING,"key_irq",NULL);
if(ret){
printk("request_irq error");
return ret;
}
return 0;
}
static void __exit mycdev_exit(void){
//5.释放中断
free_irq(irqno,NULL);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
驱动 中断底半部 tasklet机制 示例
于 2023-05-16 18:37:02 首次发布