Edit online

PINCTRL 配置

17 Dec 2024
Read time: 3 minute(s)

内核配置

  1. 在 SDK 根目录下,执行下列命令,进入 kernel 的功能配置界面:
    make kernel-menuconfig

    或使用简写命令

    make km
  2. 在内核配置界面,按如下选择:
    Linux
        Device Drivers
            Pin controllers--->
                [*] ArtInChip pin controller version1 device driver
    

DTS 配置

  • board.dtsi 文件中,配置 pinctrl 结点:
    pinctrl: pinctrl@19200000 {
        compatible = "artinchip,aic-pinctrl-v1.0";
        reg = <0x19200000 0x800>;
        clocks = <&cmu CLK_GPIO>;
        resets = <&rst RESET_GPIO>;
    };
    
  • board.dtsi 文件,配置 SoC 中所有功能模块的 pins 结点信息。
    以 GPIOA 为例说明,如下所示:
    gpio_a: bank-0 {
        interrupts-extended = <&plic0 68 IRQ_TYPE_LEVEL_HIGH>;
        gpio-controller;
        artinchip,bank-port = <0>;
        artinchip,bank-name = "PA";
        gpio-ranges = <&pinctrl 0 0 12>;
        gpio_regs = <0x0000 0x0004 0x0008 0x000C 0x0010 0x0080>;
        debounce = <1>;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
    };
    
    • artinchip,bank-port:GPIOA 的索引值

    • artinchip,bank-name:GPIOA 在 chip 结构体中的名字

    • gpio-ranges:第一个数值表示 GPIOA 的第一个 pin 脚在 GPIOA 中的索引值。第二个数值表示 GPIOA 的第一个 pin 脚在整个 SOC 的 GPIO 中的序号索引值。第三个数值表示 GPIOA 中 pin 脚的个数

    • interrupt-controller:GPIOA 使用中断时,把 GPIOA 看做是一个中断控制器

  • 功能模块 pin 脚复用 DTS 配置

    以 uart0 的引脚复用为例进行说明:

    uart0_pins_a: uart0-0 {
        pins {
            pinmux = <AIC_PINMUX('A', 0, 5)>,
                     <AIC_PINMUX('A', 1, 5)>;
            bias-disable;
            drive-strength = <3>;
        };
    };
    
    uart0_pins_b: uart0-1 {
        pins {
            pinmux = <AIC_PINMUX('A', 2, 5)>,
                     <AIC_PINMUX('A', 3, 5)>;
            bias-disable;
            drive-strength = <3>;
        };
    };
    
    board.dtsi 文件描述了各个模块所有的 pin 脚配置信息。
    • uart0_pins_auart0_pins_b:分别为 UART0 的不同引脚配置。
    • pinmux:模块使用的的引脚配置信息:
      • AIC_PINMUX:自定义宏,表示 u32 数据
      • AIC_PINMUX(‘A’, pin, function):以 AIC_PINMUX('A', 2, 5) 为例,表示将 PA2 脚配置为 function 5,即可作为 uart 引脚。

        如以上示例描述,uart0_pins_a 使用 PA0 和 PA1 作为 pin 脚,uart_pins_b 使用是 PA2 和 PA3 作为 pin 脚。

  • 功能模块 pin 脚引用 DTS 配置

    board.dtsi 文件中,列出了所有的模块的 pin 脚配置信息。一般在 board.dtsi 文件中指定模块具体使用的 pin 脚组合。在 board.dtsi 文件,各个模块的结点引用 pinctrl 的 pin 脚配置,声明本模块所使用的 pin 脚。如下图,uart0 使用 uart0_pins_a 的引脚配置,即使用 PA0 和 PA1 脚。

    &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pins_a>;
        status = "okay";
    };