Linux内核中的GPIO系统

一、前言

作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务。对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver、LED driver。往往CPU datasheet的关于GPIO或者IO ports的章节都是比较简单的,非常适合刚入行的工程师。虽然GPIO子系统相关的硬件比较简单,没有复杂的协议,不过,对于软件抽象而言,其分层次的软件思想是每个嵌入式软件工程师需要掌握的内容。

我更倾向使用GPIO系统这个名字来代替GPIO driver这个名字,GPIO driver仅仅包含了pin signal状态控制和读取的内容,而GPIO系统包括了pin multiplexing、pin configuration、GPIO control、GPIO interrupt control等内容。本文主要是以3.14内核作为例子,讲述linux kernel中GPIO系统的软件框架。

二、GPIO相关硬件有哪些差异

嵌入式工程师总是要处理各种各样的target board,每个target board上的GPIO总是存在不同,例如:

1、和CPU的连接方式不同

对于ARM的嵌入式硬件平台,SOC本身可以提供大量的IO port,SOC上的GPIO controller是通过SOC的总线(AMBA)连接到CPU的。对于嵌入式系统而言,除了SOC的IO port,一些外设芯片也可能会提供IO port,例如:

(1)有些key controller芯片、codec或者PMU的芯片会提供I/O port

(2)有些专用的IO expander芯片可以扩展16个或者32个GPIO

从硬件角度看,这些IO和SOC提供的那些IO完全不同,CPU和IO expander是通过I2C(也有可能是SPI等其他类型的bus)连接的,在这种情况下,访问这些SOC之外的GPIO需要I2C的操作,而控制SOC上的GPIO只需要写寄存器的操作。不要小看这个不同,写一个SOC memory map的寄存器非常快,但是通过I2C来操作IO就不是那么快了,甚至,如果总线繁忙有可能阻塞当前进程,这种情况下,内核同步机制必须有所区别(如果操作GPIO可能导致sleep,那么同步机制不能采用spinlock)。

2、访问方式不同

SOC片内的GPIO controller和SOC片外的IO expander的访问当然不一样,不过,即便都是SOC片内的GPIO controller,不同的ARM芯片,其访问方式也不完全相同,例如:有些SOC的GPIO controller会提供一个寄存器来控制输出电平。向寄存器写1就是set high,向寄存器写0就是set low。但是有些SOC的GPIO controller会提供两个寄存器来控制输出电平。向其中一个寄存器写一就是set high,向另外一个寄存器写一就是set low。

3、配置方式不同

即便是使用了同样的硬件(例如都使用同样的某款SOC),不同硬件系统上GPIO的配置不同。在一个系统上配置为输入,在另外的系统上可能配置为输出。

4、GPIO特性不同。这些特性包括:

(1)是否能触发中断。对一个SOC而言,并非所有的IO port都支持中断功能,可能某些处理器只有一两组GPIO有中断功能。

(2)如果能够触发中断,那么该GPIO是否能够将CPU从sleep状态唤醒

(3)有些有软件可控的上拉或者下拉电阻的特性,有的GPIO不支持这种特性。在设定为输入的时候,有的GPIO可以设定debouce的算法,有的则不可以。

5、多功能复用

有的GPIO就是单纯的作为一个GPIO出现,有些GPIO有其他的复用的功能。例如IO expander上的GPIO只能是GPIO,但是SOC上的某个GPIO除了做普通的IO pin脚,还可以是SPI上clock信号线。

三、硬件功能分类

ARM based SOC的datasheet中总有一个章节叫做GPIO controller(或者I/O ports)的章节来描述如何配置、使用SOC的引脚。虽然GPIO controller的硬件描述中充满了大量的寄存器的描述,但是这些寄存器的功能大概分成下面三个类别:

1、有些硬件逻辑是和IO port本身的功能设定相关的,我们称这个HW block为pin controller。软件通过设定pin controller这个硬件单元的寄存器可以实现:

(1)引脚功能配置。例如该I/O pin是一个普通的GPIO还是一些特殊功能引脚(例如memeory bank上CS信号)。

(2)引脚特性配置。例如pull-up/down电阻的设定,drive-strength的设定等。

2、如果一组GPIO被配置成SPI,那么这些pin脚被连接到了SPI controller,如果配置成GPIO,那么控制这些引脚的就是GPIO controller。通过访问GPIO controller的寄存器,软件可以:

(1)配置GPIO的方向

(2)如果是输出,可以配置high level或者low level

