linux 标准子模块 keyborads支持按键操作,不需要自己写按键驱动
Device Drivers —> Input device support —> [*] Keyboards —> < M> GPIO Buttons
1、设备树,根节点增加按键节点
gpio-keys {
compatible = "gpio-keys";
autorepeat;
up {
label = "GPIO Key UP";
linux,code = <103>;
gpios = <&gpio 17 1>;
};
};
2、查看设备树识别,gpio-keys已经加载
设备树修改后,加载对应的dtb文件,kernel启动信息可以看到gpio-keys的挂载!
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Starting mdev... OK
[ 5.376933] input: gpio-keys as /devices/platform/gpio-keys/input/input0
设备树文件也可以查看:
[root@buildroot /sys/firmware/devicetree/base]#ls
#address-cells clocks memreserve
#size-cells compatible model
__overrides__ fixedregulator_3v3 name
__symbols__ fixedregulator_5v0 phy
aliases gpio-keys serial-number
arm-pmu interrupt-parent soc
axi leds system
chosen memory@0 thermal-zones
3、查看 对应设备event0
[root@buildroot /dev/input]#ls
event0 mice
4、测试代码(在之前文章 helloworld.c基础上修改)
#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEV_PATH "/dev/input/event0" //difference is possible
int main(int argc, char *argv[])
{
int keys_fd;
char ret[2];
struct input_event t;
if(argc !=1)
{
printf("input device error\n");
return -1;
}
printf("key test!\n");
keys_fd=open(DEV_PATH, O_RDONLY);
if(keys_fd <= 0)
{
printf("open /dev/input/event0 device error!\n");
return -1;
}
while(1)
{
if(read(keys_fd, &t, sizeof(t)) == sizeof(t))
{
if(t.type==EV_KEY ){
//if(t.value==0 || t.value==1)
if( t.value==1)
{
printf("key %d \n", t.code);
if(t.code == KEY_ESC)
break;
}
}
}
}
close(keys_fd);
return 0;
}
5、按动按键,测试
[root@buildroot /usr/bin]#./helloworld
key test!
key 103
key 103
key 103
key 103
key 103
key 103
key 103
^C
-----------------------------------------仅此记录-----------------------------------------