/sys/class/gpio
默认只能作为root
访问。所以我喜欢一个新组gpio
可以使用/sys/class/gpio
下的文件和目录。为了达到这个目的,我将以下几行添加到/etc/rc.local
(我在Debian上):
sudo chown root:gpio /sys/class/gpio/unexport /sys/class/gpio/export
sudo chmod 220 /sys/class/gpio/unexport /sys/class/gpio/export
因此,这为所有gpio
组成员提供了写权限。所以他们现在可以export
和unexport
针很好。
问题是他们无法在export
(e.x./sys/class/gpio/gpio17
)之后读取/写入特定的pin文件,因为这些文件再次由root:root
拥有。
我如何更改它们默认创建为root:gpio
?我的意思是每次导出引脚时我都可以手动执行此操作。但那有点不舒服。
UPDATE
根据larsks的回答,我创建了缺少的规则文件。现在它部分有效:
-rwxrwx--- 1 root gpio 4096 Jun 19 16:48 export
lrwxrwxrwx 1 root gpio 0 Jun 19 16:51 gpio17 -> ../../devices/soc/3f200000.gpio/gpio/gpio17
lrwxrwxrwx 1 root gpio 0 Jun 19 16:45 gpiochip0 -> ../../devices/soc/3f200000.gpio/gpio/gpiochip0
-rwxrwx--- 1 root gpio 4096 Jun 19 16:45 unexport
但对于./gpio17/
我仍然得到root:root
:
-rw-r--r-- 1 root root 4096 Jun 19 16:52 active_low
lrwxrwxrwx 1 root root 0 Jun 19 16:52 device -> ../../../3f200000.gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 direction
-rw-r--r-- 1 root root 4096 Jun 19 16:52 edge
drwxr-xr-x 2 root root 0 Jun 19 16:52 power
lrwxrwxrwx 1 root root 0 Jun 19 16:52 subsystem -> ../../../../../class/gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 uevent
-rw-r--r-- 1 root root 4096 Jun 19 16:52 value
更新2
好的,我解决了这个问题。因为我在RaspbianInstaller上安装了Raspbian,所以我从来没有通过raspi-config
工具。这似乎是一个问题。因为我也错过了/sys/device/virtual/gpio/
文件夹。
我在这里遵循了这个指南:http://www.element14.com/community/message/139528/l/re-piface-digital-2--setup-and-use#139528
然后权限是正确的(即使针脚文件夹和他们的文件value
,direction
,...)。
您可以使用udev
规则执行此操作,该规则可以定义在内核实例化新设备时要执行的操作。 Raspberry Pi设备的当前版本的Raspbian发行版在/etc/udev/rules.d/99-com.rules
中包含以下内容:
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio'"
这样可以确保/sys/class/gpio
下的条目始终可供gpio
组的成员使用:
# ls -lL /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 May 6 23:36 export
drwxrwx--- 2 root gpio 0 Jan 1 1970 gpiochip0
-rwxrwx--- 1 root gpio 4096 May 6 23:37 unexport
# echo 11 > /sys/class/gpio/export
# ls -lL /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 May 6 23:37 export
drwxrwx--- 2 root gpio 0 May 6 23:37 gpio11
drwxrwx--- 2 root gpio 0 Jan 1 1970 gpiochip0
-rwxrwx--- 1 root gpio 4096 May 6 23:37 unexport
更新
各个引脚的权限也是正确的:
# ls -Ll /sys/class/gpio/gpio11/
total 0
-rwxrwx--- 1 root gpio 4096 May 6 23:37 active_low
drwxr-xr-x 3 root root 0 May 6 23:36 device
-rwxrwx--- 1 root gpio 4096 May 6 23:37 direction
-rwxrwx--- 1 root gpio 4096 May 6 23:37 edge
drwxrwx--- 2 root gpio 0 May 6 23:37 subsystem
-rwxrwx--- 1 root gpio 4096 May 6 23:37 uevent
-rwxrwx--- 1 root gpio 4096 May 6 23:37 value
4.x内核的更常见规则如下
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'find -L /sys/class/gpio/ -maxdepth 2 -exec chown root:gpio {} \; -exec chmod 770 {} \; || true'"
如果路径中存在符号链接,则初始答案中的规则将无法选择导出的gpio
UPD请记住,当您通过sysfs导出一些GPIO时,您应该等到udev规则触发并完成,然后才能获得所需的访问权限。对我有用的东西是在尝试访问GPIO文件之前睡了大约100ms。