26-контактный GPIO разъем
Все выводы 26-контактного разъёма по умолчанию работают как GPIO. Помимо режима GPIO, отдельные выводы могут использовать альтернативные функции - UART, I2C, SPI, PWM.
Включение альтернативных функций производится через Device Tree overlay-файлы, которые переводят выбранные выводы в соответствующий аппаратный режим.
Подключение overlay-файлов
Исходные файлы overlay для платы Eltay RM88S на Orange Pi CM5 Tablet Base Board располагаются в каталоге:
board/eltay/rm88s/op_tablet_baseboard/overlays/
После сборки соответствующие .dtbo должны находиться в образе по пути:
/boot/overlays/
Для включения одного или нескольких интерфейсов необходимо добавить параметр fdtoverlays в используемую секцию файла /boot/extlinux/extlinux.conf.
Пример включения одного overlay:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart4.dtbo
При одновременном включении нескольких совместимых overlay все файлы указываются в одной строке через пробел. Например:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart1.dtbo /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-i2c4.dtbo /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-spi0-cs0.dtbo
После изменения extlinux.conf устройство необходимо перезагрузить.
При изменении только overlay-файлов пересборка ядра не требуется. Достаточно повторно собрать образ/rootfs, чтобы обновленные .dtbo были помещены в /boot/overlays/.
Использование выводов в режиме GPIO
Все сигнальные выводы разъема по умолчанию могут использоваться как GPIO, если не подключен overlay-файл, переводящий соответствующий вывод в аппаратную функцию UART, I2C, SPI или PWM.
Распиновка 26-контактного разъема:
| Номер | Сигнал | Номер | Сигнал |
|---|---|---|---|
| 1 | 3V3 | 2 | 5V |
| 3 | GPIO1_B7 | 4 | 5V |
| 5 | GPIO1_B6 | 6 | GND |
| 7 | GPIO1_A3 | 8 | GPIO1_D0 |
| 9 | GND | 10 | GPIO1_D1 |
| 11 | GPIO1_D2 | 12 | GPIO1_A2 |
| 13 | GPIO1_D3 | 14 | GND |
| 15 | GPIO1_B0 | 16 | GPIO1_A4 |
| 17 | 3V3 | 18 | GPIO1_A6 |
| 19 | GPIO1_B2 | 20 | GND |
| 21 | GPIO1_B1 | 22 | GPIO1_A7 |
| 23 | GPIO1_B3 | 24 | GPIO1_B4 |
| 25 | GND | 26 | GPIO1_B5 |
Все сигнальные GPIO разъема относятся к gpiochip1.
Соответствие выводов GPIO-контроллеру и смещениям линий:
| Вывод разъема | GPIO | GPIO-контроллер | Смещение линии |
|---|---|---|---|
| 3 | GPIO1_B7 | gpiochip1 | 15 |
| 5 | GPIO1_B6 | gpiochip1 | 14 |
| 7 | GPIO1_A3 | gpiochip1 | 3 |
| 8 | GPIO1_D0 | gpiochip1 | 24 |
| 10 | GPIO1_D1 | gpiochip1 | 25 |
| 11 | GPIO1_D2 | gpiochip1 | 26 |
| 12 | GPIO1_A2 | gpiochip1 | 2 |
| 13 | GPIO1_D3 | gpiochip1 | 27 |
| 15 | GPIO1_B0 | gpiochip1 | 8 |
| 16 | GPIO1_A4 | gpiochip1 | 4 |
| 18 | GPIO1_A6 | gpiochip1 | 6 |
| 19 | GPIO1_B2 | gpiochip1 | 10 |
| 21 | GPIO1_B1 | gpiochip1 | 9 |
| 22 | GPIO1_A7 | gpiochip1 | 7 |
| 23 | GPIO1_B3 | gpiochip1 | 11 |
| 24 | GPIO1_B4 | gpiochip1 | 12 |
| 26 | GPIO1_B5 | gpiochip1 | 13 |
Перед использованием можно проверить линии:
gpioinfo gpiochip1
Например, для установки вывода 15 (GPIO1_B0) в единичное состояние:
gpioset -m wait gpiochip1 8=1
Команда удерживает линию до завершения процесса. Для выхода нажать Ctrl+C.
Для чтения состояния вывода 15:
gpioget gpiochip1 8
После включения overlay соответствующие линии заняты драйвером периферийного контроллера и не должны одновременно использоваться как GPIO.
Включение UART
На разъем выведены три интерфейса UART: UART1, UART4 и UART6. Уровень логических сигналов составляет 3,3 В.
UART1
Сигналы UART1:
UART1_RX_M1 -> GPIO1_B7 -> вывод 3
UART1_TX_M1 -> GPIO1_B6 -> вывод 5
Для включения UART1 используется overlay:
rk3588s-eltay-rm88s-on-op-cm5-tablet-uart1.dtbo
Строка в /boot/extlinux/extlinux.conf:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart1.dtbo
UART1 использует те же выводы, что I2C5, а вывод 3 также используется PWM13. Поэтому overlay UART1 нельзя подключать одновременно с overlay-файлами для I2C5 или PWM13.
После перезагрузки проверить регистрацию контроллера:
dmesg | grep -Ei 'ttyS1|uart1|feb40000|serial'
ls -l /dev/ttyS1
Ожидается регистрация:
feb40000.serial: ttyS1 ... is a 16550A
UART1 доступен как:
/dev/ttyS1
UART4
Сигналы UART4:
UART4_TX_M0 -> GPIO1_D2 -> вывод 11
UART4_RX_M0 -> GPIO1_D3 -> вывод 13
Для включения UART4 используется overlay:
rk3588s-eltay-rm88s-on-op-cm5-tablet-uart4.dtbo
Строка в /boot/extlinux/extlinux.conf:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart4.dtbo
UART4 нельзя использовать одновременно с SPI1, поскольку SPI1 использует оба вывода UART4. Вывод 11 также используется как PWM0.
Проверка после перезагрузки:
dmesg | grep -Ei 'ttyS4|uart4|feb70000|serial'
ls -l /dev/ttyS4
Ожидается:
feb70000.serial: ttyS4 ... is a 16550A
UART4 доступен как:
/dev/ttyS4
UART6
Сигналы UART6:
UART6_TX_M2 -> GPIO1_D0 -> вывод 8
UART6_RX_M2 -> GPIO1_D1 -> вывод 10
Для включения UART6 используется overlay:
rk3588s-eltay-rm88s-on-op-cm5-tablet-uart6.dtbo
Строка в /boot/extlinux/extlinux.conf:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart6.dtbo
UART6 нельзя использовать одновременно с SPI1, поскольку выводы 8 и 10 используются как SPI1_MISO_M2 и SPI1_MOSI_M2.
Проверка:
dmesg | grep -Ei 'ttyS6|uart6|feb90000|serial'
ls -l /dev/ttyS6
Ожидается:
feb90000.serial: ttyS6 ... is a 16550A
UART6 доступен как:
/dev/ttyS6
Одновременная работа UART
UART1, UART4 и UART6 используют разные физические выводы и могут быть включены одновременно:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart1.dtbo /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart4.dtbo /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-uart6.dtbo
Включение I2C
На разъем выведены две шины I2C - I2C4 и I2C5.
Линии SDA и SCL должны иметь подтягивающие резисторы к 3,3 В. Если подтяжки отсутствуют на подключаемом модуле, их необходимо установить на внешней плате.
I2C4
Сигналы I2C4:
I2C4_SCL_M3 -> GPIO1_A3 -> вывод 7
I2C4_SDA_M3 -> GPIO1_A2 -> вывод 12
Для включения используется overlay:
rk3588s-eltay-rm88s-on-op-cm5-tablet-i2c4.dtbo
Строка в /boot/extlinux/extlinux.conf:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-i2c4.dtbo
I2C4 нельзя включать одновременно с PWM1, поскольку вывод 7 используется обоими интерфейсами.
После перезагрузки проверить появление шины:
ls -l /dev/i2c-*
for d in /sys/class/i2c-dev/i2c-*; do
echo "$d -> $(readlink -f "$d/device")"
done
Для I2C4 аппаратному контроллеру соответствует:
feac0000.i2c
Шина доступна как:
/dev/i2c-4
Для поиска устройств:
i2cdetect -y -r 4
Примеры обмена:
# запись одного байта 0x10 в устройство с адресом 0x42
i2ctransfer -y 4 w1@0x42 0x10
# чтение четырех байтов из устройства с адресом 0x42
i2ctransfer -y 4 r4@0x42
I2C5
Сигналы I2C5:
I2C5_SDA_M3 -> GPIO1_B7 -> вывод 3
I2C5_SCL_M3 -> GPIO1_B6 -> вывод 5
Для включения используется overlay:
rk3588s-eltay-rm88s-on-op-cm5-tablet-i2c5.dtbo
Строка:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-i2c5.dtbo
I2C5 нельзя включать одновременно с UART1 или PWM13.
Аппаратному контроллеру соответствует:
fead0000.i2c
Шина доступна как:
/dev/i2c-5
Проверка:
i2cdetect -y -r 5
Одновременная работа I2C
I2C4 и I2C5 используют разные выводы и могут работать одновременно.
Включение SPI
На разъем выведены две SPI-шины: SPI0_M2 и SPI1_M2.
Тестовые overlay создают spidev, позволяющий работать с SPI из userspace.
SPI0
Сигналы SPI0:
SPI0_MOSI_M2 -> GPIO1_B2 -> вывод 19
SPI0_MISO_M2 -> GPIO1_B1 -> вывод 21
SPI0_CLK_M2 -> GPIO1_B3 -> вывод 23
SPI0_CS0_M2 -> GPIO1_B4 -> вывод 24
SPI0_CS1_M2 -> GPIO1_B5 -> вывод 26
Для SPI0 подготовлены три overlay. В конфигурации необходимо использовать только один из них:
-
SPI0 с CS0
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-spi0-cs0.dtboСоздается:
/dev/spidev0.0 -
SPI0 с CS1
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-spi0-cs1.dtboСоздается:
/dev/spidev0.1 -
SPI0 с двумя chip select
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-spi0-dual-cs.dtboСоздаются:
/dev/spidev0.0/dev/spidev0.1
SPI0 использует отдельную группу выводов и может работать одновременно с подготовленными UART, I2C и PWM overlay.
Проверка после перезагрузки:
dmesg | grep -Ei 'spi0|spidev|feb00000'
ls -l /dev/spidev*
SPI1
На разъем выведен только CS0 интерфейса SPI1:
SPI1_MISO_M2 -> GPIO1_D0 -> вывод 8
SPI1_MOSI_M2 -> GPIO1_D1 -> вывод 10
SPI1_CLK_M2 -> GPIO1_D2 -> вывод 11
SPI1_CS0_M2 -> GPIO1_D3 -> вывод 13
Для включения SPI1 используется overlay:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-spi1-cs0.dtbo
SPI1 нельзя включать одновременно с UART4, UART6 или PWM0.
Создается:
/dev/spidev1.0
Проверка:
dmesg | grep -Ei 'spi1|spidev|feb10000'
ls -l /dev/spidev*
Подключение реального SPI-устройства с kernel-драйвером
Тестовые overlay создают spidev. Для штатной работы с устройством, имеющим собственный драйвер ядра, узел spidev следует заменить описанием конкретного устройства.
Например, для устройства на SPI0 CS0:
&spi0 {
pinctrl-names = "default";
pinctrl-0 = <&spi0m2_pins &spi0m2_cs0>;
num-cs = <1>;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
device@0 {
compatible = "vendor,device-name";
reg = <0>;
spi-max-frequency = <5000000>;
};
};
Значение compatible должно соответствовать драйверу подключенного устройства.
Включение PWM
На 26-контактный разъем выведены четыре независимых PWM-контроллера:
PWM0_M1 -> GPIO1_D2 -> вывод 11
PWM1_M2 -> GPIO1_A3 -> вывод 7
PWM3_M3 -> GPIO1_A7 -> вывод 22
PWM13_M2 -> GPIO1_B7 -> вывод 3
Для каждого выхода используется отдельный overlay:
rk3588s-eltay-rm88s-on-op-cm5-tablet-pwm0.dtbo
rk3588s-eltay-rm88s-on-op-cm5-tablet-pwm1.dtbo
rk3588s-eltay-rm88s-on-op-cm5-tablet-pwm3.dtbo
rk3588s-eltay-rm88s-on-op-cm5-tablet-pwm13.dtbo
Например, для PWM13:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-pwm13.dtbo
Несколько PWM overlay можно подключать одновременно, если их выводы не заняты другими включенными интерфейсами.
Ограничения совместного использования:
- PWM0 нельзя использовать одновременно с UART4 или SPI1.
- PWM1 нельзя использовать одновременно с I2C4.
- PWM13 нельзя использовать одновременно с UART1 или I2C5.
После перезагрузки определить соответствие pwmchipN аппаратным контроллерам:
for chip in /sys/class/pwm/pwmchip*; do
[ -e "$chip" ] || continue
echo "$chip -> $(basename "$(readlink -f "$chip/device")")"
done
Контроллерам соответствуют адреса:
fd8b0000.pwm -> PWM0 -> вывод 11
fd8b0010.pwm -> PWM1 -> вывод 7
fd8b0030.pwm -> PWM3 -> вывод 22
febf0010.pwm -> PWM13 -> вывод 3
febf0030.pwm -> PWM15 -> штатный вентилятор Tablet Base Board
Номера pwmchipN назначаются ядром динамически. Нужный PWM следует определять по адресу устройства, а не по номеру pwmchip.
PWM15 занят драйвером штатного вентилятора и не должен экспортироваться или перенастраиваться вручную.
Каждый из PWM0, PWM1, PWM3 и PWM13 содержит канал 0.
Например, если нужный контроллер определился как:
/sys/class/pwm/pwmchip2 -> febf0010.pwm
то для работы с PWM13 задайте:
PWMCHIP=/sys/class/pwm/pwmchip2
Экспортировать канал:
[ -d "$PWMCHIP/pwm0" ] || echo 0 > "$PWMCHIP/export"
Запустить сигнал частотой 1 кГц с коэффициентом заполнения 50%:
echo 0 > "$PWMCHIP/pwm0/enable" 2>/dev/null
echo 1000000 > "$PWMCHIP/pwm0/period"
echo 500000 > "$PWMCHIP/pwm0/duty_cycle"
echo normal > "$PWMCHIP/pwm0/polarity" 2>/dev/null
echo 1 > "$PWMCHIP/pwm0/enable"
Параметры задаются в наносекундах:
period = 1000000 нс = 1 мс = 1 кГц
duty_cycle = 500000 нс = 50%
Остановить генерацию:
echo 0 > "$PWMCHIP/pwm0/enable"
Освободить канал:
echo 0 > "$PWMCHIP/unexport"