|
|
(не показана 1 промежуточная версия этого же участника) |
Строка 164: |
Строка 164: |
| echo 0 > /sys/class/gpio/gpio32/value | | echo 0 > /sys/class/gpio/gpio32/value |
| </syntaxhighlight> | | </syntaxhighlight> |
| | |
| | ====Номера GPIO==== |
| | Наиболее унивверсальный способ получить номер GPIO для устаревшего интерфейса sysfs - получить его по метке GPIO. |
| | Для этого нужно найти номер gpiochip, смещение внутри gpiochip и базовый адрес gpiochip. |
| | |
| | Пример: |
| | |
| | <syntaxhighlight lang="bash"> |
| | ~# gpiofind "A1 OUT" |
| | gpiochip0 109 |
| | ~# cat /sys/class/gpio/gpiochip0/base |
| | 0 |
| | </syntaxhighlight> |
| | |
| | Т.е. для A1 OUT будет старый номер 0 (base) + 109 (offset) = 109. |
| | |
| | Номера по метке можно получить также через отладочный интерфейс ядра. Это не требует использования утилит gpiod, но формат вывода может быть изменён в новых версиях ядра. "Старый" (глобальный) номер указан в первом столбце: |
| | |
| | |
| | <syntaxhighlight lang="bash"> |
| | ~# cat /sys/kernel/debug/gpio | grep "A1 OUT" |
| | gpio-109 (A1 OUT |wb-mqtt-gpio ) out lo |
| | </syntaxhighlight> |
| | |
| | GPIO для дискретных входов и выходов модулей расширения и модулей ввода-вывода доступны таким же образом. Не забудьте выбрать модуль в интерфейсе Hardware Modules Configuration. |
| | |
| | |
| | |
| | |
|
| |
|
| ====Работа с прерываниями==== | | ====Работа с прерываниями==== |
Строка 199: |
Строка 228: |
|
| |
|
| Модуль позволяет работать с gpio в синхронном и асинхронном (с регистрацией коллбэков) режимах. | | Модуль позволяет работать с gpio в синхронном и асинхронном (с регистрацией коллбэков) режимах. |
|
| |
| ==Прямое обращение через память процессора==
| |
|
| |
| <b>Этот метод настоятельно НЕ РЕКОМЕНДУЕТСЯ для использования без достаточных оснований. Для работы из С/C++ стоит использовать работу через файлы в sysfs или chardev, как описано в предыдущих разделах</b>.
| |
|
| |
| Управлять GPIO можно с помощью прямого доступа к регистрам процессора, в обход Linux, через интерфейс /dev/mem. При этом, по сравнению с работой через sysfs минимизируются накладные расходы. Этот метод можно использовать,
| |
| если вам необходим очень быстрый доступ к GPIO, например bitbang протоколов или ШИМ. Стоит иметь в виду, что планировщик процессов всё ещё может вносить в работу программы значительные задержки.
| |
| Рекомендуется выносить критичные ко времени задачи в ядро.
| |
|
| |
| Обратитесь в техподдержку за дальнейшей консультацией.
| |
|
| |
| =Работа в ядре Linux=
| |
| Ознакомиться с ядром Linux, использующимся в контроллерах WirenBoard можно в нашем [https://github.com/wirenboard/linux репозитории ядра].
| |
|
| |
| ===Рекомендации по Device Tree===
| |
|
| |
| Device-tree, использующиеся на контроллерах WirenBoard, доступны в репозитории ядра.
| |
| Разные аппаратные ревизии контроллера используют разные dts (например, dts для WB6.X можно найти [https://github.com/wirenboard/linux/blob/dev/v4.9.x/arch/arm/boot/dts/imx6ul-wirenboard61.dts здесь])
| |
|
| |
| Указывать GPIO в Device Tree необходимо для настройки работы GPIO в режиме программного SPI, I2C, для использования GPIO в качестве источника прерываний и т.д.
| |
| Так, например, на пин 10@UEXT1 (CS) и пины 5@UEXT2 (SCL), 6@UEXT2 (SDA), 10@UEXT2 (CS) выведены линии GPIO процессора. Их можно сконфигурировать для использования, например, в качестве chip-select для SPI или в качестве I2C.
| |
|
| |
| GPIO процессора и периферийных устройств разбиты на банки (gpiochip). GPIO процессора разбиты на 3 банка по 32 GPIO: gpio0, gpio1, gpio2. Адресация GPIO в Device Tree происходит по номеру банка и номеру GPIO *внутри* банка.
| |
|
| |
| ====Пример device-tree node====
| |
|
| |
| Определим сигнал 6@UEXT2 (SDA) в качестве источника прерываний для драйвера mrf24j40. Согласно таблице [[Список GPIO]], сигнал соответствует GPIO 53 процессора. 53 принадлежит второму банку gpio (от 32 до 63). Номер GPIO внутри банка 53-32=21 :
| |
|
| |
| <syntaxhighlight lang="json">
| |
| 6lowpan@0 {
| |
| compatible = "microchip,mrf24j40";
| |
| spi-max-frequency = <100000>;
| |
| reg = <6>;
| |
| interrupt-parent = <&gpio1>;
| |
| interrupts = <21 0>;
| |
| };
| |
| </syntaxhighlight>
| |