Доступ к 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.