Edit online

PINCTRL 配置

14 Nov 2024
Read time: 3 minute(s)

内核配置

在 Luban 根目录下执行 make kernel-menuconfig,进入 kernel 的功能配置,按如下选择:

Linux
    Device Drivers
        Pin controllers--->
            [*] ArtInChip pin controller version1 device driver

DTS 配置

  • pinctrl 结点 DTS 配置。在 board.dtsi 文件中,配置 pinctrl 结点:
    pinctrl: pinctrl@19200000 {
        compatible = "artinchip,aic-pinctrl-v1.0";
        reg = <0x19200000 0x800>;
        clocks = <&cmu CLK_GPIO>;
        resets = <&rst RESET_GPIO>;
    };
    
  • gpio 子结点 DTS 配置
    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 有两种引脚配置,分别用 a 和 uart0_pins_b 表示。pinmux 属性表示的是模块所使用的的引脚配置信息,AIC_PINMUX 是自定义的一个表示 u32 数据的宏,AIC_PINMUX(‘A’, 2, 5)表示把 PA2 脚配置为 function 5,即可作为 uart 引脚。所以,uart0_pins_a 使用的 pin 脚是 PA0 和 PA1,uart_pins_b 使用的 pin 脚是 PA2 和 PA3。

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

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

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