深度解析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】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

基于Linux操作系统的服务器运行的同时,也会表征出各种各样参数信息

最后是每个程序的资源占用列表,其中 CPU 的使用率是所有 CPU core 占用率的总和。通常执行....

的头像 马哥Linux运维 发表于 05-25 17:28 229次阅读
基于Linux操作系统的服务器运行的同时,也会表征出各种各样参数信息

初学者是选ARM7还是ARM9?uCOS还是Linux?

本文首先介绍了ARM7、ARM9和uCOS及Linux这四者的概念,其次阐述了ARM7与ARM9的区....

发表于 05-25 11:16 81次阅读
初学者是选ARM7还是ARM9?uCOS还是Linux?

请问你们可以提供AM1808最小开发板的原理图?可以烧入嵌入式linux操作系统,可以正常启动嵌入式linux。

发表于 05-25 10:41 137次阅读
请问你们可以提供AM1808最小开发板的原理图?可以烧入嵌入式linux操作系统,可以正常启动嵌入式linux。

在8168 DVR-RDK中,现在生成的.out 只可以在开发板上运行的,怎么修改能够生成可在linux的可调试程序?

发表于 05-25 08:12 29次阅读
在8168 DVR-RDK中,现在生成的.out 只可以在开发板上运行的,怎么修改能够生成可在linux的可调试程序?

基于AM335x平台 Linux系统上运行PRU程序(下篇)

发表于 05-24 16:56 50次阅读
基于AM335x平台 Linux系统上运行PRU程序(下篇)

基于AM335x平台 Linux系统上运行PRU程序(上篇)

发表于 05-24 16:40 24次阅读
基于AM335x平台 Linux系统上运行PRU程序(上篇)

Python快速入门方法

发表于 05-24 15:37 170次阅读
Python快速入门方法

基于嵌入式Linux的语音识别系统硬软件设计详细讲解教程

该设计运用三星公司的S3C2440,结合ICRoute公司的高性能语音识别芯片LD3320,进行了语....

发表于 05-24 15:15 151次阅读
基于嵌入式Linux的语音识别系统硬软件设计详细讲解教程

linux标准学习教程,让你学习linux有方法

发表于 05-24 15:06 91次阅读
linux标准学习教程,让你学习linux有方法

嵌入式Linux主设备号和次设备号的获取

静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设备,内核开发者已经为其分....

的头像 嵌入式ARM 发表于 05-23 17:18 180次阅读
嵌入式Linux主设备号和次设备号的获取

中断程序时间过长导致的后果是什么?

发表于 05-23 10:06 158次阅读
中断程序时间过长导致的后果是什么?

OMAP35x Linux PSP数据表

本文档提供了OMAP35X Linux PSP包的一部分的设备驱动程序的概述和性能数据。

发表于 05-22 09:24 28次阅读
OMAP35x Linux PSP数据表

在Linux上移植了znp host framework,并开发host程序,请问zcl_SendRead函数会一直阻塞是什么原因?

发表于 05-22 03:02 19次阅读
在Linux上移植了znp host framework,并开发host程序,请问zcl_SendRead函数会一直阻塞是什么原因?

我想用3359做一个EtherCAT的主站,底层的系统是选择RT linux好还是TI RTOS好呢?有没有两者的对比?

发表于 05-22 00:51 70次阅读
我想用3359做一个EtherCAT的主站,底层的系统是选择RT linux好还是TI RTOS好呢?有没有两者的对比?

通过这10个基础命令开始掌握Linux命令行

如果你对 Linux 感兴趣,但是一直在使用 PC 或者 Mac 桌面,你可能想知道你需要知道什么才....

的头像 Linux爱好者 发表于 05-21 17:21 343次阅读
通过这10个基础命令开始掌握Linux命令行

用30个实例探索top命令的细节

最全Linux TOP命令使用教程!

的头像 马哥Linux运维 发表于 05-20 10:20 358次阅读
用30个实例探索top命令的细节

技术帖:如何在 Linux 中使用 find

find 是日常工具箱中功能更强大、更灵活的命令行工具之一,因此值得花费更多的时间。

的头像 Linux爱好者 发表于 05-20 10:11 313次阅读
技术帖:如何在 Linux 中使用 find

NXP的Cortex-M系列为例做简要介绍Linux开发

单片机与应用处理器的核心区别到底是什么呢?是核心主频的差异?还是Linux系统的支持?又或者是处理器....

的头像 ZLG致远电子 发表于 05-20 08:00 1029次阅读
NXP的Cortex-M系列为例做简要介绍Linux开发

驱动是如何工作的_Linux设备驱动的固件加载详解

作为一个驱动作者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地....

的头像 电子发烧友网工程师 发表于 05-20 07:10 189次阅读
驱动是如何工作的_Linux设备驱动的固件加载详解

CoreOS与红帽OpenShift联手推动混合云原生服务

红帽公布CoreOS与红帽 OpenShift集成的发展蓝图 CoreOS与红帽 OpenShift....

的头像 电子发烧友网工程师 发表于 05-20 00:44 435次阅读
CoreOS与红帽OpenShift联手推动混合云原生服务

