一、Linux 内核自带按键驱动使能。
Linux 内核也自带了 KEY 驱动,如果要使用内核自带的 KEY 驱动的话需要配置 Linux 内核,不过 Linux 内核一般默认已经使能了 KEY 驱动,但是我们还是要检查一下。
使用如下命令打开 Linux 配置菜单:
make menuconfig
按照如下路径 找到相应的配置选项:
选中“GPIO Buttons”选项,将其编译进 Linux 内核中,如图
选中以后就会在.config 文件中出现“CONFIG_KEYBOARD_GPIO=y”这一行,Linux 内核 就会根据这一行来将 KEY 驱动文件编译进 Linux 内核。
二、设备树节点编写
据Documentation/devicetree/bindings/input/gpio-keys.txt 这个文件在设备树中添加指定的设备节点 即可,节点要求如下:
①、节点名字为“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 = <KEY_ENTER>; 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
然后按下 开发板上的按键
如果按下 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。