Как определить цифры GPIO PIN? Загружается ли драйвер GPIO?

Вы должны указать полный путь: startx / usr / bin / xmonad

Что происходит, когда вы запускаете startx xmonad is xmonad рассматривается как аргумент для клиента по умолчанию: xterm. Итак, xterm xmonad запущен.

0
03.12.2018, 17:03
2 ответа

Как правило, контакты GPIO сильно зависят от аппаратного обеспечения. Нет систематических имен, нет систематических драйверов, нет систематических регистров.

Единственное, что вы можете сделать, это прочитать имеющуюся у вас информацию, погуглить и угадать.

Поскольку в руководстве к вашей материнской плате указано, что имеется разъем GPIO, мы можем предположить, что контакты GPIO на самом деле физически маршрутизируются куда-то (, что не является данностью; контакты GPIO могут использоваться BIOS для других целей или просто быть открытыми ). «SOC» означает «Система на чипе», «3V3» означает 3,3 Вольта (уровень ТТЛ ).

Во-первых, предупреждение:Если этот заголовок напрямую подключается к SoC, то легко повредить SoC, выполнив неправильные действия. Электростатический разряд, неправильные уровни напряжения, перепутанные входы с выходами и т. д. могут повредить ваш SoC, а вместе с ним и ваш основной процессор. Всегда сначала подключайте к нему буферный чип, если хотите его использовать. Даже если буферная микросхема, которую вы нашли рядом с ней, на самом деле защищает именно этот заголовок, а не что-то другое.

Теперь нам нужен лист данных. Поиск в Google выдает это , что выглядит неплохо.

Это говорит нам о том, что SoC имеет 101 контакт GPIO для S0 и 43 контакта GPIO для S5. Только 10 из них попадают в заголовок материнской платы, но, к счастью, мы знаем, какие именно. Другие могут быть подключены к другим элементам на материнской плате, поэтому важно оставить их в покое.

На стр. 56 указано, что GPIO (PCU )представляет собой перемещаемый диапазон ввода-вывода длиной 256 -байт, декодируемый устройством PCI в матрице ввода-вывода. Я не знаю, как интерпретировать GBA: PCI[B:0,D:31,F:0] + 48h. В любом случае это означает, что следующим шагом будет использование lspciнастолько подробно, насколько это необходимо, выяснить, какие устройства PCI могут иметься в виду, и найти область размером 256 байт, которая выглядит многообещающе.

Далее рассказывается о PCU (Platform Unit Controller ), в частности о регистрах GPIO, начиная со страницы 1262.

Итак, следующий шаг — прочитать все это, понять, написать для него драйвер ядра, который использует правильную карту PCI и регион. Этот драйвер заставит контакты ввода/вывода отображаться под /sys/class/gpio. Написание одного не должно быть слишком трудным, должно быть достаточно найти существующие драйверы GPIO и модифицировать их для этого оборудования. Вам нужно знать, как программировать на C, и вы должны научиться писать модуль ядра.

Также возможно, что драйвер для этого конкретного оборудования уже существует, но, по крайней мере, его нет в вашем ядре (, иначе вы уже увидите некоторые контакты ).

Редактировать

Хорошо, B, D и F, кажется, соответствуют шине, устройству и функции устройств PCI, и есть две области по 32 -байта для контроллера SMBus, поэтому по крайней мере одна из них будет соответствовать описанной в руководство.

Однако в 00:1f.0нет регионов, только блок, зависящий от поставщика. В техническом описании указано +40для управления питанием ACPI, +48hдля GPIO и +f0hдля RCBA, а также говорится: «Они устанавливаются с использованием регистров базовых адресов (BAR )или других подобных средств»., так что, возможно, это не BAR/регион, а просто байты в конфигурации PCI.

Итак, попробуйте что-то вродеlspci -xxx -s 00:1f.0(от имени root ), это должно отобразить все пространство конфигурации в виде шестнадцатеричного дампа. Также взгляните на dmesgпосле загрузки и cat /proc/ioports, чтобы увидеть, что управление питанием ACPI появляется где-то (, т.е. есть ли у него какие-либо диапазоны портов ввода-вывода, связанные с ним ). Мы можем сравнить это с +40h. Пожалуйста, отредактируйте вопрос с информацией.

