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”,会有打印信息,如下图所示。 卸载驱动如下图。 测试完成。
|