前言:
我们工作开发中非常常用的就是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子系统提供的功能:
- 管理系统中所有的可以控制的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配置信息。
文章来源:https://www.toymoban.com/news/detail-466699.html
- 在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功能。文章来源地址https://www.toymoban.com/news/detail-466699.html
到了这里,关于【Linux】Pinctrl子系统简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!