深度解析Linux SPI总线和设备驱动架构

嵌入式ARM 2018-02-07 08:16 次阅读

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

· CS    片选信号

· SCK  时钟信号

· MISO  主设备的数据输入、从设备的数据输出脚

· MOSI  主设备的数据输出、从设备的数据输入脚

硬件结构

通常,负责发出时钟信号的设备我们称之为主设备,另一方则作为从设备,下图是一个SPI系统的硬件连接示例:

深度解析Linux 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设备。

原文标题:Linux SPI总线和设备驱动架构你都懂了吗?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

MY-IMX6-EK140P L4115编译手册

MY-IMX6-EK140P L4115 编译手册 目录 [隐藏] 1文档说明 1.1系统环境说明1.2操作说明1.3截图说明1.4图片中的L...

发表于 08-14 09:26 99次 阅读
MY-IMX6-EK140P L4115编译手册

cc2530和linux gateway之间的通信网关端的服务都没有正常启动是什么原因?

请教各位大侠个问题: 我最近在做cc2530和linux gateway之间的通信,在CC2530端烧写的是Z-Stack Home 1.2.2a.44539\Proje...

发表于 08-14 07:43 43次 阅读
cc2530和linux gateway之间的通信网关端的服务都没有正常启动是什么原因?

ARM与嵌入式Linux的入门建议

也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理...

发表于 08-13 17:40 152次 阅读
ARM与嵌入式Linux的入门建议

Linux内核学习经验总结分享

操作系统是介于底层硬件和应用软件之间的接口,其各个子系统的实现很大程度上依赖于硬件特性。书上介绍这些....

的头像 马哥Linux运维 发表于 08-13 17:40 116次 阅读
Linux内核学习经验总结分享

基于Linux操作系统内核的崩溃转储机制解析

随着嵌入式Linux系统的广泛应用,对系统的可靠性提出了更高的要求,尤其是涉及到生命财产等重要领域,....

发表于 08-13 17:00 46次 阅读
基于Linux操作系统内核的崩溃转储机制解析

关于Linux操作系统网络驱动程序编写知识详解

Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把程序文档贴出....

发表于 08-13 16:52 54次 阅读
关于Linux操作系统网络驱动程序编写知识详解

四款炫酷Linux开源程序照亮你的生活!

许多 Linux 用户认为在终端中工作太复杂、无聊,并试图逃避它。但这里有个改善方法 —— 四款终端....

的头像 Linux爱好者 发表于 08-13 14:36 147次 阅读
四款炫酷Linux开源程序照亮你的生活!

(转)6 个 Linux 运维典型问题,大牛的分析解决思路在这里

作为一名合格的 Linux 运维工程师,一定要有一套清晰、明确的解决故障思路,当问题出现时,才能迅速定位、解决问题,这里给出一...

发表于 08-13 14:10 88次 阅读
(转)6 个 Linux 运维典型问题,大牛的分析解决思路在这里

嵌入式Linux模块编译步骤详细概述让你少走弯路

今天将直接了当的带你进入linux的模块编译,当然在介绍的过程当中,我也会添加一些必要的注释,以便初....

的头像 嵌入式ARM 发表于 08-12 10:56 249次 阅读
嵌入式Linux模块编译步骤详细概述让你少走弯路

linux用io模拟写spi,打印出来错误的id号,这段代码有什么错误点,请大神指出

发表于 08-11 11:53 341次 阅读
linux用io模拟写spi,打印出来错误的id号,这段代码有什么错误点,请大神指出

Linux环境下对磁盘分区进行管理的一种机制

物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,....

的头像 马哥Linux运维 发表于 08-10 17:58 271次 阅读
Linux环境下对磁盘分区进行管理的一种机制

关于嵌入式Linux系统开发学习流程详解

C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知....

发表于 08-10 17:15 89次 阅读
关于嵌入式Linux系统开发学习流程详解

浅析Linux中命令链接操作符的十个最佳实例

Linux命令中链接的意思是,通过操作符的行为将几个命令组合执行。

的头像 马哥Linux运维 发表于 08-10 15:51 134次 阅读
浅析Linux中命令链接操作符的十个最佳实例

Linux内核的git历史记录一些最奇怪的事情

正如我所看到的,这个有66个父节点的不同寻常的提交在某种程度上只是对于ASoc代码修改的正常合并。A....

的头像 Linux爱好者 发表于 08-10 11:22 255次 阅读
Linux内核的git历史记录一些最奇怪的事情

如何修复Linux内核存在的TCP漏洞?

卡内基梅隆大学的 CERT/CC 发出警告,称 Linux 内核 4.9 及更高版本中有一个 TCP....