基于Linux的USB+20+OTG驱动的研究与实现

学习Linux的好帮手,对于大家学习一定帮助

发表于 05-19 10:29 74次阅读
基于Linux的USB+20+OTG驱动的研究与实现

嵌入式Linux的开机启动流程简单的介绍

这里ROM Code是上电后最先执行的动作,就相当一个启动引导的过程;U-Boot除了初始外设外,还....

的头像 嵌入式ARM 发表于 05-18 15:04 278次阅读
嵌入式Linux的开机启动流程简单的介绍

设备驱动模型直观的认识

可以看到,我们在使用kobject、kset、ktype结构,就在sysfs虚拟文件系统下创建(通过....

的头像 嵌入式ARM 发表于 05-18 14:58 173次阅读
设备驱动模型直观的认识

美高森美和SiFive推出HiFive Unleashed扩展板 助力Linux软件和固件开发人员首次构建RISC-V PC

致力于在功耗、安全、可靠性和性能方面提供差异化的领先半导体技术方案供应商美高森美公司(Microse....

的头像 人间烟火123 发表于 05-17 11:23 650次阅读
美高森美和SiFive推出HiFive Unleashed扩展板 助力Linux软件和固件开发人员首次构建RISC-V PC

Linux操作系统下C语言编程入门.pdf

Linux操作系统下C语言编程入门

发表于 05-17 10:08 60次阅读
Linux操作系统下C语言编程入门.pdf

AM437x开发板FPGA与ARM基于GPMC通信测试

发表于 05-16 14:28 292次阅读
AM437x开发板FPGA与ARM基于GPMC通信测试

在Linux中安装Vim-anywhere

这仅仅只是一个例子。你甚至可以使用 Vim-anywhere 在烦人的 web 表单或者其他应用上进....

的头像 Linux爱好者 发表于 05-16 09:32 204次阅读
在Linux中安装Vim-anywhere

生态之痛:没有产业化的研发都是在耍流氓

倪光南在反思芯片发展的问题时也提到:越没人用就越无法获得应用支持,越没有应用支持就越没人用,这是个恶....

的头像 传感器技术 发表于 05-15 17:10 389次阅读
生态之痛:没有产业化的研发都是在耍流氓

交叉编译工具链的命名规则

ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot....

的头像 嵌入式ARM 发表于 05-15 11:06 286次阅读
交叉编译工具链的命名规则

从全局的视角分析内核对内存的管理

内存溢出的解决办法:1、等比例缩小图片。2、对图片采用软引用,及时进行 recycle( ) 操作。....

的头像 Linuxer 发表于 05-14 14:24 187次阅读
从全局的视角分析内核对内存的管理

了解各种系统调用助你成为一名Linux下编程高手

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己....

的头像 嵌入式资讯精选 发表于 05-14 11:10 329次阅读
了解各种系统调用助你成为一名Linux下编程高手

如何解决Linux设备驱动的固件问题

作为一个驱动作者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地....

的头像 嵌入式ARM 发表于 05-12 10:46 472次阅读
如何解决Linux设备驱动的固件问题

透了解系统调用助你成为Linux下编程高手

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己....

的头像 嵌入式ARM 发表于 05-11 11:27 224次阅读
透了解系统调用助你成为Linux下编程高手

三个Linux命令行工具能让你假装很忙

有时候你很忙。而有时候你只是需要看起来很忙,就像电影中的黑客一样。有一些开源工具就是干这个的。

的头像 Linux爱好者 发表于 05-10 09:24 370次阅读
三个Linux命令行工具能让你假装很忙

深入理解Linux RCU:RCU是读写锁的替代者

请注意,在单个CPU上读写锁比RCU慢一个数量级,在16个CPU上读写锁比RCU几乎要慢两个数量级。....

的头像 Linuxer 发表于 05-10 09:13 230次阅读
深入理解Linux RCU:RCU是读写锁的替代者

深入理解Linux RCU:经典RCU实现概要

减少锁竞争的一个有效方法是创建一个分级结构,如上图所示。在此,四个rcu_node 结构中的每一个都....

的头像 Linuxer 发表于 05-10 09:08 548次阅读
深入理解Linux RCU:经典RCU实现概要

OMAP35x Linux PSP的备驱动程序的概述和性能数据

本文档提供了OMAP35X Linux PSP包的一部分的设备驱动程序的概述和性能数据。

发表于 05-08 16:01 26次阅读
OMAP35x Linux PSP的备驱动程序的概述和性能数据

在Linux下touch的9个命令示例

默认情况下,每当我们尝试使用 touch 命令更改符号链接文件的时间戳时,它只会更改原始文件的时间戳....

的头像 Linux爱好者 发表于 05-08 14:17 160次阅读
在Linux下touch的9个命令示例

Linux内核地址映射模型与Linux内核高端内存详解

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据....

发表于 05-08 10:33 210次阅读
Linux内核地址映射模型与Linux内核高端内存详解

在Linux中监控多台主机

如果你想要以快速且粗略地在局域网中一次监控多台主机,你可能需要了解一下 “rwho” 工具。只要安装....

的头像 Linux爱好者 发表于 05-07 09:48 229次阅读
在Linux中监控多台主机

嵌入式Linux系统开发入门基础

Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过....

发表于 05-05 13:03 166次阅读
嵌入式Linux系统开发入门基础

Linux存储入门基础:如何简单、快捷的恢复数据

数据恢复,经常是突发事故响应中关键而又耗时的一步。多数情况下,工程师往往并非专司数据恢复,操作环境往....

发表于 05-05 10:21 214次阅读
Linux存储入门基础:如何简单、快捷的恢复数据

动态链接库不为人知的秘密

Linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主....

的头像 Linuxer 发表于 05-04 14:33 238次阅读
动态链接库不为人知的秘密

Linux内核内存管理问题

当我们在终端启动一个程序时,终端进程调用 exec 函数将可执行文件载入内存,此时代码段,数据段,b....

的头像 马哥Linux运维 发表于 05-04 10:29 346次阅读
Linux内核内存管理问题

Linux 监控多台主机的技巧分享

让我来解释一下 rwho 是如何工作的。每个在网络上使用 rwho 的系统都将广播关于它自己的信息,....

发表于 05-04 09:58 166次阅读
Linux 监控多台主机的技巧分享

哪些关闭了Linux抢占?抢占又关闭了谁?

对于ARM处理器而言,判断irqs_disabled(),其实就是判断CPSR中的IRQMASK_I....

的头像 Linuxer 发表于 05-04 08:57 777次阅读
哪些关闭了Linux抢占?抢占又关闭了谁?

linux中 9 个touch命令介绍

touch 命令用于创建空文件,也可以更改 Unix 和 Linux 系统上现有文件时间戳。这里所说....

发表于 05-02 17:05 66次阅读
linux中 9 个touch命令介绍

嵌入式项目运用Linux技巧的步骤流程

使用实时操作系统作为应用程序代码平台的设计还面临着许多挑战,比如如何将功能分配给不同的并行任务、如何....

发表于 05-02 09:13 194次阅读
嵌入式项目运用Linux技巧的步骤流程

意法半导体的STM32F429微控制器上的一个μClinux项目实现

对嵌入式系统设计师来说,还可以方便地使用一种工具(utility)聚合工具,如BusyBox,这种工....

的头像 EDN电子技术设计 发表于 05-02 08:25 466次阅读
意法半导体的STM32F429微控制器上的一个μClinux项目实现

从单片机到PC的系统程序一些问题的理解

从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将....

的头像 玩转单片机 发表于 05-01 18:01 498次阅读
从单片机到PC的系统程序一些问题的理解

在Linux下51单片机的开发环境搭建详细程序编写详细概述

在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了。

的头像 单片机精讲吴鉴鹰 发表于 05-01 17:32 1007次阅读
在Linux下51单片机的开发环境搭建详细程序编写详细概述

如何避免Linux的物理内存碎片化

Linux buddyy系统是linux kernel比较稳定的一个模块,但是并不是说它没有缺陷,L....

的头像 Linuxer 发表于 05-01 16:43 212次阅读
如何避免Linux的物理内存碎片化

使用基本命令来查看Linux版本号

如果你加入了一家新公司,要为开发团队安装所需的软件并重启服务,这个时候首先要弄清楚它们运行在什么发行....

的头像 Linux爱好者 发表于 05-01 06:11 979次阅读
使用基本命令来查看Linux版本号

MSP430代码编写器Studio V5.2

本手册描述了使用MSP430超低功耗微控制器的德克萨斯仪器代码编写器Studio Studio V5....

发表于 04-28 14:41 31次阅读
MSP430代码编写器Studio V5.2

meltdown产生的主要原因是CPU的投机执行

在AARCH64中,本来就是两张页表,硬件上存在TTBR0,TTBR1两个寄存器,TTBR0中填的页....

的头像 Linuxer 发表于 04-28 09:53 502次阅读
meltdown产生的主要原因是CPU的投机执行

Linux总是以Lazy的方式给应用程序分配内存

mmap看起来是由一个虚拟地址对应一个文件(可以直接用指针访问文件),本质上是把进程的虚拟地址空间映....

的头像 Linuxer 发表于 04-27 15:10 236次阅读
Linux总是以Lazy的方式给应用程序分配内存

为什么技术一定要学习Linux?Linux在各领域发展的现状与趋势

随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了....

的头像 马哥Linux运维 发表于 04-26 15:32 597次阅读
为什么技术一定要学习Linux?Linux在各领域发展的现状与趋势

来学一学在Linux中使用fc命令

我们现在知道 fc 命令不带任何参数的话会将上一个命令载入编辑器。但有时你可能不想编辑,仅仅是想再次....

的头像 Linux爱好者 发表于 04-26 15:29 227次阅读
来学一学在Linux中使用fc命令

什么是Shell,Shell命令的两种执行方式

很多传统的程序设计语言,例如Fortran、Ada、Pascal、C、C++和Java,都是编译型语....

的头像 嵌入式ARM 发表于 04-26 10:48 524次阅读
什么是Shell,Shell命令的两种执行方式