PINCTRL 配置
内核配置
在 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"; };