目录
一、中断是什么?
二、中断驱动
中断驱动---检测外部中断
获取外设的数据内容,通过中断信号进行获取
在驱动中设置外设为中断模式:当外设产生设定的特定信号(就是中断)
在驱动中实现中断处理操作(函数)
1.中断号
中断号:就是一个号码,中断控制器管理所有中断的编号,外设连接的引脚就对应了引脚的中断控制器的中断号
有硬件设备----设备的中断号
驱动如何获取中断号:
1、宏定义
IRQ_EINT(中断号)
2、设备树中描述,然后再驱动中获取
gpx1: gpx1 {
gpio-controller;
#gpio-cells = <2>;interrupt-controller;
interrupt-parent = <&gic>;
interrupts = <0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
<0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>;
#interrupt-cells = <2>;
};
2.实现驱动工作
a、获取到中断号
获取设备树节点,返回值就是从设备树中找到的节点
struct device_node *of_find_node_by_path(const char *path);
从节点中获取到中断号,返回值就是中断号
unsigned int irq_of_parse_and_map(struct device_node *dev,int index);
b、申请中断
typedef irqreturn_t (*irq_handler_t)(int, void *);----类型替换,irq_handler_t代表函数指针
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
参数1:
unsigned int irq:申请中断的中断号
参数2:
irqreturn_t (*)(int, void *) ---- irq_handler_t
irq_handler_t handler:函数指针,进行注册中断,当产生中断时调用对应的函数进行处理
参数3:
unsigned long flags:中断处理的触发方式
#define IRQF_TRIGGER_NONE 0x00000000
#define IRQF_TRIGGER_RISING 0x00000001
#define IRQF_TRIGGER_FALLING 0x00000002
#define IRQF_TRIGGER_HIGH 0x00000004
#define IRQF_TRIGGER_LOW 0x00000008
参数4:
const char *name:字符串首地址,中断的描述信息
/proc/inruppter
参数5:
void *dev:传递给参数2的函数进行自动调用的(作为参数2这个函数的参数)
返回值:
成功返回0,失败返回非0
释放中断:
void free_irq(unsigned int irq,void * dev_id)
参数1:
unsigned int irq
中断号
参数2:
void * dev_id:与申请中断第五个参数保持一致
总结
中断是指在程序执行过程中,出现某种紧急事件,CPU暂停执行现行程序,转去执行处理该事件的程序——中断服务程序,执行完后再返回到被暂停的程序继续执行,这一过程称为中断。