linux input子系统,gpio-keys,gpio中断使用

news2025/7/15 10:08:51

GPIO控制

嵌入式linux下应用编程会经常使用到gpio,GPIO 可以通过 sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示:

 可以看到该目录下包含两个文件 export、 unexport 以及 5 个 gpiochipX(X 等于 0、 32、 64、 96、 128)命名的文件夹。
⚫ gpiochipX: 当前 SoC 所包含的 GPIO 控制器,不同的soc包含不同的GPIO控制器,当前使用的soc的GPIO控制器分别为 GPIO1、 GPIO2、 GPIO3、 GPIO4、 GPIO5,在这里分别对应 gpiochip0、 gpiochip32、gpiochip64、 gpiochip96、 gpiochip128 这 5 个文件夹, 每一个 gpiochipX 文件夹用来管理一组 GPIO。
随便进入到其中某个目录下,可以看到这些目录下包含了如下文件:

在这个目录我们主要关注的是 base、 label、 ngpio 这三个属性文件,这三个属性文件均是只读、不可写。
base: 与 gpiochipX 中的 X 相同,表示该控制器所管理的这组 GPIO 引脚中最小的编号。每一个 GPIO引脚都会有一个对应的编号, Linux 下通过这个编号来操控对应的 GPIO 引脚。

 label: 该组 GPIO 对应的标签,也就是名字。

 ngpio: 该控制器所管理的 GPIO 引脚的数量(所以引脚编号范围是: base ~ base+ngpio-1) 。

 对于给定的一个 GPIO 引脚,如何计算它在 sysfs 中对应的编号呢?其实非常简单,譬如给定一个 GPIO引脚为 GPIO4_IO16,那它对应的编号是多少呢?首先我们要确定 GPIO4 对应于 gpiochip96,该组 GPIO 引脚的最小编号是 96(对应于 GPIO4_IO0),所以 GPIO4_IO16 对应的编号自然是 96 + 16 = 112;同理GPIO3_IO20 对应的编号是 64 + 20 = 84。
⚫ export: 用于将指定编号的 GPIO 引脚导出。 在使用 GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。 注意 export 文件是只写文件,不能读取,将一个指定的编号写入到 export 文件中即可将对应的 GPIO 引脚导出,譬如:

echo 0 > export # 导出编号为 0 的 GPIO 引脚

导出成功之后会发现在/sys/class/gpio 目录下生成了一个名为 gpio0 的文件夹(gpioX, X 表示对应的编号)。这个文件夹就是导出来的 GPIO 引脚对应的文件夹,用于管理、控制该 GPIO 引脚,稍后再给大家介绍。

unexport: 将导出的 GPIO 引脚删除。当使用完 GPIO 引脚之后,我们需要将导出的引脚删除,同样该文件也是只写文件、不可读,譬如:

echo 0 > unexport # 删除导出的编号为 0 的 GPIO 引脚

删除成功之后,之前生成的 gpio0 文件夹就会消失!
以上就给大家介绍了/sys/class/gpio 目录下的所有文件和文件夹,控制 GPIO 引脚主要是通过 export 导出之后所生成的 gpioX(X 表示对应的编号)文件夹,在该文件夹目录下存在一些属性文件可用于控制 GPIO引脚的输入、输出以及输出的电平状态等。

GPIO使用

将指定的编号写入到 export 文件中,可以导出指定编号的 GPIO 引脚,导出成功之后会在/sys/class/gpio目录下生成对应的 gpioX(X 表示 GPIO 的编号)文件夹,以前面所生成的 gpio0 为例,进入到 gpio0 目录,该目录下的文件如下所示:

 我们主要关心的文件是 active_low、 direction、 edge 以及 value 这四个属性文件,接下来分别介绍这四个属性文件的作用:

⚫ direction: 配置 GPIO 引脚为输入或输出模式。该文件可读、可写,读表示查看 GPIO 当前是输入还是输出模式,写表示将 GPIO 配置为输入或输出模式;读取或写入操作可取的值为"out"(输出模式)和"in"(输入模式),如下所示:

 ⚫ value: 在 GPIO 配置为输出模式下,向 value 文件写入"0"控制 GPIO 引脚输出低电平,写入"1"则控制 GPIO 引脚输出高电平。在输入模式下,读取 value 文件获取 GPIO 引脚当前的输入电平状态。譬如:

# 获取 GPIO 引脚的输入电平状态
echo "in" > direction
cat value
# 控制 GPIO 引脚输出高电平
echo "out" > direction
echo "1" > value

⚫ active_low: 这个属性文件用于控制极性, 可读可写,默认情况下为 0,譬如:

# active_low 等于 0 时
echo "0" > active_low
echo "out" > direction
echo "1" > value #输出高
echo "0" > value #输出低
# active_low 等于 1 时
$ echo "1" > active_low
$ echo "out" > direction
$ echo "1" > value #输出低
$ echo "0" > value #输出高

由此看出, active_low 的作用已经非常明显了, 对于输入模式来说也同样适用。