(3)如果是输入,可以获取GPIO引脚上的电平状态

3、如果一组gpio有中断控制器的功能,虽然控制寄存器在datasheet中的I/O ports章节描述,但是实际上这些GPIO已经被组织成了一个interrupt controller的硬件block,它更像是一个GPIO type的中断控制器,通过访问GPIO type的中断控制器的寄存器,软件可以:

(1)中断的enable和disable(mask和unmask)

(2)触发方式

(3)中断状态清除

四、如何通过软件抽象来掩盖硬件差异

传统的GPIO driver是负责上面三大类的控制,而新的linux kernel中的GPIO subsystem则用三个软件模块来对应上面三类硬件功能:

(1)pin control subsystem。驱动pin controller硬件的软件子系统。

(2)GPIO subsystem。驱动GPIO controller硬件的软件子系统。

(3)GPIO interrupt chip driver。这个模块是作为一个interrupt subsystem中的一个底层硬件驱动模块存在的。本文主要描述前两个软件模块,具体GPIO interrupt chip driver以及interrupt subsystem请参考本站其他相关文档。

1、pin control subsystem block diagram

下图描述了pin control subsystem的模块图:

底层的pin controller driver是硬件相关的模组,初始化的时候会向pin control core模块注册pin control设备(通过pinctrl_register这个bootom level interface)。pin control core模块是一个硬件无关模块,它抽象了所有pin controller的硬件特性,仅仅从用户(各个driver就是pin control subsystem的用户)角度给出了top level的接口函数,这样,各个driver不需要关注pin controller的底层硬件相关的内容。

2、GPIO subsystem block diagram

下图描述了GPIO subsystem的模块图:

基本上这个软件框架图和pin control subsystem是一样的,其软件抽象的思想也是一样的,当然其内部具体的实现不一样,我们会在后续的文章中描述。

原文链接:

http://www.wowotech.net/io-port-control.html


扫码或长按关注

回复「 篮球的大肚子」进入技术群聊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识函数集锦

python之路——初识函数 阅读目录 为什么要用函数  函数的定义与调用  函数的返回值  函数的参数  本章小结为什么要用函数 现在有一个需求,让你计算hello world的长度,你怎么计算? s1hello world length0 for i in s1:length1 print…

html无损转换pdf,Pdf2html :高保真PDF至HTML转换

高保真PDF至HTML转换pdf2htmlEX介绍传统pdf2html有两种:一种相当于pdf2text加一些比较弱的格式,基本跟pdf2text也差不了多少另一种是把所有渲染成图片然后嵌到一个html,结果是文字信息都丢失(不能选择,拷贝),生成的文件还巨大。pd…

送你一个Git命令地图

上周,公众号举办了一个活动,抽取Git鼠标垫,现在已经结束了,大家不用再过去找,周末我收到了鼠标垫,然后看到有几个读者朋友圈也发了,我感觉也算是做了一个好事,拿到鼠标垫&#xff0c…

文件的权限与隐藏属性

一、文件的属性 1. 权限详解 r 表示读权限————————————读取文件内容 w 表示写权限————————————编辑、新增、修改内容(非删除) x 代表执行权限———————————读取文件内容 — 表示没有该权限——————————读取文件内容 2. 权限对目录的重…

利用insert、update和delete命令可以同时对多个表进行操作_学习笔记-操作系统(1)...

概念负责管理协调硬件、软件等计算机资源的工作为上层用户、应用程序提供简单易用的服务是一种系统软件功能和目标资源的管理者处理机管理:进程管理(进程控制、进程同步、进程通信、死锁处理、处理机调度)存储器管理:内存管理&…

uboot和Linux内核移植

这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文。请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接。这篇文章是一个读者昨晚发给我的,文…

android界面元素识别,Android 10不能使用uiautomatorviewer定位元素的终极解决方法

Android app 元素定位除了使用Appium Inspector 外,还可以使用Android SDK 里tools中的uiautomatorviewer 工具。但今天打算使用 uiautomatorviewer 进行元素定位的时候,发现无法截图,并报如下错误:Unexpected error while obtain…

小程序背景图满屏_竞赛答题小程序

越来越多的企业部门团体举办知识竞赛答题活动,根据更加好玩的答题活动规则开发了本款知识竞赛答题小程序。本知识竞赛答题小程序采用云开发,无需搭建服务器,无需域名即可使用数据管理能力,更方便答题活动等场景,无需域…

