本文主要是介绍emmc协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、简介
1.1 简介
嵌入式多媒体卡(Embedded Multimedia Card, eMMC)是由 JEDEC 协会所订立,将 MMC controller 和 NAND Flash 封装到一个芯片中,简化存储器的使用和电路板的设计。
1.2 信号
single | description |
---|---|
clk | clock |
data strobe | 选通信号,olny for hs400 |
cmd | cmd 和response |
dat0-dat7 | 数据线 |
1.3 速度模式
mode | data rate | bus width | frequency | max throughout |
---|---|---|---|---|
Backwards Compatibility with legacy MMC card | SDR | 1,4,8 | 0-26MHz | 26MB/s |
High Speed SDR | SDR | 1,4,8 | 0-52MHz | 52MB/s |
High Speed DDR | DDR | 4,8 | 0-52MHz | 104MB/s |
HS200 | SDR | 4,8 | 0-200MHz | 200MB/s |
HS400 | DDR | 8 | 0-200MHz | 400MB/s |
1.4 基本传输
二、工作模式
2.1 简介
2.2 数据传输模式
3 command and response
CQE
1.1简介
Command Queuing是指可以将一些读写任务排成一个队列, 等它们准备好后再进行数据传输。这是一项用于优化命令排队和执行的功能,
使eMMC 能够在后台同时处理多个任务,提高了性能和效率。
eMMC Device内部会有一个存储任务的队列,Host可以将任务放入其中进行排队。Host将任务送到队列中后,任务的初始状态为“pending”,
然后Deivce会自动开始处理任务,当一个任务准备好执行时,状态会变为“ready for execution”。Host需要追踪每个排队任务的状态,
某个任务准备好之后就发送相应的命令开始数据传输。
启用CQ功能时,只支持部分命令,而且不能使用CMD17/CMD18和CMD24/CMD25 进行数据传输。
1.2主要的CMD
CQ中包括 向Device发送任务、对已发出的任务进行排序和提供额外任务管理功能 的新命令
CMD44 定义排队任务的数据传输方向、优先级、任务ID和block数量
CMD45 定义排队任务的start block addr
CMD46 指定Device执行队列中相应ID的读任务
CMD47 指定Device执行队列中相应ID的写任务
CMD48 指示Device 丢弃队列中某个任务或者所有的任务
1.3 任务排队
Host通过发送CMD44和CMD45对数据传输任务进行排队,进行排队操作时必须先发送CMD44,再发送CMD45。
如果CMD44有错误,例如所请求的任务ID已经在使用中,Device将其视为非法命令并不予以响应。
如果在发送CMD44后没有发送CMD45,则这个排队操作会被取消。成功发送CMD45并得到R1响应,就说明任务已经在Device中排队。
1.4 执行队列中的任务
Host应发送包含相应 任务ID 的CMD46或CMD47执行先前排队的任务,CMD46用于执行读取命令,CMD47用于写入命令。
Host通过读取QSR寄存器判断任务是否准备好执行,如果任务已准备好执行,则Device返回响应并开始数据传输。如果出现错误,
Device将不会进行响应,也不会进行数据传输。
1.5 QSR寄存器
QSR寄存器可以指示当前任务的状态,Host通过发送CMD13读取QSR寄存器。
- Command Queuing Engine(CQE)
2.1 简介
Host中具体执行CQ功能的硬件模块被称为“Command Queuing Engine”(CQE)。CQE负责管理 Host软件端 与eMMC Device 之间的接口以及数据传输。
CQE可以独立于 eMMC Host controller,作为一个单独的模块实现。
其中,Command Queuing Host Controller Interface(CQHCI)是一个执行CQ功能模块的软硬件接口。包括处理软件提供的任务信息,与Device通信以
发出任务和对任务进行排序,以及从内存中读写数据和生成中断等。 CQHCI的目标是提供一种统一的用于访问CQ硬件功能的接口方法,从而为这些
功能提供通用的软件驱动程序。
CQE通过存储在系统内存中的Task Descriptor List (TDL)和一个doorbell 寄存器从软件端接收任务信息,然后发送 CMD44 和 CMD45 给 eMMC Device,
CQE 还需要读取 Device的 QSR寄存器,从而决定要执行哪个任务并发出CMD46或CMD47。
2.2 基于Task Descriptor List 和 Doorbell Register 下发任务
为了在 Device 中实现任务的排队,软件端使用存储在 Host 内存中的 Task Descriptor List (TDL)下发任务。TDL由最多32个固定大小的 slot 组成,
每个 slot 包括一个Task Descriptor 和一个Transfer Descriptor 。软件需要下发任务时,会选择一个可用的TDL slot,并在其中构建这两个 Descriptor。
两个 Descriptor 被写入 slot i后,软件端通过向 CQTDBR 寄存器的第 i 位写1来通知CQE处理相应的任务,CQE就会读取 Descriptor 并根据
Task Descriptor 中编码的信息生成 CMD44和CMD45 。
Task Descriptor:编码一个任务的所有信息,例如 Address, Block Count和Priority等。Task Descriptor 还可以编码直接发送到 Device 的任意命令(DCMD Descriptor)。
Transfer Descriptor:指向一个要从中读写数据的data buffer (TRAN Descriptor) 或者一组任意长度的TRAN Descriptor(LINK Descriptor)
下图为 TDL的基本结构,其中,slot0 存储了一个 TRAN Descriptor 的任务,指向一个 data buffer,slot1 存储 LINK Descriptor的任务,指向一组TRAN Descriptor,slot31 存储 DCMD Descriptor。
2.2.1 Task Descriptor 结构
Task Descriptor 的结构如 表B.229 和B.330 所示。Task Descriptor的位宽可以使用 CQCFG 寄存器中相应的字段进行配置。
当此位字段为0时,Task Descriptor 位宽为 64bit;此字段为1时,Task Descriptor 位宽为 128bit。
当Task Descriptor为 DCMD Descriptor 时,其中某些字段的含义会发生变化。
2.2.2 Transfer Descriptor 结构
Transfer Descriptor 分为 64位寻址模式 和 32位寻址模式
在这里插入图片描述
2.3 任务选择和执行
CQE 还负责读取 Device 的 QSR寄存器,以确定哪些任务已准备好执行,选择要执行的任务并安排它们的执行顺序。
读取QSR:当任务已经Device中排队时,CQE通过CMD13读取QSR,确定哪些任务已准备好执行。
如果数据传输正在进行,CQE会在数据传输结束之前按照 CQSSC1寄存器 CBC 字段的配置发送CMD13。如果总线处于空闲状态,CQE会按照 CQSSC1寄存器 CIT 字段的配置定期发送CMD13。
选择任务:当一个或多个任务已经准备好并且总线空闲(或者先前的数据传输即将结束)时,CQE就会选择一个任务执行。
任务执行排序:当总线处于空闲状态时,CQE发送 CMD46 或 CMD47 让Device执行某个任务。同时CQE还会将这个任务的 Transfer Descriptor 作为指向 Host 内存中 data buffer 的指针提供给 DMA。
2.4 发送 Direct Command(DCMD)
DCMD功能是为了当启用CQ模式时,软件端仍然可以通过 index 和 argument来发出 eMMC 命令。
需要启用DCMD功能时,要将CQCFG寄存器的bit 12置1。软件段将 DCMD Task Descriptor 写入TDL的 slot 31,并配置 Doorbell 寄存器(CQTDBR)。
命令的 index 和 argument 会直接编码在DCMD 的Task Descriptor中。
CQE会识别在TDL slot 31中的DCMD Task Descriptor,并根据其中的index 和 argument 构建CMD后将其发送到Device,最后将response存储在专用寄存器中。
DCMD Task只能通过 slot 31发出,并且一次只能发送一个。CQE会忽略DCMD Descriptor后面的Transfer Descriptor
2.5 Queue-Barrier (QBR)任务
为了使 Host 对任务之间的顺序具有控制权,可以通过设置Task Descriptor 中的 QBR位将一个任务标记为 Queue-Barrier (QBR)任务。Host需要实现以下两点:
a. 仅在执行完QBR 任务之前的所有任务后才会将QBR 任务发送到Device。
b. 新的任务只会在QBR任务执行完成后发送到Device。
发送QBR 任务的规则为:
a. 如果 QBR 任务是数据传输任务,只有在接收到 Device 队列中最后一个数据传输任务的 CMD46/ CMD47 的响应后,CQE才会向Device 发送 QBR 任务的CMD44和CMD45。
b. 如果QBR 任务是 DCMD任务,CQE只会在所有先前发出的任务完成后(包括数据传输完成)再发送相关的命令。
c. 在QBR 任务之后的命令只能在 QBR 任务执行完成后发送。
2.6 CQE register
3 操作流程
3.1 CQ初始化流程
- 初始化Device和启用Device的CQ功能;
- 配置CQCFG寄存器设置Task Descriptor的大小;
- 配置CQTDLBA和CQTDLBAU寄存器,指示TDL的存储位置;
- 配置CQSSC1寄存器控制CQE向Device发送SEND_QUEUE_STATUS命令的时间;
- 配置CQIC寄存器控制启用或者禁用interrupt coalescing功能以及设置中断计数和定时器保护;
- 配置CQCFG寄存器启动CQE。
3.2 发送任务流程
- 读取CQTDBR寄存器寻找一个空闲的slot;
- 在slot中创建Task Descriptor;
- 在slot中创建Transfer Descriptor;
- 如果有多个任务,需要重复进行1-3步;
- 配置CQTDBR寄存器,将相应slot的bit置1。
3.3 丢弃任务流程
- 配置CQCTL寄存器暂停CQE;
- 轮询CQCTL寄存器或者等待中断直到暂停CQE的操作完成;
- 读取CQTDBR寄存器,如果bit i为0,说明任务已经完成;
如果为1,则需要再读取CQDPT寄存器,如果bit i 为1,说明任务已经在排队,则需要发送CMD48 丢弃这个任务, - 向CQTCLR寄存器的bit i 写1清除CQE中的任务;
- 轮询CQTCLR寄存器直到清除操作完成;
- 配置CQCTL寄存器bit 0为0恢复CQE。
这篇关于emmc协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!