SPI子系统分析之一:框架
内核版本:3.9.5
SPI子系统概述:
一个SPI主控制器对应一条SPI总线,当然在系统中有唯一的总线编号.
SPI总线上有两类设备:
- 其一是主控端,通常作为SOC系统的一个子模块出现,很多嵌入式MPU中都常常包含SPI模块;
- 其二是受控端,例如一些SPI接口的Flash,传感器等等;
主控端是SPI总线的控制者,通过使用SPI协议主动发起SPI总线上的会话.而受控端则被动接受SPI主控端的指令,并作出响应的响应.
Linux目前只支持SPI主控端,不能支持SPI受控端设备.
Linux中的SPI子系统向下直接和SPI主控设备硬件交互,读取SPI总线上的数据.向上则和FS子系统,MTD子系统,字符设备子系统等等交互,给用户空间提供访问接口.
在SPI子系统中,包含两类设备驱动:
- 其一称之为Controller driver,用于驱动SPI主控设备,以和SPI总线交互,读写通信数据;
- 其二称之为Protocol driver,用于解析Controller driver读取的数据,形成有意义的协议数据.举例来说,将AT25芯片通过SPI总线和LPC3250的SPI控制器联接在一起,构成一个SPI总线通信系统.Protocol driver的作用,就是根据用户空间或者上层子系统的请求,(比如读写Flash指定地址出的数据),找到对应的SPI指令,并生成一个SPI会话帧(指令+地址+数据)数据.Controller driver的作用,就是将这个会话帧的数据通过SPI控制器的硬件,发到SPI总线上去;
由此可见,SPI子系统中有两种设备,一种是Controller driver驱动的,称之为spi_master.另一种是由Protocol driver驱动的,称之为spi_device(个人觉得这种称法不太准确,这个设备只是协议解析设备,而非真正的spi设备).
Linux的SPI子系统之所以采用将主机和外设分离的思想,是因为SPI主控器功能单一,只负责和SPI总线交互,读写数据.但数据的具体含义,根据SPI总线上的设备不同,而千差万别.首先主机SPI控制器是一种平台设备,它以platform的方式注册进内核,外设的信息是以boardinfo形式静态定义的,在创建spi_master时,会根据外设的bus_num和主机的bus_num是否相等,来选择是否将该外设挂接在该SPI主控制器下.
内核一方面把SPI通信系统分成上面两个部分,另一方面创建了一个spi核心系统,用于联接这两部分.
根据上面的分析我们知道,SPI通信的数据流大致是:
- 用户请求=>Protocol driver分析请求,生成SPI通信帧=>Controller driver将通信帧发送到SPI总线上;
- SPI设备传回数据=>Controller driver从SPI总线上读回=>Protocol解析通信数据并上报;
其中Protocol和Controller之间的交互中,SPI帧是一个比较关键的数据结构.Protocol通过分析上层请求生成这种帧,并且解析这种帧得到SPI设备的响应的结果.Controller通过和SPI总线交互,收发这样的帧.在Linux内核中,这个帧通过一个叫做spi_message的结构来实现.
在有数据请求时,Protocol解析请求生成这个帧,并发送到SPI核心子系统.SPI核心子系统通过Protocol设备的信息,找到对应的Controller设备,并将这个帧发送给Controller.Controller接受到这个帧后发送到SPI总线上,返程类似.
spi_master/spi_device和spi_driver的关系如下:

同时,SPI设备和驱动的对应关系如下:

结合上文介绍可知,spi_master是以platform_device注册进内核的,系统会寻找其相应的platform_driver与其进行匹配,这其实就对应我们的Controller driver.
而spi核心层所做的工作就是将这些与平台相关的部分抽象概括,抽象出所有控制器都具备的功能代码,同时向上为spiprotocol驱动提供接口比如spi_message,spi_transfer,spi_async等,具体可参见linux/spi/spi.h文件.