Если диапазон GPIO не находится в BAR/регионе, включить его будет крайне сложно; в этот момент вы, вероятно, должны начать писать драйвер ядра.

Редактировать

В проекте Coreboot также есть код для доступа к элементам GPIO в Intel, например. gpio.c и gpio.h для архитектуры Baytrail -.Не уверен, какая архитектура у Celeron J1900, но даже если она не совпадает, это может подсказать, работает ли регион GPIO.

Редактировать

Хорошо, BAR действительно совершенно пусты. Предполагая, что +40h и +48h работают как полосы, они оба являются пространством ввода-вывода (младший бит равен единице ), где

+40h (ACPI) = 0400h
+48h (GPIO) = 0500h 

По сравнению с /proc/ioportsэто имеет смысл :ACPI — 0400 -047f, а 0500 -05fe зарезервировано для того же устройства pnp 00:01.

Итак, это диапазон ввода-вывода, и он уже сопоставлен. Вы можете получить к нему доступ через /dev/port, чтение и запись по правильному смещению или в программе C, используя ioperm. Хотя я смутно припоминаю, что разработчики ядра Linux угрожали отключить одну или обе эти функции, поэтому я не знаю, работает ли она до сих пор. В этом случае вам нужен драйвер ядра.

В любом случае, будьте очень осторожны при работе с пространством ввода-вывода. :Даже чтение неправильного адреса может привести к аппаратным действиям, а если вы сделаете это со случайными адресами, может случиться что угодно. Так что нет hexdump -C /dev/port. Кроме того, размер доступа имеет значение.

Я не смог найти в техническом описании ничего конкретного о том, как работает пространство ввода-вывода GPIO, поэтому либо вам нужно поискать в Google более подходящее техническое описание, либо, возможно, файлы Coreboot работают достаточно похоже.

2
28.01.2020, 02:41

Я приобрел аналогичное оборудование и столкнулся с аналогичными проблемами. Сначала я пытался исследовать маршрут, описанный другими, но потом решил его следующим образом:

Моя система :Версия ЦП :Intel (R )Celeron (R )ЦП J1900 @ 1,99 ГГц

В какой-то момент я понял, что это реализует чип IT8786.

Если вы проверите конфигурацию ядра, вы можете найти поддержку семейства драйверов IT87x (, конечно, в разделе «Драйверы GPIO» ). В моем случае это было включено только как модуль.

Затем я загрузил модуль с:

sudo insmod /lib/modules/5.8.0-55-generic/kernel/drivers/gpio/gpio-it87.ko

dmesg вернул следующий элемент:

gpio_it87: Found Chip IT8786 rev 2. 64 GPIO lines starting at 0a00h

Проверив /dev, появился gpiochip0, и с этого момента вы можете использовать уже упомянутый метод sysfs, если хотите (, хотя и на пенсии ).

Если вы не знаете, как связать физические контакты с оборудованием, попробуйте это:

apt-get install gpiod

Запуск gpioinfo возвращает в моем случае следующее:

gpiochip0 - 64 lines:
        line   0:  "it87_gp10"       unused   input  active-high
        line   1:  "it87_gp11"       unused   input  active-high
        line   2:  "it87_gp12"      "sysfs"   input  active-high [used]
        line   3:  "it87_gp13"       unused   input  active-high
        line   4:  "it87_gp14"       unused   input  active-high
        line   5:  "it87_gp15"       unused   input  active-high
        line   6:  "it87_gp16"       unused   input  active-high
        line   7:  "it87_gp17"       unused   input  active-high
        line   8:  "it87_gp20"       unused   input  active-high
        line   9:  "it87_gp21"       unused   input  active-high
        line  10:  "it87_gp22"       unused   input  active-high
        line  11:  "it87_gp23"       unused   input  active-high
        line  12:  "it87_gp24"      "sysfs"   input  active-high [used]
        line  13:  "it87_gp25"       unused   input  active-high
        line  14:  "it87_gp26"       unused   input  active-high
        line  15:  "it87_gp27"       unused   input  active-high
        line  16:  "it87_gp30"       unused   input  active-high
        line  17:  "it87_gp31"       unused   input  active-high
        line  18:  "it87_gp32"       unused   input  active-high
        line  19:  "it87_gp33"       unused   input  active-high
        line  20:  "it87_gp34"       unused   input  active-high
        line  21:  "it87_gp35"       unused   input  active-high
        line  22:  "it87_gp36"      "sysfs"  output  active-high [used]
        line  23:  "it87_gp37"       unused   input  active-high
        line  24:  "it87_gp40"       unused   input  active-high
        line  25:  "it87_gp41"       unused   input  active-high
        line  26:  "it87_gp42"       unused   input  active-high
        line  27:  "it87_gp43"       unused   input  active-high
        line  28:  "it87_gp44"       unused   input  active-high
        line  29:  "it87_gp45"       unused   input  active-high
        line  30:  "it87_gp46"       unused   input  active-high
        line  31:  "it87_gp47"       unused   input  active-high
        line  32:  "it87_gp50"       unused   input  active-high
        line  33:  "it87_gp51"       unused   input  active-high
        line  34:  "it87_gp52"       unused   input  active-high
        line  35:  "it87_gp53"       unused   input  active-high
        line  36:  "it87_gp54"       unused   input  active-high
        line  37:  "it87_gp55"       unused   input  active-high
        line  38:  "it87_gp56"       unused   input  active-high
        line  39:  "it87_gp57"       unused   input  active-high
        line  40:  "it87_gp60"       unused   input  active-high
        line  41:  "it87_gp61"       unused   input  active-high
        line  42:  "it87_gp62"       unused   input  active-high
        line  43:  "it87_gp63"       unused   input  active-high
        line  44:  "it87_gp64"       unused   input  active-high
        line  45:  "it87_gp65"       unused   input  active-high
        line  46:  "it87_gp66"       unused   input  active-high
        line  47:  "it87_gp67"       unused   input  active-high
        line  48:  "it87_gp70"       unused   input  active-high
        line  49:  "it87_gp71"       unused   input  active-high
        line  50:  "it87_gp72"       unused   input  active-high
        line  51:  "it87_gp73"      "sysfs"   input  active-high [used]
        line  52:  "it87_gp74"      "sysfs"  output  active-high [used]
        line  53:  "it87_gp75"      "sysfs"   input  active-high [used]
        line  54:  "it87_gp76"      "sysfs"   input  active-high [used]
        line  55:  "it87_gp77"       unused   input  active-high
        line  56:  "it87_gp80"       unused   input  active-high
        line  57:  "it87_gp81"       unused  output  active-high
        line  58:  "it87_gp82"       unused   input  active-high
        line  59:  "it87_gp83"       unused   input  active-high
        line  60:  "it87_gp84"       unused   input  active-high
        line  61:  "it87_gp85"       unused   input  active-high
        line  62:  "it87_gp86"       unused   input  active-high
        line  63:  "it87_gp87"       unused   input  active-high

Вы можете использовать утилиты gpiod для работы с разными выводами. Если ваш производитель каким-то образом указал, какой GPI/O вы можете использовать, то вы можете связать «линию» с частью it87 _gpXX», где XX — контакты, вероятно, предоставленные производителем.

Быструю проверку можно сделать по-старому.

Перейдите в /sys/class/gpio и посмотрите, какой gpiochip вы найдете. Базовое число внутри gpiochip является начальной позицией, а точки линии, возвращаемые gpioinfo, — смещением.

В моем случае у меня было 448 в качестве базы. Если я хочу добраться до GP81, это строка 57,так что я бы сделал это:

echo 505 > /sys/class/gpio/export

Надеюсь, это поможет! Это спасло меня от написания драйвера (Кстати, производитель прислал мне драйвер, но он не работал)

0
17.06.2021, 18:48

Теги

Похожие вопросы