⚫ edge: 控制中断的触发模式,该文件可读可写。 在配置 GPIO 引脚的中断触发模式之前,需将其设置为输入模式:
非中断引脚: echo "none" > edge
上升沿触发: echo "rising" > edge
下降沿触发: echo "falling" > edge
边沿触发: echo "both" > edge
当引脚被配置为中断后可以使用 poll()函数监听引脚的电平状态变化,在后面的示例中将向大家介绍。

注意:并不是任何时候都会存在edge文件,当GPIO控制器没有进行中断配置时,edge是不存在的。所以使用edge进行中断配置,必须保证设备树中GPIO控制器进行了中断配置:

类似如下情况,设备树不进行GPIO控制器的中断描述时,edge不存在!

input子系统,gpio-keys使用

当我们希望gpio作为输入并且由中断触发时可以使用linux自带的key驱动。如果要使用内核自带的 KEY 驱动的话需要配置 Linux 内核。按照如下路径找到相应的配置选项:

 

Linux 内核自带的 KEY 驱动文件为drivers/input/keyboard/gpio_keys.c, gpio_keys.c 采用了 platform 驱动框架,在 KEY 驱动上使用了 input 子系统实现。

要 使 用 Linux 内 核 自 带 的 按 键 驱 动 程 序 很 简 单 , 只 需 要 根 据Documentation/devicetree/bindings/input/gpio-keys.txt 这个文件在设备树中添加指定的设备节点即可,节点要求如下:
①、节点名字为“gpio-keys”。
②、 gpio-keys 节点的 compatible 属性值一定要设置为“gpio-keys”。
③、所有的 KEY 都是 gpio-keys 的子节点,每个子节点可以用如下属性描述自己:
        gpios: KEY 所连接的 GPIO 信息。
        interrupts: KEY 所使用 GPIO 中断信息,不是必须的,可以不写。
        label: KEY 名字
        linux,code: KEY 要模拟的按键,也就是示例代码 58.1.2.4 中的这些按键。
④、如果按键要支持连按的话要加入 autorepeat。
打开 dts,根据上面的要求创建对应的设备节点,设备节点内容如下所示:

gpio-keys {
    compatible = "gpio-keys";
    #address-cells = <1>;
    #size-cells = <0>;
    autorepeat;

    key0 {
        label = "GPIO Key Enter";
        linux,code = <KEY_ENTER>;
        gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
    };
};

注意:缺省interrupts属性的前提是GPIO控制器已经配置了中断,如果使用电平触发中断,则不建议保留autorepeat属性,否则会一直触发中断。

测试

进入系统,使用如下命令(eventx换成自己的节点)进行测试,按下按键会上报input格式数据

hexdump /dev/input/eventx

 

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

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

相关文章

三种循环结构的使用及区别

循环结构for循环while循环do-while循环三种循环的区别for循环 控制一段代码反复执行很多次 // 输出3次HelloWorldfor (int i 0; i < 3; i) {System.out.println("Hello World"); }while循环 // 输出3次HelloWorldint i 0; while(i < 3){System.out.println(…

图解LeetCode——剑指 Offer 22. 链表中倒数第k个节点

一、题目 输入一个单向链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即&#xff1a;链表的尾节点是倒数第1个节点。 例如&#xff0c;一个链表有 6 个节点&#xff0c;从头节点开始&#xff0c;它们的值依次是…

【软件测试】自动化测试该如何做?项目?技术团队?你真的会自动化吗......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 对于自动化测试&…

系统分析师真题2018试卷相关概念二

相联存储的基本特点&#xff1a; 按照内容存取是相联存储的最基本的特点&#xff0c;Cache是一种非常经典的相联存储器。 CISC复杂指令集与RISC指令集的相关概念&#xff1a; CISC复杂指令集&#xff1a; 数量多&#xff0c;使用频率差别大&#xff0c;可变长格式寻址方式&a…

大批量分析下日志处理检索功能

今天我们看一个日志处理分析的问题&#xff08;jvm操作&#xff09; 首先说下需求为什么发生&#xff1a; 需求描述&#xff1a; 在我们进行文件分析的时候&#xff0c;如果文件很多&#xff0c;而这个时候我们的线程在分析的时候产生了大量的报错&#xff0c;由于需要定位问题…

推荐5款免费且无广告的软件,助你提升效率

有时候一些小工具&#xff0c;能给你带来一些意想不到的效果&#xff0c;我们来看看下面这5款工具&#xff0c;你又用过其中几款呢&#xff1f; 1.文件大小查看——Folder Size Folder Size是一个可以查看文件大小的软件&#xff0c;使用它可以一键查看文件夹里的文件大小。你…

linux篇【16】:传输层协议

目录 一.再谈端口号 1.端口号定义 2.端口号范围划分 &#xff08;1&#xff09;一共有 2^16 个端口 &#xff08;2&#xff09;认识知名端口号(Well-Know Port Number) 3.端口号和进程就是K V关系 4.netstat &#xff08;1&#xff09;示例1&#xff1a; n 拒绝显示别名…

