7.7.2. PINCTRL配置

7.7.2.1. 内核配置

参考快速入门 - 编译概述 - Kernel配置,进入kernel的功能配置,按如下选择:

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

7.7.2.2. DTS配置

7.7.2.2.1. pinctrl结点DTS配置

在dtsi文件中,配置pinctrl结点:

pinctrl: pinctrl@19200000 {
    compatible = "zx,aic-pinctrl-v1.0";
    reg = <0x19200000 0x800>;
    clocks = <&cmu CLK_GPIO>;
    resets = <&rst RESET_GPIO>;
};

7.7.2.2.2. gpio子结点DTS配置

在xxx-pinctrl.dtsi文件,配置SOC中所有功能模块的pins结点信息。以GPIOA为例说明,如下图:

gpio_a: bank-0 {
    interrupts-extended = <&plic0 68 IRQ_TYPE_LEVEL_HIGH>;
    gpio-controller;
    zx,bank-port = <0>;
    zx,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>;
};

各属性值含义如下:

  • zx,bank-port:GPIOA的索引值

  • zx,bank-name:GPIOA在struct gpio_chip结构体中的名字

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

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

7.7.2.2.3. 功能模块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>;
    };
};

在xxx-pinctrl.dtsi文件中,描述了各个模块所有的pin脚配置信息,如上图。UART0有两种引脚配置,分别用uart0_pins_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。

7.7.2.2.4. 功能模块pin脚引用DTS配置

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

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