PINCTRL 配置
内核配置
-
在 SDK 根目录下,执行下列命令,进入 kernel 的功能配置界面:
make kernel-menuconfig
或使用简写命令
make km
-
在内核配置界面,按如下选择:
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_a 和 uart0_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"; };