Перейти к основному содержимому

12-контактный GPIO разъем

Все сигнальные выводы 12-контактного разъёма по умолчанию работают как GPIO. Помимо этого на выводах доступно использование альтернативных функций - UART, I2C, SPI, PWM, CAN и PDM. Включение функций производится с помощью специальных overlay-файлов, они переводят выбранные выводы в соответствующую аппаратную функцию.

Подключение overlay-файлов​

Исходные файлы overlay для платы Eltay RM88S на OrangePi CM5 Base Board располагаются в каталоге:

board/eltay/rm88s/op_baseboard/overlays/

После сборки соответствующие .dtbo должны находиться в образе по пути:

/boot/overlays/

Для включения одного или нескольких интерфейсов необходимо добавить параметр fdtoverlays в используемую секцию файла /boot/extlinux/extlinux.conf.

Пример включения одного overlay:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart4.dtbo

При одновременном включении нескольких совместимых overlay все файлы указываются в одной строке через пробел:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart4.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart7.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-i2c7.dtbo

После изменения extlinux.conf устройство необходимо перезагрузить.

При изменении только overlay-файлов пересборка ядра не требуется. Достаточно повторно собрать образ/rootfs, чтобы обновленные .dtbo были помещены в /boot/overlays/.


Использование выводов в режиме GPIO​

Все сигнальные выводы разъема по умолчанию работают в режиме GPIO, если не подключен overlay, переводящий их в иную аппаратную функцию.

Распиновка разъема:

НомерСигналНомерСигнал
13V323V3
3GPIO1_B04GND
5GPIO1_B16GPIO1_B2
7GPIO1_B38GND
9GPIO1_B410GPIO1_B5
11GPIO4_B212GPIO4_B3

Соответствие сигнальных выводов GPIO-контроллерам и смещениям линий:

Вывод разъемаGPIOGPIO-контроллерСмещение линии
3GPIO1_B0gpiochip18
5GPIO1_B1gpiochip19
6GPIO1_B2gpiochip110
7GPIO1_B3gpiochip111
9GPIO1_B4gpiochip112
10GPIO1_B5gpiochip113
11GPIO4_B2gpiochip410
12GPIO4_B3gpiochip411

Перед использованием можно проверить доступные линии:

gpioinfo gpiochip1
gpioinfo gpiochip4

Например, для установки вывода 3 (GPIO1_B0) в единичное состояние:

gpioset -m wait gpiochip1 8=1

Команда удерживает линию до завершения процесса. Для выхода нажать Ctrl+C.

Для чтения состояния вывода 3:

gpioget gpiochip1 8

Аналогично, для управления выводом 11 (GPIO4_B2):

gpioset -m wait gpiochip4 10=1

и для чтения его состояния:

gpioget gpiochip4 10

После включения overlay соответствующие линии заняты драйвером периферийного контроллера и не должны одновременно использоваться в качестве GPIO.


Включение UART на разъеме​

На разъем выведены два интерфейса UART — UART4 и UART7. Уровень сигналов составляет 3,3 В.

UART4​

Сигналы UART4:

UART4_RX_M2 -> GPIO1_B2 -> вывод 6
UART4_TX_M2 -> GPIO1_B3 -> вывод 7

Для включения UART4 нужно добавить overlay rk3588s-eltay-rm88s-op-baseboard-uart4.dtbo в /boot/extlinux/extlinux.conf:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart4.dtbo
внимание

UART4 использует выводы 6 и 7, поэтому его нельзя включать одновременно с SPI0. При использовании PDM с SDI3 или CLK1 соответствующие линии PDM также конфликтуют с UART4.

После перезагрузки проверить регистрацию контроллера:

dmesg | grep -Ei 'ttyS4|uart4|feb70000|serial'
ls -l /dev/ttyS4

Ожидаемая строка в dmesg:

feb70000.serial: ttyS4 ... is a 16550A

В этом случае UART4 доступен как:

/dev/ttyS4

UART7​

Сигналы UART7:

UART7_RX_M2 -> GPIO1_B4 -> вывод 9
UART7_TX_M2 -> GPIO1_B5 -> вывод 10

