什么是 /sys/class/gpio/export 和 `/sys/class/gpio/unexport 机制以及底层 sysfs 功能是什么?

2023-12-14

在 Android 和 Linux 下使用旧版 sysfs GPIO 的第一步是export您要使用的特定 GPIO 引脚。当您完成 GPIO 引脚的操作后unexport it.

我一直在寻找一个解释export命令实际上是这样做的,但是我发现的所有内容都是关于内置的bash与GPIO无关的命令。

然后我意识到命令行的实际命令是echo 938 > /sys/class/gpio/export and /sys/class/gpio/export是文件夹中的特殊设备文件/sys/class/gpio.

我发现的唯一评论表明将 GPIO 引脚号写入/sys/class/gpio/export导致与该 GPIO 引脚关联的 GPIO 特殊文件“导出到用户空间”,然后允许用户应用程序使用指定的 GPIO 引脚以及到特殊设备文件的文件 I/O。

用户空间的 GPIO Sysfs 接口

“出口” …

用户空间可能会要求内核将 GPIO 的控制导出到用户空间 将其编号写入该文件。

示例:“echo 19 > export”将为 GPIO #19 创建一个“gpio19”节点, 如果内核代码没有要求的话。

“不导出”...

反转导出到用户空间的效果。

示例:“echo 19 > unexport”将删除导出的“gpio19”节点 使用“导出”文件。

所以如果我指定echo 938 > /sys/class/gpio/export然后是一个特殊的设备文件夹/sys/class/gpio/gpio938带有特殊设备文件/sys/class/gpio/gpio938/value and /sys/class/gpio/gpio938/direction被创建。当我做一个echo 938 > /sys/class/gpio/unexport那么那些特殊的设备文件被删除了吗?

在研究如何在 Android 5.1 下使用 DragonBoard 410C 的 GPIO 引脚时,我正在学习有关该设备的在线课程,据说将以下行添加到启动初始化脚本中。

set -A pins 938 915 1017 926 937 930 914 971 901 936 935
for i in 0 1 2 3 4 5 6 7 8 9 10
do
    echo ${pins[i]} > /sys/class/gpio/export;
    chmod 777 /sys/class/gpio/gpio${pins[i]};
    chmod 777 /sys/class/gpio/gpio${pins[i]}/value;
    chmod 777 /sys/class/gpio/gpio${pins[i]}/direction;
done

我的理解是,这些命令为 GPIO 引脚 938、915、1017、926、937、914、901、936、935 创建特殊设备文件,以便应用程序可以读取和写入这些 GPIO 引脚以执行某些操作,例如转动例如,通过写入值来打开和关闭 LED/sys/class/gpio/gpio938/value.

我对此启动初始化脚本的理解是,这消除了用户使用sudo命令,以便用户在运行访问 GPIO 引脚的应用程序之前执行这些命令sysfs。真的吗?

我的问题

这些特殊设备文件是什么/sys/class/gpio/export and /sys/class/gpio/unexport以及它们如何连接到 Linux 内核中的某种功能,这些功能在 Linux 内核中创建和销毁特殊设备文件/sys/class/gpio folder?

建议对启动初始化脚本进行更改,生成代表 GPIO 引脚的特殊设备文件,任何人都可以访问该引脚,因此应用程序可以只使用这些引脚,而不必费心export or unexport?用户应用程序只需对特殊设备执行读/写操作,而无需使用sudo echo 938 > /sys/class/gpio/export first?

引导初始化脚本创建的这些特殊文件的访问和共享权限是什么?多个应用程序是否可以同时操作相同的 GPIO 引脚?


Linux 文件系统中有几个目录结构不是实际的磁盘文件目录。相反,这些目录结构和其中的“文件”是伪文件或 Linux 操作系统服务和数据,它们以文件的形式呈现,可以使用文件操作进行访问,但不是存储在持久存储(例如硬盘或固态硬盘)上的实际文件。状态盘。

现代 Linux API 使用和兼容性研究:支持时支持什么

除了主要的系统调用表之外,Linux 还导出了许多 通过伪文件系统的附加 API,例如 /proc、/dev 和 /系统。这些被称为伪文件系统,因为它们不受支持 通过磁盘,而是将内核数据结构的内容导出到 应用程序或管理员就好像它们存储在文件中一样。 这些伪文件系统是导出调整的便捷位置 参数、统计数据和其他特定子系统或设备 特定的 API。尽管许多这些伪文件用于 命令行或管理员编写的脚本中,有一些是例行公事的 由应用程序使用。为了充分了解使用模式 Linux 内核中,伪文件也必须考虑。

伪文件的类比

从用户角度思考这些伪文件的一种方法是它们是一种远程过程调用Linux 内核的接口,使用文件系统语义来请求执行某些操作。文件系统语义映射到以下通用操作和行为:

  • 打开伪文件意味着打开用户应用程序和 Linux 内核中的某些功能之间的连接
  • 读取伪文件是指通过连接读取Linux内核中某些功能提供的数据块
  • 写伪文件意味着通过连接向Linux内核中的某些功能发送请求消息(该消息可以是带数据的命令、仅命令或仅数据)
  • 关闭伪文件意味着关闭用户应用程序与 Linux 内核中的某些功能之间的连接

不同的伪文件公开不同的 Linux 内核数据和服务,这意味着关于文件操作如何映射到通过伪文件公开的 Linux 内核功能的接口规范将不仅取决于 Linux 内核功能或伪文件的处理程序,而且取决于伪文件的 Linux 内核功能或处理程序。还有Linux内核版本。

这篇 StackOverFlow 帖子,从内核模块创建 sysfs 条目,包含一个伪文件处理程序的简单示例/sys显示了提供 Linux 内核将新伪文件的处理程序挂接到 Linux 内核所需的函数接口的基础知识。

这篇 StackOverFlow 帖子,如何在/proc/driver下创建proc条目?,包含一个伪文件处理程序的简单示例/proc.

这两个简单的示例都与源代码具有相似的结构。然而,这些特定示例可能使用已弃用的 Linux 内核接口,因此我提供这些链接只是为了说明伪文件处理程序的底层功能。

导出和取消导出

通常,运行 Linux 的底层硬件的 GPIO 引脚不会暴露给用户应用程序。 Linux 内核使用设备驱动程序使用这些引脚与设备进行交互。

的目的export是将选定的 GPIO 引脚作为伪文件公开给用户空间,允许用户应用程序与某些硬件执行自己的交互。并非所有可用或可能的 GPIO 引脚都可能会暴露。可以使用哪些引脚来暴露export将取决于什么/sys处理程序已被插入到 Linux 内核中,以及这些处理程序允许执行的操作。

实际公开哪些伪文件以及如何使用这些伪文件将取决于 GPIO 引脚的功能,例如数字引脚与模拟引脚与支持 PWM 或具有上拉或下拉电阻的引脚的比较。公开哪些文件还取决于处理程序的功能/sys/class/gpio/提供。 GPIO 引脚可能具有可用的上拉或下拉电阻,但处理程序可能不提供操作它的接口。

export伪文件将创建一个代表所请求的 GPIO 引脚的伪文件目录。这是通过向export带有包含数据的消息的伪文件export命令需要正确识别所请求的 GPIO 引脚。然后该消息由 GPIO 处理exportLinux 内核中的 sysfs 处理程序创建代表 GPIO 引脚的伪文件夹以及伪文件,这些文件为指定 GPIO 引脚提供用户应用程序和 sysfs 处理程序之间的接口。处理程序提供物理 GPIO 引脚和引脚设备驱动程序与伪文件表示或接口之间的层。

The unexport伪文件删除 GPIO 引脚伪文件,以便不再可以与用户应用程序中表示的 GPIO 引脚进行交互。

有关 PWM sysfs 支持的注意事项:正如通过 sysfs 接口支持 GPIO 引脚一样/sys还支持 PWM 引脚。根文件夹是/sys/class/pwm其功能在架构上与 GPIO 引脚的功能类似。有一个类似的export and unexport使 PWM 引脚可用的功能以及使用导出的 PWM 伪文件是通过对与代表 PWM 引脚的伪文件夹关联的一组文件进行标准文件操作。看在 Dragonboard410c 上使用 PMIC PWM其中描述了“PWM 通过 MPP_4 引脚公开,即低速扩展连接器上的引脚 28”的基础知识。

启动脚本发生变化

引导脚本更改使用/sys/class/gpio/export创建请求的 GPIO 伪文件。但是,创建的伪文件具有一组在创建伪文件时设置的默认访问权限。由于创建是在具有 root 权限的初始化期间进行的,因此chmod命令用于允许任何用户应用程序与创建的伪文件交互,而不仅仅是创建它们的用户 root 。

自从export是在启动和初始化期间完成的,目的是创建 GPIO 引脚伪文件,该文件将在设备通电时保留在原位,并在设备使用期间保留在原位。

DragonBoard 410C 低功耗连接器上的每个 GPIO 引脚都由几个伪文件表示,value用于传达引脚的值(无论是高电平还是低电平)和direction用于传达引脚的方向(无论是输入引脚还是输出引脚)。所以我们需要做一个chmod对于每个伪文件,我们希望用户应用程序访问包括这些伪文件所在的伪文件夹,例如/sys/class/gpio/gpio938其中包含/sys/class/gpio/gpio938/value and /sys/class/gpio/gpio938/direction.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 /sys/class/gpio/export 和 `/sys/class/gpio/unexport 机制以及底层 sysfs 功能是什么? 的相关文章

  • 按下主页按钮时 onPause 不会触发

    我有一个安卓AppCompatActivity未能点火onPause按下主页按钮时发生的事件 根据安卓文档 https developer android com guide components activities activity l
  • 外部硬件指纹扫描仪和 Android 设备集成

    我想建立一个android像员工考勤这样的应用程序使用fingerprint scanner 我想知道 是否可以使用外部硬件设备进行指纹识别 扫描 如何将Android应用程序与外部硬件finger集成 打印扫描设备 如何从外部硬件设备获取
  • 如何获取 Android 应用程序的内部版本号?

    我需要弄清楚如何获取或创建我的 Android 应用程序的内部版本号 我需要在用户界面中显示内部版本号 我必须做点什么吗AndroidManifest xml 如果您使用 Gradle 插件 Android Studio 从版本 0 7 0
  • android studio 和 android SDK 捆绑的 eclipse 版本有什么区别

    我没有 Android 开发经验 我想开始编写应用程序 The 官方开发者工具页面 http developer android com tools index html包含两个不同 IDE 的链接 第一个包含捆绑的 ADT 版本Eclip
  • GridLayout 对齐列内的子项

    我有一个GridLayout由 6 个孩子组成 它的列数为 2 左列的子列有layout gravity of start end fill horizontal and layout width0dp 这会导致它们填满所有可用空间 Thi
  • 在通知声音中暂停/恢复媒体播放器

    很容易检测到电话何时打入 通过phoneStateListener 但是其他通知声音 例如电子邮件或短信 又如何呢 在某些设备上 这些通知听起来很静音 但不会暂停任何当前正在运行的 mediaPlayer 实例 这对用户来说很烦人 理想情况
  • 我是否需要在我的 Firebase 项目中添加 SHA-1 指纹?

    在 Firebase 上有一个弹出窗口 显示我的项目可以添加指纹 SHA1 因为我只想使用一些 Firebase 服务 例如实时数据库 身份验证 我需要在我的项目中添加指纹吗 该图显示 仅在使用某些 Google Play 服务 如 OAu
  • 在android中的操作栏中标题左侧添加图标

    我想在操作栏中标题的左侧添加一个可点击的图标 按钮 怎么做 以下是我向操作栏添加搜索和设置图标的代码 它们出现在右侧 但我想在标题左侧添加一个新图标 怎么做 XML menu menu
  • HttpURLConnection getResponseCode 未返回

    我尝试在 Android 上使用 HttpURLConnection 将文件发布到我们的服务器 但 getResponseCode 调用只是挂起并且永远不会返回 该问题源于文件对于服务器来说太大 因此服务器发回 HTTP 错误代码 413
  • 安卓多点触控?

    作为一名开发人员 我倾向于先编程 然后再研究 我试图实现一个可以处理多个用户输入的屏幕 基本上映射的不仅仅是一根手指 我尝试了两件事 我有一个实现 OnTouchListener 的 Activity 类 这里我有两个单独的子视图 它们将
  • 喷气背包组合中的波纹效果无法正常工作

    我正在研究jetpack compose中的连锁反应 我提供了我的颜色 单击视图后 它会在一段时间后显示不同类型的颜色 在按下状态时显示为深灰色 binding itemComposable setContent Column modifi
  • 在操作栏中编辑文本

    我正在使用 Action Bar Sherlock 为我的应用程序创建 UI 在将依赖项添加到我的项目等后 我创建了一个活动来测试它 public class PPS extends SherlockActivity Override pu
  • Android 中未找到 PhoneGap 类错误

    我的 PhoneGap Android 应用程序遇到一些问题 到目前为止我明白了 我已经把一切都做好了 这是我所做的 在 Eclipse 中创建项目后 我在 libs 文件夹中添加了 cordova 2 2 0 jar 然后我编辑了Andr
  • ListView.hasWindowFocus==true 但子视图 hasWindowFocus==false

    有时我注意到 对于 View v v hasWindowFocus false View v getParent hasWindowFocus true 如果我正确理解文档 情况就不应该如此 v getParent 是 ListView 的
  • 如何使用 Kotlin 在 ListAdapter 中使用 Filterable?

    我会用一个SearchView过滤我的RecyclerView 在 stackoverflow 和其他网站上我发现只是使用的示例Filterable与 Java 和RecyclerView Adapter当我使用时ListAdapter 所
  • 为什么 LayoutInflater 忽略我指定的layout_width 和layout_height 布局参数?

    我在让 LayoutInflater 按预期工作时遇到了严重的困难 其他人也是如此 如何使用layoutinflator在运行时添加视图 https stackoverflow com questions 4735847 help for
  • Android 布局崩溃

    I use a XWalkView https crosswalk project org 加载网页和视频查看器 https github com Bilibili ijkplayer在我的应用程序中播放实时视频 我希望 IjkVideoV
  • OkHttp javax.net.ssl.SSLPeerUnverifiedException:主机名domain.com未验证

    我几天来一直在努力让它发挥作用 我正在尝试通过以下方式连接到我的服务器https带有自签名证书 我认为现在没有任何页面或示例是我未读过的 我做了什么 按照本教程创建了 bks 密钥库 http blog crazybob org 2010
  • AS更新到1.0后,项目中出现“method ID not in [0, 0xffff]: 65536”错误

    我将 Android Studio 更新到最新版本 并让它 修复项目 之类的 但现在我的项目无法编译 给了我 FAILED FAILURE Build failed with an exception What went wrong Exe
  • 找不到 com.google.gms:google-services:4.1.0 [重复]

    这个问题在这里已经有答案了 Bitrise 构建失败并出现以下错误 配置根项目 src 时出现问题 无法解析配置 classpath 的所有文件 找不到 com google gms google services 4 1 0 在以下位置进

