MX6ULL学习笔记(十三)Linux 自带按键驱动程序

一、Linux 内核自带按键驱动使能。

        Linux 内核也自带了 KEY 驱动,如果要使用内核自带的 KEY 驱动的话需要配置 Linux 内核,不过 Linux 内核一般默认已经使能了 KEY 驱动,但是我们还是要检查一下。

使用如下命令打开 Linux 配置菜单:

make menuconfig 

按照如下路径 找到相应的配置选项:

MX6ULL学习笔记(十三)Linux 自带按键驱动程序_第1张图片选中“GPIO Buttons”选项,将其编译进 Linux 内核中,如图 MX6ULL学习笔记(十三)Linux 自带按键驱动程序_第2张图片

        选中以后就会在.config 文件中出现“CONFIG_KEYBOARD_GPIO=y”这一行,Linux 内核 就会根据这一行来将 KEY 驱动文件编译进 Linux 内核。 

二、设备树节点编写        

        据Documentation/devicetree/bindings/input/gpio-keys.txt 这个文件在设备树中添加指定的设备节点 即可,节点要求如下:

MX6ULL学习笔记(十三)Linux 自带按键驱动程序_第3张图片

①、节点名字为“gpio-keys”。

②、gpio-keys 节点的 compatible 属性值一定要设置为“gpio-keys”。

③、所有的 KEY 都是 gpio-keys 的子节点,每个子节点可以用如下属性描述自己: gpios:KEY 所连接的 GPIO 信息。 interrupts:KEY 所使用 GPIO 中断信息,不是必须的,可以不写。 label:KEY 名字 linux,code:KEY 要模拟的按键,也就是示例代码 58.1.2.4 中的这些按键。

④、如果按键要支持连按的话要加入 autorepeat。 打开 imx6ull-alientek-emmc.dts,根据上面的要求创建对应的设备节点,设备节点内容如下 所示:

gpio-keys { 
 compatible = "gpio-keys"; 
 #address-cells = <1>; 
 #size-cells = <0>; 
 autorepeat; 
 key0 { 
      label = "GPIO Key Enter"; 
      linux,code = ; 
      gpios = <&gpio1 18 GPIO_ACTIVE_LOW>; 
     }; 
 }; 

第 5 行,autorepeat 表示按键支持连按。

第 6~10 行,ALPHA 开发板 KEY 按键信息,名字设置为“GPIO Key Enter”,这里我们将 开发板上的 KEY 按键设置为“EKY_ENTER”这个按键,也就是回车键。

最后设置 KEY 所使用的 IO 为 GPIO1_IO18,一定要检查一下设备树看看此 GPIO 有没有 被用到其他外设上,如果有的话要删除掉相关代码!

重新编译设备树,然后用新编译出来的 imx6ull-alientek-emmc.dtb 启动 Linux 系统。

三、运行测试

查看/dev/input 目录,看看都有哪些文件,结果如图

        从图可以看出存在 event1 这个文件,这个文件就是 KEY 对应的设备文件,使用

hexdump 命令来查看/dev/input/event1 文件,输入如下命令:

hexdump /dev/input/event1 

然后按下 开发板上的按键

MX6ULL学习笔记(十三)Linux 自带按键驱动程序_第4张图片

如果按下 KEY 按键以后会在终端上输出图 58.5.2.2 所示的信息那么就表示 Linux 内核的按 键驱动工作正常。

四、失败分析

        大家如果发现按下 KEY 按键以后没有反应,那么请检查一下三方面:

①、是否使能 Linux 内核 KEY 驱动。

②、设备树中 gpio-keys 节点是否创建成功。

③、在设备树中是否有其他外设也使用了 KEY 按键对应的 GPIO,但是我们并没有删除掉 这些外设信息。

检查 Linux 启动 log 信息,看看是否有类似下面这条信息:

gpio-keys gpio_keys:Failed to request GPIO 18, error -16

上述信息表示 GPIO 18 申请失败,失败的原因就是有其他的外设正在使用此 GPIO。 

你可能感兴趣的:(mx6ull,学习,笔记,linux)