在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的编号写入该文件来将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引脚的特殊设备文件,因此应用程序可以只使用这些引脚,而不必担心export
或unexport
?用户应用程序可以只对特殊设备执行读/写操作,而不必先使用sudo echo 938 > /sys/class/gpio/export
?
引导初始化脚本创建的这些特殊文件的访问和共享权限是什么,并且多个应用程序可以同时操纵相同的GPIO引脚吗?
Linux文件系统中有几种目录结构,它们不是实际的磁盘文件目录。相反,这些目录结构及其中的“文件”是伪文件或Linux操作系统服务,以及表示为文件的数据,可以使用文件操作进行访问,但不是存储在永久性存储(例如硬盘或固态硬盘)上的实际文件。状态磁盘。
除了主系统调用表之外,Linux还通过伪文件系统(例如/ proc,/ dev和/ sys)导出许多其他API。这些之所以称为伪文件系统,是因为它们没有磁盘支持,而是将内核数据结构的内容导出到应用程序或管理员,就好像它们存储在文件中一样。这些伪文件系统是导出调整参数,统计信息以及其他特定于子系统或特定于设备的API的便捷位置。尽管这些伪文件中的许多是管理员在命令行或脚本中使用的,但应用程序通常会使用其中的一些伪文件。为了充分了解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引脚。然后,此消息由export
Linux内核中的GPIO sysfs处理程序处理,以创建代表GPIO引脚的伪文件文件夹以及为用户应用程序和sysfs处理程序之间提供指定GPIO引脚之间的接口的伪文件。处理程序提供物理GPIO引脚和引脚设备驱动程序与伪文件表示或接口之间的层。
该unexport
伪文件删除的GPIO管脚伪文件,以便从用户的应用程序所表示的GPIO管脚相互作用不再可用。
关于PWM sysfs支持的注意事项:就像通过sysfs接口支持GPIO引脚一样,/sys
也支持PWM引脚。根文件夹为/sys/class/pwm
,其功能与GPIO引脚的体系结构相似。有一个类似export
和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
和/sys/class/gpio/gpio938/direction
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句