的头像 Linux爱好者 发表于 08-10 11:15 239次 阅读
如何修复Linux内核存在的TCP漏洞?

z-stack_linux_gateway 在BB Black上运行./zigbeeHWgw bbb 出现错误,请问是什么原因?

z-stack_linux_gateway 在BB Black上运行./zigbeeHWgw bbb 出现错误 完全按照TI发布的z-stack_linux_gateway 的文档上操...

发表于 08-10 07:05 30次 阅读
z-stack_linux_gateway 在BB Black上运行./zigbeeHWgw bbb 出现错误,请问是什么原因?

一个关于Linux中断的问题:硬件处理,初始化和中断处理

I/O APIC 每个I/O APIC提供24个管脚,能够和外部设备的中断线连接,每个管脚都可以通....

的头像 Linuxer 发表于 08-09 17:16 353次 阅读
一个关于Linux中断的问题:硬件处理,初始化和中断处理

Z-Stack linux gateway安装错误,请问是怎么回事?

虚拟机的方式安装的Ubuntu12.04,系统信息如下: Distributor ID:    Ubuntu Description:    Ubu...

发表于 08-09 08:59 96次 阅读
Z-Stack linux gateway安装错误,请问是怎么回事?

请教关于z-stack linux gateway 中更新protobuf-c的问题

我下载了z-stack linux gateway 然后尝试编译到PC机去执行,按照流程,我下载了 protobuf2.6.1版本。protobuf-c1.2.1版本,并且...

发表于 08-09 08:11 38次 阅读
请教关于z-stack linux gateway 中更新protobuf-c的问题

请问Z-Stack Linux Gateway能否开放全部源码?

请问,Z-Stack Linux Gateway能否开放全部源码,自己用mips toolchain编译,运行在mips架构的处理器上,谢谢...

发表于 08-09 06:57 33次 阅读
请问Z-Stack Linux Gateway能否开放全部源码?

以Arm-Linux为平台的智能家居控制系统的设计详解

嵌入式系统以其占用资源少、专用性强、功耗低的特点使其广泛应用在移动通信、工业生产、安全监控等领域。针....

发表于 08-08 16:27 116次 阅读
以Arm-Linux为平台的智能家居控制系统的设计详解

排查Linux机器被入侵的11个步骤

随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至....

的头像 马哥Linux运维 发表于 08-08 14:42 156次 阅读
排查Linux机器被入侵的11个步骤

嵌入式环境下的轻量级GUI系统解决方案设计详解

近年来,随着信息家电、手持设备、无线设备的迅速发展,人们对嵌入式系统的需求逐渐增多,要求也越来越高....

发表于 08-07 15:18 147次 阅读
嵌入式环境下的轻量级GUI系统解决方案设计详解

基于嵌入式Linux系统的机车状态实时检测系统设计详解

状态监测与故障诊断技术是现代工业技术发展的产物,已发展到了以专家系统、神经网络和模糊分析等理论为基....

发表于 08-07 15:07 88次 阅读
基于嵌入式Linux系统的机车状态实时检测系统设计详解

请问6678能不能加载linux系统

实验室的z7的板子恩那个家在linux系统,老板就问6678能不能加,求大神解答!...

发表于 08-07 08:52 101次 阅读
请问6678能不能加载linux系统

基于嵌入式Linux的Qt Designer快速安装流程设计详解

RAD(快速应用程序开发)是一种高效的软件开发形式,可以让用户在极短的时间里创建一个图形化的用户界....

发表于 08-06 09:17 89次 阅读
基于嵌入式Linux的Qt Designer快速安装流程设计详解

Linux 4.18 正式版将延期发布

前两天 Linux 4.18 RC 7 发布的时候,Linus Torvalds 表示,如果不出意外....

的头像 Linux爱好者 发表于 08-05 08:55 272次 阅读
Linux 4.18 正式版将延期发布

Arch Linux 有何优缺点?

Arch Linux 于 2002 年发布,由 Aaron Grifin 领头,是当下最热门的 Li....

的头像 Linux爱好者 发表于 08-05 08:52 284次 阅读
Arch Linux 有何优缺点?

关于在嵌入式项目中使用Linux的五大技巧详解

微控制器制造商的开发板,以及他们与开发板一起提供的软件项目例程,在工程师着手一个新设计时可以提供很大....

发表于 08-03 15:23 168次 阅读
关于在嵌入式项目中使用Linux的五大技巧详解

用于管理文件方法和数据结构案例分析

文件系统是在存储设备中(SD Card、NAND Flash…)组织文件的方法和数据结构,用于管理文....

