往期内容
Uart子系统专栏:
- 专栏地址:Uart子系统
- Linux内核早期打印机制与RS485通信技术
– 末片,有专栏内容观看顺序interrupt子系统专栏:
- 专栏地址:interrupt子系统
- Linux 链式与层级中断控制器讲解:原理与驱动开发
– 末片,有专栏内容观看顺序pinctrl和gpio子系统专栏:
专栏地址:pinctrl和gpio子系统
编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用
– 末片,有专栏内容观看顺序
input子系统专栏:
- 专栏地址:input子系统
- input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
– 末片,有专栏内容观看顺序I2C子系统专栏:
- 专栏地址:IIC子系统
- 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
– 末篇,有专栏内容观看顺序总线和设备树专栏:
- 专栏地址:总线和设备树
- 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
– 末篇,有专栏内容观看顺序
目录
1.最容易访问的设备是什么?
是内存!
要读写内存,知道它的地址就可以:
volatile unsigned int *p = 某个地址;
unsigned int val;
*p = val; /* 写 */
val = *p; /* 读 */
只有内存能这样简单、方便地使用吗?
不是的,所有的"ram-like"接口设备都可以这样操作。
什么叫"ram-like"接口?
- 要发出地址:有地址线
- 要读写数据:有数据线
- 怎么分辨是读还是写:有读写信号
- 众多"ram-like"设备共享上面的信号,怎么才能互不影响?每个设备都有自己的片选信号
如下图所示:
-
CPU发出addr,到达内存控制器,也出现在RAM、Flash、GPIO等设备上
-
使能设备:
- 如果addr属于RAM的地址范围,cs0就被使能
- 如果addr属于Flash的地址范围,cs1就被使能
- 如果addr属于GPIO的地址范围,cs2就被使能
- 没有被使能的设备,就相当于没接上去一样,不会影响其他设备
-
读写数据、
关键在于:内存控制器,它会根据地址范围发出对应的片选信号,选中对应的设备。
内存控制器(Memory Controller)是负责管理系统中的内存(如 DRAM、SRAM)的硬件或逻辑组件。它在处理器与内存之间起到桥梁作用,主要负责处理器对内存的访问控制、调度和数据传输。现代的内存控制器通常集成在 CPU 中(即集成内存控制器,IMC),也可以作为独立的芯片存在。通过内存控制器,实现CPU访问某个设备时,放弃其它设备来干扰到了addr和data。
内存控制器的作用:
- 处理内存访问请求:
内存控制器接收来自 CPU 或其他硬件组件的内存读写请求,翻译这些请求为内存可识别的操作,并按照一定的顺序将其传递到内存芯片。 - 内存寻址:
内存控制器负责将 CPU 的逻辑地址转换为物理内存地址,并根据请求类型(读取或写入)执行相应的操作。它确保每个内存访问能够在正确的内存地址上执行。 - 管理内存时序:
不同类型的内存(如 DDR、LPDDR)具有不同的时序要求,内存控制器根据内存的特性管理操作的延时,确保时序要求得到满足以保持内存读写的稳定性。 - 数据缓冲和预取:
内存控制器会缓冲数据,以提高处理器与内存之间的数据传输效率。它还可能通过预取机制,提前将可能被 CPU 需要的数据从内存取出放入缓存,减少内存访问延迟。 - 内存访问优化:
内存控制器通过调度和优化内存访问请求,提高内存的带宽利用率。例如,它可以重排序内存请求,以减少等待时间(例如最早-最少行开销调度),避免多次刷新同一行数据。 - 支持多通道内存:
许多内存控制器支持多通道(如双通道、四通道等)内存架构,通过并行处理多个内存访问请求,增加带宽,提高整体系统性能。 - 刷新管理(DRAM):
动态内存(如 DRAM)需要周期性刷新以保持数据的完整性。内存控制器负责在后台进行这些刷新操作,不干扰正常的读写操作。 - 纠错功能(ECC):
一些内存控制器支持错误校正码(ECC)内存,它能够检测并纠正内存中的单比特错误,确保数据的可靠性,尤其在服务器和关键任务系统中非常重要。 - 内存访问权限和安全性:
内存控制器可以管理不同进程或设备对内存的访问权限,以确保不同内存区域之间的隔离,防止未经授权的访问。
2.地址空间的概念
2.1 概念
嵌入式系统中的地址空间:
-
CPU发出addr,可以用来方位EMMC控制器
-
但是CPU发出的addr,不能直接到达EMMC Flash
-
想访问EMMC Flash
- 必须用过EMMC控制器
- 编写EMMC控制器驱动程序
-
如果CPU发出的addr,可以直接到达EMMC Flash,那就简单了
在嵌入式系统中,当CPU发出一个内存地址请求(例如给eMMC Flash),这个请求需要经过多个层次的硬件控制器进行处理,其中包括内存控制器、eMMC控制器等。以下是原因和流程的详细解释:
1. eMMC与内存的不同工作方式
eMMC(嵌入式多媒体卡)与常规的RAM(如DDR)相比,工作机制和协议不同。eMMC是一种基于NAND Flash技术的非易失性存储设备,而内存(RAM)是一种随机存取存储器,两者的读写机制、协议、时序要求都存在较大差异。为了桥接这些差异,eMMC需要一个专门的eMMC控制器来处理和管理它的操作。
2. 内存控制器与eMMC控制器的不同职责
- 内存控制器:负责管理系统中的随机存取内存(如DRAM、SRAM),它直接与CPU和系统总线进行交互,并为CPU提供快速的读写操作支持。内存控制器的设计主要面向同步存储设备的高速数据访问需求。
- eMMC控制器:eMMC设备使用标准的eMMC协议,它是一种专用的协议,包含复杂的读写命令集、数据块管理、以及数据的写保护等功能。eMMC控制器的主要职责是处理这些协议细节,并通过标准化接口(如SD/MMC协议)与eMMC Flash芯片交互。
3. eMMC控制器的主要作用
- 协议转换:CPU通过内存控制器发出的地址和数据是基于系统总线的协议,而eMMC Flash本身使用的是eMMC协议。eMMC控制器负责将系统总线上的读写命令和数据,转换为eMMC设备能够理解的命令格式(如CMD/RESP命令结构)。eMMC控制器需要根据eMMC协议发送特定的指令来控制eMMC Flash的读写操作。
- 数据管理:eMMC Flash采用块设备的形式进行管理,其数据读写通常需要按照块或页的单位进行操作,而不是直接按字节寻址。eMMC控制器负责管理这些数据的打包、拆分以及对应块的寻址工作。
- 时序控制:eMMC控制器负责管理eMMC Flash的时序。与RAM不同,eMMC Flash的写入和擦除操作涉及物理层的NAND Flash技术,因此时序要求复杂得多。eMMC控制器确保这些操作的顺序和时序符合Flash设备的工作要求。
- 错误检测与管理:eMMC Flash中的数据可能会发生错误(如位翻转等),eMMC控制器通常包含错误检测和纠错功能,以保证数据的完整性。控制器还可以实现坏块管理(bad block management)和磨损均衡(wear leveling)等操作,以延长Flash的使用寿命。
- DMA传输:为了提高传输效率,eMMC控制器可以通过直接内存访问(DMA)与系统内存交互,避免CPU处理每一个数据块。通过DMA,数据可以直接从eMMC控制器传送到内存,减少CPU的负担。
4. 流程解析
当CPU发出访问eMMC Flash的请求(例如读写数据),整个流程大致如下:
- CPU发出请求:CPU发出一个存储操作(地址和数据),并通过内存控制器发送到系统总线。
- 内存控制器处理:内存控制器根据系统的内存映射,确定这是对外部设备(如eMMC Flash)的请求,并将其转交给eMMC控制器。
- eMMC控制器接收请求:eMMC控制器解析来自系统总线的请求,并转换为eMMC协议命令。
- eMMC控制器与eMMC Flash交互:eMMC控制器通过eMMC总线发送合适的命令给eMMC Flash芯片,并进行数据传输(读或写)。
- 返回结果:eMMC控制器将数据或状态反馈回内存控制器,再通过总线返回给CPU。
内存控制器和eMMC控制器的存在是为了处理不同类型存储器的访问需求。内存控制器管理RAM等高速存储器,而eMMC控制器专门处理eMMC Flash这种基于NAND技术的非易失性存储设备。eMMC控制器承担协议转换、时序控制、数据打包、错误管理等任务,确保CPU能够通过标准的总线协议与eMMC设备进行交互。
2.2 例子
以人类为例:
- 爷爷生了4个小孩,排行1234
- 老大又生了4个小孩,排行1234
- 这2个"1234"辈分不一样,空间不一样
在嵌入式系统中,eMMC控制器与eMMC Flash之间的地址空间、访问方式和协议是不一样的。为了让CPU能够成功地与eMMC Flash交互,必须通过eMMC控制器来进行“桥接”,就像家族中的不同辈分和不同位置,虽然都属于同一个家族,但辈分和位置决定了他们的不同角色和互动方式。
用上面的例子来类比:
- CPU的地址空间可以理解为爷爷生的4个小孩的地址空间(在系统总线中分配的地址范围),这些地址是统一的系统内存或I/O地址,CPU直接管理它们。
- eMMC控制器的地址空间则像是老大生的4个小孩的地址空间。虽然这些小孩也是家族的一部分,但他们属于不同的辈分,和爷爷生的小孩不同。
- eMMC Flash可以理解为这些“更年轻”的小孩中的一个。eMMC控制器知道如何和他们沟通,因为他们使用了一套不同的“语言”或“协议”。
为什么需要经过eMMC控制器?
- 协议不同:CPU使用的是通用的内存访问协议,而eMMC Flash使用的是专用的eMMC协议。eMMC控制器需要负责将这两者之间的协议进行转换,就像不同辈分的家族成员之间有不同的沟通方式。
- 时序和操作复杂性:eMMC Flash不像内存那样可以随时读写,它的操作更加复杂,包含块擦除、页读写、坏块管理等。eMMC控制器负责管理这些复杂的操作,以确保CPU可以方便地读写数据。
- 地址空间不同:eMMC控制器和eMMC Flash的地址空间是独立于CPU的系统总线地址空间的。eMMC控制器会将系统总线上的地址映射到eMMC Flash设备的物理地址范围,从而使CPU能够通过eMMC控制器正确访问eMMC Flash上的数据。
不同的控制器和存储设备有各自的“地址空间”和“访问协议”。CPU要通过内存控制器和eMMC控制器,才能成功访问eMMC Flash。这是因为不同存储设备和外设在系统中的层次和访问规则是不一样的,就像不同辈分的家族成员,他们的角色和职责不同,需要通过合适的渠道进行沟通。
3.理解PCI和PCIe的关键
3.1 地址空间
把上文第2大点所谈到的emmc控制器换成PIC/PICe就行了
将eMMC控制器换成PCI/PCIe控制器,基本道理也是相似的。无论是eMMC、PCI、PCIe,还是其他设备,CPU与这些外设之间的通信都需要经过一个专用的控制器来进行数据的传递和协议转换,原因也大致相同。
类似的核心概念:
- 协议不同:
不同设备(例如eMMC、PCI/PCIe设备)使用不同的通信协议和信号传输方式。CPU和PCI/PCIe设备之间不能直接进行通信,PCI/PCIe控制器负责处理通信协议的转换。就像eMMC控制器负责将CPU发出的命令转换成eMMC Flash能够理解的协议,PCI/PCIe控制器负责协调CPU与PCI/PCIe设备之间的数据传输。 - 地址空间不同:
CPU的地址空间是基于系统总线的,而PCI/PCIe设备有它们自己的地址空间。PCI/PCIe控制器负责将系统总线上的地址映射到PCI/PCIe设备的物理地址上,让CPU能够通过这个映射访问设备的资源和寄存器。类似的情况也出现在eMMC控制器中,控制器负责将系统地址映射到eMMC Flash的存储空间。 - 访问管理与优化:
PCI/PCIe控制器不仅负责协议转换,还负责传输管理、资源分配、时序优化等复杂的任务。这与eMMC控制器需要管理读写、坏块管理等类似。
上面的例子例子:
就像之前的家族辈分类比,CPU相当于长辈(爷爷),PCI/PCIe控制器就像家中的某个成员(比如老大),而PCI/PCIe设备就是老大的小孩。为了让长辈和这些小孩沟通,老大(PCI/PCIe控制器)需要负责桥接他们的沟通方式,处理不同辈分之间的关系(地址空间和协议)。
额外的功能差异:
虽然原理相似,但具体功能和作用可能会有所不同,比如:
- PCI/PCIe支持多设备通信,可以通过总线桥接多个外设,而eMMC主要是面向存储设备。
- PCIe的速度和拓展性更高,支持高速串行数据传输,而eMMC是专用存储接口。
3.2 PIC接口速览
考文件:01_pci接口引脚电路示例.pdf
在PCI控制器到PCI设备之间,addr线和data是复用的,也就是上图的AD0-AD31,传输的是数据还是地址由FRAMEL决定。
PCI是采用并行接口来传输的,它的传输速率比较高,但是达到一定速率后,相互之间会有很大的干扰。
3.3 PCIe接口速览
参考文件:01_pcie接口引脚电路示例_AX99100.pdf
这个图片是一个典型的 PCIe X1 接口的引脚定义和电路图。
电源部分:
-
+3.3V 和 +12V 电源引脚:
- A2, A3, B1, B2, B3:这些引脚为 PCIe 设备提供 +12V 电源。
- A8, A9, B8, B10:这些引脚提供 +3.3V 电源。
- B11 提供 3.3Vaux,用于维持设备的辅助电源。
- 电源引脚用于为 PCIe 设备供电,它们是输入端口,PCIe 设备从这些引脚获取所需的电源。
信号部分:
-
PCIe REFCLK(参考时钟):
- A12(REFCLKN#),A13(REFCLKP#):这两个引脚提供 PCIe 的参考时钟信号。PCIe 设备会使用这些时钟信号进行数据传输的同步。
- 这两个引脚是输入引脚,提供给 PCIe 设备的时钟信号。
-
PCIe 数据传输信号:
-
TX:
- A15(PCIe_TXP)、A16(PCIe_TXN):这是 PCIe 的传输信号对,分别是正负差分对。用于从设备发送数据到主机(上传)。
-
RX:
- B14(PCIe_RXP)、B15(PCIe_RXN):这是 PCIe 的接收信号对,分别是正负差分对。用于从主机接收数据到设备(下载)。
-
TX 和 RX 引脚分别用于 PCIe 设备的数据发送和接收,属于输入输出信号。
-
控制信号部分:
-
PCIe RST#(复位信号):
- A11:这是 PCIe 设备的复位信号,用于复位设备。通常在系统启动时,这个信号会被拉低,复位 PCIe 设备。
- 这是输入信号,主机向设备发送复位命令。
-
PCIe WAKE#(唤醒信号):
- B11:这个信号用于从低功耗模式唤醒设备,当设备需要唤醒时,它可以通过拉低此信号通知主机。
- 这是输出信号,设备通知主机它需要唤醒。
-
PRSNT#(存在信号):
- A1 和 B17:表示设备是否已插入插槽。通常 PRSNT 信号用于检测设备是否正确插入。
- 这是输出信号,用于告知主机设备是否存在。
接地部分:
- 多个接地引脚分布在 A7, A10, A14, A17, A18, B4, B6, B13, B16, B18。这些是用于提供电气接地的引脚。
和PCIe控制器连接的部分:
- 输入信号:PCIe_REFCLKP/N(时钟同步)、PCIe_RST#(复位控制),
- 输出信号:PCIe_WAKE#(唤醒信号)、PRSNT#(复位控制)
- 双向信号:PCIe_TXP/N(输出)、PCIe_RXP/N(输入)
PCIe则是使用串行接口来进行传输,差分信号。
标签:控制器,eMMC,Flash,嵌入式,PCIe,PCI,内存,CPU From: https://blog.csdn.net/caiji0169/article/details/144279104