Получить значение вывода gpio с помощью libgpiod в Linux
Я использую Linux (ядро 5.8.17) на встроенной пользовательской плате, и у меня есть сценарий, выполняющий некоторые операции gpioget и gpioset с пакетом libgpiod. Установка выходных контактов с помощью gpioset отлично работает, как и получение значений входных контактов с помощью gpioget. Но когда мне нужно узнать текущее значение выходного контакта, использование gpioget изменяет значение контакта и направление.
Вот пример:
~# gpioinfo |grep MB_AC_ON
line 230: "MB_AC_ON" unused output active-high
~# gpioset $(gpiofind "MB_AC_ON")=1
~# gpioget $(gpiofind "MB_AC_ON")
0
~# gpioinfo |grep MB_AC_ON
line 230: "MB_AC_ON" unused input active-high
Установка булавки на «1» работает. Но затем, проверяя текущее значение того же пина с помощью gpioget, значение меняется на «0», а направление меняется на входное. Можно ли вообще получить значение вывода gpio с помощью libgpiod?
2 ответа
На самом деле принятый ответ содержит только один аспект проблемы. Да, не гарантирует сохранение состояния GPIO после выхода. Можно было бы использоватьmode
параметр, позволяющий держать дескриптор файла открытым до тех пор, пока он не получит сигнал.[1]
gpioset --mode=signal $(gpiofind "MB_AC_ON")=1
Ибо libgpiod v2 ведет себя по-другому и по умолчанию больше не завершает работу, пока не получит сигнал. С учетом других упрощений, позволяющих напрямую указывать строку по метке, эквивалентная команда, приведенная выше, в версии 2 сводится к следующему:
gpioset MB_AC_ON=1
Хотя для некоторых контроллеров GPIO состояние фактически сохраняется даже послеgpioset
выходит, что, похоже, относится и к ОП. В этих случаях у вас все еще остается проблема, связанная с использованиемgpioget
впоследствии меняет направление с вывода обратно на ввод, даже если вы просто хотите получить текущее состояние вывода.
В этом случае v2 изlibgpiod
имеет новый параметр--as-is
чтобы сохранить направление[2]:
gpioget --as-is MB_AC_ON
[1] https://manpages.debian.org/testing/gpiod/gpioset.1.en.html
[2] https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/commit/tools/gpioget.c?h=v2.0&id=3a912fbc1e2697f4479396fd11557b943b31d217
когда я проверил детали
gpioset -h
там было примечание: я думаю, что это ответ на ваш вопрос.
Примечание: состояние линии GPIO, управляемой символьным устройством, возвращается к состоянию по умолчанию, когда завершается последний процесс, ссылающийся на файловый дескриптор, представляющий файл устройства. Это означает, что неправильно запускать gpioset, завершать работу и ожидать, что линия будет продолжать двигаться вверх или вниз. Это может произойти, если данный вывод является плавающим, но это должно интерпретироваться как неопределенное поведение.
Также, если мы посмотрим на код (
gpioset: ../libgpiod/tools/gpioset.c
) более детально. Мы видим, что эти блоки кода ниже приводят к тому, что строка получает значение по умолчанию (вы не можете сохранить значение, установленное с помощью gpioset).
gpiod_line_release_bulk(lines);
gpiod_chip_unref(chip);
gpiod_line_bulk_free(lines);
free(offsets);
free(values);