在学习字符驱动的过程中,实现过按键驱动。实现功能:按键在按下时,会触发中断然后给应用层上报按键的状态。 像按键这种通用性驱动,linux也有提供标准的驱动(gpio_keys.c)。本篇文章主要记录如何使用此驱动。
要用到的内核代码路径: driver/input/keyboard/gpio_keys.c。
先将gpio_keys.c编译到内核: /* driver/input/keyboard/Makefile */ obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o /* arch/arm/config/[target_name]_defconfig */ CONFIG_KEYBOARD_GPIO=y 设备树节点添加: ① 在根节点增加gpio_key设备节点,compatible值与gpio_keys.c保持一致。 ② 增加具体按键设备子节点,设置相关节点属性值。 /* include/dt-bindings/input/linux-event-codes.h */ #define KEY_1 2 /* arch/arm/boot/dts/[target_name].dts */ gpio-keys { compatible = "gpio-keys"; user { label = "User Button"; gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>; gpio-key,wakeup; linux,code = <KEY_1>; }; };将源码设备树编译完后,烧录到开发板,然后测试效果
自测APP
App.png原始数据: hexdump 查看每次上报的十六进制类型数据:
原始数据.png介绍一下原始数据意义: [1 - 4 byte] : 秒 [5 - 8 byte] : 微妙 [9 -10 byte] : 事件数据 [11-12 byte] : 键值 [13-16 byte] : 按下和松开状态 上图框住的按下框内: 第一行表示 : 上报按键事件的数据 第二行表示 : 上报同步事件的数据