概述
采用Linux自带的按键驱动gpio-keys.c,实现按键输入读取。与上一章实现leds-gpio类似。
修改设备树文件
在根节点‘/’下创建key节点,节点名称为keys。节点内容如下(可参考别的平台的key节点编写):
keys:
{
compatible = "gpio-keys";
key1{
label = "volume-up"
linux,code = <114>;
gpios = <&pioC 0 GPIO_ACTIVE_LOW>; /* PC0*/
debounce-interval = <10>;
};
key2{
label = "volume-down"
linux,code = <115>;
gpios = <&pioC 2 GPIO_ACTIVE_LOW>; /* PC2*/
debounce-interval = <10>;
};
}
对于以上属性的功能不清楚,可以在gpio-keys.c中查找到,例如debounce-interval值提取过后,存放在结构体为gpio_keys_button的button中,查看结构体释义,可知道配置的参数是消抖时间,单位为ms。同理,linux,code的值表示输入事件的代码。当然,也可以在\Documentation\devicetree\bindings\input\gpio-keys.txt中了解属性的含义。
写完之后,执行make dtbs可以单独进行设备树进行编译。
编译驱动
(一)把驱动编译进内核
通过搜索compatible匹配内容,可以找到”gpio-keys”位于/drivers/input/keyboard/gpio-keys.c中。
打开/drivers/input/keyboard/Makefile可找到obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o,所以需要在根目录下的.config设置CONFIG_KEYBOARD_GPIO=y,或者通过menuconfig进行配置。
(二)编译下载
下载过后,可以在系统设备树中看到增加的key1和key2节点。
在/dev/input/目录下新增了一个event1是我们注册的驱动所对应的设备文件,可以通过hexdump命令来查看/dev/input/event1文件内容。可以通过按下按键或释放来测试内容变化。
应用测试
应用程序通过读取/dev/input/event1设备来判断按键是否按下。驱动如下:
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#define INPUT_DEV "/dev/input/event1"
int main(int argc, char * const argv[])
{
int fd = 0;
struct input_event event;
int ret = 0;
fd = open(INPUT_DEV, O_RDONLY);
if(fd <= 0)
{
perror("open err\r\n");
exit(1);
}
while(1){
ret = read(fd, &event, sizeof(event));
if(ret == -1) {
perror("Failed to read.\n");
exit(1);
}
if(event.type != EV_SYN)
{
printf("type:%d, code:%d, value:%d\n", event.type, event.code, event.value);
}
}
return 0;
}
测试现象如下: