NXP提供Linux源码,具体文档目录:linux-imx-4.1.15\Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt。
一、介绍
控制引脚复用或配置参数(如上拉/下拉、三态、驱动强度等)的硬件模块被指定为引脚控制器。 每个引脚控制器都必须表示为设备树中的一个节点,就像任何其他硬件模块一样。
其信号受管脚配置影响的硬件模块是指定的客户端设备。 同样,每个客户端设备都必须表示为设备树中的一个节点,就像任何其他硬件模块一样。
为了使客户端设备正确运行,某些引脚控制器必须设置某些特定的引脚配置。 一些客户端设备需要单个静态引脚配置,例如在初始化期间设置。 其他人需要在运行时重新配置引脚,例如当设备处于非活动状态时将引脚设置为三态。 因此,每个客户端设备都可以定义一组命名状态。 这些状态的数量和名称由客户端设备自己的绑定定义。
此文件中定义的常见 pinctrl 绑定为客户端设备设备树节点提供了一个基础结构,以将这些状态名称映射到这些状态使用的引脚配置。
请注意,引脚控制器本身也可能是它们自己的客户端设备。 例如,当驱动程序加载时,引脚控制器可以设置自己的“active”状态。 这将允许在单个位置表示板的静态引脚配置,而不是将其拆分到多个客户端设备节点。 是否执行此操作的决定在某种程度上取决于单个板设备树文件的作者,以及绑定对该板使用的单个客户端设备施加的任何要求,即它们是否需要某些特定的命名状态来进行动态引脚配置。
二、Pinctrl 客户端设备
对于每个客户端设备,每个引脚状态都分配有一个整数 ID。 这些数字从 0 开始,并且是连续的。 对于每个状态 ID,存在一个唯一属性来定义引脚配置。 每个状态也可以被分配一个名称。 使用名称时,存在另一个属性以从这些名称映射到整数 ID。
每个客户端设备自己的绑定确定必须在其设备树节点中定义的状态集,以及是否定义必须提供的状态 ID 集,或者是否定义必须提供的状态名称集。
必须属性:
pinctrl-0:phandles 列表,每个都指向一个引脚配置节点。 这些引用的引脚配置节点必须是它们配置的引脚控制器的子节点。 此列表中可能存在多个条目,以便可以配置多个引脚控制器,或者可以从多个节点为单个引脚控制器构建状态,每个节点都构成整体配置的一部分。 有关这些引脚配置节点格式的详细信息,请参阅本文档的下一部分。在某些情况下,定义一个状态可能很有用,但它是空的。 当在没有引脚控制器的 SoC 中使用公共 IP 块时,或者在引脚控制器不影响相关硬件模块的情况下,可能需要这样做。 如果该 IP 块的绑定需要存在某些引脚状态,则它们仍必须定义,但可以留空。
可选属性:
pinctrl-1:phandle 列表,每个都指向 pin 控制器中的 pin 配置节点。
……
pinctrl-n:phandle 列表,每个都指向 pin 控制器中的 pin 配置节点。
pinctrl-names:要分配状态的名称列表。 列表条目 0 定义整数状态 ID 0 的名称,列表条目 1 定义状态 ID 1 的名称,依此类推。
pinctrl-assert-gpios:phandle 列表,每个都指向一个 GPIO,某些电路板设计使用该 GPIO 来控制电路板上两个外围设备之间的引脚。 它就像一个板级引脚多路复用器,通过上拉/下拉 GPIO 为给定的引脚选择不同的功能。 有关如何指定 GPIO 的详细信息,请参阅 bindings/gpio/gpio.txt。
例如:
/* 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>;
};
/* 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>;
};
/*
* 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 = <>;
};
三、引脚控制器设备
引脚控制器设备应包含客户端设备引用的引脚配置节点。
例如:
pincontroller {
... /* Standard DT properties for the device itself elided */
state_0_node_a {
...
};
state_1_node_a {
...
};
state_1_node_b {
...
};
}
这些引脚配置子节点中的每一个的内容完全由各个引脚控制器设备的绑定定义。 此内容没有通用标准。
引脚配置节点不必是引脚控制器设备的直接子节点; 例如,他们可能是孙辈。 这是否合法,以及子节点和中间父节点之间是否存在任何交互,再次完全由单个引脚控制器设备的绑定来定义。
四、通用管脚复用节点内容
引脚复用节点:
function:要选择的多路复用器功能。
groups:使用此功能选择的组列表(必须指定 this 或“pins”)。
pins:使用此功能选择的引脚列表(必须指定此或“groups”)
例如:
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 节点的结构。
支持的通用属性有:
pins:节点中的属性适用的引脚列表(必须指定此或“group”)
group:如果驱动程序支持整个组而不是单个引脚的配置,则应用属性的组(必须指定 this 或“pins”)
bias-disable:禁用任何引脚偏置
bias-high-impedance:高阻抗模式(“third-state”, “floating”)
bias-bus-hold:弱锁存
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:设置转换速率
例如:
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 将 pin 名称或 ID 列表作为必需参数。 硬件的特定绑定定义:
- 条目是整数还是字符串,以及它们的含义。
2、bias-pull-up、-down 和 -pin-default 作为支持它的硬件的可选参数,以欧姆为单位的拉力。 偏置禁用将禁用拉动。
3、drive-strength 以 mA 为单位的目标强度作为参数。
4、input-debounce 将 usec 中的去抖时间作为参数或 0 以禁用去抖。
关于这些参数的更深入的文档可以在 <include/linux/pinctrl/pinconf-generic.h> 中找到。