3690
правок
(не показано 7 промежуточных версий этого же участника) | |||
Строка 42: | Строка 42: | ||
'''ВНИМАНИЕ:''' остановка драйверов может привести к неожиданному поведению контроллера. Теперь нужный gpio свободен до следующей перезагрузки. | '''ВНИМАНИЕ:''' остановка драйверов может привести к неожиданному поведению контроллера. Теперь нужный gpio свободен до следующей перезагрузки. | ||
В контроллерах Wiren Board доступные к использованию gpio обычно заняты сервисом wb-mqtt-gpio. Остановить его можно так: | |||
<syntaxhighlight lang="bash"> | |||
systemctl stop wb-mqtt-gpio | |||
</syntaxhighlight> | |||
==Bash== | ==Bash== | ||
Строка 47: | Строка 51: | ||
Различия между ''chardev'' и ''sysfs'' хорошо описаны в [https://embeddedbits.org/new-linux-kernel-gpio-user-space-interface/ этой статье]. Sysfs имеет статус deprecated, поэтому, по возможности, <u>стоит работать через chardev</u>. | Различия между ''chardev'' и ''sysfs'' хорошо описаны в [https://embeddedbits.org/new-linux-kernel-gpio-user-space-interface/ этой статье]. Sysfs имеет статус deprecated, поэтому, по возможности, <u>стоит работать через chardev</u>. | ||
===Работа через chardev=== | |||
Представленный в ядре 4.8 интерфейс chardev имеет C/Python библиотеку ''libgpiod'' и userspace-утилиты для работы с gpio. Исходный код библиотеки и документация доступны в [https://github.com/brgl/libgpiod репозитории libgpiod]. | |||
Утилиты распространяются в составе debian-пакетов ''gpiod'' и ''libgpiod-dev''. Установка: | |||
<syntaxhighlight lang="bash"> | |||
~# apt install gpiod | |||
</syntaxhighlight> | |||
Для работы с gpio в пакете ''gpiod'' поставляются следующие утилиты: | |||
* <code>gpiodetect</code> — информация обо всех банках gpio в системе | |||
* <code>gpioinfo</code> — подробная информация обо всех линиях gpio определённого банка | |||
* <code>gpioget <чип> <линия></code> — возвращает значение определённого gpio | |||
* <code>gpioset <чип> <линия1>=<значение1> <линия2>=<значение2></code> — устанавливает состояние на определенные линии gpio | |||
* <code>gpiofind <название></code> — возвращает номер gpio | |||
* <code>gpiomon</code> — отслеживание событий gpio | |||
Пример работы: | |||
<syntaxhighlight lang="bash"> | |||
~# systemctl stop wb-mqtt-gpio # stop WB GPIO<==>MQTT bridge | |||
~# gpiofind "A1 IN" # find gpiochip and offset for a given label | |||
gpiochip0 231 | |||
~# gpioget `gpiofind "A1 IN"` # get the current GPIO value, using data returned by gpiofind | |||
1 | |||
~# gpiofind "A1 OUT" # find chip and offset for another GPIO | |||
gpiochip0 109 | |||
~# gpioset gpiochip0 109=1 # enable A1 OUT | |||
~# gpioset gpiochip0 109=0 # disable A1 OUT | |||
~# gpioset `gpiofind "A1 OUT"`=0 # now the same using gpiofind | |||
</syntaxhighlight> | |||
Примеры использования gpiod можно посмотреть в [https://www.acmesystems.it/gpiod] и [https://github.com/brgl/libgpiod]. | |||
===Интерфейс sysfs=== | ===Интерфейс sysfs=== | ||
Строка 125: | Строка 164: | ||
echo 0 > /sys/class/gpio/gpio32/value | echo 0 > /sys/class/gpio/gpio32/value | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====Номера GPIO==== | |||
Наиболее унивверсальный способ получить номер GPIO для устаревшего интерфейса sysfs - получить его по метке GPIO. | |||
Для этого нужно найти номер gpiochip, смещение внутри gpiochip и базовый адрес gpiochip. | |||
Пример: | |||
<syntaxhighlight lang="bash"> | |||
~# gpiofind "A1 OUT" | |||
gpiochip0 109 | |||
~# cat /sys/class/gpio/gpiochip0/base | |||
0 | |||
</syntaxhighlight> | |||
Т.е. для A1 OUT будет старый номер 0 (base) + 109 (offset) = 109. | |||
Номера по метке можно получить также через отладочный интерфейс ядра. Это не требует использования утилит gpiod, но формат вывода может быть изменён в новых версиях ядра. "Старый" (глобальный) номер указан в первом столбце: | |||
<syntaxhighlight lang="bash"> | |||
~# cat /sys/kernel/debug/gpio | grep "A1 OUT" | |||
gpio-109 (A1 OUT |wb-mqtt-gpio ) out lo | |||
</syntaxhighlight> | |||
GPIO для дискретных входов и выходов модулей расширения и модулей ввода-вывода доступны таким же образом. Не забудьте выбрать модуль в интерфейсе Hardware Modules Configuration. | |||
====Работа с прерываниями==== | ====Работа с прерываниями==== | ||
Строка 153: | Строка 221: | ||
См. также [http://elinux.org/GPIO elinux.org] | См. также [http://elinux.org/GPIO elinux.org] | ||
==Python== | ==Python== | ||
Строка 177: | Строка 228: | ||
Модуль позволяет работать с gpio в синхронном и асинхронном (с регистрацией коллбэков) режимах. | Модуль позволяет работать с gpio в синхронном и асинхронном (с регистрацией коллбэков) режимах. | ||