admin管理员组

文章数量:1561463

一、基础 

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 的子节点,每个子节点可以用如下属性描述自己:
  • gpiosKEY 所连接的 GPIO 信息。
  • interruptsKEY 所使用 GPIO 中断信息(可选)
  • labelKEY 名字
  • linux,codeKEY 要模拟的按键。

④如果按键要支持连按的话要加入 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