reference:
Linux pinctrl 子系统 - BSP-路人甲 - 博客园
1.pinctrl
子系统概述
pinctrl子系统涉及两个概念:
Pin controller devices
在dts中定义具体pin 复用信息,配置信息的地方,也是与pinctrl driver匹配的device
Pinctrl client devices
在dts中引用pin controller devices的具体设备
2.pinctrl子系统使用
a.pin controller devices dts配置
这里以imx6ull上最简单的led为例,pin controller devices中需要加上led pin的复用信息和配置信息
&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 /* SD1 CD */
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
//MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */
>;
};
...
pinctrl_gpioled: gpioledgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10b0
>;
};
...
};
};
imx6ull中pin controller devices 名字是iomuxc,名称每个半导体厂商都可以自定义,主要是和pin controller driver匹配即可;上述dts是对iomuxc节点进行追加,原始定义在imx6ull.dtsi中如下
iomuxc: iomuxc@020e0000 {
compatible = "fsl,imx6ul-iomuxc";
reg = <0x020e0000 0x4000>;
};
所以在kernel中搜索"fsl,imx6ul-iomuxc"可以找到pinctrl driver的实现,在drivers/pinctrl/freescale/pinctrl-imx6ul.c,后续会详解,说回pinctrl client devices dts配置
b.pinctrl client devices dts配置
gpioled{
compatible = "alientek,gpio-led";
status = "okay";
pinctrl-0 = <&pinctrl_gpioled>;
led-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
};
gpioled是我们led设备,需要设置io复用以及配置信息,只要在gpioled设备中引用我们在pin controller devices dts中定义好的pinctrl_gpioled,在gpioled 对应的ko insmode 的时候就会按照pinctrl_gpioled中的定义自动帮我们配置好pinctrl相关的信息