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 pinctl 分析,Linux驱动架构之pinctrl子系统分析(一)相关推荐

  1. Linux和Windows设备驱动架构比较

    毕业后一直在学操作系统, 有时候觉得什么都懂了,有时候又觉得好像什么都不懂,但总体来说自认为对操作系统实现机制的了解比周围的人还是要多一些.去年曾花了几个星期的晚上时间断断续续翻译了这篇对Linux和 ...

  2. Linux pinctrl子系统分析之三 数据结构分析

    在上一章我们通过数据结构间的关联,说明了pinctrl子系统的软件框架.本章我们主要介绍每一个数据结构的定义,从而加深对pinctrl子系统相关的数据结构理解.本章我们依然从soc pin描述.boa ...

  3. 嵌入式linux 控制台 驱动,控制台驱动是linux重要的设备驱动之一

    一:前言 我们在之前分析过input子系统和tty设备驱动架构.今天需要将两者结合起来.看看linux中的控制台是怎么样实现的. 二:控制台驱动的初始化 之前在分析tty驱动架构的时候曾分析到.主设备 ...

  4. linux kernel有线网卡驱动enc28j60分析 一

    1.为了更好低学习linux的网络驱动架构,本文选择分析linux kernel下的有线网卡驱动enc28j60来学习网络驱动架构. enc28j60是一个10/100Mb的有线网卡,适用于嵌入式设备 ...

  5. 【linux驱动】USB子系统分析

    本文针对Linux内核下USB子系统进行分析,主要会涉及一下几个方面: USB基础知识:介绍USB设备相关的基础知识 Linux USB子系统分析:分析USB系统框架,USB HCD/ROOT HUB ...

  6. 深入浅出SCSI子系统(一)Linux 内核中的 SCSI 架构

    目录 深入浅出SCSI子系统(一)Linux 内核中的 SCSI 架构 1.Linux 内核中的 SCSI 架构描述 2.SCSI 较高层 3.SCSI 中间层 4.SCSI 较低层 深入浅出SCSI ...

  7. 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发

    这周主要对pinctrl子系统进行分析,该分析的基本上已经分析完成,唯一没有细说的估计就是gpio与pinctrl之间的关联了.本章即是pinctrl子系统分析的最后一章,本章我们主要实现一个虚拟的p ...

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

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

  9. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

最新文章

  1. 后面一次上传对linux kernel 的分析
  2. Nginx之简介与安装(一)
  3. 牛客题霸 NC27 集合的所有子集
  4. T-SQL | 你需要了解的执行计划
  5. skimage库需要依赖 numpy+mkl 和scipy
  6. goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.6:generate failed: Index: 0, Size: 0
  7. 深入学习二叉树(四) 二叉排序树
  8. 山东管理学院计算机二级,山东管理学院有几个校区及校区地址 哪个校区最好...
  9. 用U盘安装一个Linux系统
  10. 【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息
  11. Rust 程序语言资料
  12. 编译原理三大经典书籍
  13. 易优CMS插件大全-采集翻译发布插件
  14. 无版权,全免费,请收藏这10个免费高清无权素材网站
  15. 安尼泰科T1行车记录仪说明书
  16. 无法修改linux密码Authentication token manipulation error 问题解决
  17. Bootstrap第一章初识
  18. 深入GetMessage,PeekMessage以及Windows消息机制
  19. Java Swing写简单计算器以及拓展贷款计算器(等额本息和等额本金计算可以单独拿出来用)
  20. 币圈的8大女神都是谁?-千氪

热门文章

  1. ntpdate报错the NTP socket is in use, exiting
  2. 解决IIS占用CPU和内存大的问题
  3. 递归总结 By greenhand
  4. 卸载 Visual Studio 2005
  5. php 自己封装一个调用第三方接口的函数
  6. python+Django框架运用(一)
  7. 51nod--1212 最小生成树
  8. 用JS实现的常见几种排序算法
  9. Developer Express 之 XtraReport如何动态绑定数据
  10. VC读取PE文件的OEP