低速 I/O
Modalix 具備兩個專用 SPI 通道以及八個可設定的 SIO 區塊。每個 SIO 區塊都可設定為提供 GPIO、UART、I2C 或 SPI 功能,並由輸出腳位多工器選擇要將哪個功能送到各個腳位。
腳位對應準則
指派 SIO 腳位時:
- 請先選定您要使用的乙太網路與 PCIe 通道:部分腳位功能是預先定義的,必須搭配對應的 PCIe 與乙太網路介面使用。
- 在每個 SIO 區塊中,上方列的腳位具有優先權,應優先考慮。
- 請使用 Function 欄中所列的功能,讓所選介面與該腳位可用的功能相符。
SIO 腳位對應
64 腳位的 SIO 介面分為八個 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,而不是呼叫命令列工具。
Binding: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";
};
從 overlay 啟用它:
&uart12 {
status = "okay";
};
時脈、重設及其他設定也可以在同一個 overlay 中覆寫。每個 SIO 區塊都有各自的時脈、重設、腳位與 DMA 控制器,並由上方的節點參照。
Binding:snps-dw-apb-uart.yaml
I2C
40 針排針(Waveshare 載板上的 J12)上引出了兩個 I2C 介面。
確認匯流排
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 |
驅動程式與 Device Tree
I2C GPIO 擴充器由 PCF857x 驅動程式支援,並已在 arch/arm64/configs/simaai_modalix_defconfig 中啟用:
CONFIG_GPIO_PCF857X=y
此驅動程式涵蓋 NXP PCF8574 與 PCF8575 I2C GPIO 擴充器,請參閱 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
Binding:snps,designware-i2c.yaml 與 nxp,pcf8575.yaml
i2cdetect 會探測匯流排上的每個位址,並回報哪些裝置有回應。-r 使用 SMBus read-byte 方式探測,-y 會略過確認提示,最後一個引數則是匯流排編號:
root@modalix:~# i2cdetect -r -y 0
SPI
除了設定為 SPI 的 SIO 區塊之外,Modalix 還具備兩個專用 SPI 通道。NVS SPI 與 SIO SPI 路徑的裝置 overlay,以及 SPI 裝置驅動程式與 device tree binding,都遵循上方 UART 所示的相同 overlay 模式。
參考資料
以下資源皆為公開:
| 參考資料 | 位置 |
|---|---|
| 建置核心、device tree 與 overlay | 從原始碼建置 BSP |
| 核心設定 | simaai_modalix_defconfig |
| Modalix device tree | arch/arm64/boot/dts/simaai |
| 範例 overlay | dts/simaai/overlays |
| GPIO binding | snps,dw-apb-gpio.yaml |
| UART binding | snps-dw-apb-uart.yaml |
| I2C 控制器 binding | snps,designware-i2c.yaml |
| PCF857x 擴充器 binding | nxp,pcf8575.yaml |
後續步驟
- 載板硬體啟動:需要調整的項目及原因。
- 從原始碼建置 BSP:建置並安裝包含您 overlay 的核心。