pinctrl 子系统简介
Linux 驱动讲究驱动分离与分层,是驱动分离与分层思想下的产物。
pinctrl 子系统用途
- 获取设备树中 pin 信息。
- 根据获取到的 pin 信息来设置 pin 的复用功能
- 根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
pinctrl子系统例程
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
};
...
pinctrl_flexcan1: flexcan1grp{
fsl,pins = <
MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
>;
};
...
pinctrl_wdog: wdoggrp {
fsl,pins = <
MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
>;
};
};
};
pinctrl-names
里定义了该引脚有哪些状态。分别对应pinctrl-0
pinctrl-1``pinctrl-x
.
宏详细介绍
#define MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x0090 0x031C 0x0000 0x5 0x0
5个值的含义如下所示
<mux_reg
conf_reg
input_reg
mux_mode
input_val
>
mux_reg: 寄存器偏移地址,IOMUXC 外 设 寄 存 器 起 始 地 址 为 0x020e0000,因此0x020e0000+0x0090=0x020e0090, IOMUXC_SW_MUX_CTL_PAD_UART1_RTS_B 寄存器地址
正 好 是 0x020e0090.
conf_reg: 寄存器偏移地址,和 mux_reg 一样, 0x020e0000+0x031c=0x020e031c,这个就是寄存器 IOMUXC_SW_PAD_CTL_PAD_UART1_RTS_B 的地址.
input_reg: 寄存器偏移地址, 有些外设有 input_reg 寄存器,有 input_reg 寄存器的外设需要配置 input_reg 寄存器.
mux_reg: mux_reg寄存器值
input_val: conf_reg 寄存器的值,设置一个 PIN 的电气特性的