文章目录
BSP工程师针对芯片的寄存器写Pinctrl子系统,驱动工程师使用Pinctrl 子系统
Pinctrl 子系统重要概念
概述
无论是哪种芯片,都有类似图的结构, IOMUX 认为是引脚功能选择器,有时候还需要配置引脚,比如上拉、下拉、开漏等等。前面提到的这些操作都可以交给Pinctrl 子系统完成。即把引脚的复用、配置抽出来,做成 Pinctrl 子系统,给 GPIO、I2C 等模块使用

ps:大多数的芯片,没有单独的 IOMUX 模块,即没有pinctl子系统去管理引脚的复用、配置等等,这些功能都在GPIO 模块内部实现的,所以在硬件上 GPIO 和 Pinctrl 是密切相关,在软件上它们的关系也非常密切
重要概念
涉及 2 个对象:pin controller、client device。
- 前者提供服务:可以用它来复用引脚、配置引脚。
- 后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们。
pin controller:
在芯片手册里你找不到 pin controller,它是一个软件上的概念,你可以认为它对应 IOMUX──用来复用引脚,还可以配置引脚(比如上下拉电阻等)
注意,pin controller 和 GPIO Controller 不是一回事,前者控制的引脚可用于 GPIO 功能、I2C 功能;后者只是把引脚配置为输入、输出等简单的功能。即
先用 pin controller 把引脚配置为 GPIO,再用 GPIO Controler 把引脚配置为输入或输出。
client device:
Pinctrl 系统的客户,那就是使用 Pinctrl 系统的设备,使用引脚的设备。它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚
关系图,右边device是设备树的一个节点,它是Pinctrl 系统的客户

首先是介绍一个概念引脚的状态:pin state:
- 对于一个“client device”来说,比如对于一个 UART 设备,它有多个“状态”:default、sleep 等,如默认状态下,UART 设备是工作的,那么所用的引脚就要复用为 UART功能。在休眠状态下,为了省电,可以把这些引脚复用为 GPIO 功能;或者直接把它们配置输出高电平。上图中,pinctrl-names 里定义了 2 种状态:default、sleep。
某种状态下对应的引脚配置有如下关联:
- 第 0 种状态用到的引脚在 pinctrl-0 中定义,它是 state_0_node_a,位于 pincontroller 节点中。当这个设备处于 default 状态时,pinctrl 子系统会自动根据上述信息
把所用引脚复用为 uart0 功能。 - 第 1 种状态用到的引脚在 pinctrl-1 中定义,它是 state_1_node_a,位于 pincontroller 节点中。当这这个设备处于 sleep 状态时,pinctrl 子系统会自动根据上述信息
把所用引脚配置为高电平。
左图 pin controller 节点中,是给client device 使用的。
- 可以用来描述复用信息:哪组(group)引脚复用为哪个功能(function);
- 可以用来描述配置信息:哪组(group)引脚配置为哪个设置功能(setting),比如上拉、下拉等。
注意:pin controller 节点的格式,没有统一的标准,每家芯片都不一样。甚至上面的 group、function关键字也不一定有,但是概念是有的。
代码中怎么引用 pinctrl
当设备切换状态时,对应的pinctrl 就会被调用。比如在 platform_device 和 platform_driver 的枚举过程中,流程如下:

当系统休眠时,也会去设置该设备 sleep 状态对应的引脚,不需要我们自己去调用代码。非要自己调用,也有函数:
devm_pinctrl_get_select_default(struct device *dev); // 使用"default" 状态的引脚
pinctrl_get_select(struct device *dev,

文章介绍了Pinctrl子系统和GPIO子系统在芯片引脚管理中的重要概念。Pinctrl子系统负责引脚的复用和配置,包括pincontroller(服务提供者)和clientdevice(服务使用者)。clientdevice在设备树中声明所需引脚的功能和配置。GPIO子系统则用于配置引脚为GPIO功能,读写引脚值。在设备树中指定引脚,然后在驱动代码中调用相关函数进行操作。文章强调了在软件设计中,利用Pinctrl和GPIO子系统可以实现单板无关的驱动代码。


被折叠的 条评论
为什么被折叠?



