默认情况下,/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
?我的意思是每次导出引脚时我都可以手动执行此操作。但那有点不舒服。
更新
根据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
,...)。
答案 0 :(得分:8)
您可以使用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
答案 1 :(得分:8)
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文件之前,对我有用的事情是睡眠大约100毫秒。
答案 2 :(得分:1)
通过@ roman-savrulin扩展答案,这是一个简单的版本。
无需对REMOVE事件运行规则,仅对ADD事件运行。也不需要运行“ find”,因为udev环境将提供包含新GPIO引脚文件的sysfs目录的确切路径。您还可以使用“ chgrp”仅更改拥有的组,并使用“ chmod”中的符号模式仅添加组写入权限位。
在尝试打开图钉的文件之前,您仍然必须等待规则处理完成,但是该过程应以更简单的规则(仅涉及所需的最小文件数)来更快地完成。
SUBSYSTEM=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chgrp -R gpio /sys/${DEVPATH} && chmod -R g+w /sys/${DEVPATH}'"
答案 3 :(得分:0)
检查您所属的组:
userk@dopamine $: groups
userk sudo dialout
如果您属于以下拨出电话,则不注释。
userk@dopamine $: ls -l /dev/gpiomem
crw------- root root /dev/gpiomem
此文件镜像与GPIO设备关联的内存。该命令的输出表示文件的所有者是root用户,“拥有”该文件的组是root用户。这10个字符代表文件类型和与其相关的权限。当前配置允许文件所有者读取和写入文件。
如果您想控制gpios,则希望能够读写该文件。
一种选择是修改群组所有者,使其与您所属的群组所有者匹配(在我的情况下为拨出),然后设置权限,以允许该群组的所有用户读写文件。
长话短说:
userk@dopamine $: sudo chown root:dialout /dev/gpiomem
userk@dopamine $: sudo chmod 660 /dev/gpiomem
等等!此设置不会永久保留,并且在重启后将消失。
有关此主题的更多信息,请参见此post
答案 4 :(得分:0)
对于 Ubuntu 运行。
sudo apt install rpi.gpio-common