Сопоставьте контакты GPIO оборудования Raspberry с номерами линий микросхем gpiod
Я играл со своим Raspberry Pi на выходных. Я использовал руководство от Freenove, которому я следовал, чтобы реализовать несколько простых схем, которые управляются контактами GPIO на малине.
В руководстве по Freenove используется устаревшая библиотека WiringPi. Помимо того факта, что он устарел, я понимаю, что WiringPi добавляет дополнительные абстракции и упрощения, чтобы позволить пользователям сосредоточиться на своих схемах и меньше на написании шаблонного кода для интеграции низкоуровневых (C) библиотек.
Теперь я хочу лучше понять, как приложения пользовательского пространства взаимодействуют с аппаратными выводами GPIO, и я не беспокоюсь о написании шаблонного кода. Итак, я начал играть с libgpiod , у которого есть API C, который можно использовать для чтения и установки контактов GPIO, и он хорошо работает.
Мне непонятно, как я могу сопоставить физические контакты GPIO на 40-контактном разъеме (которые пронумерованы от 1 до 40) с одним из 54 внутренних номеров строк, которые сообщает gpiod, когда я использую команду.
На моем Raspberry 3b + с Raspbian 10 команда выводит следующее, где все имена строк отображаются как
unnamed
. Список продолжается примерно так, но я сократил его до 10 строк.
gpiochip0 - 54 lines:
line 0: unnamed unused output active-high
line 1: unnamed unused output active-high
line 2: unnamed unused output active-high
line 3: unnamed unused output active-high
line 4: unnamed unused output active-high
line 5: unnamed unused output active-high
line 6: unnamed unused output active-high
line 7: unnamed unused output active-high
line 8: unnamed unused output active-high
line 9: unnamed unused input active-high
line 10: unnamed unused input active-high
[...]
Я обнаружил проблему с отсутствующими именами линий GPIO, в которых обсуждается эта проблема, но я не понимаю ответа или почему она была закрыта.
Как я должен искать номера строк микросхемы на основе имени вывода, например? Методом проб и ошибок я обнаружил, что
GPIO17
сопоставляется с линией
17
, но например
CE0
сопоставляется с линией
8
и карты в линию
3
, который я узнал методом проб и ошибок, используя
gpioset
.
Я не уверен, что это хорошая идея - жестко закодировать это сопоставление в моем приложении, или мне нужно каким-то образом обнаружить эти значения программно, чтобы сделать программу более переносимой?
Я пытался использовать
gpiod_ctxless_find_line
:
gpiod_ctxless_find_line ("SCL1", configuration->chipname, configuration->chipname_length, &offset);
но даже если это возвращает значение
0
(ОК) результирующее смещение
66796
что не является правильным значением. Я предполагаю, что он ничего не возвращает, потому что
gpioinfo
не имеет названий строк.
Если я напишу программу на C, используя
libgpiod
, могу ли (должен?) я обнаруживать эти сопоставления во время выполнения, или можно просто жестко их закодировать? Возможно, что на будущей Raspberry
SCL1
не будет на физическом контакте 5 или сопоставлении с линией 3?
2 ответа
Пока я писал этот вопрос, я обнаружил, что в официальной Raspberry документацииGPIO есть эти изображения, которые показывают отображение, а затем я понял, что желтые номера GPIO на втором рисунке соответствуют
libgpiod
номера строк. Таким образом, существует взаимно однозначное соответствие между
GPIOxx
и номер строки:
Думаю, в моем процессе обучения было две запутанных части. Во-первых, WiringPi использует другие термины GPIO, чем Raspberry. Например, WiringPi имеет два блока GPIO, пронумерованных как
GPIO0 (wiringPi)
к
GPIO7 (wiringPi)
с последующим зазором для специальных штифтов, таких как
SDA1
и еще один блок, пронумерованный как
GPIO21 (wiringPi)
к . Итак
GPIO29 (wiringPi)
на самом деле
GPIO21 (raspberry)
на малине.
Вторая часть заключается в том, что моя коммутационная плата показывает только семантические имена для некоторых GPIO, а не фактический номер GPIO (например, вместо
GPIO 2 (SDA)
это только показывает
SDA
).
С помощью
pinout
можно увидеть официальное сопоставление Raspberry Pi, которое сопоставляет GPIO с физическими контактами. Такая же информация присутствует в
gpio readall
команда в
BMC
столбец, но столбец имени показывает имена GPIOwiringPi, а не имена GPIO Raspberry pi из изображения выше.
Проблема, на которую вы упомянули об отсутствующих именах строк GPIO, была недавно восстановлена, и AFAIK наконец-то решен. Проблема заключалась в том, что дерево устройств не было определено. Это было исправлено в RPi 4B некоторое время назад, но по какой-то причине более старые платформы были проигнорированы. Я думаю, что все исходные файлы были обновлены, хотя вам все еще может понадобиться
rpi-update
некоторое время, пока не выйдет прошивка для
apt
обновления.
FWIW, я решил добавить в свой RPi 3B+ наложение дерева устройств . Я сделал это исключительно в качестве учебного упражнения, но я не уверен, что многому научился, поскольку код дерева устройств кажется мне загадочным . Тем не менее, закончив проект оверлея, мне нравится идея иметь оверлей, поскольку он позволяет мне легко изменять
gpio-line-names
в соответствии с моими предпочтениями.