1.1 中断概述
ARM 架构 linux 内核中,有 5 种常见的异常,其中中断异常是其一,Linux 内核将所
有中断统一编号,使用一个 irq_desc 结构体来描述这些中断,里面记录了中断名称、中断状
态、中断标记、并提供了中断的底层硬件访问函数(如:清除、屏蔽、使能中断),提供了这
个中断的处理函数入口,通过它还可以调用用户注册的的中断处理函数。linux 内核的中断体
系已经很完善了,驱动工程师需要做的就是调用 request_irq 函数向内核注册中断处理函
数,下面我们来看看 request_irq 函数的定义:
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
第一个参数 irq:中断号,与平台架构相关;
第二个参数 handler:用户中断处理函数;
第三个参数 flags:中断标记
第四个参数 devname:中断名字,可以通过 cat /proc/interrupts 查看;
第五个参数 dev_id:在 free_irq 中有用,也用做区分中断处理函数;
有注册就得对应着有注销,驱动的注销函数是 free_irq,其定义如下:
void free_irq(unsigned int irq, void *dev_id)
第一个参数 irq:中断号,与 request_irq 中的 irq 一致,用于定位 action 链表;
第二个参数 dev_id:用于在 action 链表中找到要卸载的表项;同一个中断的不同中断
处理函数必须使用不通的 dev_id 来区分,这就要求在注册中断共享时参数 dev_id 必须唯
一。
1.2 设备树文件修改
这里我们选用 back 按键用于测试,它的网络标号是“DISP0_WR”,对应的 IO 管脚编
号是“NANDF_WP”,对应的宏定义为“MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09 ”
这个管脚在 gpio-keys 驱动中已经使用,我们需要在设备树中将其屏蔽,然后在设备树
文件中增加测试例程的设备树代码。
打开“arch/arm/boot/dts/imx6qdl-sabresd.dtsi”设备树文件。
将 gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; 屏蔽掉,如下图所示。
在“itop_max485_ctl”之后添加以下代码:
key_int{
compatible = "itop,key_int_name";
pinctrl-names = "default";
gpio_key_int = <&gpio6 9 GPIO_ACTIVE_LOW>;
status = "okay";
};
添加完成之后如下图所示,
重新烧写设备树文件,在开发板“/sys/bus/platform/device”目录下会有 key_int 文件
夹生成,表明设备注册完成。
1.3 测试驱动
驱动源码在压缩包“独立中断例程_V1.0”中。
使用“insmod key_int.ko”命令加载驱动模块。如下图。
按下按键“Back”,会有打印信息,如下图所示。
卸载驱动如下图。
测试完成。