随机推荐

  • 如果没有进行替换,Python 字符串将在文件中替换,而不触及文件

    如果没有进行字符串替换 Python 的 string replace 返回什么 即使没有进行任何更改 Python 的 file open f w 是否始终会触及文件 使用 Python 我尝试将一组文件中出现的 oldtext 替换为
  • 检测 matplotlib 刻度标签何时重叠

    我有一个由 pandas 生成的 matplotlib 条形图 如下所示 index Label 1 Label 2 Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet consect
  • 在图像完全加载之前使用 Javascript 获取图像尺寸

    我读过有关图像完全加载后获取图像尺寸的各种方法 但是一旦开始加载就可以获取任何图像的尺寸吗 我还没有通过搜索找到太多相关信息 这让我相信这是不可能的 但事实是浏览器 在我的例子中是 Firefox 显示了我在标题中的新选项卡中打开的任何图像
  • 通过 docker-compose 运行时,Flask CLI 抛出“OSError: [Errno 8] Exec format error”

    我正在运行一个 Flask 应用程序自定义脚本 无论如何 或者尝试这样做 我使用的是 Windows 10 应用程序应该使用以下命令在 Linux Docker 容器中运行 docker compose up api Docker comp
  • WebForms 自定义/动态路由

    我在用着菲尔 哈克的WebForms 的 URL 路由 我想定义一个 动态 的路由 假设我有这条路线 any aspx 转到 gt PageProcessor aspx 这会将任何非物理页面的请求发送到 PageProcessor 页面 这
  • 如何在Matlab中使用for循环处理大视频并且没有内存错误

    我是 Matlab 处理的新手 我想在 for 循环 或没有它 中读取和处理一个大视频 超过 200k 帧 我特别想 使用VideoReader阅读视频 将视频细分为 n 个纪元 每个纪元 1000 帧 处理 1000 帧的每个 epoch
  • Git - 在线存储库中有未跟踪的文件[重复]

    这个问题在这里已经有答案了 我正在使用 git bitbucket 来控制我的 Linux 配置文件 所有文件都在目录中 cfg 然后我另外还有一些本地配置文件 cfg local 这些应该因机器而异 我想在我的在线存储库中保留本地文件的副
  • Java - for循环终止表达式之间的区别

    我只是好奇 这两个循环实现之间的速度和性能是否有差异 假使 假设size 方法返回处理一组元素的数组 集合或对象的长度 实际上它来自XOM api 实施1 int size someArray size for int i 0 i lt s
  • 如何在 OPENROWSET(BULK...) 中动态指定文件的路径?

    我想将图像插入图像字段 最好使用接受图像路径的存储过程 经过一番折腾后我想出了这个 functional DECLARE parameters nvarchar max DECLARE sql string nvarchar max N U
  • 如何从 ILNumerics 曲面图上鼠标的单击位置找到曲面的 3D 坐标?

    目前 我们的系统使用 ILNumerics 3D 绘图立方体类和 ILNumerics 曲面组件来显示 3D 网格曲面 我们系统的目标是能够通过鼠标单击绘图来询问表面上的各个点 我们在绘图上设置了 MouseClick 事件 问题是我不确定
  • 如何从 R 中的 nls 获取绘图?

    在 R 中 我使用 nls 进行非线性最小二乘拟合 那么如何使用拟合提供的系数值绘制模型函数呢 是的 这是一个very来自 R 相关新手的天真问题 使用第一个例子 nls按照我逐行指出的示例 可以实现以下目标 This is just ou
  • 在 Objective-C 中检查空字符串的正确方法是什么?

    我在我的 iPhone 应用程序中使用了这个 if title nil do something 但它引发了一些异常 并且控制台显示标题为 null 所以我现在用这个 if title nil title isKindOfClass NSN
  • 如何在 Pandas 数据框中展开列

    我有以下熊猫数据框 import pandas as pd import numpy as np df pd DataFrame fc 100 100 112 1 3 14 125 sample id S1 S1 S1 S2 S2 S2 g
  • VC++ 增量链接器错误 LNK1000

    免责声明 我是一名 C 人员 几乎没有 VS C MFC 经验 我正在尝试在我的机器上构建一些混合 C Net 的项目 当在我的机器上通过命令行编译 C 项目时 我收到此错误 链接 致命错误 LNK1000 IMAGE BuildImage
  • 等待谷歌服务器端函数解析的最简单方法

    我需要客户端代码等待被调用的服务器端 google script run 函数完成 然后再运行更多代码 The withSuccessHandler successFunc 不会导致服务器调用之后的代码行等待 我做了什么 async fun
  • JavaBeans 属性适配器如何工作?

    如果我遵循所描述的 JavaFX 属性定义 我想要做的事情就很好here 现在 我想使用 Java Beans 属性适配器来定义 Java Beans 对象的属性 由于没有文档 我无法弄清楚它是如何工作的 假设我有一个简单的 POJO 类
  • 将整数作为常量引用传递与复制

    这可能是一个愚蠢的问题 但我注意到在大量 API 中 许多采用不打算修改的整数参数的方法签名如下所示 void method int x 而不是 void method const int x 对我来说 这两个似乎都会function一模一
  • aws-sdk: NoSuchKey: 指定的密钥不存在?

    在我的nodejs项目中 我使用aws sdk从我的s3存储桶下载所有图像 但我收到此错误 NoSuchKey 指定的密钥不存在 但密钥是正确的 我可以使用这些密钥上传图像 我的代码是 var AWS require aws sdk s3
  • 将计划的开始值和结束值建模为变量

    我正在尝试在 Anylogic 中构建一个模型 该模型将优化资源池的开始和结束时间以满足需求 有没有办法将计划的开始时间和结束时间作为参数输入到优化模型中 我目前的班次是8 5 可以满足30天的需求 但优化模型可能会说6 6 我们加班 可以
  • 什么是 /sys/class/gpio/export 和 `/sys/class/gpio/unexport 机制以及底层 sysfs 功能是什么?

    在 Android 和 Linux 下使用旧版 sysfs GPIO 的第一步是export您要使用的特定 GPIO 引脚 当您完成 GPIO 引脚的操作后unexport it 我一直在寻找一个解释export命令实际上是这样做的 但是我