1. 简介
在学习字符驱动的过程中,实现过按键驱动。实现功能:按键在按下时,会触发中断然后给应用层上报按键的状态。
像按键这种通用性驱动,linux也有提供标准的驱动(gpio_keys.c)。本篇文章主要记录如何使用此驱动。
2.代码
要用到的内核代码路径: 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>;
};
};
3.测试
将源码设备树编译完后,烧录到开发板,然后测试效果
-
自测APP
App.png -
原始数据:
hexdump 查看每次上报的十六进制类型数据:
原始数据.png
介绍一下原始数据意义:
[1 - 4 byte] : 秒
[5 - 8 byte] : 微妙
[9 -10 byte] : 事件数据
[11-12 byte] : 键值
[13-16 byte] : 按下和松开状态
上图框住的按下框内:
第一行表示 : 上报按键事件的数据
第二行表示 : 上报同步事件的数据
网友评论