PinCtrl
概述
PinCtrl(Pin Controller)子系统用于管理和配置芯片引脚的功能复用和电气特性。该子系统涉及两个主要对象:
- Pin controller devices:提供引脚控制服务,负责引脚复用和配置
- PinCtrl client devices:使用引脚控制服务的设备,通过设备树声明所需的引脚功能和配置
注意
Pin controller 与 GPIO controller 是不同的概念。Pin controller 负责将引脚配置为特定功能(如 GPIO、I2C 等),而 GPIO controller 则负责将已配置为 GPIO 功能的引脚设置为输入或输出模式。
功能描述
现代芯片包含大量引脚,每个引脚可能支持多种功能。手动配置每个引脚的寄存器既耗时又容易出错。Linux 内核引入 PinCtrl 子系统来抽象引脚的复用和配置,使开发者能够方便地管理引脚功能。
PinCtrl 子系统提供以下核心功能:
- 引脚枚举与命名(Enumerating and naming)
- 引脚复用(Multiplexing):配置引脚用于 GPIO、I2C 或其他外设功能
- 引脚配置(Configuration):设置上拉、下拉、开漏、驱动强度等电气特性
典型的芯片引脚架构如下图所示:

如图所示,pinA 和 pinB 可以通过 IOMUX(引脚复用控制器)连接到不同的功能模块:
- 配置为
GPIO功能时,连接到GPIO模块 - 配置为
I2C功能时,连接到I2C模块
此外,还可以同时配置引脚的电气特性,如驱动能力、上拉/下拉电阻等。
设备树配置
在设备树中,Pin controller 和 client device 分别定义为两个节点:
pincontroller {
/* Pin controller 节点 */
state_0_node_a {
/* 引脚配置状态 */
};
state_1_node_a {
/* 引脚配置状态 */
};
state_1_node_b {
/* 引脚配置状态 */
};
};
/* Client device 节点 */
device {
pinctrl-names = "idle", "default", "idle", "sleep";
pinctrl-0 = <&state_0_node_a>;
pinctrl-1 = <&state_1_node_a &state_1_node_b>;
pinctrl-2 = <&state_1_node_a &state_1_node_b>;
pinctrl-3 = <&state_1_node_a &state_1_node_b>;
};
Client 端一般情况下无需额外编写软件,按照相应的规范编写 DTS 即可。
核心 API
int pinconf_set_config(struct pinctrl_dev *pctldev,
unsigned int pin,
unsigned long *configs,
unsigned int nconfigs);
参数说明:
pctldev:PinCtrl 设备指针pin:要配置的引脚编号configs:配置参数数组nconfigs:配置参数数量(数组元素个数)