Вы должны указать полный путь: startx / usr / bin / xmonad
Что происходит, когда вы запускаете startx xmonad
is xmonad
рассматривается как аргумент для клиента по умолчанию: xterm. Итак, xterm xmonad
запущен.
Как правило, контакты 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 работают достаточно похоже.
Я приобрел аналогичное оборудование и столкнулся с аналогичными проблемами. Сначала я пытался исследовать маршрут, описанный другими, но потом решил его следующим образом:
Моя система :Версия ЦП :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
Надеюсь, это поможет! Это спасло меня от написания драйвера (Кстати, производитель прислал мне драйвер, но он не работал)