第二章 驱动设计的硬件基础
2.1 处理器
2.1.1 通用处理器
中央处理器的体系结构可以分为两类,一类为冯诺依曼结构,另一类为哈佛结构。ARM9及以上使用的是哈佛结构。
冯诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。
而哈佛结构将程序指令和数据分开存储,指令和数据可以有不同的数据宽度。
- 结构: 程序存储器和数据存储器是两个独立的存储器,每个存储器相对应的是系统的四条总线(程序的数据总线/地址总线 数据的数据总线/地址总线)。
- 过程: 中央单片机首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,进行下一步操作(通常是执行)。
- 分析: 这种分离的程序总线和数据总线可允许在同一机器周期内同时获得指令字(来自程序存储器)和操作数(来自数据存储器),程序和数据存储在两个分开的物理空间中,取址和执行能完全重叠,执行时可以预先读取下一条指令,提高了执行速度,进而提高了数据的吞吐率。
2.1.2 数字信号处理器
2.2 存储器
存储器主要可分类为只读存储器(ROM)、闪存(Flash)、随机存储存储器(RAM)、光盘。
ROM还可以再细分为不可编程ROM、可编程ROM(PROM)、可擦除可编程ROM(EPROM)和电可擦除可编程ROM(EEPROM)。
NOR和NAND是市场上两种主要的Flash闪存技术。
NOR flash的特点是可芯片内执行,程序可以直接再NOR内运行。而NAND Flash则不支持。
举个具体的例子来说明:
- 假设你的嵌入式系统中存储了一个程序在NOR Flash中
- 当系统启动时,CPU可以直接访问NOR Flash中的这段程序并执行
- 就像是直接从书本上读取内容一样,不需要先把内容抄写到笔记本上
这与NAND Flash形成对比:
- NAND Flash不支持直接执行,必须先将程序代码复制到RAM中才能运行
- 这就像是必须先把书本内容抄写到笔记本上才能阅读
CFI (Common Flash Interface) 规范和 JEDEC (Joint Electron Device Engineering Council) 规范都是闪存行业的重要标准,我来分别解释它们的用途:
CFI规范的作用:
- 标准化识别机制:允许系统自动识别Flash设备的具体特性,如容量、块大小、写入方式等
- 兼容性保证:不同厂商生产的Flash芯片可以互相替换,只要它们都遵循CFI规范
- 简化开发:软件开发人员可以编写通用的驱动程序,而不需要为每个具体的Flash型号开发专门的驱动
JEDEC规范的作用:
- 定义物理标准:规定了芯片的封装尺寸、引脚定义、电气特性等物理参数
- 保证互换性:确保不同厂商生产的同类型存储器可以在物理上互相替换
- 质量标准:提供了可靠性测试标准和质量要求的规范
这两个规范的关系:
- CFI主要关注Flash存储器的功能接口和软件层面
- JEDEC则更关注硬件层面的标准化
- 它们相互补充,共同促进了Flash存储器产业的标准化和规范化
实际应用例子:
- 当你设计主板时,遵循JEDEC规范可以确保Flash芯片能够正确安装
- 当你开发驱动程序时,遵循CFI规范可以确保软件能够正确识别和操作Flash设备
eFuse电编程熔丝作为OTP(One-Time Programmable,一次性可编程)存储器。eFuse可以通过计算机对芯片内部的参数和功能进行配置,这一般是在芯片出厂的时候已经设置好了。
RAM也可再分为静态RAM(SRAM)和动态RAM(DRAM)。DRAM以电荷形式进行存储,数据存储在电容器中。由于电容器会漏电而出现电荷丢失,所以DRAM器件需要定期刷新。SRAM是静态的,只要供电它就会保持一个值,SRAM没有刷新周期。每个SRAM存储单元由6个晶体管组成,而DRAM存储单元由1个晶体管和一个电容器组成。
这种结构差异导致:
- SRAM更快、功耗更高、成本更高、密度更低
- DRAM更慢、功耗更低、成本更低、密度更高
这就是为什么SRAM通常用作CPU缓存,而DRAM用作主内存的原因。
LPDDR vs DDR 主要区别:
- 工作电压:
- LPDDR 的工作电压更低(一般1.2V以下)
- 普通 DDR 工作电压较高(如DDR4是1.2V)
- 功耗特性:
- LPDDR 具有更多的省电模式
- LPDDR 在待机时可以进入更深度的休眠状态
- LPDDR 唤醒时间更短
- 使用场景:
- LPDDR 主要用于移动设备(手机、平板等)
- DDR 主要用于台式机、服务器等
关于LPDDR带x和不带x的区别:
- 不带x的LPDDR:
- 指标准版本的LPDDR
- 遵循JEDEC标准规范
- 如LPDDR4、LPDDR5等
- 带x的LPDDR(如LPDDR4X、LPDDR5X):
- 是对应版本的升级版
- 通常提供更高的性能或更低的功耗
- 例如:LPDDR4X比LPDDR4电压更低(从1.1V降到1.05V)
- 往往具有更高的带宽
举个实际例子:
- LPDDR4的最高速率是3200Mbps
- LPDDR4X可以达到4266Mbps
- 同时LPDDR4X的功耗更低
2.3 接口与总线
2.3.1 串口
2.3.2 IIC
开始位和停止位都由IIC主设备产生。在选择从设备时,如果从设备采用7位地址,则主设备在发起传输过程前,需先发送1字节的地址信息,前7位为设备地址,最后1位为读写标志。之后,每次传输的数据也是1字节,从MSB开始传输。
MSB 代表 Most Significant Bit(最高有效位),例如一个字节(8位)的数据:10110101,传输顺序:1 → 0 → 1 → 1 → 0 → 1 → 0 → 1
(1)master往slave写数据(传输方向不改变)
(2)master往slave写数据,再从slave读回数据(传输方向改变)
2.3.3 SPI
在SPI(串行外设接口)总线协议中,CPOL(时钟极性)和CPHA(时钟相位)是控制数据传输时序的两个重要参数。它们决定了数据如何在时钟信号的上升沿或下降沿传输。下面是对它们的详细解释:
- CPOL(时钟极性): CPOL控制SPI时钟(SCK)的空闲状态,也就是当没有数据传输时,时钟线的电平是高电平还是低电平。CPOL = 0:时钟线在空闲时是低电平(逻辑0)。CPOL = 1:时钟线在空闲时是高电平(逻辑1)。
- CPHA(时钟相位): CPHA决定数据是在哪个时钟沿上进行采样和传输。具体来说,数据是根据时钟信号的第一个还是第二个时钟沿来捕获。CPHA = 0:数据在时钟的第一个边沿(上升沿或下降沿)被采样,而数据在第二个边沿(即时钟信号变化后)传输。CPHA = 1:数据在时钟的第二个边沿(上升沿或下降沿)被采样。
如何理解它们的组合:
SPI协议通常有4种时钟模式(CPOL和CPHA的组合):
- 模式0(CPOL = 0,CPHA = 0):时钟空闲时为低电平,数据在时钟的上升沿采样。
- 模式1(CPOL = 0,CPHA = 1):时钟空闲时为低电平,数据在时钟的下降沿采样。
- 模式2(CPOL = 1,CPHA = 0):时钟空闲时为高电平,数据在时钟的下降沿采样。
- 模式3(CPOL = 1,CPHA = 1):时钟空闲时为高电平,数据在时钟的上升沿采样。
2.3.4 USB
USB3.0 线缆则设计了8条内部线路,除了VBUS、电源地之外,其余3对均为数据传输线路。其中保留了D+与D-这两条兼容USB 2.0的线路,新增了SSRX与SSTX转为USB 3.0所设的线路。
控制传输(Control Transfer)
控制传输主要用于设备初始化、设置和状态查询。它通常是最基础的传输方式,负责设备的管理和配置。
工作流程:
- 主机通过控制传输向设备发送请求,设备响应请求并返回数据。
- 控制传输通常包括 请求阶段、数据阶段 和 状态阶段。
图示:
特点:
- 用于配置设备、发送命令、查询设备状态等。
- 数据传输量小,时延较低。
批量传输(Bulk Transfer)
批量传输用于大量数据的传输,特别适合文件传输等不需要实时性的场景(如USB闪存盘、打印机)。
工作流程:
- 主机和设备之间的数据传输没有固定的时延,依赖于总线的带宽和空闲时间。
- 传输的数据量大,且每个数据包都有确认机制。
图示:
特点:
- 适用于大数据量、非实时的传输(如文件)。
- 传输速度较高,但时延不固定。
中断传输(Interrupt Transfer)
中断传输用于传输较小数据量且对时延有较高要求的场景,如键盘、鼠标等输入设备。
工作流程:
- 主机周期性地请求设备进行数据传输。
- 设备有数据时,会在固定的时间间隔内进行数据传输。
图示:
特点:
- 适用于需要响应速度快的小数据传输(如键盘、鼠标)。
- 时延较小,并且具有周期性的传输。
同步传输(Isochronous Transfer)
同步传输用于需要实时性的应用,如音频、视频设备,保证数据按时到达,适合实时流式数据。
工作流程:
- 主机和设备之间会持续进行数据流的传输,数据流的每个包都有固定的时间点。
- 如果数据传输失败,数据丢失不会被重试。
图示:
特点:
- 适用于实时性要求高的设备(如音频、视频设备)。
- 数据传输时有固定时间间隔,数据丢失后不会重试。
总结:
每种传输方式在USB通信中都有特定的应用场景:
- 控制传输:设备初始化、命令传输和状态查询。
- 批量传输:大量数据传输,如文件传输。
- 中断传输:低延迟、小数据量的传输,适用于输入设备。
- 同步传输:实时数据流,适用于音频、视频等实时传输。
2.3.5 以太网接口
以太网接口中的 MAC(Media Access Control) 和 PHY(Physical Layer) 是两个重要的硬件组件,它们共同工作,负责数据的传输和接收。它们分别位于不同的OSI(Open Systems Interconnection)模型层,虽然它们紧密配合,但各自有不同的职责和功能。
MAC(Media Access Control) — 媒体访问控制层
MAC是 数据链路层(OSI模型的第2层)的一部分,负责数据帧的格式化、地址识别以及对网络介质的访问控制。它的主要任务是确定在共享媒介上如何可靠地发送和接收数据。
主要功能:
- 数据封装与解封装:将传输的数据包从网络层(如IP包)封装成以太网帧,并添加必要的标头(如MAC地址、校验和等);反之,接收到的数据帧会解封装,去掉以太网帧头,交给上层协议。
- MAC地址:每个网络设备都有一个唯一的MAC地址(通常由硬件厂商赋予),MAC地址用于唯一标识网络中的设备。
- 访问控制:在共享网络中,MAC协议负责控制如何在多个设备之间共享同一介质。例如,Ethernet使用CSMA/CD(Carrier Sense Multiple Access with Collision Detection)协议来控制访问。
MAC的工作原理:
当数据需要通过以太网传输时,MAC层会从网络层获取数据,将其封装为以太网帧,并在帧中插入目标设备的MAC地址(用于标识目标设备)。数据通过网络传输后,接收设备的MAC层会提取数据,解封装并传递给上层(网络层)。
PHY(Physical Layer) — 物理层
PHY属于 物理层(OSI模型的第1层),负责在物理介质上传输和接收数据。PHY主要涉及信号的编码、调制、解调和电气接口,确保在物理介质(如电缆、光纤)上传输的数字信号能够正确地传递。
主要功能:
- 信号转换:PHY将MAC层发送的数字信号转换为适合在物理介质上发送的电气信号(如电压、光信号等)。同样,PHY也将接收到的电气信号转换回数字信号,并将其传递给MAC层。
- 介质转换:PHY不仅处理传统的以太网电缆(如双绞线)的信号,还可以处理光纤和无线等不同类型的介质。
- 速度和带宽支持:PHY支持不同速度的网络,如10/100/1000Mbps(千兆以太网)、10Gbps等,以满足不同网络需求。
PHY的工作原理:
PHY的工作是“低层”的,它接收来自MAC的数据,利用电气信号在网络介质上进行传输;同样,它也负责将从介质中接收到的信号转换成数字信号,并交给MAC进行处理。
MAC和PHY的关系
- MAC和PHY是协作关系:MAC负责管理网络数据的封装、地址识别、访问控制等,而PHY负责将数据从电气层面传输到介质,并负责接收物理层的信号并转换为数字数据传递给MAC层。
- 数据流动的过程:当数据从主机或设备要发送到网络时,首先通过MAC层进行封装和地址处理,然后交给PHY层进行物理传输;当数据从网络接收到主机或设备时,PHY层接收并将数据传递给MAC层,MAC层再解封装并处理数据。
2.3.6 SD和SDIO
SD是一种关于Flash存储卡的标准,也就是一般常见的SD记忆卡,在设计上与MMC保持了兼容。
SDIO(Secure Digital Input/Output) 是基于 SD卡 的一种扩展标准,它将 SD卡 存储功能与 输入/输出(I/O) 功能结合起来,能够在一个设备中同时提供存储和外部设备接口。SDIO卡为电子设备提供了扩展功能,如无线网络、蓝牙、GPS、摄像头等,而不仅仅是存储功能,它使得设备能够通过SD卡接口与外部硬件进行通信。
SD卡与SDIO卡的工作方式
- SD卡:传统的SD卡通常只提供数据存储功能,它的主要用途是存储数据,通过 SD总线 与设备进行通信,设备通过 命令和响应 与SD卡交互,读取和写入数据。
- SDIO卡:除了存储功能外,SDIO卡还支持 输入输出(I/O) 功能。SDIO卡通过 多通道数据总线 支持数据传输,同时也能与设备进行外设通信。例如,SDIO卡可以作为 无线网卡,让设备通过Wi-Fi连接网络,或者作为 蓝牙适配器,实现蓝牙功能。
SDIO卡内有一个 控制器,负责管理外设功能的操作。SDIO卡的主机通过 SDIO 协议与卡上的外设控制器进行通信,数据传输通常采用 字节模式 或 块模式。而当SDIO卡作为存储卡时,它也像普通的SD卡一样进行数据存储操作。
SD卡的典型时序
在SD卡中,数据的读取和写入是基于命令和响应的机制进行的,通常采用 SPI模式 或 SD模式。下面我们来简要回顾SD卡的典型时序:
SD卡时序(SD模式)
- 命令发送:主机向SD卡发送命令(如读写操作),每个命令都有相应的响应。
- 数据传输:一旦主机得到SD卡的响应,它会根据命令的类型(如读、写、擦除等)执行相应的操作。数据传输通常使用 块模式(如512字节的块)或 字节模式(如8位数据单元)。
- 数据写入时序: 命令阶段:主机通过发送命令来指示SD卡执行操作,命令通常通过SPI或SD模式的总线传送。响应阶段:SD卡返回响应,通常是一个 R1 或 R2 类型的响应,表示命令是否执行成功。数据阶段:若是数据写入操作,数据会被传送至SD卡,数据通常是通过并行数据线或SPI总线进行传输。
- 数据读取时序: 命令阶段:主机发送读命令,告诉SD卡准备好数据。响应阶段:SD卡返回响应,确认准备好数据。数据传输阶段:主机通过数据总线接收数据,通常是连续的字节块。
SD卡时序图:
SDIO卡的典型时序
SDIO卡在时序上比SD卡更复杂,因为除了存储操作外,SDIO卡还需要支持外设的 I/O功能,例如,Wi-Fi、蓝牙、GPS等。因此,SDIO卡的时序必须支持外设控制命令的发送与响应、外设数据传输等。
SDIO卡时序(SDIO模式)
- 命令发送与响应:SDIO卡除了存储命令外,还需要处理针对外设的控制命令,例如启动Wi-Fi、读取传感器数据等。这些命令发送后,主机和SDIO卡之间需要进行命令响应。
- 数据传输:SDIO卡支持多种 数据传输模式,包括字节模式和块模式。数据传输不仅限于存储数据,还可能包括从外设读取或写入数据。
SDIO卡时序图:
在 SDIO模式 下,时序不仅仅包括传统的SD存储命令,还可能涉及到 外设控制命令。例如,控制SDIO卡内的无线网卡启动、传感器读取等。
eMMC就是NAND Flash、闪存控制芯片和标准接口封装的集合,它把NAND和控制芯片直接封装在一起成为一个多芯片封装芯片。
- NAND Flash:是非易失性存储器,用于存储数据。它是一种基于 闪存技术 的存储介质,常用于各种存储卡、SSD以及嵌入式存储系统中。
- 闪存控制芯片:负责控制对NAND Flash的读写操作。NAND Flash本身是由许多小的存储单元(称为块或页面)构成,控制芯片负责管理这些存储单元的操作,包括地址映射、坏块管理、垃圾回收等。闪存控制器提供了 抽象的存储接口,使主机系统可以通过简单的命令进行数据操作,而不必了解NAND Flash的底层细节。
- 标准接口封装:eMMC使用标准的接口(如 MMC接口 或 eMMC协议)与主机系统通信,它简化了存储的集成过程,不需要额外的外部控制器或接口,便于直接嵌入到电子设备中。
eMMC与NAND Flash的关系
eMMC 其实是一个由 NAND Flash 和 闪存控制器 组成的封装。可以把eMMC看作是NAND Flash存储和控制器集成后的解决方案。其主要特点如下:
- NAND Flash存储:存储数据的介质。
- 控制器的作用:eMMC的控制器在内部管理对NAND Flash的存取操作。NAND Flash本身不具备直接通信能力,它需要控制器来处理数据的读写、存储管理(如坏块管理、垃圾回收、磨损均衡)等任务。控制器为主机提供简单的接口,使得主机能够通过标准的命令操作数据,而不需要处理底层的闪存管理逻辑。
- eMMC的封装:eMMC将NAND Flash和控制器封装成一个单独的芯片,从而简化了主机对存储设备的管理。eMMC提供的接口使得集成变得更加简单和直接,减少了外部电路和芯片的数量。
eMMC与NAND Flash的区别
- eMMC是一个封装解决方案,它不仅包含NAND Flash芯片,还集成了 控制器 和接口,并提供一个标准的接口协议(MMC协议)。相比之下,NAND Flash本身只是存储芯片,需要额外的控制器和电路才能被系统使用。
- NAND Flash 是一种存储介质,而 eMMC 是将NAND Flash和控制器封装为一个整体的存储解决方案,使得存储操作更加简单、方便。
- 接口和兼容性:eMMC使用标准的 MMC接口(兼容SPI、SD接口等),而NAND Flash通常需要复杂的外部控制器和接口设计才能正常工作。
这个专栏旨在帮助开发者循序渐进地学习Linux设备驱动开发。从基础概念开始,逐步深入到高级特性,每个模块都是下一个模块的基础。建议按照章节顺序进行,结合理论学习和实际编程练习,相信大家能够掌握Linux驱动开发的精髓,以便更好地去笔试与面试。