本文引用:http://blog.csdn.net/wuhzossibility/article/details/7870875
http://blog.csdn.net/vanbreaker/article/details/7733476
SPI子系统分析之一:框架的更多相关文章
- SPI子系统分析之四:驱动模块
内核版本:3.9.5 SPI控制器层(平台相关) 上一节讲了SPI核心层的注册和匹配函数,它是平台无关的.正是在核心层抽象了SPI控制器层的相同部分然后提供了统一的API给SPI设备层来使用.我们这一 ...
- SPI子系统分析之二:数据结构【转】
转自:http://www.cnblogs.com/jason-lu/articles/3164901.html 内核版本:3.9.5 spi_master struct spi_master用来描述 ...
- SPI子系统分析之三:驱动模块
内核版本:3.9.5 SPI核心层(平台无关) SPI子系统初始化的第一步就是将SPI总线注册进内核,并且在/sys下创建一个spi_master的类,以后注册的从设备都将挂接在该总线下. 下列函数位 ...
- SPI子系统分析之二:数据结构
内核版本:3.9.5 spi_master struct spi_master用来描述一个SPI主控制器,我们一般不需要自己编写spi控制器驱动. /*结构体master代表一个SPI接口,或者叫一个 ...
- input子系统分析之一:框架
内核版本:3.9.5 输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个Input子系统.Input子系 ...
- spi子系统之驱动SSD1306 OLED
spi子系统之驱动SSD1306 OLED 接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了.主 ...
- [国嵌攻略][159][SPI子系统]
SPI 子系统架构 1.SPI core核心:用于连接SPI客户驱动和SPI主控制器驱动,并且提供了对应的注册和注销的接口. 2.SPI controller driver主控制器驱动:用来驱动SPI ...
- Linux input子系统分析
输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...
- 7.Linux 输入子系统分析
为什么要引入输入子系统? 在前面我们写了一些简单的字符设备的驱动程序,我们是怎么样打开一个设备并操作的呢? 一般都是在执行应用程序时,open一个特定的设备文件,如:/dev/buttons .... ...
随机推荐
- Redis构建全局并发锁
Redis构建全局并发锁 https://www.cnblogs.com/FG123/p/9990336.html 谈起Redis的用途,小伙伴们都会说使用它作为缓存,目前很多公司都用Redis作为缓 ...
- [Scala函数特性系列]——按名称传递参数
通常情况下,函数的参数是传值参数:即参数的值在它被传递给函数之前被确定.但是,如果我们需要编写一个接收参数不希望马上计算,直到调用函数内的表达式才进行真正的计算的函数.对于这种情况,Scala提供按名 ...
- {Reship}{Emgu}{vs2010}C#配置Emgu
=============================================================================================This Ar ...
- flex 伸缩布局
伸缩布局 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便.CSS3在布局方面做了非常大的改进,使得我们对块级元素 ...
- bzoj1002 [FJOI2007]轮状病毒——找规律+高精度
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 打表找规律,似乎是这样:https://blog.csdn.net/fzhvampir ...
- Python——基础数据类型(补充)
1.基础数据类型汇总补充 (1)小数据池: 为了节省空间,数字和字符串有,其他的没有[了解] 数字:-5---256之间的数字共用一个内存地址 #(1)i1 = i2 id(i1) == id ...
- 自己设计代理IP池
大体思路 使用redis作为队列,买了一份蘑菇代理,但是这个代理每5秒可以请求一次,我们将IP请求出来,从redis列表队列的左侧插入,要用的时候再从右侧取出,请求成功证明该IP是可用的,将该代理IP ...
- c# 判断文件是否已使用
string path = Server.MapPath(" PDFs"); bool tfOpenTemp= IsFileInUse(path + " /Doc1.pd ...
- 一张图看懂高通QC1.0-QC4.0快充进化之路!QC2.0跟QC3.0充电区别
快充技术日新月异,快充市场百家争鸣的今天,高通QC快充依然主导着市场.如今QC快充已发展到第四代,每一代都有着革命性的进步.从QC1.0到QC4.0更新换代时间之短,不免让广大人民群众抱怨. “啥?老 ...
- 【学习笔记】dp基础
知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. dp基础,主要是做题,只有练习才能彻底掌握. 洛谷P1417 烹调方案 分析:由于时间的先后会对结果有影响,所以c[i ...