一、介绍
引脚复用或参数配置(如上拉/下拉、三态、驱动强度等)硬件模块被抽象为 pin controllers
。每一个 pin controllers
必须作为设备树的一个节点,就像其他硬件模块。
信号受引脚配置影响的硬件模块为指定的 client devices
。同样,每个 client devices
必须表示为设备树中的一个节点,就像任何其他硬件模块一样。
为了让客户端设备正确操作,特定的引脚控制器必须设置特定的引脚配置。一些客户端设备需要一个静态引脚配置,例如在初始化时设置。其他需要在运行时重新配置引脚,例如当设备处于非活动状态时,配置为三态引脚。因此,每个客户端设备可以定义一组命名的状态。这些状态的编号和名称由客户端设备自己的绑定定义。
此文件中定义的通用 pinctrl
绑定为客户机设备设备树节点提供了一个基础结构,以将这些状态名称映射到这些状态使用的 pin
配置。
请注意,引脚控制器本身也可能是它们自己的客户端设备。例如,一个引脚控制器可以在驱动加载时建立它自己的活动状态。这将允许在一个地方表示一个板的静态引脚配置,而不是将它分散到多个客户端设备节点。是否这样做的决定在某种程度上取决于单个板设备树文件的作者,以及绑定对该板使用的单个客户端设备施加的任何要求,即它们是否需要某些特定的命名状态来进行动态引脚配置。
二、Pinctrl client devices
对于每个客户端设备,每个 pin
状态都分配一个整数 ID
。这些数字从 0
开始,并且是连续的。对于每个状态 ID
,存在一个唯一的属性来定义引脚配置。每个状态也可以分配一个名称。当使用名称时,存在另一个属性来将这些名称映射到整数 ID
。
每个客户端设备自己的绑定决定了必须在其设备树节点中定义的一组状态,以及是否定义必须提供的一组状态 ID
,还是定义必须提供的一组状态名称。
1、必需属性
pinctrl-0
:
-
phandles
列表,每个指向一个引脚配置节点。这些引用的引脚配置节点必须是它们配置的引脚控制器的子节点。这个列表中可能存在多个条目,这样可以配置多个引脚控制器,或者可以为单个引脚控制器从多个节点构建一个状态,每个节点都是整体配置的一部分。有关这些引脚配置节点格式的详细信息,请参阅本文档的下一节。 -
在某些情况下,定义一个状态可能是有用的,但如果它是空的。这可能是必需的,当一个普通的
IP
块在一个SoC
中使用,或者没有一个引脚控制器,或者在引脚控制器不影响HW
模块的问题。如果IP
块的绑定需要某些引脚状态存在,它们仍然必须被定义,但可以保留为空。
2、可选属性
pinctrl-1
:
phandles
列表,每个指向一个引脚控制器内的一个引脚配置节点。
...
pinctrl-n
:
phandles
列表,每个指向一个引脚控制器内的一个引脚配置节点。
pinctrl-names
:
- 状态名称列表,列表条目
0
定义整数状态ID 0
的名称,列表条目1
定义状态ID 1
的名称,以此类推。
pinctrl-assert-gpios
:
phandles
列表,每个都指向GPIO
,该GPIO
被一些板设计用来在板上的两个外围设备之间引导引脚。它就像一个板级引脚复用器,通过拉下gpio
来为给定的引脚选择不同的功能。有关如何指定GPIO
的详细信息,请参阅bindings/gpio/gpio.txt
。
3、示例
1、对于需要命名状态的客户端设备
/* For a client device requiring named states */
device {
pinctrl-names = "active", "idle";
pinctrl-0 = <&state_0_node_a>;
pinctrl-1 = <&state_1_node_a &state_1_node_b>;
};
2、对于相同的设备,如果使用状态 ID
/* For the same device if using state IDs */
device {
pinctrl-0 = <&state_0_node_a>;
pinctrl-1 = <&state_1_node_a &state_1_node_b>;
};
3、对于一个 IP
块,它的绑定支持引脚配置,但在一个没有任何引脚控制硬件的 SoC
上使用。
/*
* For an IP block whose binding supports pin configuration,
* but in use on an SoC that doesn't have any pin control hardware
*/
device {
pinctrl-names = "active", "idle";
pinctrl-0 = <>;
pinctrl-1 = <>;
};
三、Pin controller devices
引脚控制器设备应该包含客户端设备引用的引脚配置节点。
1、示例
pincontroller {
... /* Standard DT properties for the device itself elided */
/* 设备本身的标准DT属性被省略 */
state_0_node_a {
...
};
state_1_node_a {
...
};
state_1_node_b {
...
};
}
每个引脚配置子节点的内容完全由单个引脚控制器设备的绑定来定义。对于这些内容没有共同的标准。
引脚配置节点不必是引脚控制器设备的直接子节点;例如,他们可能是孙辈。这是否合法,以及子节点和中间父节点之间是否有任何交互,再次完全由对单个引脚控制器设备的绑定来定义。
四、通用引脚复用节点内容
1、引脚多路复用节点
function
- 要选择的多路复用器功能。groups
- 使用此函数选择的组列表(必须指定此或“pins”
)。pins
- 使用此函数要选择的引脚列表(必须指定此或“groups”
)。
2、示例
state_0_node_a {
uart0 {
function = "uart0";
groups = "u0rxtx", "u0rtscts";
};
};
state_1_node_a {
spi0 {
function = "spi0";
groups = "spi0pins";
};
};
state_2_node_a {
function = "i2c0";
pins = "mfio29", "mfio30";
};
五、通用引脚配置节点内容
在引脚配置节点中表示的许多数据项是通用的和通用的。引脚控件绑定应该在适用的地方使用下面定义的属性;并非所有这些属性都与所有硬件或绑定结构相关或有用。每个绑定文档都应该声明使用了这些泛型属性中的哪些(如果有的话),以及包含这些属性的 DT
节点的结构。
1、受支持的泛型属性
-
pins
- 节点中属性所应用的引脚列表(必须指定这个或“group”
) -
group
- 要应用属性的组,如果驱动程序支持整个组而不是单个引脚的配置(必须指定此引脚或“pins”
) -
bias-disable
- 禁用任何引脚偏置 -
bias-high-impedance
- 高阻抗模式(第三状态,浮动) -
bias-bus-hold
-latch weakly
-
bias-pull-up
- 引脚上拉 -
bias-pull-down
- 引脚下拉 -
bias-pull-pin-default
- 使用引脚默认拉取状态 -
drive-push-pull
- 主动驱动高低 -
drive-open-drain
- 带开漏的驱动器 -
drive-open-source
- 开源驱动器 -
drive-strength
- 最多X mA
的灌电流或源电流 -
input-enable
- 引脚上的使能输入(对输出无影响) -
input-disable
- 禁用引脚上的输入(对输出无影响) -
input-schmitt-enable
- 启用施密特触发器模式 -
input-schmitt-disable
- 禁用施密特触发器模式 -
input-debounce
- 脱弹模式,脱弹时间为X -
power-source
- 选择不同的电源 -
low-power-enable
- 启用低功耗模式 -
low-power-disable
- 禁用低功耗模式 -
output-low
- 将引脚设置为低电平输出模式 -
output-high
- 将引脚设置为高电平输出模式 -
slew-rate
- 设置压摆率
2、示例
state_0_node_a {
cts_rxd {
pins = "GPIO0_AJ5", "GPIO2_AH4"; /* CTS+RXD */
bias-pull-up;
};
};
state_1_node_a {
rts_txd {
pins = "GPIO1_AJ3", "GPIO3_AH3"; /* RTS+TXD */
output-high;
};
};
state_2_node_a {
foo {
group = "foo-group";
bias-pull-up;
};
};
一些泛型属性有参数。对于那些这样做的,参数描述如下。
1、pin
将引脚名称或 ID
的列表作为必需的参数。硬件的特定绑定定义:
- 条目是整数还是字符串,以及它们的含义。
2、偏置上拉,下拉和引脚默认值作为硬件上的可选参数,以支持其以欧姆为单位的拉力强度。偏置禁用将禁用拉取。
3、驱动强度以 mA
为目标强度作为参数。
4、input-debounce
将 usec
中的去抖时间作为参数,或将 0
用于禁用去抖动。
5、关于这些参数的更深入的文档可以在 "include/linux/pinctrl/pinconf-generic.h"
。