1、前言
在嵌入式系统中,许多SoC的内部都包含了pin控制器,通过芯片内部的pin控制器,我们可以配置一个或者一组引脚的状态和功能特性,Linux内核为了统一各SoC厂商的引脚管理,提供了pinctrl子系统。

2、引脚功能分类
嵌入式芯片手册往往有一个GPIO控制的章节来描述SoC的引脚如何进行配置,该描述具有大量的寄存器操作,但是通过配置这些寄存器实现的功能基本有三类,如下:

(1)通过设置pin controller硬件的控制单元,可以实现

(1.1)引脚的功能配置,例如设定I/O引脚是普通的GPIO输入输出功能,还是具有特殊功能的引脚;

(1.2)引脚特性配置,例如引脚内部的上/下拉电阻和驱动强度的设定。

(2)如果一组pin被配置成SPI,则将会和SPI controller连接,如果配置成了GPIO,则将会和GPIO controller进行连接,通过配置GPIO controller的寄存器,可以实现
(2.1)设置GPIO的方向,例如输入或者输出;
(2.2)当GPIO设置为输出方向时,能够设定该引脚的电平是高电平还是低电平;
(2.3)当GPIO设置为输入方向时,能够读取该引脚的电平状态。

(3)如果IO口具有中断控制功能时,通过访问IO口的中断控制寄存器,可以实现
(3.1)设置中断控制是否使能;
(3.2)设置中断的触发方式,例如上升沿/下降沿触发;
(3.3)通过设置寄存器将中断状态清除。

3、通过软件抽象来掩盖硬件差异
在Linux的内核的pinctrl系统架构中,使用了3个软件模块来对应上述的三类功能,如下:
(1)pinctrl子系统,用于pin controller硬件的驱动软件子系统;
(2)GPIO subsystem,用于GPIO controller硬件的驱动软件子系统;
(3)GPIO interrupt chip driver,该模块作为interrupt subsystem的底层硬件驱动模块存在。
下图为pinctrl subsystem的模块图:

底层的specific pin controller driver是硬件相关的模块,与嵌入式SoC相关,pin control core模块是一个与硬件无关的模块,它抽象了所有pin controller的硬件特性,它对用户(other driver)提供了顶层的接口函数,因此,用户不再需要关注pin controller的硬件底层相关知识。

下图则是GPIO subsystem的模块图:

该软件框架图和pinctrl subsystem的软件框架图一样,其软件抽象的思想是一样的,内部的具体实现不一样。

4、pinctrl子系统相关文件

(1)核心源文件
在kernel/drivers/pinctrl目录下,包含了pinctrl子系统的核心驱动文件:

在最后的源文件pinctrl-xxx.c,举个例子,例如高通msm提供的pinctrl子系统底层驱动文件有如下文件pinctrl-msm.c、pinctrl-msm.h、pinctrl-msm-tlmm.c。

(2)内核模块提供的接口文件
Linux内核中很多模块需要用到pinctrl子系统的服务,因此需要提供pinctrl子系统的外部接口和相关的数据结构,这些头文件在kernel/include/linux/pinctrl目录下,列表如下:

(3)与SoC相关的底层pinctrl子系统驱动接口
pinctrl子系统提供给底层驱动实现的头文件如下:

5、pinctrl子系统与其它内核模块关系

pinctrl子系统与其它内核模块的关系图如下所示:

在上图可以看到,GPIO子系统的管理归属于pinctrl子系统,并且pinctrl子系统与设备驱动模型也有密切的联系。

Linux驱动架构之pinctrl子系统分析(一)的更多相关文章

  1. Linux 驱动——Button8(输入子系统)

    输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...

  2. Linux驱动编程--基于I2C子系统的I2C驱动

    代码中,我添加了很多注释,应该不难理解,有错误大家可以指出来,我再改正 #include <linux/kernel.h> #include <linux/module.h> ...

  3. Linux驱动中的platform总线分析

    copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...

  4. Linux驱动编程--基于I2C子系统的I2C驱动的Makefile

    ifeq ($(KERNELRELEASE),) KERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd) TEST = ...

  5. 【驱动】linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  6. linux下I2C驱动架构全面分析【转】

    本文转载自:http://blog.csdn.net/wangpengqi/article/details/17711165 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...

  7. linux i2c驱动架构-dm368 i2c驱动分析

      linux i2c驱动架构-dm368 i2c驱动分析   在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinc ...

  8. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

  9. linux下i2c的驱动架构分析和应用

    i2c在linux下的代码在/driver/i2c下面,总体代码如下所示: i2c-core.c 这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口.    i2c-dev.c  实现 ...

随机推荐

  1. C++ OpenSSL 之四:CER转换为PEM

    1.等同于使用: openssl  x509 -in "cer_path" -inform DER -out "save_path" -outform PEM ...

  2. notepad++ 设置运行python脚本

    按F5 在输入框中输入: cmd /k python “$(FULL_CURRENT_PATH)” &PAUSE & EXIT python路径必须在环境变量中. 否则需要输入完整的p ...

  3. Golang 需要避免踩的 50 个坑(二)

    前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...

  4. CentOS6.7编译安装mysql5.5(详解编译选项)

    注意!  mysql5.5之前一般都是用make编译 mysql5.5 -5.6 一般都是用cmake编译 cmake : 跨平台编译器, mysql官方提供的rpm包 mysql-client :提 ...

  5. wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server

    之前在vps上,最近迁移到了php虚拟主机上,迁移后发现无法登陆后台出现403:Forbidden You don’t have permission to access /wp-login.php ...

  6. Java多线程编程核心技术-第7章-拾遗增补-读书笔记

    第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...

  7. 预计阅读时间核心jS代码

    <script type="text/javascript"> jq(document).ready(function() { var read_time=jq(&qu ...

  8. Feign 报错:No fallback instance of type class xxx found for feign client xxx

    通常需要确认配置内容: 开启 Hystrix:feign.hystrix.enabled=true Fallback类需要注解@Component 出处:https://www.jianshu.com ...

  9. idea安装、配置及基本使用

    下载 下载地址:https://www.jetbrains.com/idea/download/#section=windows Ultimate为旗舰版,功能全面,插件丰富,按年收费. Commun ...

  10. ubuntu配置定时任务crontab何保存退出

    crontab -e配置完成后,如何把保存并退出? 1.Ctrl+o 写入 2.出现“FIile name to Write...”,输入Enter 3.Ctrl+x 保存输出 提示“crontab: ...