【问题标题】:what is the /sys/class/gpio/export and `/sys/class/gpio/unexport mechanism and what is the underlying sysfs functionality?什么是 /sys/class/gpio/export 和 `/sys/class/gpio/unexport 机制以及底层 sysfs 功能是什么?
【发布时间】:2020-12-25 09:26:03
【问题描述】:

在 Android 和 Linux 下使用旧版 sysfs GPIO,此过程的第一步是使用 export 您要使用的特定 GPIO 引脚。并且当你完成 GPIO 引脚到unexport 时。

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

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

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

GPIO Sysfs Interface for Userspace

“出口”……

用户空间可能会要求内核将 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/sys/class/gpio/gpio938/direction。当我执行echo 938 > /sys/class/gpio/unexport 时,那些特殊的设备文件会被删除吗?

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

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

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

我的问题

/sys/class/gpio/export/sys/class/gpio/unexport 这些特殊设备文件是什么?它们如何与 Linux 内核中的某种功能相关联,该功能会在 /sys/class/gpio 文件夹中创建和销毁特殊设备文件?

对启动初始化脚本的建议更改是表示任何人都可以访问的 GPIO 管脚的特殊设备文件,因此应用程序可以只使用这些管脚而不用打扰exportunexport?用户应用程序无需先使用sudo echo 938 > /sys/class/gpio/export 就可以对特殊设备执行读/写操作?

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

【问题讨论】:

标签: android embedded-linux gpio sysfs


【解决方案1】:

/sys/class/gpio 中的伪文件是内核接口中函数调用的相当薄的包装器。内核文档 [1] 中有一条关于导入/导出功能用途的线索:

内核驱动程序请求 GPIO 后,它可能只可用 通过 gpiod_export() 在 sysfs 接口中。司机可以控制 信号方向是否可能改变。这有助于驾驶员防止 用户空间代码避免意外破坏重要的系统状态。

这种显式导出可以帮助调试(通过制作一些 实验更容易),或者可以提供一个始终存在的界面 适合作为电路板支持包的一部分进行记录。

因此,从本质上讲,此功能的存在是为了防止用户空间应用程序粗心地践踏 I/O 设备的状态。我不知道它在实践中有多大用处。

[1]https://www.kernel.org/doc/html/latest/admin-guide/gpio/sysfs.html

【讨论】:

  • 感谢您的回答。我没有想过使用伪文件作为搜索词,并通过这样做找到了一些新材料。这个看起来很有趣,i-programmer.info/programming/cc/…
  • 我开始认为使用 /sys/class/gpio/gpio905/value 之类的伪文件来设置 GPIO 引脚是高电平还是低电平类似于将 UDP 消息发送到远程设备上的 UDP 端口,消息中包含监视端口的软件可以理解的一些数据值。监控端口的软件接受消息,将消息内容转换为必要的格式,然后调用函数或系统服务,转换后的数据执行请求的服务。
  • 我做了一些研究,并整理了一个包含细节的答案。您的回答提供了我有效研究此问题所需的搜索词。没有你的建议,我不可能学到我所拥有的东西。谢谢。
【解决方案2】:

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

A Study of Modern Linux API Usage and Compatibility: What to Support When You’re Supporting

除了主系统调用表,Linux 还导出了很多 通过伪文件系统(例如 /proc、/dev 和 /系统。这些被称为伪文件系统,因为它们没有支持 通过磁盘,而是将内核数据结构的内容导出到 应用程序或管理员,就好像它们存储在文件中一样。 这些伪文件系统是导出调优的方便位置 参数、统计数据和其他子系统特定或设备 特定的 API。尽管这些伪文件中的许多都用于 命令行或管理员的脚本中,有一些是常规的 应用程序使用。为了充分了解 Linux 内核,还必须考虑伪文件。

伪文件的类比

从用户的角度考虑这些伪文件的一种方式是,它们是 Linux 内核的一种Remote Procedure Call 接口,它使用文件系统语义来请求完成某些操作。文件系统语义映射到以下通用操作和行为:

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

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

这篇 StackOverFlow 帖子 Create sysfs entry from kernel module 包含一个简单的伪文件处理程序示例 /sys 显示了提供 Linux 内核需要将新伪文件的处理程序挂钩到 Linux 中的函数接口的基础知识内核。

此 StackOverFlow 帖子 How to create proc entry under /proc/driver? 包含 /proc 中伪文件处理程序的简单示例。

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

导出和取消导出

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

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

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

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

unexport 伪文件删除了 GPIO 引脚伪文件,因此与用户应用程序中表示的 GPIO 引脚的交互不再可用。

关于 PWM sysfs 支持的注意事项: 正如通过 sysfs 接口和/sys 支持 GPIO 引脚一样,也支持 PWM 引脚。根文件夹是/sys/class/pwm,其功能在架构上与 GPIO 引脚类似。有一个类似的exportunexport 功能可以使 PWM 引脚可用,并且使用导出的 PWM 伪文件是通过对一组与代表 PWM 引脚的伪文件夹相关联的文件进行标准文件操作。请参阅Using PMIC PWM on Dragonboard410c,其中描述了“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/sys/class/gpio/gpio938/direction

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2017-01-24
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多