Для включения UART7 нужно добавить overlay rk3588s-eltay-rm88s-op-baseboard-uart7.dtbo:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart7.dtbo
внимание

UART7 использует выводы 9 и 10, поэтому его нельзя включать одновременно с SPI0. При стандартной конфигурации PDM (SDI1 + CLK0) линия тактирования PDM также конфликтует с UART7.

После перезагрузки проверить регистрацию контроллера:

dmesg | grep -Ei 'ttyS7|uart7|feba0000|serial'
ls -l /dev/ttyS7

Ожидаемая строка в dmesg:

feba0000.serial: ttyS7 ... is a 16550A

В этом случае UART7 доступен как:

/dev/ttyS7

Одновременное включение UART4 и UART7​

UART4 и UART7 используют разные выводы и могут быть включены одновременно:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart4.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-uart7.dtbo

Проверка после перезагрузки:

ls -l /dev/ttyS4 /dev/ttyS7
dmesg | grep -Ei 'ttyS4|ttyS7|feb70000|feba0000'

Включение I2C на разъеме​

На разъем выведена шина I2C7 в варианте мультиплексирования M3:

I2C7_SCL_M3 -> GPIO4_B2 -> вывод 11
I2C7_SDA_M3 -> GPIO4_B3 -> вывод 12

Overlay настраивает частоту шины 100 кГц:

clock-frequency = <100000>;

Для включения I2C7 нужно добавить overlay rk3588s-eltay-rm88s-op-baseboard-i2c7.dtbo в /boot/extlinux/extlinux.conf:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-i2c7.dtbo
внимание

I2C7 использует выводы 11 и 12, поэтому его нельзя включать одновременно с PWM14, PWM15 или CAN1.

Линии SDA и SCL должны иметь подтягивающие резисторы к 3,3 В. Если подтяжки отсутствуют на подключаемом модуле, их необходимо установить на внешней плате.

После сохранения изменений и перезагрузки проверить появление шины:

ls -l /dev/i2c-*

for d in /sys/class/i2c-dev/i2c-*; do
echo "$d -> $(readlink -f "$d/device")"
done

Ожидаемое соответствие:

fec90000.i2c -> I2C7

В этом случае I2C7 доступен как:

/dev/i2c-7

Для работы с шиной можно использовать i2c-tools:

# поиск устройств на шине I2C7
i2cdetect -y -r 7

# запись одного байта 0x10 в устройство с адресом 0x42
i2ctransfer -y 7 w1@0x42 0x10

# чтение четырех байтов из устройства с адресом 0x42
i2ctransfer -y 7 r4@0x42

Включение SPI на разъеме​

На разъем выведена шина SPI0 в варианте мультиплексирования M2:

SPI0_MISO_M2 -> GPIO1_B1 -> вывод 5
SPI0_MOSI_M2 -> GPIO1_B2 -> вывод 6
SPI0_CLK_M2 -> GPIO1_B3 -> вывод 7
SPI0_CS0_M2 -> GPIO1_B4 -> вывод 9
SPI0_CS1_M2 -> GPIO1_B5 -> вывод 10

Подготовлены три тестовых overlay-файла. В конфигурации необходимо указывать только один из них:

  • SPI0 с CS0

    fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-spi0-cs0.dtbo

    Создается:

    /dev/spidev0.0
  • SPI0 с CS1

    fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-spi0-cs1.dtbo

    Создается:

    /dev/spidev0.1
  • SPI0 с двумя chip select

    fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-spi0-dual-cs.dtbo

    Создаются:

    /dev/spidev0.0
    /dev/spidev0.1
внимание

SPI0 использует выводы 5, 6, 7, 9 и 10, поэтому его нельзя включать одновременно с UART4 или UART7.

Проверка после перезагрузки:

dmesg | grep -Ei 'spi0|spidev|feb00000'
ls -l /dev/spidev*

Значение spi-max-frequency = <50000000> задает максимальную частоту 50 МГц. Реальная частота обмена выбирается приложением и не должна превышать ограничение подключенного SPI-устройства.

Подключение реального SPI-устройства с kernel-драйвером​

