Linux: проблема времени экспорта gpio

Созданный на 27 мар. 2014  ·  9Комментарии  ·  Источник: raspberrypi/linux

Если следующие три команды выполняются индивидуально из командной строки на Raspberry Pi с использованием Raspbian (2014-01-07-wheezy-raspbian.zip), они выполняются успешно:

pi<strong i="6">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport
pi<strong i="7">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export
pi<strong i="8">@raspberrypi</strong> ~ $ echo out > /sys/class/gpio/gpio23/direction 
pi<strong i="9">@raspberrypi</strong> ~ $ 

Однако, если они выполняются вместе в одной строке, возникает ошибка отказа в разрешении:

pi<strong i="13">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; echo out > /sys/class/gpio/gpio23/direction
-bash: /sys/class/gpio/gpio23/direction: Permission denied
pi<strong i="14">@raspberrypi</strong> ~ $ 

Ошибка отказа в разрешении возникает из-за того, что «echo out> / sys / class / gpio / gpio23 / direction» выполняется до того, как биты группы и разрешения для «/ sys / class / gpio / gpio23 / direction» были установлены на соответствующие значения. . Биты группы и разрешения - это «root» и «-rw-r - r--», но они должны быть «gpio» и «-rwxrwx ---».

Эту проблему синхронизации можно увидеть в последовательности команд ниже, которая экспортирует gpio 23 и дважды перечисляет содержимое «/ sys / class / gpio / gpio23 /». Вывод первой команды ls сильно отличается от вывода второй команды ls. Изменились и группа, и разрешения для всех файлов.

pi<strong i="19">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; ls -l /sys/class/gpio/gpio23/; ls -l /sys/class/gpio/gpio23/
total 0
-rw-r--r-- 1 root root 4096 Mar 27 21:51 active_low
-rw-r--r-- 1 root root 4096 Mar 27 21:51 direction
-rw-r--r-- 1 root root 4096 Mar 27 21:51 edge
drwxr-xr-x 2 root root    0 Mar 27 21:51 power
lrwxrwxrwx 1 root root    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Mar 27 21:51 uevent
-rw-r--r-- 1 root root 4096 Mar 27 21:51 value
total 0
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 active_low
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 direction
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 edge
drwxrwx--- 2 root gpio    0 Mar 27 21:51 power
lrwxrwxrwx 1 root gpio    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 uevent
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 value

Это проблема, которую нужно решить?

Самый полезный комментарий

Это очень раздражающая проблема, требующая уродливых решений. Он не должен был закрываться.

Все 9 Комментарий

Я только что отредактировал вышеуказанный пост. Изначально ни одного из вхождений "echo 23> / sys / class / gpio / uneport" не было. Неэкспорт необходим только для того, чтобы вернуть gpio в исходное неэкспортированное состояние.

Я получил:

pi<strong i="6">@raspberrypi</strong>:~ $ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Mar 27 17:41 export
lrwxrwxrwx 1 root root    0 Mar 27 17:41 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 4096 Mar 27 17:41 unexport
pi<strong i="7">@raspberrypi</strong>:~ $ echo 23 > /sys/class/gpio/unexport
-bash: /sys/class/gpio/unexport: Permission denied

чего я и ожидал. Только root имеет разрешение на доступ к / sys / class / gpio / uneport, поэтому, когда pi пытается это сделать, он правильно получает отказ в разрешении.

Если я сначала запускаю «sudo su», команда работает должным образом.

Это то, что я использовал в старых версиях или Raspbian, но на 2014-01-07-wheezy-raspbian я получаю:

pi<strong i="7">@raspberrypi</strong> ~ $ ls -l /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 Mar 28 16:58 export
lrwxrwxrwx 1 root gpio    0 Jan  1  1970 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
-rwxrwx--- 1 root gpio 4096 Mar 28 17:01 unexport
pi<strong i="8">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export 
pi<strong i="9">@raspberrypi</strong> ~ $ 

Все работает нормально и ошибок нет. Каждый в группе gpio имеет разрешение на доступ к / sys / class / gpio / export, а pi является членом группы gpio.

pi<strong i="13">@raspberrypi</strong> ~ $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users netdev input spi gpio

uname выводит следующее:

pi<strong i="17">@raspberrypi</strong> ~ $ uname -a
Linux raspberrypi 3.10.34+ #661 PREEMPT Thu Mar 27 00:36:02 GMT 2014 armv6l GNU/Linux

Поведение изменилось, поскольку мы использовали кое-что udev от ребят из piface. Вы правы, вам нужно подождать, пока udev изменит разрешения на созданном устройстве. Это вещь, связанная с пользовательским пространством, поэтому не совсем для этого репо, но я не совсем уверен, что есть способ ее улучшить.

Это работает?

echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; sleep 1; echo out > /sys/class/gpio/gpio23/direction

@asb Хорошо, спасибо за информацию. Думаю, я изменю код в onoff, чтобы он

@popcornmix да, это работает, спасибо.

Я вижу ценность в расширении процесса разрешения GPIO в пользовательское пространство, но эта реализация
испортил семантику операции экспорта GPIO ядра. Запись в / sys / class / gpio / export
должен дождаться, пока процесс пользовательского пространства сообщит о завершении своей работы, прежде чем запись вернется.

Обходные решения, которые говорят, что пользователи должны подождать некоторое время, пока метаданные sysfs установятся после
операции экспорта очень уродливы, потому что нет правильного периода ожидания. Стратегия обхода, которая
ищет изменения в метаданных (например, для группы, установленной на gpio) неадекватны, потому что цель
процесс разрешения пользовательского пространства является гибким - он может решить, что root является правильной группой и никаких изменений
имеет место.

Семантическое изменение операции экспорта GPIO ядра является препятствием для переносимого кода, не только
между Raspberry Pi и другими аппаратными платформами, а также между разными Linux
раздачи на Raspberry Pi.

Согласованный. Ответственность за обеспечение работающей реализации sysfs лежит на ядре, а реализация Raspbian явно некрасиво сломана. Я не понимаю, как эта проблема могла быть отмечена как закрытая.

Это очень раздражающая проблема, требующая уродливых решений. Он не должен был закрываться.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

pvouzis picture pvouzis  ·  9Комментарии

awlx picture awlx  ·  4Комментарии

ensarkarabudak picture ensarkarabudak  ·  7Комментарии

dkerr64 picture dkerr64  ·  7Комментарии

XECDesign picture XECDesign  ·  6Комментарии