Перейти до основного вмісту

Низькошвидкісний ввід-вивід

Modalix має два виділені канали SPI і вісім конфігуровних блоків SIO. Кожен блок SIO можна налаштувати для роботи як GPIO, UART, I2C або SPI, а вихідний мультиплексор контактів визначає, яка функція надходить на кожен контакт.

Рекомендації щодо призначення контактів​

Під час призначення контактів SIO:

  1. Спершу виберіть канали Ethernet і PCIe, які плануєте використовувати, — деякі функції контактів визначено заздалегідь, і їх потрібно використовувати з відповідними інтерфейсами PCIe та Ethernet.
  2. У межах кожного блоку SIO контакти у верхніх рядках мають пріоритет і їх слід розглядати в першу чергу.
  3. Використовуйте функцію, зазначену в стовпці Функція, щоб вибраний інтерфейс відповідав функціональним можливостям контакту.

Призначення контактів SIO​

64-контактний інтерфейс SIO поділено на вісім 8-бітних портів. Усі контакти є контактами вводу-виводу з напругою 1,8 В.

Контакт SIOТипНапругаІнтерфейсФункція
SIO0_IO[0]I/O1.8VUARTUART_RX
SIO0_IO[1]I/O1.8V—UART_TX
SIO0_IO[2]I/O1.8VI2CI2C_SCL
SIO0_IO[3]I/O1.8V—I2C_SDA
SIO0_IO[4]I/O1.8VGPIOGPIO
SIO0_IO[5]I/O1.8V—GPIO
SIO0_IO[6]I/O1.8VGPIOGPIO
SIO0_IO[7]I/O1.8V—GPIO
SIO1_IO[0]I/O1.8VI2CETH0_PTP_PPS
SIO1_IO[1]I/O1.8VI2CN/A
SIO1_IO[2]I/O1.8VGPIOGPIO
SIO1_IO[3]I/O1.8VGPIOGPIO
SIO1_IO[4]I/O1.8VSPISPI_CLK
SIO1_IO[5]I/O1.8V—SPI_CS#
SIO1_IO[6]I/O1.8VSPISPI_MOSI
SIO1_IO[7]I/O1.8V—SPI_MISO
SIO2_IO[0]I/O1.8VI2CETH0_SMA_MDC
SIO2_IO[1]I/O1.8V—ETH0_SMA_MDIO
SIO2_IO[2]I/O1.8VSPIN/A
SIO2_IO[3]I/O1.8V—N/A
SIO2_IO[4]I/O1.8VUARTUART_RX
SIO2_IO[5]I/O1.8V—UART_TX
SIO2_IO[6]I/O1.8VUARTUART_RX
SIO2_IO[7]I/O1.8V—UART_TX
SIO3_IO[0]I/O1.8VSPIPCIE0_PERST#
SIO3_IO[1]I/O1.8VI2CPCIE0_WAKE#
SIO3_IO[2]I/O1.8VI2CPCIE0_CLKREQ#
SIO3_IO[3]I/O1.8VGPION/A
SIO3_IO[4]I/O1.8VI2CI2C_SCL
SIO3_IO[5]I/O1.8VGPIOI2C_SDA
SIO3_IO[6]I/O1.8VPCIE2PCIE0_PERST#
SIO3_IO[7]I/O1.8VPCIE2PCIE0_WAKE#
SIO4_IO[0]I/O1.8VPCIE2PCIE2_CLKREQ#
SIO4_IO[1]I/O1.8VPCIE3PCIE3_PERST#
SIO4_IO[2]I/O1.8VPCIE3PCIE3_WAKE#
SIO4_IO[3]I/O1.8VPCIE3PCIE3_CLKREQ#
SIO4_IO[4]I/O1.8VI2CI2C_SCL
SIO4_IO[5]I/O1.8V—I2C_SDA
SIO4_IO[6]I/O1.8VI2CI2C_SCL
SIO4_IO[7]I/O1.8V—I2C_SDA
SIO5_IO[0]I/O1.8VI2CI2C_SCL
SIO5_IO[1]I/O1.8V—I2C_SDA
SIO5_IO[2]I/O1.8VUARTUART_RX
SIO5_IO[3]I/O1.8V—UART_TX
SIO5_IO[4]I/O1.8VUARTUART_RX
SIO5_IO[5]I/O1.8V—UART_TX
SIO5_IO[6]I/O1.8VI2CI2C_SCL
SIO5_IO[7]I/O1.8V—I2C_SDA
SIO6_IO[0]I/O1.8VI2CI2C_SCL
SIO6_IO[1]I/O1.8V—I2C_SDA
SIO6_IO[2]I/O1.8VGPIOGPIO
SIO6_IO[3]I/O1.8V—GPIO
SIO6_IO[4]I/O1.8VSPISPI_CLK
SIO6_IO[5]I/O1.8V—SPI_CS#
SIO6_IO[6]I/O1.8VSPISPI_MOSI
SIO6_IO[7]I/O1.8V—SPI_MISO
SIO7_IO[0]I/O1.8VSPISPI_CLK
SIO7_IO[1]I/O1.8V—SPI_CS#
SIO7_IO[2]I/O1.8VI2CSPI_MOSI
SIO7_IO[3]I/O1.8V—SPI_MISO
SIO7_IO[4]I/O1.8VSPISPI_CLK
SIO7_IO[5]I/O1.8V—SPI_CS#
SIO7_IO[6]I/O1.8VSPISPI_MOSI
SIO7_IO[7]I/O1.8V—SPI_MISO

