没有选择双面打印,还出来双面打印提示,每次复印还都出来一张白纸,怎么回事? 求迅速解答2天内要,谢谢
585
2022-05-29
1. 外部中断介绍
前面有篇文章使用杂项设备完成了按键驱动的编写,实现了按键轮询检测,通过read函数向应用层传递按键值,这篇文章使用按键为例,介绍linux内核里中断的注册方法,使用中断的方式检测按键是否按下,中断在单片机、设备驱动开发里使用的都非常多,可以更加实时的检测到按键触发的情况。
Linux内核提供了中断的注册接口:
(1)注册中断
头文件 include\linux\interrupt.h 定义文件 include\linux\interrupt.h 函数原型 int request_irq(unsigned int irq,/*做实参传递给中断服务函数第1个参数*/ irq_handler_t handler, /*中断服务函数指针*/ unsigned long flags, const char *name, void *dev_id); /*做实参传递给中断服务函数第2个参数*/ 函数功能 向内核注册一个中断服务函数; 当发生中断号为 irq 的中断时候,会执行 handler 指针函数。 函数参数 irq:中断编号(每个中断源有惟一的编号)。 handler:中断服务函数指针。 原型 typedef irqreturn_t (*irq_handler_t)(int, void *)。 flag:中断的标志,用来描述本中断的基本特征的。 有固定的值,由中断源的特征决定; 比如外中断有:上升沿,下降沿触发中断这类标志。 name:中断名字, 注册后会出现cat /proc/interrupts dev_id: 这个参数是传递给中断服务函数。 对共享中断来说, 这个参数一定有要; 当注销共享中断中的其中一个时, 用这个来标识要注销哪一个。 对于有惟一入口的中断,可以传递 NULL; 但是一般来说都会传递一个有意义指针,在中断程序中使用, 以方便编程。 返回值 0 表示成功 -EINVAL (无效参数22)表示中断号无效。 -EBUSY (设备或者资源忙16)表示中断已经被占用。
(2)注销中断
void free_irq(unsigned int irq,void * dev_id) irq: 要注销的中断号 dev_id:其实就是注册时候使用的dev参数,在共享中断必不可少,不能传递NULL。 注意:为了防止在注销时同时发生中断,调用时候,先禁止中断。
(3)中断开启与关闭
禁止中断 void disable_irq_nosync(unsigned int irq); void disable_irq(unsigned int irq); 参数:irq,要禁止的中断对应的编号。 注意:在中断服务程序中不能使用 disable_irq 这个函数,否则内核崩溃,可以使用 disable_irq_nosync。 disable_irq:函数调用后,函数不会马上返回,而等待中断程序执行完成才返回,在中断调用会导致死锁。 disable_irq_nosync:调用后,函数马上返回。 使能中断 void enable_irq(unsigned int irq); 参数:irq,要使能的中断对应的编号
(4)获取irq中断号
int gpio_to_irq(unsigned gpio);
2. 外部中断驱动编写
2.1 按键原理图
2.2 驱动示例代码
insmod 安装驱动之后就直接注册按键中断,没有注册字符设备框架,当按键按下之后,直接在驱动层通过printk打印数据提示到终端。
#include 2.3 makefile代码 KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5 all: make -C $(KER_DRI) M=`pwd` modules cp *.ko /home/wbyq/work/rootfs/code -f make -C $(KER_DRI) M=`pwd` modules clean obj-m += interrupt_key.o Linux
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。