参考文档:
建议配合 GPIO 子系统使用。
建议,复制 原文链接观看,排版清晰,便于学习:
pinctrl子系统 用于引脚的配置。如复用为那种引脚,电器特性等等。
gpio子系统 用于引脚的控制。如配置输出,输出高低电平等等。
当pinctrl子系统配置引脚为GPIO模式后,才能用gpio子系统控制引脚。
(pinctrl子系统可以把引脚配置为 GPIO模式,I2C模式* 等等*)
pinctrl子系统内核文档:Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
pinctrl子系统源码路径:drivers/pinctrl
pinctrl子系统 主要工作内容(内核实现):
以上工作内容都是内核实现的,用户不需要自己编写代码,只需要配置好设备树即可。
pin controller 子节点格式是由芯片厂商自定义的,即每家芯片pin controller子节点格式都是不一样的。
各个厂商的 pinctrl 使用说明可以参考厂商提供的文档或去内核源码路径 Documentation/devicetree/bindings/pinctrl 目录下找到对应厂商的使用说明。
格式规范如:
imx6ull格式:
//client端:
@节点名字 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_自定义名字A>;
status = "okay";
};
//pincontroller服务端
pinctrl_自定义名字A: 自定义名字B {
fsl,pins = <
引脚复用宏定义 PAD(引脚)属性, // 引脚 A
引脚复用宏定义 PAD(引脚)属性; // 引脚 B
>;
};
rk3288实例:
//client端
@uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>; //它使用三个节点来表示三组引脚。
status = "okay";
};
//pincontroller服务端
gpio4_uart0 {
// 引脚 A
uart0_xfer: uart0-xfer {
rockchip,pins = <UART0BT_SIN>, <UART0BT_SOUT>; //使用rockchip,pins来指定使用哪些引脚,就等效于groups
rockchip,pull = <VALUE_PULL_DISABLE>; //引脚的参数
rockchip,drive = <VALUE_DRV_DEFAULT>; //引脚的参数
};
// 引脚 B
uart0_cts: uart0-cts {
rockchip,pins = <UART0BT_CTSN>;
rockchip,pull = <VALUE_PULL_DISABLE>;
rockchip,drive = <VALUE_DRV_DEFAULT>;
};
// 引脚 C
uart0_rts: uart0-rts {
rockchip,pins = <UART0BT_RTSN>;
rockchip,pull = <VALUE_PULL_DISABLE>;
rockchip,drive = <VALUE_DRV_DEFAULT>;
};
uart0_rts_gpio: uart0-rts-gpio {
rockchip,pins = <FUNC_TO_GPIO(UART0BT_RTSN)>;
rockchip,drive = <VALUE_DRV_DEFAULT>;
};
};
上面例子中说到 pin controller 和 client device,这两个节点说明都在文件 pinctrl-bindings.txt 中有说明。
pin controller:
client device:
/* For a client device requiring named states */
device {
pinctrl-names = "active", "idle"; // 该设备有两种状态,分别对应 pinctrl-0 和 pinctrl-1
pinctrl-0 = <&state_0_node_a>; // 第 0 个状态的名字为 active。对应的引脚在 pinctrl-0 里。
pinctrl-1 = <&state_1_node_a &state_1_node_b>; // 第 1 个状态的名字为 idle。对应的引脚在 pinctrl-1 里。
};
function:
groups:
如:
state_0_node_a
{
uart0
{
function = "uart0";
groups = "u0rxtx", "u0rtscts";
};
};
以 IMX6UL 为例子分析。
参考 NXP 提供的关于 pinctrl 文档或去 Documentation/devicetree/bindings/pinctrl 下找到文档 fsl,imx6ul-pinctrl.txt 和 fsl,imx-pinctrl.txt。
工具相应文档编写 pinctrl 配置信息。
根据文档得出以下几点关于 IMX6ULL pinctrl 子系统开发的要求:
有些SoC 把 PIN 叫 PAD
格式有芯片厂商定义
引脚复用宏 & 引脚属性值:
引脚复用宏定义 如 MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 在 内核源码/arch/arm/boot/dts/imx6ul-pinfunc.h 文件中定义,由芯片厂商编写。
如图:
引脚复用宏 由5个参数组成,分别为:
前面三个均为 寄存器地址偏移值,后面两个为对应要写入寄存器的值。
对应规则:
格式规范由设备树规定
客户端其实就是需要使用该引脚的设备树节点。
客户端必须至少有一个 pinctrl-0 状态。
原文:https://www.cnblogs.com/lizhuming/p/14647471.html