PinCtrl子系统(上)

PinCtrl子系统其实就是引脚控制器,确定引脚连接到芯片的内部那个模块之上。

 

 

Pinctrl:Pin Controller,顾名思义,就是用来控制引脚的:

  • 引脚枚举与命名(Enumerating and naming)

  • 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能

  • 引脚配置(Configuration):比如上拉、下来、open drain、驱动强度等

Pinctrl驱动由芯片厂家的BSP工程师提供,一般的驱动工程师只需要在设备树里:

  • 指明使用那些引脚

  • 复用为哪些功能

  • 配置为哪些状态

在一般的设备驱动程序里,甚至可以没有pinctrl的代码。

对于一般的驱动工程师,只需要知道“怎么使用pinctrl”即可。

这会涉及2个对象:pin controller、client device。

前者提供服务:可以用它来复用引脚、配置引脚。

后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们。

a. pin controller:

在芯片手册里你找不到pin controller,它是一个软件上的概念,你可以认为它对应IOMUX──用来复用引脚,还可以配置引脚(比如上下拉电阻等)。

注意,pin controller和GPIO Controller不是一回事,前者控制的引脚可用于GPIO功能、I2C功能;后者只是把引脚配置为输入、输出等简单的功能。即先用pin controller把引脚配置为GPIO,再用GPIO Controler把引脚配置为输入或输出。

 

b. client device

“客户设备”,谁的客户?Pinctrl系统的客户,那就是使用Pinctrl系统的设备,使用引脚的设备。它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚。

下面这个图就可以把几个重要概念理清楚:

上图中,左边是pin controller节点,右边是client device节点:

a. pin state:

对于一个“client device”来说,比如对于一个UART设备,它有多个“状态”:default、sleep等,那对应的引脚也有这些状态。

第0种状态用到的引脚在pinctrl-0中定义,它是state_0_node_a,位于pincontroller节点中。

第1种状态用到的引脚在pinctrl-1中定义,它是state_1_node_a,位于pincontroller节点中。

b. groups和function:

一个设备会用到一个或多个引脚,这些引脚就可以归为一组(group);

这些引脚可以复用为某个功能:function。

c. Generic pin multiplexing node和Generic pin configuration node

在上图左边的pin controller节点中,有子节点或孙节点,它们是给client device使用的。

可以用来描述复用信息:哪组(group)引脚复用为哪个功能(function);

可以用来描述配置信息:哪组(group)引脚配置为哪个设置功能(setting),比如上拉、下拉等。

注意:pin controller节点的格式,没有统一的标准!!!!每家芯片都不一样。

      甚至上面的group、function关键字也不一定有,但是概念是有的。

 

posted @ 2022-03-25 13:36  咸阳梁硕  阅读(90)  评论(0)    收藏  举报