Pinctrl框架是linux系统为统一各SOC厂商pin管理,避免各SOC厂商各自实现相同pin管理子系统而提出的。目的是为了减少SOC厂商系统移植工作量。
许多SoC 内部都包含pin 控制器,通过pin 控制器,我们可以配置一个或一组引脚的功能和特性。在软件上,Linux 内核pinctrl驱动可以操作pin 控制器为我们完成如下工作:
Ø 枚举并且命名pin控制器可控制的所有引脚;
Ø 提供引脚的复用能力
Ø 提供配置引脚的能力,如驱动能力、上拉下拉、数据属性等。
Ø 与gpio子系统的交互
Ø 实现pin中断
Pincontroller: 是对硬件模块的软件抽象,通常用来表示硬件控制器。能够处理引脚复用、属性配置等功能。
Pin: 根据芯片不同的封装方式,可以表现为球形、针型等。软件上采用常用一组无符号的整数[0-maxpin]来表示。
Pingroups: 外围设备通常都不只一个引脚,比如SPI,假设接在soc的{0,8,16,24}管脚,而另一个设备I2C接在SOC的{24,25}管脚。我们可以说这里有两个pin groups。很多控制器都需要处理pin groups。因此管脚控制器子系统需要一个机制用来枚举管脚组且检索一个特定组中实际枚举的管脚。
Pinconfig: 管脚可以被软件配置成多种方式,多数与它们作为输入/输出时的电气特性相关。例如,可以设置一个输出管脚处于高阻状态,或是“三态”(意味着它被有效地断开连接)。或者可以通过设置将一个输入管脚与VDD或GND相连(上拉/下拉),以便在没有信号驱动管脚时可以有个确定的值。
Pinmux:引脚复用功能,使用一个特定的物理管脚(ball/pad/finger/等等)进行多种扩展复用,以支持不同功能的电气封装的习惯。
Devicetree: 犹如它的名字,是一颗包括cpu的数量和类别,内存基地址,总线与桥,外设连接\中断控制器和、gpio以及clock器等系统资源的树,Pinctrl驱动支持从device tree中定义的设备节点获取pin的配置信息。
script : 指的是打包到img中的sys_config.fex文件. 包含系统各模块配置参数。
一、驱动框架
总体框架
Sunxi Pinctrl 驱动模块的框架如下图所示,整个驱动模块可以分成4个部分:pinctrl api、pinctrl common frame、sunxi pinctrl driver and board configuration。
Pinctrl api: pinctrl提供给上层用户调用的接口。
Pinctrl framework: Linux提供的pinctrl 驱动框架。
Pinctrl sunxi driver: sunxi平台需要实现的驱动。
Board configuration: 设备pin配置信息,格式device tree source 或者sys_config.
Pinctrl framework 主要处理pinstate、pinmux 和pinconfig三个功能,pinstate和pinmux、pinconfig映射关系如下图所示。
系统运行在不同的状态,pin配置有可能不一样,比如系统正常运行时,设备的pin需要一组配置,但系统进入休眠时,为了节省功耗,设备pin需要另一组配置。Pinctrl framwork能够有效管理设备在不同状态下的引脚配置。
二、外部接口
1.pinctrl
pinctrl_get
pinctrl_put
devm_pinctrl_get
devm_pinctrl_put
pinctrl_lookup_state
pinctrl_select_state
devm_pinctrl_get_select
devm_pinctrl_get_select_default
pin_config_get
pin_config_set
pin_config_group_get
pin_config_group_set
2.gpio
gpio_request
gpio_free
gpio_direction_input
gpio_direction_output
__gpio_get_value
__gpio_set_value
of_get_named_gpio