所学来自百问网
目录
1. Pinctrl 子系统
1.1 引入
要想让pinA、B用于GPIO或I2C,需要设置IOMUX(输入/输出多路复用器)让它们连接到GPIO模块或I2C模块;
所以GPIO、I2C应该是并列的关系,它们能够使用之前,需要设置IOMUX。 有时候并不仅仅是设置IOMUX,还要配置引脚,比如上拉、下拉、开漏等等。
现在的芯片动辄几百个引脚,在使用到GPIO功能时,让你一个引脚一个引脚去找对应的寄存器,这要疯掉。所以BSP工程师已经提前做好的了,BSP工程师把引脚的复用、配置抽出来,做成Pinctrl子系统,给GPIO、I2C 等模块使用,我们只需要引用就行了
1.2 概念
pin controller:可以用它来复用引脚、配置引脚
client device:声明自己要使用哪些引脚的哪些功能,怎么配置它们
1.2.1 pin controller
是一个软件上的概念,你可以认为它对应IOMUX──用来复用引脚,还可以配置引脚(比如上下拉电阻等)
注意:pin controller和GPIO Controller不是一回事,前者控制的引脚可用于GPIO功能、I2C功能;后者只是把引脚配置为输入、输出等简单的功能。即先用pin controller把引脚配置为GPIO,再用GPIO Controler把引脚配置为输入或输出。
1.2.2 client device
Pinctrl系统的客户,那就是使用Pinctrl系统的设备,使用引脚的设备。它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚。
1.pin state
pin state 对应图中的 pinctrl-names
对于一个“client device”来说,比如对于一个UART设备,它有多个“状态”:default、sleep等,那对应的引脚也有这些状态。
比如默认状态下,UART设备是工作的,那么所用的引脚就要复用为UART功能。
在休眠状态下,为了省电,可以把这些引脚复用为GPIO功能;或者直接把它们配置输出高电平。
上图中,pinctrl-names里定义了2种状态:default、sleep。
-
第0种状态用到的引脚在pinctrl-0中定义,它是state_0_node_a, 位于pincontroller 节点中。
-
第1种状态用到的引脚在pinctrl-1中定义,它是state_1_node_a, 位于pincontroller 节点中。
当这个设备处于 default 状态时,pinctrl 子系统会自动根据上述信息把所用引脚复用为uart0功能。
当这这个设备处于 sleep 状态时,pinctrl 子系统会自动根据上述信息把所用引脚配置为高电平。
2.groups 和 function
-
group:一个设备会用到一个或多个引脚,这些引脚就可以归为一组;
-
function:这些引脚可以复用为某个功能。