的头像 周立功单片机 发表于 08-03 09:28 917次 阅读
用于管理文件方法和数据结构案例分析

ARM与嵌入式Linux入门的6个建议

也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也....

的头像 玩转单片机 发表于 08-02 17:02 351次 阅读
ARM与嵌入式Linux入门的6个建议

嵌入式Linux OS启动流程

BootLoader是一段小程序,主要功能是引导操作系统启动。可以把它想象成PC机Linux上的GR....

的头像 嵌入式ARM 发表于 08-01 16:17 280次 阅读
嵌入式Linux OS启动流程

基于ARM920处理器和嵌入式Linux操作系统的GPS智能终端设计解析

GPS智能终端是智能交通系统(ITS系统)的重要组成部分,它将卫星定位技术(GPS)、地理信息系统(....

发表于 08-01 14:55 366次 阅读
基于ARM920处理器和嵌入式Linux操作系统的GPS智能终端设计解析

什么是Qt?Qt 5的安装和开发步骤及实例及概念解析

Qt最早是在1991年由奇趣科技开发的,1996年进入商业领域,成为全世界范围内数千种成功的应用程序....

发表于 08-01 08:00 30次 阅读
什么是Qt?Qt 5的安装和开发步骤及实例及概念解析

德国下萨克森州跟随慕尼黑计划从Linux转向Windows

据外媒消息,德国下萨克森州计划跟随慕尼黑的脚步,将超过 13000 台工作站从 OpenSUSE 迁....

的头像 Linux爱好者 发表于 07-31 16:58 244次 阅读
德国下萨克森州跟随慕尼黑计划从Linux转向Windows

Linux2.4.22 内核基础上的嵌入式闸门智能监控系统设计

闸门系统是水资源调度中重要的组成部分,国内目前多采用手动和部分电动的操作方式,真正实现闸门的智能控制....

发表于 07-31 15:57 253次 阅读
Linux2.4.22 内核基础上的嵌入式闸门智能监控系统设计

以嵌入式Linux为基础的机车状态实时检测系统设计详解

状态监测与故障诊断技术是现代工业技术发展的产物,已发展到了以专家系统、神经网络和模糊分析等理论为基础....

发表于 07-31 15:48 167次 阅读
以嵌入式Linux为基础的机车状态实时检测系统设计详解

基于嵌入式Linux框架下的的智能仪器触摸屏接口设计过程详解

在现代化生产中, 为了确保机械设备安全可靠地运行, 通常要采用适宜的仪器仪表, 利用故障诊断技术及时....

发表于 07-30 15:13 102次 阅读
基于嵌入式Linux框架下的的智能仪器触摸屏接口设计过程详解

Linux 0.01版本内核的源码和注释的详细资料免费下载

对于学习linux内核很有帮助,能学到很多基础性的知识。本文档的主要内容详细介绍的是linux 0.....

发表于 07-30 08:00 46次 阅读
Linux 0.01版本内核的源码和注释的详细资料免费下载

Linux十个基础知识点分享

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任....

的头像 马哥Linux运维 发表于 07-28 10:23 358次 阅读
Linux十个基础知识点分享

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一个中间状态,这个时候....

的头像 Linuxer 发表于 07-28 10:09 309次 阅读
什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

LINUX是什么?

LINUX是一个免费类unix内核,适用于386-AT计算机,附带完整源代码。主要让黑客、计算机科学....

的头像 马哥Linux运维 发表于 07-28 08:53 353次 阅读
LINUX是什么?

如何管理Linux 的内存分页?

内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存的物理特性出发,深....

的头像 Linux爱好者 发表于 07-28 08:24 504次 阅读
如何管理Linux 的内存分页?

如何在 Linux 中使用一个命令升级所有软件

你无需运行每个包管理器来更新包。 topgrade 工具通过检测已安装的软件包、工具、插件并运行相应....

的头像 Linux爱好者 发表于 07-28 08:20 367次 阅读
如何在 Linux 中使用一个命令升级所有软件

基于SAMA5D2 MPU的系统模块的作用介绍

设计用于运行Linux® 操作系统的工业级微处理器(MPU)系统是一件非常困难和复杂的事情。即便是该....

的头像 Excelpoint世健 发表于 07-27 17:44 1302次 阅读
基于SAMA5D2 MPU的系统模块的作用介绍

实现降低CAPEX,提高性能并促进5G的加速发展

Enea(NASDAQ OMX Nordic:ENEA)宣布在上海移动世界大会上演示实时加速Linu....

的头像 FPGA开发圈 发表于 07-27 17:34 867次 阅读
实现降低CAPEX,提高性能并促进5G的加速发展

USB在Linux里的结构框架是什么样的?USB Core和Hub是什么?

USB博大精深不是一篇文章就能够解释清楚的。想要深入研究USB的话,USB协议(外加Host和OTG....

的头像 嵌入式ARM 发表于 07-27 16:08 458次 阅读
USB在Linux里的结构框架是什么样的?USB Core和Hub是什么?

ARM Linux各种驱动的中断服务程序工作在ARM的IRQ模式吗?

可见,ARM Linux最初进入IRQ模式后,比较快速地从IRQ模式切换到了SVC模式,但是这个时候....

的头像 Linuxer 发表于 07-27 14:54 310次 阅读
ARM Linux各种驱动的中断服务程序工作在ARM的IRQ模式吗?

采用嵌入式Linux主处理器的DLP® LightCrafter™ Display 2000评估模块

虽然不像BeagleBone系列那样拥有许多GPIO引脚,但第二代和第三代Raspberry Pi单....

的头像 德州仪器 发表于 07-27 14:25 1310次 阅读
采用嵌入式Linux主处理器的DLP® LightCrafter™ Display 2000评估模块

关于嵌入式Linux系统实时进程调度算法系统详解

嵌入式系统(Embedded Systems)是以应用为中心,以计算机技术为基础,软件硬件可剪裁(....

发表于 07-27 14:03 79次 阅读
关于嵌入式Linux系统实时进程调度算法系统详解

教大家如何测Linux设备的 Wi-Fi吞吐量!

在CMD窗口中输入adb push D:\iperf_linux.dat data/,其意思是将D盘....

的头像 RFsister创客射频空间 发表于 07-26 17:45 364次 阅读
教大家如何测Linux设备的 Wi-Fi吞吐量!

Linux如何使用XFS?

XFS文件系统采用优化算法,日志记录对整体文件操作影响非常小。XFS查询与分配存储空间非常快。xfs....

的头像 马哥Linux运维 发表于 07-26 16:41 317次 阅读
Linux如何使用XFS?

让你的linux服务器时刻保持强劲动力!

sync 做同步,将所有未写的系统缓冲区写到磁盘中,以确保文件系统的完整性,否则在释放缓存的过程中,....

的头像 中兴开发者社区 发表于 07-26 14:30 302次 阅读
让你的linux服务器时刻保持强劲动力!

linux常用命令你真的知道吗?分享鲜为人知却很有趣的Unix/Linux命令

linux常用命令其中有一些命令用有用已经不足以形容她的可爱,希望各位朋友不要过于咬文嚼字。另外,回....

发表于 07-26 12:00 101次 阅读
linux常用命令你真的知道吗?分享鲜为人知却很有趣的Unix/Linux命令

Linux中的可用磁盘空间如何检查?

跟踪磁盘利用率信息是系统管理员(和其他人)的日常待办事项列表之一。Linux 有一些内置的使用程序来....

的头像 嵌入式资讯精选 发表于 07-25 18:53 347次 阅读
Linux中的可用磁盘空间如何检查?

Unix是什么呢?比较Unix和Linux

除了BSD,它成为了Unix家族中最受欢迎的分支之一,Unix的商业产品在20世纪80年代和90年代....

的头像 马哥Linux运维 发表于 07-25 17:06 360次 阅读
Unix是什么呢?比较Unix和Linux

如何检查Linux中的磁盘利用率?

跟踪磁盘利用率信息是系统管理员(和其他人)的日常待办事项列表之一。Linux 有一些内置的使用程序来....

的头像 Linux爱好者 发表于 07-25 15:18 358次 阅读
如何检查Linux中的磁盘利用率?

基于嵌入式Linux系统的轻量级图形用户界面支持系统研究

嵌入式系统一般指非PC系统,有计算机功能但又不称之为计算机的设备或器材。他是以应用为中心,以计算机技....

发表于 07-25 15:04 95次 阅读
基于嵌入式Linux系统的轻量级图形用户界面支持系统研究

一种基于嵌入式Linux平台的多协议路由器的设计方案

随着社会信息化进程和互联网的飞迅发展,对无线环境下提供数据服务的需求变得更加迫切。传统的无线移动网络....

发表于 07-25 14:36 200次 阅读
一种基于嵌入式Linux平台的多协议路由器的设计方案

Linux下各文件夹的用途及结构说明介绍

通常情况下,根文件系统所占空间一般应该比较小,因为其中的绝大部分文件都不需要经常改动,而且包括严格的....

的头像 马哥Linux运维 发表于 07-24 15:32 507次 阅读
Linux下各文件夹的用途及结构说明介绍