news 2026/10/9 21:22:41

外设与接口:基于内核 gpio-keys 子系统的按键处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
外设与接口:基于内核 gpio-keys 子系统的按键处理

1 基本原理

在 Linux 中,gpio-keys是一个平台驱动(Platform Driver),它充当了物理 GPIO 硬件与 Linux 标准输入子系统(Input Subsystem)之间的“翻译官”。

整个处理流程自下而上分为四层:

  1. 硬件层 (Hardware):
    • 物理按键连接到芯片的 GPIO 引脚。
    • 产生电平变化(中断信号)。
  2. 驱动层 (Driver: gpio-keys):
    • 职责:在设备树(DTS)匹配成功后,申请 GPIO 资源,注册中断服务函数(ISR),并配置软件消抖定时器。
    • 转换:当中断发生时,驱动读取 GPIO 电平,将物理信号(High/Low)转换为逻辑事件(Key Code, Value)。
    • 关联机制:调用input_allocate_device()和input_register_device()向内核注册一个输入设备。
  3. 核心层 (Input Core):
    • 职责:Linux 内核通用的输入管理层。它不关心底层是 GPIO、USB 还是蓝牙。
    • 接口:gpio-keys通过input_report_key()和input_sync()函数将事件上报给核心层。
    • 分发:核心层将事件分发给对应的 Handler(通常是evdev)。
  4. 用户层 (Userspace):
    • 接口:系统在/dev/input/目录下生成字符设备节点(如event3)。
    • 数据:应用程序读取标准的struct input_event结构体。

2 操作步骤

以下是基于 RK3566 Armbian 环境的标准操作流程。为了简化软件配置,优先选择硬件默认电平与电路逻辑相符的引脚。

  • 按键接 GND:选择默认上拉的引脚(如 GPIO0_B5)。
  • 按键接 VCC:选择默认下拉的引脚。

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

  • Group A=0, B=8, C=16, D=24
  • 示例:GPIO0_B5 =8+5=138 + 5 = 138+5=13

第一步:编写设备树插件源码 (.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 目录,并修改启动配置。

  1. 复制文件:将编译好的.dtbo放入/boot/overlay-user/目录(如果没有这个目录则手动创建)。
sudomkdir-p /boot/overlay-user/sudocprk3566-user-button.dtbo /boot/overlay-user/
  1. 编辑配置:修改/boot/armbianEnv.txt文件,添加或修改user_overlays参数(注意不需要 .dtbo 后缀)。
user_overlays=rk3566-user-button

第四步:重启并验证

  1. 重启系统:
sudoreboot
  1. 检查驱动加载: 重启后,查看内核日志,确认gpio-keys是否加载成功:
dmesg|grepgpio-keys
  1. 功能测试:安装并运行 evtest
sudoaptinstallevtestsudoevtest
  • 选择对应的 Event ID。
  • 按下按键应显示Event: type 1 (EV_KEY), code 148, value 1。
  • 松开按键应显示value 0。

3 应用开发

一旦设备树生效,系统启动后会在/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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 12:44:02

列车售票|基于springboot 列车售票系统(源码+数据库+文档)

列车售票目录 基于springboot vue列车售票系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue列车售票系统 一、前言 博主介绍&#xff1a;✌️大厂…

作者头像 李华
网站建设 2026/10/9 10:02:38

AI驱动的手动测试变革:赋能而非替代

随着大语言模型和智能自动化技术的飞速发展&#xff0c;软件测试领域正迎来前所未有的变革浪潮。传统手动测试作为软件质量保障的基石&#xff0c;面临着效率提升与价值重塑的双重挑战。 AI时代手动测试的困境与机遇 传统手动测试的局限性 手动测试长期面临着测试覆盖率低、…

作者头像 李华
网站建设 2026/10/9 8:01:42

【奶茶Beta专项】【LVGL9.4源码分析】09-core-group

【奶茶Beta专项】【LVGL9.4源码分析】09-core-group焦点组管理1 概述1.1 文档目的1.2 代码版本与范围2 设计意图与总体定位2.1 为什么需要 lv_group2.2 lv_group 在架构中的位置2.3 与全局输入/焦点状态的关系3 使用方式与典型 DEMO3.1 创建 group 并绑定编码器输入3.2 在菜单/…

作者头像 李华
网站建设 2026/10/9 17:34:19

网络安全异想天开(不定期更新)

1.使用AI大数据技术处理安全问题。2.有福同享有难同当&#xff1a;你发什么&#xff0c;我返回你发的&#xff0c;你拒绝我也拒绝。3.没有隐私可言&#xff1a;软件协议&#xff0c;隐私条款和设置&#xff0c;早就泄露了。4.高考屏蔽信号也是一种安全手段。5.手机验证码的安全…

作者头像 李华
网站建设 2026/10/9 20:44:18

《CAPL脚本实现CANOE工具 Bus-Off自动恢复(含重试机制)》

目录 1.创建CAPL文件 3.编辑CAPL文件 4.CAPL文件功能描述 4.执行CAPL文件结果 1.创建CAPL文件 选择"Insert Network Node" 点击编辑按钮 ->输入CAPL文件的名称->点击打开 ->自动生成一个空的CAPL文件 3.编辑CAPL文件 这边的CANOE软件版本为16 /*!En…

作者头像 李华
网站建设 2026/10/9 17:42:29

力扣1965-丢失信息的雇员

表: Employees---------------------- | Column Name | Type | ---------------------- | employee_id | int | | name | varchar | ---------------------- employee_id 是该表中具有唯一值的列。 每一行表示雇员的 id 和他的姓名。表: Salaries---------------…

作者头像 李华