Тестовые overlay создают spidev, позволяющий обращаться к шине из userspace. Для штатной работы с устройством, имеющим собственный драйвер ядра, узел spidev следует заменить описанием этого устройства.

Пример для устройства на 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 = <50000000>;
};
};

Для устройства на CS1 необходимо использовать:

pinctrl-0 = <&spi0m2_pins &spi0m2_cs1>;
num-cs = <2>;

а в узле устройства указать:

reg = <1>;

Значение compatible должно соответствовать драйверу конкретного подключенного устройства.


Включение PWM на разъеме GPIO​

На 12-контактный разъем выведены два независимых PWM-контроллера:

PWM14_M1 -> GPIO4_B2 -> вывод 11
PWM15_IR_M1 -> GPIO4_B3 -> вывод 12

Несмотря на наличие обозначения IR в имени функции PWM15_IR_M1, вывод может использоваться как обычный PWM-выход.

Для работы с PWM доступны два overlay-файла.

Для включения PWM14 на выводе 11:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-pwm14.dtbo

Для включения PWM15 на выводе 12:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-pwm15.dtbo

Для одновременного включения PWM14 и PWM15 необходимо подключить оба оверлея:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-pwm14.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-pwm15.dtbo
внимание

PWM14 и PWM15 используют соответственно выводы 11 и 12. Поэтому их нельзя одновременно использовать с I2C7 или CAN1.

После сохранения изменений и перезагрузки устройства проверить наличие PWM-контроллеров:

for chip in /sys/class/pwm/pwmchip*; do
[ -e "$chip" ] || continue
echo "$chip -> $(readlink -f "$chip/device")"
done

Контроллерам соответствуют следующие адреса:

febf0010.pwm -> PWM13, управление штатным вентилятором
febf0020.pwm -> PWM14, вывод 11 разъема
febf0030.pwm -> PWM15, вывод 12 разъема

Например, при включенном оверлее PWM14 результат может выглядеть так:

/sys/class/pwm/pwmchip0 -> /sys/devices/platform/febf0010.pwm
/sys/class/pwm/pwmchip1 -> /sys/devices/platform/febf0020.pwm

В этом примере:

pwmchip0 -> PWM13 штатного вентилятора
pwmchip1 -> PWM14 на выводе 11

Номера pwmchipN назначаются ядром динамически и могут отличаться в разных сборках. Поэтому нужный контроллер следует определять по адресу устройства, а не по номеру pwmchip.

PWM13, соответствующий адресу febf0010.pwm, занят драйвером штатного вентилятора. Его не следует экспортировать или настраивать вручную через sysfs.

Каждый контроллер PWM14 и PWM15 содержит один канал с номером 0.

PWM14​

Сначала определить, какой каталог pwmchipN соответствует устройству febf0020.pwm:

for chip in /sys/class/pwm/pwmchip*; do
[ -e "$chip" ] || continue
echo "$chip -> $(basename "$(readlink -f "$chip/device")")"
done

Например, если получено:

/sys/class/pwm/pwmchip1 -> febf0020.pwm

задать:

PWMCHIP=/sys/class/pwm/pwmchip1

Экспортировать канал:

