【Linux】Pinctrl子系统简介

前言:

我们工作开发中非常常用的就是GPIO,在Linux开发中,是有必要去熟悉并理解的。在Linux内核中也有提供相应的子系统pinctrl子系统,本文从大的面上去了解它

参考学习:Linux笔记老师课程(Pinctrl子系统)

https://live.csdn.net/v/219059?spm=1001.2014.3001.5501

https://xuesong.blog.csdn.net/article/details/109522945?spm=1001.2014.3001.5502

https://blog.csdn.net/qq_33487044/article/details/123468166

https://blog.csdn.net/qq_33487044/article/details/110010020

现阶段,先学到这里了,这一部分的内容后续会结合具体的例子实践,深入学习理解。

一、Pinctrl子系统概述 

gpio引脚除了作为普通输入输出端口之外化具有接入其他控制器的功能。但是引脚的功能分配和特性配置是个繁琐的工作。这个问题如何去解决呢?

Pinctrl子系统就是来解决上述问题的,它主体上有两类设置,其中一类是功能选择,即用作iic、uart还是作为普通gpio。另一类则是gpio的特性配置,即上拉、下拉、驱动能力和速率的配置。 

【Linux】Pinctrl子系统简介_第1张图片

总述,Linux Pinctrl子系统提供的功能:

  • 管理系统中所有的可以控制的pin,在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin.
  • 管理这些pin的复用 (Multiplexing) 。对于SOC而言,其引脚除了配置成普通的GPI0之外,若干个引脚还可以组成一个pin group,特定的功能。pin controlsubsystem要管理所有的pin group。
  • 配置这些pin的特性。例如使能或关闭引脚上的pul-up、pull-down电阻,配置引脚的driver strength。

二、Pinctrl的具体框架

Pinctrl整个驱动模块可以分为4个部分:

  • pinctrl api:提供给上层用户调用的接口
  • pinctrl common framework:提供给上层用户调用的接口
  • pinctrl driver:平台需要实现的驱动
  • board configuration:设备pin配置信息。

【Linux】Pinctrl子系统简介_第2张图片

  • 在Pinctrl core可以看到有三个状态,default、sleep以及idle。系统正常运行时,会先按默认的配置或者处于空闲的状态;系统进入休眠状态时,为节省功耗,需要对设备pin进行另一组配置。
  • Pinctrl framework 主要处理 pinstate、pinmux 和 pinconfig 三个功能,映射关系如上图所示。

三、Pinctrl dts配置例子

uart0_pins: uart0-pins {
	pins = "18", "19";
	function = "uart0";
};
uart0_sleep_pins: uart0-pins {
	pins = "18", "19";
	function = "gpio";
};
...
&uart0 {
	pinctrl-names = "default","sleep";
	pinctrl-0 = <&uart0_pins>;
	pinctrl-1 = <&uart0_sleep_pins>;
	status = "okay";
};

pinctrl-0对应上述uart0-pins,这里pin会配置为uart功能,对应18、19号引脚。pinctrl-1对应上述的uart0_sleep_pins,系统进入休眠时,这里pin会配置为gpio功能。

你可能感兴趣的:(嵌入式Linux驱动,嵌入式硬件,驱动开发)