linux内核pinctrl子系统分析

一、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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值