目录
一、内核检查
二、驱动文件
三、设备树
四、验证
一、内核检查
内核一般默认已经使能了 KEY 驱动,但是还是要检查一下。按照如下路径找到相应的配置选项:
Device Drivers
-> Input device support
-> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
-> Keyboards (INPUT_KEYBOARD [=y])
->GPIO Buttons
选中以后就会在源码根目录下.config 文件中出现“CONFIG_KEYBOARD_GPIO=y”这一行,
Linux 内核就会根据这一行来将 KEY 驱动文件编译进 Linux 内核
二、驱动文件
打开源码根目录下的\drivers\input\keyboard\Makefile,找到在内核使能的“CONFIG_KEYBOARD_GPIO"
可以看到 ,对应的是gpio_keys.o,也就是由gpio_keys.c编译出来到,所以KEY 驱动文件为drivers/input/keyboard/gpio_keys.c
gpio_keys.c 采用了 platform 驱动框架,在 KEY 驱动上使用了 input 子系统实现。
打开gpio_keys.c,查找 .compatible
设备树上面的compatible必须和这个一直,下面开始编写设备树
三、设备树
打开绑定文档,源码根目录下\Documentation\devicetree\bindings\input\gpio-keys.txt
按键参考文档规定来写
200行,文档规定节点名字为“gpio-keys”。
201行,文档规定 gpio-keys 节点的 compatible 属性值一定要设置为“gpio-keys”。
204行,文档说需要autorepeat 表示按键支持连按
206-207行,pinctrl系统,用来配置电气属性的,这和之前的按键实验一样
209行,所有的 KEY 都是 gpio-keys 的子节点,每个子节点可以用如下属性描述自己
210行,label: KEY 名字,这里设置可以自定
211行,linux,code: KEY 要模拟的按键,打开源码目录下/include/uapi/linux/input.h
KEY 按键设置为“EKY_ENTER”这个按键,也就是回车键,效果和键盘上的回车键一样。后面学习 LCD 驱动的时候需要用到此按键,因为 Linux 内核设计的 10 分钟以后 LCD关闭,也就是黑屏,就跟我们用电脑或者手机一样,一定时间以后关闭屏幕。这里将开发板上的 KEY 按键注册为回车键,当 LCD 黑屏以后直接按一下 KEY 按键即可唤醒屏幕,就跟当电脑熄屏以后按下回车键即可重新打开屏幕一样
212行,文档说gpios: KEY 所连接的 GPIO 信息。也就是使用的 IO,这里要检查该IO有没有被别的节点使用,如果有就需要先屏蔽
四、验证
用编译好的设备树启动开发板
可以在启动信息里面看到已经设置好按键
下面进入查看一下
可以看到已经存在event1
最后运行一下
可以看到,按下按键就会打印对应的信息,倒数第三列为code 为事件编码,也就是按键号,
上面设置“EKY_ENTER”这个按键,值为28,转为16进制就是1c