emmc协议

一、简介

1.1 简介

嵌入式多媒体卡(Embedded Multimedia Card, eMMC)是由 JEDEC 协会所订立,将 MMC controller 和 NAND Flash 封装到一个芯片中,简化存储器的使用和电路板的设计。
在这里插入图片描述 在这里插入图片描述

1.2 信号

singledescription
clkclock
data strobe选通信号,olny for hs400
cmdcmd 和response
dat0-dat7数据线

1.3 速度模式

modedata ratebus widthfrequencymax throughout
Backwards Compatibility with legacy MMC cardSDR1,4,80-26MHz26MB/s
High Speed SDRSDR1,4,80-52MHz52MB/s
High Speed DDRDDR4,80-52MHz104MB/s
HS200SDR4,80-200MHz200MB/s
HS400DDR80-200MHz400MB/s

1.4 基本传输

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、工作模式

2.1 简介

在这里插入图片描述在这里插入图片描述

2.2 数据传输模式

2.2.1 change to hs200 / hs400 / hs400 enhance

在这里插入图片描述 在这里插入图片描述
在这里插入图片描述

三、 command and response

3.1 基本格式

在这里插入图片描述在这里插入图片描述

3.2 常用cmd

CMD INDEXArgumentrespAbbreviationDescription
CDM00x0000_0000NO RESGO_IDLE_STATE
CDM1OCR without busyR3SEND_OP_COND
CMD2[31:0] stuff bitsR2ALL_SEND_CID
CMD3[31:16] RCAR1SET_RELATIVE_ASSR
CMD6[31:26] set to 0
[25:24] access
[23:16] index
[15:8] value
[7:3] set to 0
[2:0] cmd set
R1bSWITCH
CMD7[31:16] RCAR1/R1bSELECT / DESELECT_CARD
CDM9[31:16] RCAR2SEND_CSD
CMD12[31:16] RCA
[0] HPI
R1/R1bSTOP_TRANSMISSION
CMD13[31:16] RCA
[15] SQS
[0] HPI
R1SEND_STATUS
CMD16[31:0] block lengthR1SET_BLOCKLEN
CMD17[31:0] data addressR1READ_SINGLE_BLOCK
CMD18[31:0] data addressR1READ_MULTIPLE_BLOCK
CMD21[31:0] stuff bitsR1SEND_TUNING_BLOCK
CMD23[15:0] number of blocksR1SET_BLOCK_COUNT
CMD24[31:0] data addressR1WRITE_SINGLE_BLOCK
CMD25[31:0] data addressR1WRITE_MULTIPLE_BLOCK

CMD6 access

access bitaccess name
00Command set
01set bits
10clear bits
11write byte

四、寄存器

4.1 OCR

在这里插入图片描述

4.2 CID

在这里插入图片描述

4.3 RCA

在这里插入图片描述

4.4 CSD

在这里插入图片描述

4.5 EXT_CSD

在这里插入图片描述

在这里插入图片描述
CMD6 参数
HS timing 0x03b90100
HS400 timing 0x03b90300
8bit ddr with enhance 0x03b78600
8bit ddr without enhance 0x03b70600
8bit sdr without enhance 0x03b70200

四、CQ & CQE

4.1 CQ

4.1.1 简介

Command Queuing是指可以将一些读写任务排成一个队列, 等它们准备好后再进行数据传输。这是一项用于优化命令排队和执行的功能,使eMMC 能够在后台同时处理多个任务,提高了性能和效率。
eMMC Device内部会有一个存储任务的队列,Host可以将任务放入其中进行排队。Host将任务送到队列中后,任务的初始状态为“pending”,然后Deivce会自动开始处理任务,当一个任务准备好执行时,状态会变为“ready for execution”。Host需要追踪每个排队任务的状态,某个任务准备好之后就发送相应的命令开始数据传输。
启用CQ功能时,只支持部分命令,而且不能使用CMD17/CMD18和CMD24/CMD25 进行数据传输。
在这里插入图片描述

4.1.2主要的CMD

CQ中包括 向Device发送任务、对已发出的任务进行排序和提供额外任务管理功能 的新命令
CMD44 定义排队任务的数据传输方向、优先级、任务ID和block数量
CMD45 定义排队任务的start block addr
CMD46 指定Device执行队列中相应ID的读任务
CMD47 指定Device执行队列中相应ID的写任务
CMD48 指示Device 丢弃队列中某个任务或者所有的任务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1.3 任务排队

Host通过发送CMD44和CMD45对数据传输任务进行排队,进行排队操作时必须先发送CMD44,再发送CMD45。
如果CMD44有错误,例如所请求的任务ID已经在使用中,Device将其视为非法命令并不予以响应。
如果在发送CMD44后没有发送CMD45,则这个排队操作会被取消。成功发送CMD45并得到R1响应,就说明任务已经在Device中排队。
在这里插入图片描述

4.1.4 执行队列中的任务

Host应发送包含相应 任务ID 的CMD46或CMD47执行先前排队的任务,CMD46用于执行读取命令,CMD47用于写入命令。
Host通过读取QSR寄存器判断任务是否准备好执行,如果任务已准备好执行,则Device返回响应并开始数据传输。如果出现错误,
Device将不会进行响应,也不会进行数据传输。
在这里插入图片描述

4.1.5 QSR寄存器

QSR寄存器可以指示当前任务的状态,Host通过发送CMD13读取QSR寄存器。
在这里插入图片描述

4.2. Command Queuing Engine(CQE)

4.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。
在这里插入图片描述

4.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。
在这里插入图片描述

4.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 时,其中某些字段的含义会发生变化。
在这里插入图片描述
在这里插入图片描述

4.2.2.2 Transfer Descriptor 结构

Transfer Descriptor 分为 64位寻址模式 和 32位寻址模式
在这里插入图片描述
在这里插入图片描述

4.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。

4.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

4.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 任务执行完成后发送。

4.2.6 CQE register

在这里插入图片描述

4.3 操作流程

4.3.1 CQ初始化流程

  1. 初始化Device和启用Device的CQ功能;
  2. 配置CQCFG寄存器设置Task Descriptor的大小;
  3. 配置CQTDLBA和CQTDLBAU寄存器,指示TDL的存储位置;
  4. 配置CQSSC1寄存器控制CQE向Device发送SEND_QUEUE_STATUS命令的时间;
  5. 配置CQIC寄存器控制启用或者禁用interrupt coalescing功能以及设置中断计数和定时器保护;
  6. 配置CQCFG寄存器启动CQE。

4.3.2 发送任务流程

  1. 读取CQTDBR寄存器寻找一个空闲的slot;
  2. 在slot中创建Task Descriptor;
  3. 在slot中创建Transfer Descriptor;
  4. 如果有多个任务,需要重复进行1-3步;
  5. 配置CQTDBR寄存器,将相应slot的bit置1。
    在这里插入图片描述

4.3.3 丢弃任务流程

  1. 配置CQCTL寄存器暂停CQE;
  2. 轮询CQCTL寄存器或者等待中断直到暂停CQE的操作完成;
  3. 读取CQTDBR寄存器,如果bit i为0,说明任务已经完成;
    如果为1,则需要再读取CQDPT寄存器,如果bit i 为1,说明任务已经在排队,则需要发送CMD48 丢弃这个任务,
  4. 向CQTCLR寄存器的bit i 写1清除CQE中的任务;
  5. 轮询CQTCLR寄存器直到清除操作完成;
  6. 配置CQCTL寄存器bit 0为0恢复CQE。

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值