mysql常用且易混淆函数整理

DATE_FORMAT(date&#xff0c;format) 函数中format的格式如下&#xff1a; 类型转化函数 为了进行数据类型转化&#xff0c;MySQL提供了CAST()函数&#xff0c;它可以把一个值转化为指定的数据类型。类型有&#xff1a;BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED 示例&a…

【前端】chatGPT教我写compose函数

0 前言 昨天希望实现一个通用的compose函数&#xff0c;能够接受同步函数与异步函数&#xff0c;并且通过异步函数同步执行来是吸纳compose函数中的所有参数函数能顺序执行。 比如compose(asyncFun3,syncFun2,asyncFun1,syncFunc0)&#xff0c;四个函数能从右到作顺序执行&…

vue3+webpack5搭建项目

1、运行npm run dev报错&#xff1a; [webpack-cli] Failed to load E:\demoProject\vue3Webpack5\config\webpack.dev.js config [webpack-cli] Error: Cannot find module html-webpack-plugin 解决方案&#xff1a; 尝试了好多解决方案&#xff0c;都不可以。抱着试试的心…

2023年爆火的csgo搬砖项目详细拆解,steam搬砖长期稳定

不懂的同学可以听我下面慢慢道来 我的态度&#xff1a;存在即有意义&#xff0c;没有长久的赚钱项目&#xff0c;但是一定有长久赚钱的人。 我们团队也一直在做这个项目&#xff0c;赚钱是一定的&#xff0c;简单总结&#xff1a;执行力技巧量化。 开门见山 一、steam搬砖项…

Sqoop全部数据导入_将mysql数据库中的数据导入到hdfs中---大数据之Apache Sqoop工作笔记002

然后来看一下如何用sqoop导入数据,这里的导入指的是从其他数据源导入到hdfs,反过来是导出 然后看一下首先准备一下数据 去创建数据库company ,创建表staff, 然后插入数据 插入两行数据测试用 \ 然后查询一下use company 然后查询一下看看结果

整车电源的几种模式:OFF/ACC/RUN/CRANK

本文框架1.前言2. 四种电源模式2.1 OFF模式2.2 ACC模式2.3 ON模式2.4 CRANK模式3. KL15/KL301.前言 在诊断或者网络管理相关模块开发对客户的需求进行梳理时&#xff0c;经常会看到客户对不同车辆模式下处理策略的需求&#xff0c;如果前期没接触过这几种模式&#xff0c;可能…

基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(中篇)

3.2 SPI硬件时序方式 上面的3.1小节是采用SPI模拟时序驱动SD NAND&#xff0c;STM32本身集成有SPI硬件模块&#xff0c;可以直接利用STM32硬件SPI接口读写。 下面贴出底层的适配代码。 上面贴出的驱动代码里&#xff0c;已经将驱动接口部分和协议逻辑部分区分开了&#xff0c;替…

设计模式C++实现20: 桥接模式(Bridge)

部分内容参考大话设计模式第22章&#xff1b;本实验通过C语言实现。 一 基本原理 意图&#xff1a;将抽象部分和实现部分分离&#xff0c;使它们都可以独立变化。 上下文&#xff1a;某些类型由于自身的逻辑&#xff0c;具有两个或多个维度的变化。如何应对“多维度的变化”…

掌握MySQL分库分表(六)解决主键重复问题--Snowflake雪花算法

文章目录问题及需求常用ID解决方案数据库自增IDUUIDRedis发号器Snowflake雪花算法分布式 ID 生成算法Snowflake原理关于bit与byte雪花算法的位数Snowflake必须注意的地方全局唯⼀、不能重复保证各个系统时间一致Snowflake雪花算法实现雪花算法测试结果问题及需求 单库下⼀般使…

模块Model

定义 包含一系列数据&#xff0c;函数&#xff0c;类的文件&#xff0c;通常以.py结尾 作用 让相关的数据&#xff0c;函数&#xff0c;类有逻辑的组织 第一种调用方法直接通过import导入模块名 首先创建模块module01.py import timedef print_nowtime():"""…

sqlserver复制远程数据库到本地

文章目录前言一、前置知识在微软的SQL Server 2000 数据库有三种类型的文件&#xff1a;主要数据文件&#xff1a;&#xff08;扩展名.mdf是 primary data file 的缩写&#xff09;次要数据文件&#xff08;扩展名.ndf是Secondary data files的缩写&#xff09;事务日志 &#…

【数据结构】——树和二叉树的概念

目录 1.树概念及结构 1.1树的概念 1.2 树的相关性质 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树概念 2.2 特殊的二叉树 2.3 二叉树的性质 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构…

Retrofit+Hilt后端请求小项目2--依赖与准备工作

目录依赖处理settings.gradlebuild.gradle(project:app)build.gradle(module:app)准备工作接口安装 JSON 转 kotlin 插件获取 JSON依赖处理 settings.gradle 首先在此指定使用 hilt 依赖时的版本 pluginManagement {repositories {gradlePluginPortal()google()mavenCentral…