Linux的pinctrl介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的pinctrl介绍相关的知识,希望对你有一定的参考价值。

参考技术A             pinctrl意思是pin ctrl,很简单就是系统中pin引脚的控制。文章主要针对的是嵌入式系统来说,其实PC中应该也有,但是我们实际使用还更多的是嵌入式系统需要做配置改动。对于一款SOC,设计出来之后会支持多种功能,同时在一个SOC也肯定会在多个产品中使用。对于硬件数量有限的pin脚来说,不可能适配所有的产品功能。所以硬件设计师就利用了复用功能来达到以上要求。一个pin设计假定它支持8种功能,那么实际同一时刻只有一个功能能够被配置并使用。所有的pin我们通过一个统一的控制器去控制他们的mux功能,用人话说就是选择某个功能使用。比如pin脚编号1,支持iic sda, gpio0_0, spi cs, uart rx等功能,那我们可以通过mux控制器来选择具体使用哪个功能。

            如果只是这样那就太简单了,pin在硬件领域还有所谓的上下拉输出和驱动力的配置。这个说实话作为软件设计人员,硬件说配置成啥样就啥样了,我是不懂的。用专业术语来说,就是配置DS和pull up/down功能。

            结合以上说法,pinctrl的功能就是配置mux, DS和up/down功能。正常来说,一个pin的相关控制器都在同一个32bits的寄存器当中。其中up/down控制占2位,mux功能占8位,DS功能占3位,剩下的就是预留的(只是通常情况下,实际硬件的设计各有不同,举个例子而已)。

            再说一嘴,一个SOC如果有96个pin脚,那它就肯定有96个寄存器去控制对应pin脚的功能。

            前面说了什么是pinctrl,那么问题就来了,应该怎么样去使用它,从而达到我们的目的呢?这边主要分两个部分来说,从难到易吧。作为一个嵌入式Linux系统,肯定存在类似uboot这样的bootloader,也肯定有Linux(废话)。简单的地方就说little kernel中怎么配置(因为uboot我不懂,但原理应该类似---瞎猜的),难的地方就说Linux里面怎么使用pinctrl。确实挺难的,因为特别绕~

            前面说了这个地方使用pinctrl是简单的,因为lk中我们只会用到某些引脚,而且很简单,没有复杂的引用关系。需要做的仅仅是根据需求把对应的pin寄存器去直接操作就行。类似于你们刚开始接触嵌入式时候的裸写寄存器,就这样完了。当然为了统一方便,我们会封装成一个配置寄存器函数,然后再提供一个大的config数组。数组中也有96个成员,包含所有pin脚配置和上下拉以及DS驱动力控制。这样,函数里遍历所有的数组成员,然后一个个把对应的值写进去,就完成了pinctrl的操作。

            是不是很简单,反正我觉得确实很简单~

            这里面就说来话长了,期待我的下一个文章吧。后续主要会对它进行更新

RK3588平台开发系列讲解(Pinctrl篇)Pinctrl设备树介绍

平台 内核版本 安卓版本
RK3588 Linux 5.10 Android12

以上是关于Linux的pinctrl介绍的主要内容,如果未能解决你的问题,请参考以下文章

01_Pinctrl子系统视频介绍

LINUX子系统之pinctrl子系统

LINUX子系统之pinctrl子系统

LINUX子系统之pinctrl子系统

LINUX子系统之pinctrl子系统

Linux基于IMX6ULL平台Pinctrl架构分析总结-- Client Device使用过程