저속 I/O
Modalix에는 전용 SPI 채널 2개와 구성 가능한 SIO 블록 8개가 있습니다. 각 SIO 블록은 GPIO, UART, I2C 또는 SPI를 제공하도록 구성할 수 있으며, 출력 핀 멀티플렉서가 각 핀에 연결될 기능을 선택합니다.
매핑 지침
SIO 핀을 할당할 때는 다음 지침을 따르십시오.
- 사용할 이더넷 및 PCIe 채널을 먼저 선택하십시오. 일부 핀 기능은 미리 정의되어 있어 해당 PCIe 및 이더넷 인터페이스와 함께 사용해야 합니다.
- 각 SIO 블록 내에서는 위쪽 행의 핀이 우선하므로 먼저 고려해야 합니다.
- 선택한 인터페이스가 핀에서 사용 가능한 기능과 일치하도록 기능 열에 명시된 기능을 사용하십시오.
SIO 핀 매핑
64핀 SIO 인터페이스는 8비트 포트 8개로 나뉩니다. 모든 핀은 1.8 V I/O입니다.
| SIO 핀 | 유형 | 전압 | 인터페이스 | 기능 |
|---|---|---|---|---|
SIO0_IO[0] | I/O | 1.8V | UART | UART_RX |
SIO0_IO[1] | I/O | 1.8V | — | UART_TX |
SIO0_IO[2] | I/O | 1.8V | I2C | I2C_SCL |
SIO0_IO[3] | I/O | 1.8V | — | I2C_SDA |
SIO0_IO[4] | I/O | 1.8V | GPIO | GPIO |
SIO0_IO[5] | I/O | 1.8V | — | GPIO |
SIO0_IO[6] | I/O | 1.8V | GPIO | GPIO |
SIO0_IO[7] | I/O | 1.8V | — | GPIO |
SIO1_IO[0] | I/O | 1.8V | I2C | ETH0_PTP_PPS |
SIO1_IO[1] | I/O | 1.8V | I2C | N/A |
SIO1_IO[2] | I/O | 1.8V | GPIO | GPIO |
SIO1_IO[3] | I/O | 1.8V | GPIO | GPIO |
SIO1_IO[4] | I/O | 1.8V | SPI | SPI_CLK |
SIO1_IO[5] | I/O | 1.8V | — | SPI_CS# |
SIO1_IO[6] | I/O | 1.8V | SPI | SPI_MOSI |
SIO1_IO[7] | I/O | 1.8V | — | SPI_MISO |
SIO2_IO[0] | I/O | 1.8V | I2C | ETH0_SMA_MDC |
SIO2_IO[1] | I/O | 1.8V | — | ETH0_SMA_MDIO |
SIO2_IO[2] | I/O | 1.8V | SPI | N/A |
SIO2_IO[3] | I/O | 1.8V | — | N/A |
SIO2_IO[4] | I/O | 1.8V | UART | UART_RX |
SIO2_IO[5] | I/O | 1.8V | — | UART_TX |
SIO2_IO[6] | I/O | 1.8V | UART | UART_RX |
SIO2_IO[7] | I/O | 1.8V | — | UART_TX |
SIO3_IO[0] | I/O | 1.8V | SPI | PCIE0_PERST# |
SIO3_IO[1] | I/O | 1.8V | I2C | PCIE0_WAKE# |
SIO3_IO[2] | I/O | 1.8V | I2C | PCIE0_CLKREQ# |
SIO3_IO[3] | I/O | 1.8V | GPIO | N/A |
SIO3_IO[4] | I/O | 1.8V | I2C | I2C_SCL |
SIO3_IO[5] | I/O | 1.8V | GPIO | I2C_SDA |
SIO3_IO[6] | I/O | 1.8V | PCIE2 | PCIE0_PERST# |
SIO3_IO[7] | I/O | 1.8V | PCIE2 | PCIE0_WAKE# |
SIO4_IO[0] | I/O | 1.8V | PCIE2 | PCIE2_CLKREQ# |
SIO4_IO[1] | I/O | 1.8V | PCIE3 | PCIE3_PERST# |
SIO4_IO[2] | I/O | 1.8V | PCIE3 | PCIE3_WAKE# |
SIO4_IO[3] | I/O | 1.8V | PCIE3 | PCIE3_CLKREQ# |
SIO4_IO[4] | I/O | 1.8V | I2C | I2C_SCL |
SIO4_IO[5] | I/O | 1.8V | — | I2C_SDA |
SIO4_IO[6] | I/O | 1.8V | I2C | I2C_SCL |
SIO4_IO[7] | I/O | 1.8V | — | I2C_SDA |
SIO5_IO[0] | I/O | 1.8V | I2C | I2C_SCL |
SIO5_IO[1] | I/O | 1.8V | — | I2C_SDA |
SIO5_IO[2] | I/O | 1.8V | UART | UART_RX |
SIO5_IO[3] | I/O | 1.8V | — | UART_TX |
SIO5_IO[4] | I/O | 1.8V | UART | UART_RX |
SIO5_IO[5] | I/O | 1.8V | — | UART_TX |
SIO5_IO[6] | I/O | 1.8V | I2C | I2C_SCL |
SIO5_IO[7] | I/O | 1.8V | — | I2C_SDA |
SIO6_IO[0] | I/O | 1.8V | I2C | I2C_SCL |
SIO6_IO[1] | I/O | 1.8V | — | I2C_SDA |
SIO6_IO[2] | I/O | 1.8V | GPIO | GPIO |
SIO6_IO[3] | I/O | 1.8V | — | GPIO |
SIO6_IO[4] | I/O | 1.8V | SPI | SPI_CLK |
SIO6_IO[5] | I/O | 1.8V | — | SPI_CS# |
SIO6_IO[6] | I/O | 1.8V | SPI | SPI_MOSI |
SIO6_IO[7] | I/O | 1.8V | — | SPI_MISO |
SIO7_IO[0] | I/O | 1.8V | SPI | SPI_CLK |
SIO7_IO[1] | I/O | 1.8V | — | SPI_CS# |
SIO7_IO[2] | I/O | 1.8V | I2C | SPI_MOSI |
SIO7_IO[3] | I/O | 1.8V | — | SPI_MISO |
SIO7_IO[4] | I/O | 1.8V | SPI | SPI_CLK |
SIO7_IO[5] | I/O | 1.8V | — | SPI_CS# |
SIO7_IO[6] | I/O | 1.8V | SPI | SPI_MOSI |
SIO7_IO[7] | I/O | 1.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
사용자 지정 애플리케이션에서는 명령줄 도구를 호출하는 대신 libgpiod C API를 사용하십시오.
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 컨트롤러를 구현합니다.
I2C
40핀 헤더(Waveshare 캐리어 카드의 J12)에는 I2C 인터페이스 2개가 노출되어 있습니다.
버스 확인
root@modalix:~# ls /dev/i2c-*
/dev/i2c-0
/dev/i2c-1
40핀 헤더 핀아웃(J12)
| 핀 | 신호 | 핀 | 신호 |
|---|---|---|---|
| 1 | 3.3 V 전원 | 2 | 5 V 전원 |
| 3 | I2C1_SDA | 4 | 5 V 전원 |
| 5 | I2C1_SCL | 6 | GND |
| 7 | GPIO09_AUD_MCLK | 8 | UART1_TXD |
| 9 | GND | 10 | UART1_RXD |
| 11 | UART1_RTS | 12 | I2S0_SCLK |
| 13 | SPI1_SCK | 14 | GND |
| 15 | GPIO12 | 16 | SPI1_CS1 |
| 19 | SPI0_MOSI | 20 | GND |
| 21 | SPI0_MISO | 22 | SPI1_MISO |
| 23 | SPI0_SCLK | 24 | SPI0_CS0 |
| 25 | GND | 26 | SPI0_CS1 |
| 27 | I2C0_SDA | 28 | I2C0_SCL |
| 29 | GPIO01 | 30 | GND |
| 31 | GPIO11 | 32 | GPIO07 |
| 33 | GPIO13 | 34 | GND |
| 35 | I2S0_FS | 36 | UART1_CTS |
| 37 | SPI1_MOSI | 38 | I2S0_SDIN |
| 39 | GND | 40 | I2S0_SDOUT |
드라이버 및 디바이스 트리
I2C GPIO 익스팬더는 arch/arm64/configs/simaai_modalix_defconfig에서 활성화된
PCF857x 드라이버로 지원됩니다.
CONFIG_GPIO_PCF857X=y
이 드라이버는 NXP PCF8574 및 PCF8575 I2C GPIO 익스팬더를 지원합니다.
simaai_modalix_defconfig를 참조하십시오.
PCF8574가 연결된 버스 0을 활성화하는 예는 다음과 같습니다.
/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 바이트 읽기 방식으로 탐색하고, -y는 확인 프롬프트를 건너뛰며, 마지막
인수는 버스 번호입니다.
root@modalix:~# i2cdetect -r -y 0
SPI
Modalix에는 SPI로 구성한 SIO 블록 외에도 전용 SPI 채널 2개가 있습니다. NVS SPI 및 SIO SPI 경로용 장치 오버레이와 SPI 장치 드라이버, 디바이스 트리 바인딩은 위의 UART에서 설명한 것과 동일한 오버레이 패턴을 따릅니다.
참고 자료
모두 공개되어 있습니다.
| 참고 자료 | 위치 |
|---|---|
| 커널, 디바이스 트리 및 오버레이 빌드 | 소스에서 BSP 빌드 |
| 커널 구성 | simaai_modalix_defconfig |
| Modalix 디바이스 트리 | arch/arm64/boot/dts/simaai |
| 오버레이 예제 | dts/simaai/overlays |
| GPIO 바인딩 | snps,dw-apb-gpio.yaml |
| UART 바인딩 | snps-dw-apb-uart.yaml |
| I2C 컨트롤러 바인딩 | snps,designware-i2c.yaml |
| PCF857x 익스팬더 바인딩 | nxp,pcf8575.yaml |
다음 단계
- 캐리어 보드 브링업 — 적응이 필요한 부분과 그 이유.
- 소스에서 BSP 빌드 — 오버레이를 포함한 커널의 빌드 및 설치.