gpio子系统与pinctrl子系统一:关系

直对gpio子系统 与 pinctrl子系统的关系比较模糊,最近理解了一下。 

先说结论:

  • 理解的关键在于:两者即是独立,又是互相联系。
  • 独立指软件上的独立,linux本身对于不同模块都是独立的
  • 联系是指硬件上的联系,因为都是针对硬件上的pin进行操作。
  • 芯片手册一般只有gpio章节没有pinctrl章节,pinctrl是软件上的概念,可以理解为一个模块。 
  • 在linux的软件架构上,gpio又是pinctrl的子集,gpio 子系统依赖于 pinctrl 子系统来实现;在引入设备树之后,GPIO子系统是通过pinctrl子系统来实现的,这一条是重点。
  • 只有当pinctrl 子系统将pin配置为GPIO时,才需要配置 gpio 子系统。
  • gpio子系统与pinctrl子系统相辅相成,共同构成了一个芯片对pin引脚的管理。

如下图(网上引用来的图):

 既然二者是相辅相成,那二者的分工角色分别是什么呢??

gpio子系统提供了:

1. 配置成输入时,读引脚电平值,高或低。

2. 配置成输出时,输出高低电平。

3. 作为中断引脚使用时,检测中断触发方式(此处涉及到irqchip子系统)。

或者说:

  • gpio 子系统用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO 为输入输出,读取 GPIO 的值等。
  • 在设备树中添加 gpio 相关信息,在驱动程序中使用 gpio 子系统提供的 API 函数来操作 GPIO。

pinctrl子系统提供了:

1. 引脚功能配置:通过配置寄存器选择复用成不同的引脚功能。

                             例如:作为普通的gpio,也可以作为SPI的clock。 

2. 引脚驱动配置:包括引脚内部的上拉货下拉、驱动能力等。

或者说:

  • 获取设备树中 pin 信息。
  • 根据获取到的 pin 信息来设置 pin 的复用功能
  • 根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
  • 在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成。 

因此,对于一个引脚而言,首先是功能配置。

如果配置复用功能 ,如UART时,该引脚连接的就是UART controller。

如果配置成普通GPIO口,那该引脚连接的就是GPIO controller。

=========================================================================

这里引用一段前辈的话,基本上言简意赅的概括了这部分的功能:Linux中的pinctrl和gpio子系统_万里羊的博客-CSDN博客

        基于设备树的Linux gpio驱动其本质就相当于配置LED灯所使用的的GPIO寄存器,驱动开发方式和逻辑基本没啥区别。

        Linux是一个庞大和完善的系统,尤其是驱动的框架,像GPIO这种最基本的驱动不可能采用“原始”的裸机驱动开发方式,否则就像我买了一辆自行车,结果每天推着自行车去上班一样。

        Linux内核提供了pinctrl和gpio子系统用于GPIO驱动开发,我们学会了pinctrl和gpio子系统就相当于学会了骑自行车的本领,来简化GPIO驱动开发。

       Linux驱动讲究驱动分离和分层,pinctrl和gpio子系统就是驱动分离与分层思想下的产物,驱动分离与分层就是按照面向对象编程的设计思想而设计的设备驱动框架。而pinctrl子系统重点是设置PIN(SOC或者PAD)的复用和电气属性,如果将pinctrl子系统将一个PIN服用为GPIO的话,接下来就需要用到GPIO子系统了gpio子系统顾名思义就是用于初始化GPIO并且提供相应的API函数,比如设置GPIO为输入或者输出,读取GPIO的值等功能。 

你可能感兴趣的:(#,GPIO,与,PinCtrl子系统,linux,内核,驱动程序,gpio)