本帖最后由 renshengrumeng 于 2020-6-27 09:46 编辑
一、设备树编写
设备树中arch/arm/boot/dts/ STM32mp157a-dk1.dts增加如下:
mykeys { input-name= "gpio-keys"; btn0 { label= "btn0"; gpios= <&gpioa 14 GPIO_ACTIVE_LOW>; linux,input-type= ; linux,code= ; gpio-key,wakeup; debounce-interval= <15>; }; btn1 { label= "btn1"; gpios= <&gpioa 13 GPIO_ACTIVE_LOW>; linux,code= ; }; };
复制代码
(红色为必要部分) - label : 一个key 的别名
- linux,code : 键值,作为按键的唯一识别号(宏位于)
- linux,input-type: input类型(宏定义在/usr/include/linux/input-event-codes.h) 默认为EV_KEY
- wakeup-source: 与pm相关,默认为disable
- linux,can-disable:是否共享中断line ((默认)0:shared, 1: not shared)
- debounce-interval : 去抖延时
- gpios : gpio 的相关信息
二、驱动移植需要在linux内核配置里选上相关的配置。在内核源码目录下:
# make menuconfig
Device Drivers ---> Input devicesupport ---> Keyboards ---> <*> GPIO Buttons
复制代码
选择上后,再编内核,再使用新的内核镜像启动系统 注:默认st 自带linux 系统已经选上。 三、验证
- 使用新内核启动后,可以查看出设备驱动是否已选择上:/sys/bus/platform/drivers/目录下应有”gpio-keys”目录
- 不同的平台设备文件可能会有差异, 如果不清楚对应的设备文件, 可以用下面的命令来查看:
file:///C:/Users/usr/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
- 此时在/dev/input/目录下新增了一个event1是我们注册的驱动所对应的设备文件,可以通过hexdump命令来查看/dev/input/event1文件内容。可以通过按下按键或释放来测试内容变化。
file:///C:/Users/usr/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png 其中0002 指的是code 前面的0001 代表 EV_KEY 后面的0001 代表按键按下。
四、GPIO_KEY应用程序
需要用交叉工具编译如下APP 源码:
#include #include #include #include #include #include #define NOKEY 0
int main() { intkeys_fd; charret[2]; structinput_event t; char*dev; keys_fd= open("/dev/input/event1", O_RDONLY); if(keys_fd <= 0) { printf("open%s device error!n", dev); return0; }
while(1) { if(read(keys_fd, &t, sizeof(t)) == sizeof(t)) { if(t.type == EV_KEY) if(t.value == 0 || t.value == 1) { printf("%dn", t.code); switch(t.code) { case2: printf("user1%sn", (t.value) ? "Presse" : "Released"); break; case3: printf("user2%sn",(t.value) ? "Pressed" : "Released"); break; default: break; } } } } close(keys_fd); return0; }
复制代码
通过如下命令编译 $CC ./key.c -o key 复制到系统中 运行效果如下: file:///C:/Users/usr/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
|