Spring的核心机制依赖注入,Junit测试与Java基础Getter和Setter两种方法意义——2017.07.26...

今天对Spring的基础理解又加深了一丢丢。 1 首先Spring的基础配置文件中&#xff0c;主要由以下几个配置文件&#xff0c; 1 <beans xmlns&#xff1a;xsi"http://w3.org/2001/XMLSchema-instance" 2 xmlns"http://www.springframework.org/schem…

STM32的map文件学习笔记

前言 前几个月针对公司自己的芯片写了个程序&#xff0c;这个程序有个硬性要求&#xff0c;就是能用的FLASH空间只有4KB&#xff0c;之前已经写得差不多了&#xff0c;最终占用空间3.6KB。这不&#xff0c;最近又得加需求&#xff0c;还剩一点点FLASH空间可以使用&#xff0c;这…

html网易云音乐图片轮播效果,Vue之网易云音乐PC版轮播图的实现

Github - program-learning-lists最近在刷网易云音乐歌单时发现首页的轮播图很有意思&#xff0c;正好自己想尝试做一个PC版的网易云音乐&#xff0c;于是就是使用Vue去做这个demo&#xff0c;废话少说&#xff0c;我要出招了&#xff0c;接招吧页面的DOM结构:style"slide…

python教程答案十九章_Python 编程从入门到实践 第19章 注销一节问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼现在网上的教程都是第1版的&#xff0c;很多代码都不能用&#xff0c;官网下了第2版的代码&#xff0c;一路用第1版教程修修改改好不容易到第19章 19.2.3 注销 这一节&#xff0c;现在遇到个问题&#xff0c;过不去了。。。求教大家…

深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)

文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言&#xff0c;在使用前都要进行一系列的初始化&#xff0c;MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置文件创建C…

我有个队友,叫悟空

昨晚&#xff0c;是我们篮球队年终聚会&#xff0c;好像也是第一次组织篮球队的聚会&#xff0c;之前就只知道在场上打球&#xff0c;场下就没有过这样的吃饭聚会。年终的时候&#xff0c;聚会特别多&#xff0c;该交流感情的交流感情&#xff0c;该年会抽奖的就年会抽奖&#…

go语言html css,html – 在Golang中加载图像和CSS

我在项目根目录的package main中的server.js中设置了一个路由http.HandleFunc( “/”,route.IndexHandler)IndexHandler在包路由中实现,如下所示&#xff1a;func IndexHandler(w http.ResponseWriter, r *http.Request) {data:struct{Name string}{"My name",}util.…

python队列只能一个个读取吗_python队列Queue的详解

QueueQueue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构&#xff0c;即队列&#xff0c;用来在生产者和消费者线程之间的信息传递基本FIFO队列class Queue.Queue(maxsize0)FIFO即First in First Out,先进先出。Queue提供了一个…

C#基于LibUsbDotNet实现USB通信(一)

网上C#USB通信的资料比较少&#xff0c; 基本上都是基于LibUsbDotNet 和 CyUsb, 关于打印机设备的还有一个OPOS。 本篇文章基于LibUsbDotNet。 1. 下载并安装 LibUsbDotNet 安装文件。 2. 运行Filter Wizard, Install a device filter。 安装需要通信的usb设备。 3. 建一个简单…

一个大神的Android成长之路

这篇文章是我的一个朋友写的&#xff0c;总结了这些年的技术成长之路&#xff0c;我觉得对于很多技术人都有借鉴的作用&#xff0c;技术是相通的&#xff0c;不要整天想一口气吃成一个胖子&#xff0c;不积跬步无以至千里&#xff0c;既然选择了技术这条路&#xff0c;就不畏艰…

银联Apple Pay 总结

最近在空余的时间做了银联Apple Pay,是银联快捷支付,在手机钱包里面绑定银行卡,在购买商品的时候直接指纹支付就可以了. 首先你看一线Apple Pay的官方文档:Apple Pay Human Interface Guidelines. 因为按钮和界面的原因,苹果拒绝我2次了. 按钮要使用苹果自带的Apple Pay按钮,要…

jsp页面内引入静态html,JSP技术实现动态页面到静态页面的方法

本文是介绍了jsp技术实现动态页面到静态页面的方法&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;对于JSP技术实现动态页面到静态页面的方案&#xff0c;我们从三个步骤来说明&#xff1a;JSP技术实现动态页面到静态页面的方案第一&#xff1a;为了能深入浅出的理解这…