当前位置: 首页 > news >正文

Linux SPI总线和设备驱动架构之一:系统概述【转】

 

目录(?)[-]

  1. 硬件结构
    1. 工作时序
  2. 软件架构
    1. SPI控制器驱动程序
    2. SPI通用接口封装层
    3. SPI协议驱动程序
    4. SPI通用设备驱动程序
 

SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器、传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:

 

  • CS    片选信号
  • SCK  时钟信号
  • MISO  主设备的数据输入、从设备的数据输出脚
  • MOSI  主设备的数据输出、从设备的数据输入脚
因为在大多数情况下,CPU或SOC一侧通常都是工作在主设备模式,所以,目前的Linux内核版本中,只实现了主模式的驱动框架。

 

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

硬件结构


通常,负责发出时钟信号的设备我们称之为主设备,另一方则作为从设备,下图是一个SPI系统的硬件连接示例:
                                            图1.1    SPI硬件结构图
如上图所示,主设备对应SOC芯片中的SPI控制器,通常,一个SOC中可能存在多个SPI控制器,像上面的例子所示,SOC芯片中有3个SPI控制器。每个控制器下可以连接多个SPI从设备,每个从设备有各自独立的CS引脚。每个从设备共享另外3个信号引脚:SCK、MISO、MOSI。任何时刻,只有一个CS引脚处于有效状态,与该有效CS引脚连接的设备此时可以与主设备(SPI控制器)通信,其它的从设备处于等待状态,并且它们的3个引脚必须处于高阻状态。

工作时序


按照时钟信号和数据信号之间的相位关系,SPI有4种工作时序模式:
我们用CPOL表示时钟信号的初始电平的状态,CPOL为0表示时钟信号初始状态为低电平,为1表示时钟信号的初始电平是高电平。另外,我们用CPHA来表示在那个时钟沿采样数据,CPHA为0表示在首个时钟变化沿采样数据,而CPHA为1则表示要在第二个时钟变化沿来采样数据。内核用CPOL和CPHA的组合来表示当前SPI需要的工作模式:
  • CPOL=0,CPHA=1        模式0
  • CPOL=0,CPHA=1        模式1
  • CPOL=1,CPHA=0        模式2
  • CPOL=1,CPHA=1        模式3

软件架构


在内核的SPI驱动的软件架构中,进行了合理的分层和抽象,如下图所示:
                                 图2.1    SPI驱动的软件架构

SPI控制器驱动程序


SPI控制器不用关心设备的具体功能,它只负责把上层协议驱动准备好的数据按SPI总线的时序要求发送给SPI设备,同时把从设备收到的数据返回给上层的协议驱动,因此,内核把SPI控制器的驱动程序独立出来。SPI控制器驱动负责控制具体的控制器硬件,诸如DMA和中断操作等等,因为多个上层的协议驱动可能会通过控制器请求数据传输操作,所以,SPI控制器驱动同时也要负责对这些请求进行队列管理,保证先进先出的原则。

SPI通用接口封装层


为了简化SPI驱动程序的编程工作,同时也为了降低协议驱动程序和控制器驱动程序的耦合程度,内核把控制器驱动和协议驱动的一些通用操作封装成标准的接口,加上一些通用的逻辑处理操作,组成了SPI通用接口封装层。这样的好处是,对于控制器驱动程序,只要实现标准的接口回调API,并把它注册到通用接口层即可,无需直接和协议层驱动程序进行交互。而对于协议层驱动来说,只需通过通用接口层提供的API即可完成设备和驱动的注册,并通过通用接口层的API完成数据的传输,无需关注SPI控制器驱动的实现细节。

SPI协议驱动程序


上面我们提到,控制器驱动程序并不清楚和关注设备的具体功能,SPI设备的具体功能是由SPI协议驱动程序完成的,SPI协议驱动程序了解设备的功能和通信数据的协议格式。向下,协议驱动通过通用接口层和控制器交换数据,向上,协议驱动通常会根据设备具体的功能和内核的其它子系统进行交互,例如,和MTD层交互以便把SPI接口的存储设备实现为某个文件系统,和TTY子系统交互把SPI设备实现为一个TTY设备,和网络子系统交互以便把一个SPI设备实现为一个网络设备,等等。当然,如果是一个专有的SPI设备,我们也可以按设备的协议要求,实现自己的专有协议驱动。

SPI通用设备驱动程序


有时候,考虑到连接在SPI控制器上的设备的可变性,在内核没有配备相应的协议驱动程序,对于这种情况,内核为我们准备了通用的SPI设备驱动程序,该通用设备驱动程序向用户空间提供了控制SPI控制的控制接口,具体的协议控制和数据传输工作交由用户空间根据具体的设备来完成,在这种方式中,只能采用同步的方式和SPI设备进行通信,所以通常用于一些数据量较少的简单SPI设备。













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5604043.html ,如需转载请自行联系原作者

相关文章:

  • 一些服务器的常用命令的基本操作
  • 38.IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)
  • window7 虚拟机安装
  • hacmp环境下更改ip地址
  • Citrix XenApp策略与AD组策略的整合
  • EIGRP特点包括:
  • 使用JConsole监控
  • C#去除HTML标签
  • 由VMware Workstation 6.5所想到的
  • 尘归尘,土归土——业务归业务,技术归技术。
  • 日志系统
  • 3.1 salt 语法
  • Nginx服务整理
  • Jira 6.3.6使用openldap进行认证——方法二
  • 六、任务计划管理cron
  • 【Linux系统编程】快速查找errno错误码信息
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Android Volley源码解析
  • Brief introduction of how to 'Call, Apply and Bind'
  • Java深入 - 深入理解Java集合
  • js数组之filter
  • k8s 面向应用开发者的基础命令
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL数据库运维之数据恢复
  • October CMS - 快速入门 9 Images And Galleries
  • python大佬养成计划----difflib模块
  • Redux 中间件分析
  • socket.io+express实现聊天室的思考(三)
  • vagrant 添加本地 box 安装 laravel homestead
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 世界上最简单的无等待算法(getAndIncrement)
  • 数组的操作
  • 《码出高效》学习笔记与书中错误记录
  • linux 淘宝开源监控工具tsar
  • ​【已解决】npm install​卡主不动的情况
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #1015 : KMP算法
  • $NOIp2018$劝退记
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C语言)fread与fwrite详解
  • (pojstep1.3.1)1017(构造法模拟)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)Eureka服务搭建,服务注册,服务发现
  • (五)c52学习之旅-静态数码管
  • (转)Scala的“=”符号简介
  • .bashrc在哪里,alias妙用
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。