一、pinctrl子系统简介
在许多soc内部都包含有pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。各个厂商soc的pin脚在使用中,都有许多共同的特性,要么配置,要么复用pin脚。所以内核提供了一套代码来管理这些pin,这就是pinctrl子系统。主要实现的功能:
(1)管理系统中所有的可以控制的pin,在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin。 (2)管理这些pin的复用(Multiplexing)。对于SOC而言,其引脚除了配置成普通的GPIO之外,若干个引脚还可以组成一个pin group,行程特定的功能。pin control subsystem要管理所有的pin group。 (3)配置这些pin的特性。例如使能或关闭引脚上的pull-up、pull-down电阻,配置引脚的driver strength。
如图所示的pinctrl逻辑框图,实现pinctrl子系统的功能,core在初始化时,由处理器抽象pin描述,在pinctrl core中枚举所有的pin描述。当我们的驱动层driver使用pinctrl时,会进入pinctrl core会去分析这些pin的枚举,映射,设置,配置pin和pin group。
二、pinctrl 在dts文件中的描述
1、在使用pincrtl时,就涉及pinctrl在设备树中是如何描述的,在dts文件中,将一个处理器所使用的的pin用bank和group来描述。
a、何为bank?
所谓pin bank,就是以引脚名为依据,就是一组GPIO控制器的描述,如s3c2440A这块芯片,阅读它的datasheet就可以知道有9组GPIO,如图所示:
所以我们在dts中就把这9组GPIO枚举为pin bank。这里分析一部分,其他的类似。
gpa: gpa { gpf: gpf {
gpio-controller; gpio-controller;
#gpio-cells = <2>; #gpio-cells = <2>;
}; interrupt-controller; #interrupt-cells = <2>; };
如gpa: gpa 这个child node 就是描述GPA这个组,也就是gpa bank.。当然了 gpio-controller;表示这是一个GPIO控制器,有的GPIO控制器也可以是中断控制器,如gpf: gpf,之前的LED实验就用到了。#gpio-cells = <2>;表示使用这个bank的GPIO时,需要用两个32位数去描述。肯定是GPIO number和初始电平。不信可以阅读linux-4.19.8\Documentation\devicetree\bindings\pinctrl\samsung-pinctrl.txt
b、何为group?
从字面意思理解就是一个类似集群,将不同的pin number组合在一个。group以功能为依据,我们在JZ2440的LCD驱动中,需要使用gpc bank中的(1、2、3、4、8、9、10、11、12、13、14、15)gpd bank中的(0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15)来读写数据,我们把这些具体pin number组合在一起,我们称之为一个group。同时这些组合在一起的pin number又可能实现不同的功能,就用samsung,pin-function、samsung,pin-val等来描述区分。这样子samsung,pins和samsung,pin-function构成child node。来描述设备使用pinctrl时的具体功能。
lcd_pinctrl: lcd_pinctrl {
samsung,pins = "gpc-8", "gpc-9", "gpc-10", "gpc-11", "gpc-12", "gpc-13", "gpc-14", "gpc-15",
"gpd-0", "gpd-1", "gpd-2", "gpd-3", "gpd-4", "gpd-5", "gpd-6", "gpd-7",
"gpd-8", "gpd-9", "gpd-10", "gpd-11", "gpd-12", "gpd-13", "gpd-14", "gpd-15",
"gpc-1", "gpc-2", "gpc-3", "gpc-4";
samsung,pin-function = <2>;
};
samsung,pins:描述了LCD读写数据所使用的pin number,
samsung,pin-function:将这些GPIO初始值设置为2,具体是什么功能,有datasheet解释。这一个关于初始值的描述并不只是 samsung,pin-function,对于samsung来说,还有如下几种:具体阅读linux-4.19.8\Documentation\devicetree\bindings\pinctrl\samsung-pinctrl.txt
- samsung,pin-val: Initial value of pin output buffer.
- samsung,pin-pud: Pull up/down configuration.
- samsung,pin-drv: Drive strength configuration.
- samsung,pin-pud-pdn: Pull up/down configuration in power down mode.
- samsung,pin-drv-pdn: Drive strength configuration in power down mode.
2、设备节点引用pinctrl
在lcd这个节点中dts文件是如下描述的,省略其他不需要的东西。
fb0: fb@4d000000{
compatible = "jz2440,lcd";
...
pinctrl-names = "default";
pinctrl-0 = <&lcd_pinctrl &lcd_backlight>;
...
}
state:pinctrl-names其实就是设置设备的某种初始状态,比如内核自己定义的"default","init","idel","sleep"状态;也可以是其他自己定义的状态, 比如串口的"flow_ctrl"状态(使用流量控制)。
pinctrl-0 就是正常引用pin config,也就是调用lcd_pinctrl这个group配置LCD读写数据的GPIO。
三、pinctrl子系统涉及的文件
以JZ2440开发板的LCD的dts文件为例,介绍了pinctrl在dts中的几个重要组成部分。接下来真正开始分析pinctrl子系统。
1、pinctrl涉及的主要处理文件
Linux/drivers/pinctrl
core.c core.h //pin contr