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 .... ...
随机推荐
- 体验 k8s 的核心功能
快速体验 k8s 的核心功能:应用部署.访问.Scale Up/Down 以及滚动更新 https://yq.aliyun.com/articles/337209?spm=a2c4e.11153940 ...
- Flask第五篇——设置debug模式
flask默认是没有开启debug模式的,开启debug模式有很多好处: 第一,可以帮助我们查找代码里面的错误,比如: # coding: utf-8 from flask import Flask ...
- C#类、方法的访问修饰符
这篇文章主要介绍了C#类的访问修饰符用法,较为详细的分析了C#类的访问修饰符概念与用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用 ...
- linux下如何添加一个用户并且让用户获得root权限【转载】
原文:http://www.cnblogs.com/johnw/p/5499442.html 1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加 ...
- (转)Android性能优化——工具篇
Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...
- angular指令,异步调用数据,监控数据的变化(自定义一个表头的指令)
angular框架中提供了很多有效的指令,指令的目的就是为了提高代码的复用率,提高工作效率. 下面我们自己来定义一个指令: 一点建议:写指令名字的时候,尽量不要用用大写,下划线等,否则会有很大的坑等着 ...
- mysql的三种安装方式(详细)
安装MySQL的方式常见的有三种: rpm包形式 通用二进制形式 源码编译 1,rpm包形式 (1) 操作系统发行商提供的 (2) MySQL官方提供的(版本更新,修复了更多常见BUG)www.mys ...
- CArray,CList,CMap如何实例化
1.定义一个CMap,向这个CMap中增加数据项(键-值对).CMap<CString, LPCTSTR, CString, LPCTSTR>m_ItemMap;CString strKe ...
- erlang学习之自定义behaviour
behaviour是啥,看了资料做了demo以后,感觉像接口,话不多说,祭代码 R15开始,回调模型使用callback来约定,更加好理解了 test_behavior.erl -module(tes ...
- redis 命令集
进入客户端 /usr/local/bin/redis-cli 选择数据库 select index (0-15) 退出 quit