内核版本: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子系统分析之一:框架的更多相关文章

  1. SPI子系统分析之四:驱动模块

    内核版本:3.9.5 SPI控制器层(平台相关) 上一节讲了SPI核心层的注册和匹配函数,它是平台无关的.正是在核心层抽象了SPI控制器层的相同部分然后提供了统一的API给SPI设备层来使用.我们这一 ...

  2. SPI子系统分析之二:数据结构【转】

    转自:http://www.cnblogs.com/jason-lu/articles/3164901.html 内核版本:3.9.5 spi_master struct spi_master用来描述 ...

  3. SPI子系统分析之三:驱动模块

    内核版本:3.9.5 SPI核心层(平台无关) SPI子系统初始化的第一步就是将SPI总线注册进内核,并且在/sys下创建一个spi_master的类,以后注册的从设备都将挂接在该总线下. 下列函数位 ...

  4. SPI子系统分析之二:数据结构

    内核版本:3.9.5 spi_master struct spi_master用来描述一个SPI主控制器,我们一般不需要自己编写spi控制器驱动. /*结构体master代表一个SPI接口,或者叫一个 ...

  5. input子系统分析之一:框架

    内核版本:3.9.5 输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个Input子系统.Input子系 ...

  6. spi子系统之驱动SSD1306 OLED

    spi子系统之驱动SSD1306 OLED 接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了.主 ...

  7. [国嵌攻略][159][SPI子系统]

    SPI 子系统架构 1.SPI core核心:用于连接SPI客户驱动和SPI主控制器驱动,并且提供了对应的注册和注销的接口. 2.SPI controller driver主控制器驱动:用来驱动SPI ...

  8. Linux input子系统分析

    输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...

  9. 7.Linux 输入子系统分析

    为什么要引入输入子系统? 在前面我们写了一些简单的字符设备的驱动程序,我们是怎么样打开一个设备并操作的呢? 一般都是在执行应用程序时,open一个特定的设备文件,如:/dev/buttons .... ...

随机推荐

  1. MySQL中的表中增加删除字段

    1.增加一个字段alter table user表 add COLUMN new1字段 VARCHAR(20)   NOT NULL DEFAULT 0; //增加一个字段,VARCHERA 20 , ...

  2. 《selenium2 python 自动化测试实战》(17)——几个cookies操作

    之前我们已经学过利用cookies跳过验证码登录了,那时候我们用的方法是add_cookie()方法,这里再给大家介绍两个,一般情况下我们用不到,了解一下就可以,而且如果真的用到的时候百度也很快的: ...

  3. bat实现创建、复制、删除文件及文件夹

    1 建bat文件自动执行复制,删除命令. 例1:以下是复制cd.dll文件至windows\system32的bat文件内容: copy cd.dll %windir%\system32 例2:下面一 ...

  4. 关于Visual studio 2017安装方法的若干问题

    因为忙于生活,好几年没有看关于编程方面的书了,这几天闲,就准备在电脑上装上VS的最新版本,查了查,最新版是VS2017,.搜了下网上安装后大小,还真不小.下载离线安装包,完全下载居然需要25G左右,无 ...

  5. 【DUBBO】dubbo的LoadBalance接口

    LoadBalance负载均衡, 负责从多个 Invokers中选出具体的一个Invoker用于本次调用,调用过程中包含了负载均衡的算法,调用失败后需要重新选择 --->类注解@SPI说明可以基 ...

  6. Apache Kafka 0.9消费者客户端

    当Kafka最初创建时,它与Scala生产者和消费者客户端一起运送.随着时间的推移,我们开始意识到这些API的许多限制.例如,我们有一个“高级”消费者API,它支持消费者组并处理故障转移,但不支持许多 ...

  7. mysql存储引擎之myisam学习

    myisam存储引擎特点:1.不支持事务2.表级锁定(更新时锁整个表,其索引机制是表级索引,这虽然可以让锁定的实现成本很小,但是也同时大大降低 了其并发性能) 3.读写互相阻塞:不仅会在写入的时候阻塞 ...

  8. win7 + python2.7 安装scipy

    问题: 直接pip install scipy将不能正确安装,缺少文件 方法: 下载  "scipy‑0.19.0‑cp27‑cp27m‑win_amd64.whl"[90多M] ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构

    官网的技术导读真的描述的很详细,虽然对于我们看英文很费劲,但如果英文不是很差,请选择沉下心去读,你一定能收获好多.我的学习是先从Spring boot开始的,然后接触到微服务架构,当然,这一切最大的启 ...

  10. TCP/IP网络编程系列之三(初级)

    TCP/IP网络编程系列之三-地址族与数据序列 分配给套接字的IP地址和端口 IP是Internet Protocol (网络协议)的简写,是为首发网络数据而分配给计算机的值.端口号并非赋予计算机值, ...