K230 IOMUX 指南#
概述#
K230 IOMUX 驱动为 Canaan Kendryte K230 SoC 提供引脚功能控制。该驱动实现了 Linux pinctrl 子系统,用于管理:
引脚功能复用(每个引脚有 8 种功能选择)
引脚配置(上拉/下拉、驱动强度、摆率等)
本文档主要描述k230 iomux相关寄存器定义,设备树配置,及用户态iomux工具使用。 本文档相关的主要文件如下:
文件 |
描述 |
|---|---|
|
实现 pinctrl/pinmux/pinconf 操作的主要驱动源码 |
|
包含引脚名称和功能选择器的头文件 |
|
用于运行时引脚配置的 Python 工具 |
|
Device Tree 绑定模式 |
寄存器及功能说明#
寄存器#
k230有2个iomux控制器模块:
主 IOMUX:0x91105000(64 个引脚)
PMU IOMUX:0x91000080(8 个引脚)
每个引脚在基地址偏移 pin * 4 处有一个 32 位寄存器。
寄存器位布局如下(参考 TRM 第 12.9.2 节)
位 |
字段 |
类型 |
描述 |
|---|---|---|---|
31 |
DI |
RO |
输入数据 |
30:14 |
- |
RO |
保留 |
13:11 |
IO_SEL |
RW |
功能选择(000=func1,依此类推) |
10 |
SL |
RW |
摆率使能 |
9 |
MSC |
RW |
电压控制(双电压焊盘) |
8 |
IE |
RW |
输入使能(1=启用) |
7 |
OE |
RW |
输出使能(1=启用) |
6 |
PU |
RW |
上拉(1=启用) |
5 |
PD |
RW |
下拉(1=启用) |
4:1 |
DS |
RW |
驱动强度选择(0-15) |
0 |
ST |
RW |
施密特触发器(1=启用) |
功能说明#
每个引脚最多支持 8 种功能(IO_SEL[2:0]),各个管脚可配置功能如下:
控制器 0(io0-io63)
引脚 |
alt0 |
alt1 |
alt2 |
alt3 |
alt4 |
|---|---|---|---|---|---|
io0 |
GPIO0 |
BOOT0 |
- |
TEST_PIN0 |
- |
io1 |
GPIO1 |
BOOT1 |
- |
TEST_PIN1 |
- |
io2 |
GPIO2 |
JTAG_TCK |
PULSE_CNTR0 |
TEST_PIN2 |
- |
io3 |
GPIO3 |
JTAG_TDI |
PULSE_CNTR1 |
UART1_TXD |
TEST_PIN0 |
io4 |
GPIO4 |
JTAG_TDO |
PULSE_CNTR2 |
UART1_RXD |
TEST_PIN1 |
io5 |
GPIO5 |
JTAG_TMS |
PULSE_CNTR3 |
UART2_TXD |
TEST_PIN2 |
io6 |
GPIO6 |
JTAG_RST |
PULSE_CNTR4 |
UART2_RXD |
TEST_PIN3 |
io7 |
GPIO7 |
PWM2 |
I2C4_SCL |
TEST_PIN3 |
DI0 |
io8 |
GPIO8 |
PWM3 |
I2C4_SDA |
TEST_PIN4 |
DI1 |
io9 |
GPIO9 |
PWM4 |
UART1_TXD |
I2C1_SCL |
DI2 |
io10 |
GPIO10 |
3D_CTRL_IN |
UART1_RXD |
I2C1_SDA |
DI3 |
io11 |
GPIO11 |
3D_CTRL_OUT1 |
UART2_TXD |
I2C2_SCL |
DO0 |
io12 |
GPIO12 |
3D_CTRL_OUT2 |
UART2_RXD |
I2C2_SDA |
DO1 |
io13 |
GPIO13 |
M_CLK1 |
- |
- |
DO2 |
io14 |
GPIO14 |
OSPI_CS |
TEST_PIN5 |
QSPI0_CS0 |
DO3 |
io15 |
GPIO15 |
OSPI_CLK |
TEST_PIN6 |
QSPI0_CLK |
CO3 |
io16 |
GPIO16 |
OSPI_D0 |
QSPI1_CS4 |
QSPI0_D0 |
CO2 |
io17 |
GPIO17 |
OSPI_D1 |
QSPI1_CS3 |
QSPI0_D1 |
CO1 |
io18 |
GPIO18 |
OSPI_D2 |
QSPI1_CS2 |
QSPI0_D2 |
CO0 |
io19 |
GPIO19 |
OSPI_D3 |
QSPI1_CS1 |
QSPI0_D3 |
TEST_PIN4 |
io20 |
GPIO20 |
OSPI_D4 |
QSPI1_CS0 |
PULSE_CNTR0 |
TEST_PIN5 |
io21 |
GPIO21 |
OSPI_D5 |
QSPI1_CLK |
PULSE_CNTR1 |
TEST_PIN6 |
io22 |
GPIO22 |
OSPI_D6 |
QSPI1_D0 |
PULSE_CNTR2 |
TEST_PIN7 |
io23 |
GPIO23 |
OSPI_D7 |
QSPI1_D1 |
PULSE_CNTR3 |
TEST_PIN8 |
io24 |
GPIO24 |
OSPI_DQS |
QSPI1_D2 |
PULSE_CNTR4 |
TEST_PIN9 |
io25 |
GPIO25 |
PWM5 |
QSPI1_D3 |
PULSE_CNTR5 |
TEST_PIN10 |
io26 |
GPIO26 |
MMC1_CLK |
TEST_PIN7 |
PDM_CLK |
- |
io27 |
GPIO27 |
MMC1_CMD |
PULSE_CNTR5 |
PDM_IN0 |
CI0 |
io28 |
GPIO28 |
MMC1_D0 |
UART3_TXD |
PDM_IN1 |
CI1 |
io29 |
GPIO29 |
MMC1_D1 |
UART3_RXD |
3D_CTRL_IN |
CI2 |
io30 |
GPIO30 |
MMC1_D2 |
UART3_RTS |
3D_CTRL_OUT1 |
CI3 |
io31 |
GPIO31 |
MMC1_D3 |
UART3_CTS |
3D_CTRL_OUT2 |
TEST_PIN11 |
io32 |
GPIO32 |
I2C0_SCL |
IIS_CLK |
UART3_TXD |
TEST_PIN12 |
io33 |
GPIO33 |
I2C0_SDA |
IIS_WS |
UART3_RXD |
TEST_PIN13 |
io34 |
GPIO34 |
I2C1_SCL |
IIS_D_IN0_PDM_IN3 |
UART3_RTS |
TEST_PIN14 |
io35 |
GPIO35 |
I2C1_SDA |
IIS_D_OUT0_PDM_IN1 |
UART3_CTS |
TEST_PIN15 |
io36 |
GPIO36 |
I2C3_SCL |
IIS_D_IN1_PDM_IN2 |
UART4_TXD |
TEST_PIN16 |
io37 |
GPIO37 |
I2C3_SDA |
IIS_D_OUT1_PDM_IN0 |
UART4_RXD |
TEST_PIN17 |
io38 |
GPIO38 |
UART0_TXD |
TEST_PIN8 |
QSPI1_CS0 |
HSYNC0 |
io39 |
GPIO39 |
UART0_RXD |
TEST_PIN9 |
QSPI1_CLK |
VSYNC0 |
io40 |
GPIO40 |
UART1_TXD |
I2C1_SCL |
QSPI1_D0 |
TEST_PIN18 |
io41 |
GPIO41 |
UART1_RXD |
I2C1_SDA |
QSPI1_D1 |
TEST_PIN19 |
io42 |
GPIO42 |
UART1_RTS |
PWM0 |
QSPI1_D2 |
TEST_PIN20 |
io43 |
GPIO43 |
UART1_CTS |
PWM1 |
QSPI1_D3 |
TEST_PIN21 |
io44 |
GPIO44 |
UART2_TXD |
I2C3_SCL |
TEST_PIN10 |
SPI2AXI_CLK |
io45 |
GPIO45 |
UART2_RXD |
I2C3_SDA |
TEST_PIN11 |
SPI2AXI_CS |
io46 |
GPIO46 |
UART2_RTS |
PWM2 |
I2C4_SCL |
TEST_PIN22 |
io47 |
GPIO47 |
UART2_CTS |
PWM3 |
I2C4_SDA |
TEST_PIN23 |
io48 |
GPIO48 |
UART4_TXD |
TEST_PIN12 |
I2C0_SCL |
SPI2AXI_DIN |
io49 |
GPIO49 |
UART4_RXD |
TEST_PIN13 |
I2C0_SDA |
SPI2AXI_DOUT |
io50 |
GPIO50 |
UART3_TXD |
I2C2_SCL |
QSPI0_CS4 |
TEST_PIN24 |
io51 |
GPIO51 |
UART3_RXD |
I2C2_SDA |
QSPI0_CS3 |
TEST_PIN25 |
io52 |
GPIO52 |
UART3_RTS |
PWM4 |
I2C3_SCL |
TEST_PIN26 |
io53 |
GPIO53 |
UART3_CTS |
PWM5 |
I2C3_SDA |
- |
io54 |
GPIO54 |
QSPI0_CS0 |
MMC1_CMD |
PWM0 |
TEST_PIN27 |
io55 |
GPIO55 |
QSPI0_CLK |
MMC1_CLK |
PWM1 |
TEST_PIN28 |
io56 |
GPIO56 |
QSPI0_D0 |
MMC1_D0 |
PWM2 |
TEST_PIN29 |
io57 |
GPIO57 |
QSPI0_D1 |
MMC1_D1 |
PWM3 |
TEST_PIN30 |
io58 |
GPIO58 |
QSPI0_D2 |
MMC1_D2 |
PWM4 |
TEST_PIN31 |
io59 |
GPIO59 |
QSPI0_D3 |
MMC1_D3 |
PWM5 |
- |
io60 |
GPIO60 |
PWM0 |
I2C0_SCL |
QSPI0_CS2 |
HSYNC1 |
io61 |
GPIO61 |
PWM1 |
I2C0_SDA |
QSPI0_CS1 |
VSYNC1 |
io62 |
GPIO62 |
M_CLK2 |
UART3_DE |
TEST_PIN14 |
- |
io63 |
GPIO63 |
M_CLK3 |
UART3_RE |
TEST_PIN15 |
- |
控制器 1(io0-io7,PMUIOMUX)
引脚 |
alt1 |
alt2 |
|---|---|---|
io0 |
GPIO64 |
INT0 |
io1 |
GPIO65 |
INT1 |
io2 |
GPIO66 |
INT2 |
io3 |
GPIO67 |
INT3 |
io4 |
GPIO68 |
INT4 |
io5 |
GPIO69 |
INT5 |
io6 |
GPIO70 |
OUT1 |
io7 |
GPIO71 |
OUT2 |
设备树配置#
示例#
UART0 配置#
&iomux {
uart0_pins: uart0-pins {
pinmux {
pins = "io38", "io39";
function = "alt1";
bias-disable;
drive-strength = <8>;
slew-rate = <1>;
};
};
};
&uart0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins>;
};
I2C0 配置#
&iomux {
i2c0_pins: i2c0-pins {
pinmux {
pins = "io32", "io33";
function = "alt1";
bias-pull-up;
drive-strength = <8>;
};
};
};
&i2c0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
clock-frequency = <100000>;
};
PWM 配置#
&iomux {
pwm2_pins: pwm2-pins {
pinmux {
pins = "io46";
function = "alt2"; // PWM2 功能
drive-strength = <8>;
};
};
};
&pwm0_2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pwm2_pins>;
};
说明#
/*arch/riscv/boot/dts/canaan/k230.dtsi*/
iomux: iomux@91105000 {
compatible = "canaan,k230-iomux";
reg = <0x0 0x91105000 0x0 0x100>;
#pinctrl-cells = <1>;
clocks = <&iomux_pclk_gate>;
clock-names = "apb";
status = "okay";
};
pmuiomux: pmuiomux@91000080 {
compatible = "canaan,k230-iomux";
reg = <0x0 0x91000080 0x0 0x20>;
#pinctrl-cells = <1>;
clocks = <&iomux_pclk_gate>;
clock-names = "apb";
status = "okay";
};
uart0_pins: uart0-pins {
pinmux {
pins = "io38", "io39";
function = "alt1"; // UART0_TXD / UART0_RXD
bias-disable;
drive-strength = <8>;
slew-rate = <1>; // 快速
};
};
可用引脚名称
主 IOMUX:
io0到io63PMU IOMUX:
io0到io7(映射到引脚 64-71)
可用引脚配置属性
bias-pull-up- 启用上拉电阻bias-pull-down- 启用下拉电阻bias-disable- 禁用上拉/下拉drive-strength- 驱动强度(0-15,具体电流值请参考 TRM)slew-rate- 摆率控制(0=禁用,1=启用)input-enable- 启用输入缓冲器output-enable- 启用输出缓冲器input-schmitt- 启用施密特触发器
可配置功能见前面章节
更多信息请参考Documentation/devicetree/bindings/pinctrl/canaan,k230-iomux.yaml
用户态配套工具#
k230_iomux.py是一个用户态调试和查看iomux配置工具
使用示例#
# 查看所有引脚配置(控制器 0)
python3 k230_iomux.py
# 查看特定引脚
python3 k230_iomux.py --pin io38
#查看引脚及其所有可用功能
python3 k230_iomux.py --pin io38 --funcs
# 将引脚设置为特定功能
python3 k230_iomux.py --set io38 alt1
# 使用配置选项设置引脚
python3 k230_iomux.py --set io38 alt1 --ie --oe --pu --ds 8
# 使用特定功能名称设置引脚
python3 k230_iomux.py --set io38 UART0_TXD
#查看第二个 IOMUX 控制器(PMUIOMUX)
python3 k230_iomux.py --iomux 1
##### 8. 在第二个控制器上设置引脚
python3 k230_iomux.py --iomux 1 --set io3 alt1
使用说明#
[root@canaan ~ ]#k230_iomux.py -h
usage: k230_iomux.py [-h] [--pin PIN] [--funcs] [--set PIN FUNC]
[--iomux {0,1}] [--ie] [--no-ie] [--oe] [--no-oe] [--pu]
[--pd] [--no-pull] [--ds 1-15] [--sl] [--no-sl] [--st]
[--no-st]
K230 IOMUX Pin Configuration Tool
options:
-h, --help show this help message and exit
--pin, -p PIN Specific pin to view (e.g., io38)
--funcs, -f Show all available functions for a pin
--set, -s PIN FUNC Set pin to function (e.g., io38 alt1)
--iomux, -i {0,1} IOMUX controller index (0=main, 1=pmuiomux)
--ie Enable input
--no-ie Disable input
--oe Enable output
--no-oe Disable output
--pu Enable pull-up
--pd Enable pull-down
--no-pull Disable pull-up/down
--ds 1-15 Drive strength (1-15)
--sl Enable slew rate
--no-sl Disable slew rate
--st Enable schmitt trigger
--no-st Disable schmitt trigger
Examples:
# View all pin configurations (controller 0)
python3 k230_iomux.py
# View specific pin
python3 k230_iomux.py --pin io38
# View pin with all available functions
python3 k230_iomux.py --pin io38 --funcs
# Set pin to alt1 function
python3 k230_iomux.py --set io38 alt1
# Set pin with configuration options
python3 k230_iomux.py --set io38 alt1 --ie --oe --pu --ds 8
# Set pin using specific function name (must specify pin)
python3 k230_iomux.py --set io38 UART0_TXD
# View controller 1 (PMUIOMUX at 0x91000080)
python3 k230_iomux.py --iomux 1
# Set pin on controller 1
python3 k230_iomux.py --iomux 1 --set io3 alt1
[root@canaan ~ ]#
#命令行参数
| 参数 | 描述 |
| --- | --- |
| `--pin`, `-p` | 要查看的特定引脚(例如 `io38`) |
| `--funcs`, `-f` | 显示引脚的所有可用功能 |
| `--set`, `-s` | 将引脚设置为功能(例如 `io38 alt1`) |
| `--iomux`, `-i` | IOMUX 控制器索引(0=主,1=pmuiomux) |
| `--ie` | 启用输入 |
| `--no-ie` | 禁用输入 |
| `--oe` | 启用输出 |
| `--no-oe` | 禁用输出 |
| `--pu` | 启用上拉 |
| `--pd` | 启用下拉 |
| `--no-pull` | 禁用上拉/下拉 |
| `--ds` | 驱动强度(1-15) |
| `--sl` | 启用摆率 |
| `--no-sl` | 禁用摆率 |
| `--st` | 启用施密特触发器 |
| `--no-st` | 禁用施密特触发器 |
