【通信】5G_6G(毫米波_太赫兹)定位和感知的信道建模、性能分析、定位和优化算法附Matlab代码
2026/8/21 4:02:37
在 Linux 中,gpio-keys是一个平台驱动(Platform Driver),它充当了物理 GPIO 硬件与 Linux 标准输入子系统(Input Subsystem)之间的“翻译官”。
整个处理流程自下而上分为四层:
input_allocate_device()和input_register_device()向内核注册一个输入设备。gpio-keys通过input_report_key()和input_sync()函数将事件上报给核心层。evdev)。/dev/input/目录下生成字符设备节点(如event3)。struct input_event结构体。以下是基于 RK3566 Armbian 环境的标准操作流程。为了简化软件配置,优先选择硬件默认电平与电路逻辑相符的引脚。
GPIO 编号计算公式(以 RK3566 为例):
Pin Index=(Group Index×8)+Pin Number\text{Pin Index} = (\text{Group Index} \times 8) + \text{Pin Number}Pin Index=(Group Index×8)+Pin Number
第一步:编写设备树插件源码 (.dts)
创建文件rk3566-user-button.dts,该文件描述了按键的物理属性和逻辑键值。
/dts-v1/;/plugin/;/{compatible="rockchip,rk3566";fragment@0{target-path="/";__overlay__{gpio-keys-user{compatible="gpio-keys";autorepeat;/* 开启后,所有按键都支持长按连发 */ /* --- 第一个按键(GPIO0_B5)--- */ user_button_1{label="User Button 1";linux,code=<148>;/* KEY_PROG1 */ gpios=<&gpio0131>;/* GPIO0_B5, Active Low */ debounce-interval=<20>;gpio-key,wakeup;};/* 如果需要,可以继续加 Button2, Button3... */};};};};第二步:编译为 .dtbo 文件
使用 设备树编译器(dtc)将源码编译为.dtbo文件。如果没有,执行以下命令安装:
sudoapt-getupdatesudoapt-getinstalldevice-tree-compiler编译.dts文件:
dtc -I dts -O dtb -o rk3566-user-button.dtbo rk3566-user-button.dts第三步:安装并启用 Overlay
将编译好的.dtbo文件放入系统指定的 Overlay 目录,并修改启动配置。
.dtbo放入/boot/overlay-user/目录(如果没有这个目录则手动创建)。sudomkdir-p /boot/overlay-user/sudocprk3566-user-button.dtbo /boot/overlay-user//boot/armbianEnv.txt文件,添加或修改user_overlays参数(注意不需要 .dtbo 后缀)。user_overlays=rk3566-user-button第四步:重启并验证
sudorebootgpio-keys是否加载成功:dmesg|grepgpio-keyssudoaptinstallevtestsudoevtestEvent: type 1 (EV_KEY), code 148, value 1。value 0。一旦设备树生效,系统启动后会在/dev/input/下生成一个新的节点(例如/dev/input/event3)。
应用层不需要包含任何 GPIO 相关的头文件,只需要标准的 Input 子系统头文件。
#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<linux/input.h>#defineKEY_EVENT_PATH"/dev/input/event3"intmain(){intfd=open(KEY_EVENT_PATH,O_RDONLY);structinput_eventie;while(read(fd,&ie,sizeof(ie))>0){// EV_KEY 代表按键事件if(ie.type==EV_KEY){// value: 1=按下, 0=松开, 2=长按连发printf("Key Code: %d, Action: %s\n",ie.code,ie.value==1?"Pressed":(ie.value==0?"Released":"Repeat"));}}return0;}