GPIO​

Драйвер: gpio-dwapb

У просторі користувача використовуйте libgpiod та його інструменти командного рядка:

ІнструментПризначення
gpiodetectВиводить список доступних мікросхем GPIO
gpioinfoВиводить список мікросхем і ліній із їхнім станом і драйвером-власником
gpiosetВстановлює значення лінії
gpiogetЗчитує значення лінії

Спершу визначте мікросхему та лінію — пристрої відображаються як /dev/gpiochip0 тощо:

root@modalix:~# gpiodetect
root@modalix:~# gpioset gpiochip0 17 1
root@modalix:~# gpioget gpiochip0 17

Для власних застосунків використовуйте C API libgpiod, а не виклики інструментів командного рядка.

Прив’язка: snps,dw-apb-gpio.yaml

UART​

Драйвер: snps-dw-apb-uart

Назва вузла UART містить номер блоку SIO та індекс — uart12 означає блок SIO 1, індекс 2. Кожен блок SIO надає до 4 портів UART, кожен з яких займає 2 контакти, тож індекс 2 відповідає вихідним контактам 4 і 5.

uart12: uart@0x0401a000 {
compatible = "snps,dw-apb-uart";
reg = <0x0 0x0401a000 0x0 0x100>;
interrupts = <GIC_SPI 319 IRQ_TYPE_LEVEL_HIGH>;
reg-io-width = <4>;
reg-shift = <2>;
clocks = <&sio10_clk SIMAAI_SIO_DEV_UART2>;
resets = <&reset10 SIMAAI_SIO_DEV_UART2>;
pinctrl-0 = <&pins_uart12_deafult>;
pinctrl-names = "default";
dmas = <&dmac10 4>, <&dmac10 5>;
dma-names = "tx", "rx";
status = "disabled";
};

Увімкніть його за допомогою оверлею:

&uart12 {
status = "okay";
};

Тактування, скидання та інші параметри можна перевизначити в тому самому оверлеї. Кожен блок SIO має власні контролери тактування, скидання, контактів і DMA, на які посилається наведений вище вузол.

Прив’язка: snps-dw-apb-uart.yaml

I2C​

Два інтерфейси I2C виведено на 40-контактний роз’єм (J12 на платі-носії Waveshare).

Перевірка шин​

root@modalix:~# ls /dev/i2c-*
/dev/i2c-0
/dev/i2c-1

Розводка 40-контактного роз’єму (J12)​

КонтактСигналКонтактСигнал
1Живлення 3,3 В2Живлення 5 В
3I2C1_SDA4Живлення 5 В
5I2C1_SCL6GND
7GPIO09_AUD_MCLK8UART1_TXD
9GND10UART1_RXD
11UART1_RTS12I2S0_SCLK
13SPI1_SCK14GND
15GPIO1216SPI1_CS1
19SPI0_MOSI20GND
21SPI0_MISO22SPI1_MISO
23SPI0_SCLK24SPI0_CS0
25GND26SPI0_CS1
27I2C0_SDA28I2C0_SCL
29GPIO0130GND
31GPIO1132GPIO07
33GPIO1334GND
35I2S0_FS36UART1_CTS
37SPI1_MOSI38I2S0_SDIN
39GND40I2S0_SDOUT

Драйвер і дерево пристроїв​

Розширювач GPIO на шині I2C підтримується драйвером PCF857x, увімкненим у arch/arm64/configs/simaai_modalix_defconfig:

CONFIG_GPIO_PCF857X=y

Він охоплює розширювачі GPIO NXP PCF8574 і PCF8575 на шині I2C — див. simaai_modalix_defconfig. Увімкнення шини 0 із під’єднаним PCF8574:

/dts-v1/;
/plugin/;

&i2c00 {
status = "okay";
clock-frequency = <400000>;
#address-cells = <1>;
#size-cells = <0>;

pcf8574: gpio@27 {
compatible = "nxp,pcf8574";
reg = <0x27>;
gpio-controller;
#gpio-cells = <2>;
};
};

Інструменти командного рядка​

i2c-tools входить до стандартної збірки; якщо пакета немає, установіть його:

root@modalix:~# apt update
root@modalix:~# apt install i2c-tools

Прив’язки: snps,designware-i2c.yaml і nxp,pcf8575.yaml

i2cdetect опитує кожну адресу на шині та повідомляє, які пристрої відповідають. -r використовує опитування через SMBus read-byte, -y пропускає запит на підтвердження, а останній аргумент — це номер шини:

root@modalix:~# i2cdetect -r -y 0

SPI​

Окрім будь-якого блоку SIO, налаштованого для SPI, Modalix має два виділені канали SPI. Оверлеї пристроїв для шляхів NVS SPI і SIO SPI, а також драйвер пристрою SPI і прив’язки дерева пристроїв використовують той самий шаблон оверлею, що й показаний вище для UART.

Довідкові матеріали​

Усі ці матеріали є загальнодоступними:

Довідковий матеріалДе
Збирання ядра, дерев пристроїв і оверлеївЗбирання BSP з вихідного коду
Конфігурація ядраsimaai_modalix_defconfig
Дерева пристроїв Modalixarch/arm64/boot/dts/simaai
Приклади оверлеївdts/simaai/overlays
Прив’язка GPIOsnps,dw-apb-gpio.yaml
Прив’язка UARTsnps-dw-apb-uart.yaml
Прив’язка контролера I2Csnps,designware-i2c.yaml
Прив’язка розширювача PCF857xnxp,pcf8575.yaml

Наступні кроки​