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

理查德·钱伯斯(Richard Chambers):

在Android和Linux下使用旧版sysfs GPIO,此过程的第一步是export指定要使用的特定GPIO引脚。当您完成GPIO引脚的连接unexport后。

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

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

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

用于用户空间的GPIO Sysfs接口

“出口” …

用户空间可以要求内核通过将GPIO的编号写入该文件来将GPIO的控制输出到用户空间。

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

“取消出口” ...

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

示例:“ echo 19> unexport”将删除使用“ export”文件导出的“ 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那些特殊的设备文件会被删除吗?

在研究将GPIO引脚与Android 5.1下的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

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

我的问题

这些是什么特殊的设备文件/sys/class/gpio/export以及/sys/class/gpio/unexport它们是怎样被连接到Linux内核中创建并中破坏特殊设备文件某种功能的/sys/class/gpio文件夹?

通过对引导初始化脚本的建议更改,可以创建代表可由任何人访问的GPIO引脚的特殊设备文件,因此应用程序可以只使用这些引脚,而不必担心exportunexport用户应用程序可以只对特殊设备执行读/写操作,而不必先使用sudo echo 938 > /sys/class/gpio/export

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

理查德·钱伯斯(Richard Chambers):

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

现代Linux API使用和兼容性研究:支持时要支持的内容

除了主系统调用表之外,Linux还通过伪文件系统(例如/ proc,/ dev和/ sys)导出许多其他API。这些之所以称为伪文件系统,是因为它们没有磁盘支持,而是将内核数据结构的内容导出到应用程序或管理员,就好像它们存储在文件中一样。这些伪文件系统是导出调整参数,统计信息以及其他特定于子系统或特定于设备的API的便捷位置。尽管这些伪文件中的许多是管理员在命令行或脚本中使用的,但应用程序通常会使用其中的一些伪文件。为了充分了解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引脚。然后,此消息由exportLinux内核中的GPIO sysfs处理程序处理,以创建代表GPIO引脚的伪文件文件夹以及为用户应用程序和sysfs处理程序之间提供指定GPIO引脚之间的接口的伪文件。处理程序提供物理GPIO引脚和引脚设备驱动程序与伪文件表示或接口之间的层。

unexport伪文件删除的GPIO管脚伪文件,以便从用户的应用程序所表示的GPIO管脚相互作用不再可用。

关于PWM sysfs支持的注意事项:就像通过sysfs接口支持GPIO引脚一样,/sys也支持PWM引脚。根文件夹为/sys/class/pwm,其功能与GPIO引脚的体系结构相似。有一个类似exportunexport功能,使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/sys/class/gpio/gpio938/direction

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

GPIO directory missing in /sys/class

尝试写入/ sys / class / gpio / export –写入错误:参数无效

以非root用户访问GPIO(/ sys / class / gpio)

在Linux / sys / class / gpio中写入文件的错误

尽管对/ sys / class / gpio / gpio18 / value具有文件许可权,但无法写入GPIO引脚

在没有root权限的情况下在Python中使用/ sys / class / gpio /

/ sys / class / block和/ sys / block有什么区别

/ dev和/ sys / class之间的区别?

GPIO方向的目的是什么?

为什么 Sys.time() 的 class() 长度为 2?

为什么find cmd在/ sys / class内部不起作用?

写入/ sys / class的脚本存在安全风险

Linux上的/ sys / class文件系统

AMDGPU-PRO如何关联在/ sys / kernel / debug / dri和/ sys / class / drm /中找到的GPU统计信息?

为什么上流输出与/ sys / class / power_supply内容不同?

为什么树无法完整列出/ sys / class / hwmon?我该怎么办呢?

为什么我的系统中有两个亮度控制文件(/ sys / class /)

如何使用Jetson nano GPIO在GPIO.TEGRA_SOC模式和GPIO.BCM模式下设置gpio引脚?

内核模块参数vs / sys / class / ...说明

非整数值(/ sys / class / backlight / intel_backlight /亮度)

通过/ sys / class / net获取当前的网络利用率

/ dev,/ proc和/ sys中有什么?

真正的sys.all_objects是什么?

sys.exc_info()的用途是什么?

sys.version_info是什么类型?

os.FileInfo中的Sys()是什么?

“ / sys”目录的作用是什么?

为什么 inotifywait 没有注意到 /sys/class/backlight/intel_backlight/brightness 的变化(Linux)

int.class的目的和功能是什么