【发布时间】: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 管脚的特殊设备文件,因此应用程序可以只使用这些管脚而不用打扰export 或unexport?用户应用程序无需先使用sudo echo 938 > /sys/class/gpio/export 就可以对特殊设备执行读/写操作?
启动初始化脚本创建的这些特殊文件的访问和共享权限是什么?多个应用程序可以同时操作相同的 GPIO 引脚吗?
【问题讨论】:
-
注意:通过此旧版 sysfs 接口进行 GPIO 访问自 Linux 内核 4.8 版起已弃用 (https://www.kernel.org/doc/Documentation/gpio/sysfs.txt)。它将在 2020 年从内核中删除。执行 GPIO 的新方法是通过“基于描述符”的字符设备 ABI(应用程序二进制接口)。您应该对 Libgpiod(库通用输入/输出设备)进行研究,并从 [git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/about/… 开始
标签: android embedded-linux gpio sysfs