[ -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"

PWM15​

Сначала определить, какой каталог pwmchipN соответствует устройству febf0030.pwm:

for chip in /sys/class/pwm/pwmchip*; do
[ -e "$chip" ] || continue
echo "$chip -> $(basename "$(readlink -f "$chip/device")")"
done

Например, если получено:

/sys/class/pwm/pwmchip1 -> febf0030.pwm

задать:

PWMCHIP=/sys/class/pwm/pwmchip1

Экспортировать канал и запустить генерацию сигнала с частотой 1 кГц и коэффициентом заполнения 50%:

[ -d "$PWMCHIP/pwm0" ] || echo 0 > "$PWMCHIP/export"

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"

Остановить генерацию и освободить канал:

echo 0 > "$PWMCHIP/pwm0/enable"
echo 0 > "$PWMCHIP/unexport"

Одновременная работа PWM14 и PWM15​

При одновременном подключении обоих overlay-файлов в системе должны присутствовать контроллеры с адресами:

febf0020.pwm -> PWM14
febf0030.pwm -> PWM15

Оба канала можно экспортировать и запускать одновременно. Каждый контроллер настраивается независимо через соответствующий каталог /sys/class/pwm/pwmchipN.


Включение CAN на разъеме GPIO​

На 12-контактный разъём выведены логические сигналы контроллера CAN1:

CAN1_RX_M1 -> GPIO4_B2 -> вывод 11
CAN1_TX_M1 -> GPIO4_B3 -> вывод 12

Выводы 11 и 12 содержат логические сигналы RXD и TXD, а не дифференциальные линии CAN-шины. Подключать их непосредственно к CANH и CANL нельзя. Для работы с реальной CAN-шиной необходим внешний CAN-трансивер.

Пример подключения:

вывод 12 / CAN1_TX -> TXD CAN-трансивера
вывод 11 / CAN1_RX <- RXD CAN-трансивера
вывод 4 или 8 / GND <-> GND CAN-трансивера

CANH трансивера <-> CANH CAN-шины
CANL трансивера <-> CANL CAN-шины

Логические сигналы CAN1_TX и CAN1_RX, выведенные на 12-контактный разъём Orange Pi CM5 Base Board, имеют уровень 3,3 В. При использовании CAN-трансивера с 3,3-вольтовыми логическими входами и выходами сигналы TXD и RXD можно подключать напрямую. При использовании 5-вольтового трансивера, например TJA1050, сигнал CAN1_TX с вывода 12 можно подключить ко входу TXD трансивера напрямую, а 5-вольтовый выход RXD трансивера необходимо согласовать с 3,3-вольтовым входом CAN1_RX. Для согласования можно использовать преобразователь логических уровней или резистивный делитель.

Для включения CAN1 необходимо добавить overlay-файл rk3588s-eltay-rm88s-op-baseboard-can1.dtbo в файл /boot/extlinux/extlinux.conf:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-can1.dtbo

После сохранения файла необходимо перезагрузить устройство.

внимание

CAN1 использует выводы 11 и 12, поэтому его нельзя включать одновременно с I2C7, PWM14 или PWM15.

После загрузки системы проверить наличие CAN-интерфейса:

ip -br link show
ls -l /sys/class/net/can*

Проверить, с каким аппаратным устройством связан интерфейс:

readlink -f /sys/class/net/can0/device

Ожидаемый результат:

/sys/devices/platform/fea60000.can

После загрузки интерфейс находится в состоянии DOWN.

Для запуска CAN, например на скорости 500 кбит/с:

ip link set can0 down 2>/dev/null
ip link set can0 type can bitrate 500000 loopback off
ip link set can0 up

Проверить состояние интерфейса:

ip -details -statistics link show can0

Ожидается:

can state ERROR-ACTIVE
bitrate 500000

Для проверки CAN-контроллера без внешнего трансивера можно использовать внутренний loopback:

ip link set can0 down 2>/dev/null
ip link set can0 type can bitrate 500000 loopback on
ip link set can0 up

После включения интерфейса проверить передачу и убедиться, что отправленные данные соответствуют принятым.

Для работы с реальной CAN-шиной loopback должен быть отключён:

ip link set can0 down 2>/dev/null
ip link set can0 type can bitrate 500000 loopback off
ip link set can0 up

Для работы по интерфейсу можно использовать пакет can-utils. Для просмотра входящих кадров:

candump can0

Для передачи стандартного CAN-кадра с идентификатором 0x123 и восемью байтами данных:

cansend can0 123#1122334455667788

Подключение PDM-микрофонов к разъему GPIO​

На 12-контактный разъём Orange Pi CM5 Base Board выведены сигналы контроллера PDM1:

PDM1_SDI1_M1 — GPIO1_B0 — вывод 3
PDM1_SDI2_M1 — GPIO1_B1 — вывод 5
PDM1_SDI3_M1 — GPIO1_B2 — вывод 6

PDM1_CLK1_M1 — GPIO1_B3 — вывод 7
PDM1_CLK0_M1 — GPIO1_B4 — вывод 9

PDM-интерфейс предназначен для подключения цифровых PDM-микрофонов. Контроллер формирует тактовый сигнал CLK, а микрофон передаёт цифровой звуковой поток по линии SDI.

Для включения интерфейса подготовлен overlay:

rk3588s-eltay-rm88s-op-baseboard-pdm1.dtbo

По умолчанию он использует:

вывод 3 — PDM1_SDI1_M1 — DATA
вывод 9 — PDM1_CLK0_M1 — CLK
внимание

PDM1 использует несколько вариантов мультиплексирования. В стандартной конфигурации SDI1 + CLK0 он занимает выводы 3 и 9 и конфликтует с UART7 и SPI0 (CS0). При выборе SDI2, SDI3 или CLK1 дополнительно возникают конфликты соответственно с SPI0 и UART4.

Подключение одного микрофона​

Для PDM-микрофона с питанием 3,3 В:

микрофон VDD → вывод 1 или 2 / 3V3
микрофон GND → вывод 4 или 8 / GND
микрофон DAT → вывод 3 / PDM1_SDI1
микрофон CLK → вывод 9 / PDM1_CLK0

Если микрофон имеет вывод SEL, L/R или аналогичный вход выбора канала, его необходимо подключить к GND или 3,3 В согласно документации микрофона.

PDM-контроллер используется в двухканальном режиме, поэтому при подключении одного физического микрофона запись всё равно выполняется с двумя каналами. При этом сигнал одного микрофона может присутствовать в обоих каналах. Для получения двух независимых каналов необходимо подключить два PDM-микрофона к общим линиям DATA и CLK и установить для них противоположные состояния входа SEL.

Подключение двух микрофонов​

Два совместимых PDM-микрофона можно подключить к одной линии DATA - линии CLK обоих микрофонов соединяются между собой, линии DAT также соединяются между собой.

Для разделения микрофонов по двум каналам вход выбора канала одного микрофона устанавливается в одно состояние, второго — в противоположное. Например, для Adafruit PDM MEMS Microphone Breakout:

MIC1 SEL → GND
MIC2 SEL → 3,3 В

В результате два микрофона будут записываться как два независимых канала одного ALSA capture-устройства.

Использование другой линии SDI​

Базовый overlay настроен на:

SDI1 → вывод 3

Для использования другой линии необходимо изменить две строки в исходном overlay .dtso файле.

Для SDI1, вывод 3:

rockchip,path-map = <1 0 2 3>;
pinctrl-0 = <&pdm1m1_sdi1>;

Для SDI2, вывод 5:

rockchip,path-map = <2 0 1 3>;
pinctrl-0 = <&pdm1m1_sdi2>;

Для SDI3, вывод 6:

rockchip,path-map = <3 0 1 2>;
pinctrl-0 = <&pdm1m1_sdi3>;

После изменения overlay необходимо заново скомпилировать в .dtbo.

Независимо от выбранной линии SDI к ней можно подключить как один, так и два PDM-микрофона.

Использование другого выхода CLK​

По умолчанию используется:

CLK0 → вывод 9

В overlay это задаётся строкой:

pinctrl-2 = <&pdm1m1_clk>;

Для использования:

CLK1 → вывод 7

необходимо заменить её на:

pinctrl-2 = <&pdm1m1_clk1>;

Остальная часть overlay при этом не изменяется.

Включение overlay​

В файл /boot/extlinux/extlinux.conf необходимо добавить строку:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-pdm1.dtbo

После перезагрузки проверить наличие звуковой карты:

cat /proc/asound/cards

Ожидается карта:

PDM1 Microphones

Проверить устройства записи:

arecord -l

Пример:

**** List of CAPTURE Hardware Devices ****
card 1: Microphones [PDM1 Microphones], device 0: fe4c0000.pdm-dmic-hifi ...

Номер карты может отличаться в зависимости от других включённых аудиоустройств.

Проверка записи​

Сначала определить номер карты командой:

arecord -l

Например, если PDM-карта имеет номер 1, выполнить запись:

arecord -D hw:1,0 -f S16_LE -r 48000 -c 2 -d 5 /tmp/pdm-test.wav

Будет создан файл:

/tmp/pdm-test.wav

Созданный файл можно передать на ПК для прослушивания и убедиться в корректности записи.