Сопоставьте контакты 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в соответствии с моими предпочтениями.

Другие вопросы по тегам