注意

这是最新开发分支配套的文档,可能包含已发布版本中尚未提供的功能。如果您要查看特定版本的文档,请使用左侧的下拉菜单并选择所需要的版本。

K230 IOMUX 指南#

概述#

K230 IOMUX 驱动为 Canaan Kendryte K230 SoC 提供引脚功能控制。该驱动实现了 Linux pinctrl 子系统,用于管理:

  • 引脚功能复用(每个引脚有 8 种功能选择)

  • 引脚配置(上拉/下拉、驱动强度、摆率等)

本文档主要描述k230 iomux相关寄存器定义,设备树配置,及用户态iomux工具使用。 本文档相关的主要文件如下:

文件

描述

pinctrl-k230-iomux.c

实现 pinctrl/pinmux/pinconf 操作的主要驱动源码

dt-bindings/pinctrl/canaan,k230-iomux.h

包含引脚名称和功能选择器的头文件

k230_iomux.py

用于运行时引脚配置的 Python 工具

Documentation/devicetree/bindings/pinctrl/canaan,k230-iomux.yaml

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:io0io63

  • PMU IOMUX:io0io7(映射到引脚 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` | 禁用施密特触发器 |
评论列表
条评论
登录