Доступ к GPIO (/sys/class/gpio) как к некорневому
Доступ к /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
группы gpio
. Таким образом, они теперь могут export
и unexport
булавка штрафа.
Проблема в том, что они не могут читать/записывать определенные файлы выводов после export
(ex /sys/class/gpio/gpio17
), /sys/class/gpio/gpio17
они снова принадлежат пользователю root:root
.
Как я могу изменить, чтобы они были созданы по умолчанию как root:gpio
? Я имею в виду, что я могу сделать это вручную каждый раз, когда я экспортирую булавку. Но это немного неудобно.
ОБНОВИТЬ
Согласно ответу жаворонка, я создал недостающий файл правил. Теперь это частично работает:
-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
Хорошо, я решил проблему. Поскольку я установил Raspbian поверх RaspbianInstaller, я никогда не проходил через инструмент raspi-config
. Это кажется проблемой. Потому что мне также не хватало папки /sys/device/virtual/gpio/
.
Я следовал этому руководству здесь: http://www.element14.com/community/message/139528/l/re-piface-digital-2--setup-and-use#139528
И впоследствии права были правильными (даже для pin-папок и их файлов, value
, direction
,...).
Ответы
Ответ 1
Вы можете сделать это с помощью правил udev
, которые могут определять действия для выполнения, когда ядро запускает новые устройства. Текущие версии дистрибутива Raspbian для устройств Raspberry Pi содержат следующее в /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
Ответ 2
Более распространенным правилом для ядер 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 Пожалуйста, помните, что когда вы экспортируете GPIO через sysfs, вы должны подождать, пока правило udev сработает и завершится, прежде чем вы получите желаемые права доступа. У меня получилось поспать около 100 мс, прежде чем пытаться получить доступ к файлам GPIO.