外设与接口:基于内核 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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1014904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sglang 大模型推理框架支持的EAGLE 1,2,3

文章目录EAGLE 系列模型的演进与核心机制关键参数与训练逻辑思考参考来源&#xff1a;https://docs.sglang.com.cn/backend/speculative_decoding.html https://github.com/SafeAILab/EAGLE EAGLE3 https://arxiv.org/pdf/2503.01840 EAGLE 系列模型的演进与核心机制 EAGLE 基…

延凡科技 EMS 智慧云平台:3 万起订阅,中小用能单位的 “云端全能源管家”

延凡科技 EMS 智慧云平台是专为工厂、园区、楼宇、医院等中小用能单位打造的云原生能源管理解决方案&#xff0c;聚焦 “降本节能、碳排合规、云端运维、数据驱动” 核心目标&#xff0c;采用 SaaS 订阅模式&#xff0c;整合物联网感知、云边协同、AI 能效优化算法&#xff0c;…

拦截器注册InterceptorRegistry 实现讲解

1.核心概念InterceptorRegistry 是 Spring MVC 提供的拦截器注册器&#xff0c;用于配置拦截器的拦截规则。2.主要方法addInterceptor(): 添加拦截器 addPathPatterns(): 指定要拦截的路径 excludePathPatterns(): 指定要排除的路径 路径匹配规则 /api/**: 匹配 /api/ 下的所有…

汇编语言全接触-27.工具提示控件

我们将学习工具提示控件:它是什么如何创建和使用.下载例子理论:工具提示是当鼠标在某特定区域上停留时显示的一个矩形窗口.工具提示窗口包含一些编程者想要显示的文本.在这点上,工具提示同状态栏的作用是一样的,所不同的是工具提示当单击或者远离指定区域的时候就会消逝,你可能…

汇编语言全接触-26.启动画面

上一章我们学习了位图的使用.在这一章我们要用上帝赋予我们的创造力来融会贯通上一章我们学到的知识.那就是研究如何用位图来创建启动画面. 你可以在这里下载示范: the example. 理论首先,我们先要搞清楚什么是启动画面.举个简单的例子:我们启动某些作的专业一点的程序时(比如N…

验证IP地址(一)

我们先来看题目描述&#xff1a;给定两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不…

医院管理|基于springboot 医院管理系统(源码+数据库+文档)

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

浅谈:算法中的斐波那契数(一)

我们先来看题目描述&#xff1a;斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a;F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1.给…

测试的“元认知”:智能体如何评估自身可靠性?

在软件测试领域&#xff0c;自动化与智能化正以前所未有的速度重塑工作流程。随着人工智能代理&#xff08;智能体&#xff09;广泛应用于测试用例生成、缺陷预测和持续集成&#xff0c;一个关键问题浮出水面&#xff1a;这些智能体如何像人类测试专家一样&#xff0c;对自身行…

10.8 总结

10.8 总结 作业回顾 1.1 索引练习节选 s hello 1 world 2 hello 3 Python # 获取s的长度 print(len(s)) # 30 # 获取第4个字符 print(s[3]) # l # 获取最后一个字符 print(s[-1]) # n # 获取第7个字符 print(s[6]) # 1 # 获取倒数第7个字符 print(s[-7]) # 空格【不显…

【Hadoop+Spark+python毕设】物联网网络安全威胁数据分析系统、计算机毕业设计、包括数据爬取、数据分析、数据可视化、Hadoop、实战教学

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

9.28总结

9.28总结 知识回顾 # 1. 封装一个函数&#xff1a;获取指定数据的阶乘 【没有指定数据的话默认求10的阶乘】 默认参数 # 阶乘 比如5&#xff01;5*4*3*2*1 # 未知数据 有1个 # 是否需要返回结果 def factorial(num10):result 1for i in range(num, 0, -1):result * ireturn…

零基础学JAVA--Day34(Map接口+HashTable+HashMap+TreeSet+TreeMap+开发中如何选择集合实现类?(重要)) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

电影院购票|基于springboot 电影院购票系统(源码+数据库+文档)

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

C#+VisionMaster联合开发(二)_操作流程

1、获取方案中的流程列表 // 加载流程列表 ProcessInfoList processInfoList = VmSolutionMain.GetAllProcedureList(); if (processInfoList.nNum > 0) {var processNames = processInfoList.astProcessInfo.ToLis…

本地部署DeepSeek

ollama终端的方式部署参考&#xff1a;ollama本地部署 智谱API Key获取 LM Studio 它是模型的托管平台&#xff0c;可以把模型加载后&#xff0c;作为服务器向外提供服务器&#xff0c;本身也具有简单的对话框可以聊天。 &#xff1a;https://lmstudio.ai/ 在左下角改为开发者…

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

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

航空机票预定系统|基于springboot 航空机票预定系统(源码+数据库+文档)

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

[Windows] 剪映自动预合成v1.0

[Windows] 剪映自动预合成v1.0 链接&#xff1a;https://pan.xunlei.com/s/VOgRWgF_QfvslGjXSYwZaeDXA1?pwdrd56# 从零散的元素 【进入】预合成状态&#xff0c;一键完成。 配合47kb的【剪映草稿助手】还是不错的。