admin管理员组文章数量:1564192
一、基础
1、以下介绍了 input 子系统的基础,使用的自己编的按键驱动。实际上内核自带了按键驱动(一般默认使能)。
【Linux驱动开发】INPUT 子系统实验
2、内核自带按键驱动简介
- Linux 内核的按键驱动采用 platform 框架,只需要在设备树文件中添加相应的按键节点(gpio-keys)。
- Linux 内核自带的 KEY 驱动文件为 drivers/input/keyboard/gpio_keys.c
二、使能Linux 内核自带按键驱动
1、输入以下命令打开 Linux 配置菜单
make menuconfig
2、 按以下路径打开按键驱动配置项
-> Device Drivers
-> Input device support
-> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
-> Keyboards (INPUT_KEYBOARD [=y])
->GPIO Buttons
3、开发板终端查看驱动是否使能:
在/sys/bus/platform/drivers 目录下存在一个名为“gpio-keys”的文件:
三、设备树节点编写
文档 Documentation/devicetree/bindings/input/gpio-keys.txt ,讲解了 Linux 自带按键驱动对应的设备树节点该如何编写。① 节点名字“gpio-keys”。 ② gpio-keys 节点的 compatible 属性值一定要设置为“ gpio-keys ”。 ③所有的 KEY 都是 gpio-keys 的子节点,每个子节点可以用如下属性描述自己:
- gpios:KEY 所连接的 GPIO 信息。
- interrupts:KEY 所使用 GPIO 中断信息(可选)
- label:KEY 名字
- linux,code:KEY 要模拟的按键。
④如果按键要支持连按的话要加入 autorepeat。
在根节点下添加以下节点信息:
gpio-keys {
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
autorepeat; /*支持连按*/
key0 {
label = "GPIO Key Enter"; /*按键名字*/
linux,code = <KEY_ENTER>; /*设置为 KEY_ENTER 回车键*/
gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
};
};
四、测试
1、用新的 zImage 和 imx6ull-alientek-emmc.dtb 启动开发板 。
可以看到 input 子系统多了一个 event1 设备文件:
2、使用 hexdump 命令来查看 /dev/input/event1 文件内容
hexdump /dev/input/event1
按下、释放按键会输出 input_event 类型的原始事件数据值:
3、问题分析
按下 KEY 按键以后没有反应,可能原因: ①是否使能 Linux 内核 KEY 驱动。 ②设备树中 gpio-keys 节点是否创建成功。 ③在设备树中是否有其他外设也使用了 KEY 按键对应的 GPIO ,但是并没有删除掉这些外设信息。 检查 Linux 启动 log 信息,看是否有以下报错: gpio-keys gpio_keys: Failed to request GPIO 18, error -16 上述信息表示 GPIO 18 申请失败,失败的原因就是有其他的外设正在使用此 GPIO 。
4、按键设置为回车键
Linux 内核设计的 10 分钟以后 LCD 关闭,也就是黑屏,就跟我们用电脑或者手机一样,一定时间以后关闭屏幕。这里将开发板上的 KEY 按键注册为回车键,当 LCD 黑屏以后直接按一下 KEY 按键即可唤醒屏幕。
版权声明:本文标题:【Linux驱动开发】Linux 自带按键驱动 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727460793a1115681.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论