Pin Control Subsystem是Linux内核抽象出的一套用于控制硬件引脚的一套子系统。html
一、源文件列表linux
源码位于linux/drivers/pinctrl目录下,源文件列表以下:数据结构
文件名 | 描述 |
core.c core.h | pin control subsystem的core driver |
pinctrl-utils.c pinctrl-utils.h | pin control subsystem的一些utility接口函数 |
pinmux.c pinmux.h | pin control subsystem的core driver(pin muxing部分的代码,也称为pinmux driver) |
pinconf.c pinconf.h | pin control subsystem的core driver(pin config部分的代码,也称为pin config driver) |
devicetree.c devicetree.h | pin control subsystem的device tree代码 |
pinctrl-xxxx.c | 各类pin controller的low level driver。 |
在pin controller driver文档中 ,咱们以2416的pin controller为例,描述了一个具体的low level的driver,这个driver涉及的文件包括pinctrl-samsung.c,pinctrl-samsung.h和pinctrl-s3c24xx.c,具体位于ux/drivers/pinctrl/samsung目录。架构
二、和其余内核模块接口头文件框架
不少内核的其余模块须要用到pin control subsystem的服务,这些头文件就定义了pin control subsystem的外部接口以及相关的数据结构。咱们整理linux/include/linux/pinctrl目录下pin control subsystem的外部接口头文件列表以下(在4.1内核中已经找不到如下文件):函数
文件名 | 描述 |
consumer.h | 其余的driver要使用pin control subsystem的下列接口: a、设置引脚复用功能 b、配置引脚的电气特性 这时候须要include这个头文件 |
devinfo.h | 这是for linux内核的驱动模型模块(driver model)使用的接口。struct device中包括了一个struct dev_pin_info *pins的成员,这个成员描述了该设备的引脚的初始状态信息,在probe以前,driver model中的core driver在调用driver的probe函数以前会先设定pin state |
machine.h | 和machine模块的接口。 |
三、Low level pin controller driver接口spa
咱们整理linux/include/linux/pinctrl目录下pin control subsystem提供给底层specific pin controller driver的头文件列表以下:.net
文件名 | 描述 |
pinconf-generic.h | 这个接口主要是提供给各类pin controller driver使用的,不是外部接口。 |
pinconf.h | pin configuration 接口 |
pinctrl-state.h | pin control state状态定义 |
pinmux.h | pin mux function接口 |
pin control subsystem的主要功能包括:设计
(A)管理系统中全部能够控制的pin。在系统初始化的时候,枚举全部能够控制的pin,并标识这些pin。htm
(B)管理这些pin的复用(Multiplexing)。对于SOC而言,其引脚除了配置成普通GPIO以外,若干个引脚还能够组成一个pin group,造成特定的功能。例如pin number是{ 0, 8, 16, 24 }这四个引脚组合造成一个pin group,提供SPI的功能。pin control subsystem要管理全部的pin group。
(C)配置这些pin的特性。例如配置该引脚上的pull-up/down电阻,配置drive strength等。
Pin Control Subsystem和GPIO subsystem交互
为什么pin control subsystem要和GPIO subsystem交互?
做为软件工程师,咱们指望的硬件设计应该以下图所示:
GPIO的HW block应该和其余功能复用的block是对等关系的,它们共同输入到一个复用器block,这个block的寄存器控制哪个功能电路目前是active的。pin configuration是全局的,不论哪一种功能是active的,均可以针对pin进行电气特性的设定。这样的架构下,上图中红色边框的三个block是彻底独立的HW block,其控制寄存器在SOC datasheet中应该是分红三个章节描述,同时,这些block的寄存器应该分别处于不一样的地址区间。
对于软件工程师,咱们可让pin control subsystem和GPIO subsystem彻底独立,各自进行初始化,各自映射本身的寄存器地址空间,对于pin control subsystem而言,GPIO和其余的HW block没有什么不一样,都是使用本身提供服务的一个软件模块而已。然而实际上SOC的设计并不是老是向软件工程师指望的那样,有的SOC的设计框架图以下:
这时候,GPIO block是alway active的,而红色边框的三个block是紧密的捆绑在一块儿,它们的寄存器占据了一个memory range(datasheet中用一个章节描述这三个block)。这时候,对于软件工程师来讲就有些纠结了,原本不属于个人GPIO控制也被迫要参与进来。这时候,硬件寄存器的控制都是pin controller来处理,GPIO相关的操做都要通过pin controller driver,这时候,pin controller driver要做为GPIO driver的back-end出现。
Reprinted From:http://www.wowotech.net/gpio_subsystem/pin-control-subsystem.html