Linux驱动架构之pinctrl子系统分析(一)
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子系统分析(一)的更多相关文章
- Linux 驱动——Button8(输入子系统)
输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...
- Linux驱动编程--基于I2C子系统的I2C驱动
代码中,我添加了很多注释,应该不难理解,有错误大家可以指出来,我再改正 #include <linux/kernel.h> #include <linux/module.h> ...
- Linux驱动中的platform总线分析
copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...
- Linux驱动编程--基于I2C子系统的I2C驱动的Makefile
ifeq ($(KERNELRELEASE),) KERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd) TEST = ...
- 【驱动】linux下I2C驱动架构全面分析
I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...
- linux下I2C驱动架构全面分析【转】
本文转载自:http://blog.csdn.net/wangpengqi/article/details/17711165 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...
- linux i2c驱动架构-dm368 i2c驱动分析
linux i2c驱动架构-dm368 i2c驱动分析 在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinc ...
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】
转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...
- linux下i2c的驱动架构分析和应用
i2c在linux下的代码在/driver/i2c下面,总体代码如下所示: i2c-core.c 这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口. i2c-dev.c 实现 ...
随机推荐
- C++ OpenSSL 之四:CER转换为PEM
1.等同于使用: openssl x509 -in "cer_path" -inform DER -out "save_path" -outform PEM ...
- notepad++ 设置运行python脚本
按F5 在输入框中输入: cmd /k python “$(FULL_CURRENT_PATH)” &PAUSE & EXIT python路径必须在环境变量中. 否则需要输入完整的p ...
- Golang 需要避免踩的 50 个坑(二)
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
- CentOS6.7编译安装mysql5.5(详解编译选项)
注意! mysql5.5之前一般都是用make编译 mysql5.5 -5.6 一般都是用cmake编译 cmake : 跨平台编译器, mysql官方提供的rpm包 mysql-client :提 ...
- 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 ...
- Java多线程编程核心技术-第7章-拾遗增补-读书笔记
第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...
- 预计阅读时间核心jS代码
<script type="text/javascript"> jq(document).ready(function() { var read_time=jq(&qu ...
- Feign 报错:No fallback instance of type class xxx found for feign client xxx
通常需要确认配置内容: 开启 Hystrix:feign.hystrix.enabled=true Fallback类需要注解@Component 出处:https://www.jianshu.com ...
- idea安装、配置及基本使用
下载 下载地址:https://www.jetbrains.com/idea/download/#section=windows Ultimate为旗舰版,功能全面,插件丰富,按年收费. Commun ...
- ubuntu配置定时任务crontab何保存退出
crontab -e配置完成后,如何把保存并退出? 1.Ctrl+o 写入 2.出现“FIile name to Write...”,输入Enter 3.Ctrl+x 保存输出 提示“crontab: ...