UFS深入浅出 第二章 UFS结构 第三节 UFS分区
Section 3 UFS partition
第三节 UFS分区
UFS partition concept is similar to that in eMMC. However, it is not exactly the same. In eMMC, the whole user area could be used immediately after initialization. If there are some dedicated purposes to store specific data, some area called General Purpose Partition (aka GPP) could be separated from user space with its own address memory space assigned. GPP number is up to 4 per eMMC specification. Besides that, there are two boots partition and one RPMB partition in eMMC when shipped out from factory. Either GPP, or Boot/RPMB need dedicated Switch Command CMD6 for accessing to their own independent memory space areas.
UFS分区的概念和eMMC相似。但是,又不完全一样。eMMC里面的整个用户区域可以在初始化之后立即使用。如果有特定的目的去存储一些专门的数据,那么可以从用户区域里面的分出一些分配了自己独立寻址空间的区域,称为通用目的区(也叫GPP)。根据eMMC的规范,GPP的数目最多是4个。除此之外出厂的时候在eMMC里还有两个boot分区以及一个RPMB分区。eMMC里不论是GPP,或者是Boot、RPMB,都需要特定的切换指令CMD6来访问它们自己的独立的寻址空间。
UFS partitions do not work that way. In UFS, partitions have a unique name Logical Unit (aka LU). Except one RPMB logical unit, no other Logical Units are assigned by default in UFS from factory,including boot partition. UFS memory space could not be accessed unless it has been separated into pieces with independent memory space and index assigned. Each piece is so called one Logical Unit, short as LU. The process of memory space allocation for each LU is called provisioning.
UFS的分区工作方式不太一样。在UFS里,分区有一个独特的名字逻辑单元(也叫LU)。除了一个RPMB之外,在UFS里包括boot分区在内,没有其他逻辑分区在出厂的时候就默认分配好的。UFS的存储空间在分成带有独立寻址空间和序列号的小块之前,是不能被访问的。每一个小块也就是一个逻辑单元,简写成LU。分配存储空间给每个LU的过程叫做配置(provisioning)。
The job that provisioning does is actually to create a scattered mapping table of memory space LBA for all LU. There are two types of provisioning defined by UFS specification, Full Provisioning and Thin Provisioning. Full Provisioning gives a 1:1 mapping for all physical memory with its corresponding LBA to LU. While Thin provisioning only assigned all LBAs to LUs. Compared to Full Provisioning, Thin provisioning is more flexible to use physical Flash memory so to reducing NAND overhead blocks and save cost. This is also the reason UFS command UNMAP, which is to delete Logical to Physical Address entry to free the dirty data blocks, is only supported in Thin Provisioning as Full Provisioning need to keep those dirty data blocks unless extra physical Flash blocks that are out of UFS exported capacity are provided to replace them. Nowadays, all UFS vendors has no doubt to choose Thin provisioning.
Provisioning的工作实际上是为所有的LU建立一个分散的存储空间LBA的映射表。UFS规范定义了两种Provisioning模式,完全的Full Provisioning以及廋Thin Provisioning。Full Provisioning给出了所有物理存储以及对应的LBA相对于LU的1:1对应关系。而Thin Provisioning只需要分配所有的LBA个LU。和Full Provisioning相比较,Thin Provisioning可以更加灵活的使用物理闪存,从而减少额外的NAND存储块以及减少成本。这也是为什么UFS的UNMAP命令只支持Thin Provisioning方式,UNMAP命令是通过删除逻辑物理地址映射入口来释放脏数据块。因为Full Provision除非有输出容量之外的额外的物理闪存块来替换那些脏数据块,否则就得一直留着它们。今日,所有的UFS厂商都毫无意外的选择Thin Provisioning。
The index assigned is the number of the LU. Hence Logical Unit Number (aka LUN) is used in UFS protocol to address the specific LU. Generally, there are up to 32 LU in UFS, however the real number could be much less than that based on the real storage usage design.
分配给LU的索引是数字号码,所以逻辑单元号(也叫LUN)就被用在UFS协议里面作为定位特定的LU。一般来说,UFS最多有32个LU,然而实际的数目根据实际存储使用的设计可能远小于这个数字。
UFS also inherit the concept of Well-Known Logical Unit (aka W-LU) from SCSI. There are total 4 W-LU in UFS, Device and Report LUN are two W-LU which have the same definition as that in SCSI, while Boot and RPMB are two W-LU which are newly added to implement and comply with eMMC feature. Each W-LU get its fixed number called Well-known Logical Unit Number (aka W-LUN). The fixed number is the reason that these 4 W-LU are well known. Here we only need to remember that 0xB0 is for Boot and 0xC4 is for RPMB.
UFS还集成了源自于SCSI的概念,众所周知的逻辑单元(也叫 W-LU)。UFS里一共有4个W-LU,Device和Report LUN是和SCSI定义一样的概念的W-LU。而Boot和RPMB是新加入的为了实现以及于eMMC特性保持一致的W-LU。每一个W-LU有固定的众所周知的逻辑单元码, 也就是众所周知的逻辑单元码(也叫W-LUN)。这些固定的数字码也是为什么这四个W-LU众所周知的原因。这里我们只需要记住Boot是0xB0以及RPMB是0xC4。
Boot W-LU density is part of the exported capacity of UFS, and size could be assigned up to 64MB each. This is not like eMMC. In eMMC, two boot partitions density is not counted in the exported capacity and usually is fixed for each, like 4MB. This feature gives UFS more flexibility to fit increasing demand of OS boot size requirement. Another notice for Boot W-LUs is, although it has fixed W-LUN 0xB4, it cannot be accessed until it is linked to a certain LU during the provisioning process by setting the UFS register Descriptor. RPMB W-LU is originated and does not have this limitation, W-LUN is 0xC4, which could be accessed directly. The detail will be covered in the UFS register chapter.
Boot W-LU的容量是包含在UFS的输出容量里的,大小可最大分配到64MB。这个和eMMC不一样,在eMMC里,两个Boot分区的容量是不算在输出容量里的,而且大小通常是固定的,比如说4MB。这个特性也给了UFS更多的灵活性来适应操作系统对于Boot分区尺寸逐渐增加的需求。另外一个Boot W-LU需要注意的点是,虽然它有固定的W-LUN 0xB0,但是在通过UFS寄存器设置做Provisioning把它链接到某个LU之前,它是不能访问的。 RPMB W-LU是原生的,没有这个限制,W-LUN是0xC4,直接就可以访问。具体的细节我们会在UFS寄存器的章节里讲。
学习下 eMMC
eMMC 简介
Host Interface
Flash Controller
Flash Memory
eMMC 分区管理
Boot Area Partitions
eMMC 分区应用实例
eMMC 总线协议
eMMC 总线接口
eMMC 总线模型
eMMC 简介
eMMC 是 embedded MultiMediaCard 的简称。MultiMediaCard,即MMC, 是一种闪存卡(Flash Memory Card)标准,它定义了 MMC 的架构以及访问 Flash Memory 的接口和协议。而eMMC 则是对 MMC 的一个拓展,以满足更高标准的性能、成本、体积、稳定、易用等的需求。
eMMC 的整体架构如下图片所示:
eMMC 内部主要可以分为 Flash Memory、Flash Controller 以及Host Interface 三大部分。
Host Interface
eMMC 与 Host 之间的连接如下图所示:
各个信号的用途如下所示:
CLK: 用于同步的时钟信号Data Strobe:此信号是从 Device 端输出的时钟信号,频率和 CLK 信号相同,用于同步从 Device 端输出的数据。该信号在 eMMC 5.0 中引入。CMD:此信号用于发送 Host 的 command 和 Device 的 response。DAT0-7:用于传输数据的 8 bit 总线。
Host 与 eMMC 之间的通信都是 Host 以一个 Command 开始发起的。针对不同的 Command,Device 会做出不同的响应。详细的通信协议相关内容,可以参考eMMC总线协议章节。
Flash Controller
NAND Flash 直接接入 Host 时,Host 端通常需要有 NAND Flash Translation Layer,即 NFTL 或者 NAND Flash 文件系统来做坏块管理、ECC等的功能。
eMMC 则在其内部集成了 Flash Controller,用于完成擦写均衡、坏块管理、ECC校验等功能。相比于直接将 NAND Flash 接入到 Host 端,eMMC 屏蔽了 NAND Flash 的物理特性,可以减少 Host 端软件的复杂度,让 Host 端专注于上层业务,省去对 NAND Flash 进行特殊的处理。同时,eMMC 通过使用 Cache、Memory Array 等技术,在读写性能上也比 NAND Flash 要好很多。
Flash Memory
Flash Memory 是一种非易失性的存储器,通常在嵌入式系统中用于存放系统、应用和数据等,类似于 PC 系统中的硬盘。目前,绝大部分手机和平板等移动设备中所使用的 eMMC 内部的 Flash Memory 都属于 NAND Flash。
eMMC 在内部对 Flash Memory 划分了几个主要区域,如下图所示:
BOOT Area Partition 1 & 2
此分区主要是为了支持从 eMMC 启动系统而设计的。该分区的数据,在 eMMC 上电后,可以通过很简单的协议就可以读取出来。同时,大部分的 SOC 都可以通过 GPIO 或者 FUSE 的配置,让 ROM 代码在上电后,将 eMMC BOOT 分区的内容加载到 SOC 内部的 SRAM 中执行。
RPMB Partition
RPMB 是 Replay Protected Memory Block的简称,它通过 HMAC SHA-256 和 Write Counter 来保证保存在 RPMB 内部的数据不被非法篡改。在实际应用中,RPMB 分区通常用来保存安全相关的数据,例如指纹数据、安全支付相关的密钥等。
General Purpose Partition 1~4
此区域则主要用于存储系统或者用户数据。General Purpose Partition 在芯片出厂时,通常是不存在的,需要主动进行配置后,才会存在。
User Data Area
此区域则主要用于存储系统和用户数据。User Data Area 通常会进行再分区,例如 Android 系统中,通常在此区域分出 boot、system、userdata 等分区。
eMMC 分区管理
Boot Area Partitions
Boot Area 包含两个 Boot Area Partitions,主要用于存储 Bootloader,支持 SOC 从 eMMC 启动系统。
1. 容量大小
两个 Boot Area Partitions 的大小是完全一致的,由 Extended CSD register 的 BOOT_SIZE_MULT Field 决定,大小的计算公式如下:
Size = 128Kbytes x BOOT_SIZE_MULT
一般情况下,Boot Area Partition 的大小都为 4 MB,即 BOOT_SIZE_MULT 为 32,部分芯片厂家会提供改写 BOOT_SIZE_MULT 的功能来改变 Boot Area Partition 的容量大小。BOOT_SIZE_MULT 最大可以为 255,即 Boot Area Partition 的最大容量大小可以为 255 x 128 KB = 32640 KB = 31.875 MB。
2. 从 Boot Area 启动
eMMC 中定义了 Boot State,在 Power-up、HW reset 或者 SW reset 后,如果满足一定的条件,eMMC 就会进入该 State。进入 Boot State 的条件如下:
Original Boot Operation
CMD 信号保持低电平不少于 74 个时钟周期,会触发 Original Boot Operation,进入 Boot State。
Alternative Boot Operation
在 74 个时钟周期后,在 CMD 信号首次拉低或者 Host 发送 CMD1 之前,Host 发送参数为 0xFFFFFFFA 的 COM0时,会触发 Alternative Boot Operation,进入 Boot State。
在 Boot State 下,如果有配置 BOOT_ACK,eMMC 会先发送 “010” 的 ACK 包,接着 eMMC 会将最大为 128Kbytes x BOOT_SIZE_MULT 的 Boot Data 发送给 Host。传输过程中,Host 可以通过拉高 CMD 信号 (Original Boot 中),或者发送 Reset 命令 (Alternative Boot 中) 来中断 eMMC 的数据发送,完成 Boot Data 传输。
Boot Data 根据 Extended CSD register 的 PARTITION_CONFIG Field 的 Bit[5:3]:BOOT_PARTITION_ENABLE 的设定,可以从 Boot Area Partition 1、Boot Area Partition 2 或者 User Data Area 读出。
3. RPMB Partition
RPMB(Replay Protected Memory Block)Partition 是 eMMC 中的一个具有安全特性的分区。eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。
RPMB 在实际应用中,通常用于存储一些有防止非法篡改需求的数据,例如手机上指纹支付相关的公钥、序列号等。RPMB 可以对写入操作进行鉴权,但是读取并不需要鉴权,任何人都可以进行读取的操作,因此存储到 RPMB 的数据通常会进行加密后再存储。
3.1 容量大小
RPMB Partition 的大小是由 Extended CSD register 的 BOOT_SIZE_MULT Field 决定,大小的计算公式如下:
Size = 128Kbytes x BOOT_SIZE_MULT
一般情况下,Boot Area Partition (笔误?RPMB Partition)的大小为 4 MB,即 RPMB_SIZE_MULT 为 32,部分芯片厂家会提供改写 RPMB_SIZE_MULT 的功能来改变 RPMB Partition 的容量大小。RPMB_SIZE_MULT 最大可以为 128,即 Boot Area Partition(笔误?RPMB Partition) 的最大容量大小可以为 128 x 128 KB = 16384 KB = 16 MB。
3.2 Replay Protect 原理
使用 eMMC 的产品,在产线生产时,会为每一个产品生产一个唯一的 256 bits 的 Secure Key,烧写到 eMMC 的 OTP 区域(只能烧写一次的区域),同时 Host 在安全区域中(例如:TEE)也会保留该 Secure Key。
在 eMMC 内部,还有一个RPMB Write Counter。RPMB 每进行一次合法的写入操作时,Write Counter 就会自动加一 。通过 Secure Key 和 Write Counter 的应用,RMPB 可以实现数据读取和写入的 Replay Protect。
3.3 RPMB 数据读取
RPMB 数据读取的流程如下:
a. Host 向 eMMC 发起读 RPMB 的请求,同时生成一个 16 bytes 的随机数,发送给 eMMC。
b. eMMC 将请求的数据从 RPMB 中读出,并使用 Secure Key 通过 HMAC SHA-256 算法,计算读取到的数据和接收到的随机数拼接到一起后的签名。然后,eMMC 将读取到的数据、接收到的随机数、计算得到的签名一并发送给 Host。
c. Host 接收到 RPMB 的数据、随机数以及签名后,首先比较随机数是否与自己发送的一致,如果一致,再用同样的 Secure Key 通过 HMAC SHA-256 算法对数据和随机数组合到一起进行签名,如果签名与 eMMC 发送的签名是一致的,那么就可以确定该数据是从 RPMB 中读取到的正确数据,而不是攻击者伪造的数据。
通过上述的读取流程,可以保证 Host 正确的读取到 RPMB 的数据。
3.4 RPMB 数据写入
RPMB 数据写入的流程如下:
a. Host 按照上面的读数据流程,读取 RPMB 的 Write Counter。
b. Host 将需要写入的数据和 Write Counter 拼接到一起并计算签名,然后将数据、Write Counter 以及签名一并发给 eMMC。
c. eMMC 接收到数据后,先对比 Write Counter 是否与当前的值相同,如果相同那么再对数据和 Write Counter 的组合进行签名,然后和 Host 发送过来的签名进行比较,如果签名相同则鉴权通过,将数据写入到 RPMB 中。
通过上述的写入流程,可以保证 RPMB 不会被非法篡改。
4. User Data Area
User Data Area (UDA) 通常是 eMMC 中最大的一个分区,是实际产品中,最主要的存储区域。
4.1 容量大小
UDA 的容量大小不需要设置,在配置完其他分区大小后,再扣除设置 Enhanced attribute 所损耗的容量,剩下的容量就是 UDA 的容量。
4.2 软件分区
为了更合理的管理数据,满足不同的应用需求,UDA 在实际产品中,会进行软件再分区。目前主流的软件分区技术有 MBR(Master Boot Record)和 GPT(GUID Partition Table)两种。这两种分区技术的基本原理类似,如下图所示:
软件分区技术一般是将存储介质划分为多个区域,既 SW Partitions,然后通过一个 Partition Table 来维护这些 SW Partitions。在 Partition Table 中,每一个条目都保存着一个 SW Partition 的起始地址、大小等的属性信息。软件系统在启动后,会去扫描 Partition Table,获取存储介质上的各个 SW Partitions 信息,然后根据这些信息,将各个 Partitions 加载到系统中,进行数据存取。
4.3 区域属性
eMMC 标准中,支持为 UDA 中一个特定大小的区域设定 Enhanced attribute。与 GPP 中的 Enhanced attribute 相同,eMMC 标准也没有定义该区域设定 Enhanced attribute 后对 eMMC 的影响。Enhanced attribute 的具体作用,由芯片制造商定义。
eMMC 分区应用实例
在一个 Android 手机系统中,各个分区的呈现形式如下:
mmcblk0 为 eMMC 的块设备;mmcblk0boot0 和 mmcblk0boot1 对应两个 Boot Area Partitions;mmcblk0rpmb 则为 RPMB Partition,mmcblk0px 为 UDA 划分出来的 SW Partitions;如果存在 GPP,名称则为 mmcblk0gp1、mmcblk0gp2、mmcblk0gp3、mmcblk0gp4;
root@xxx:/ # ls /dev/block/mmcblk0*/dev/block/mmcblk0/dev/block/mmcblk0boot0/dev/block/mmcblk0boot1/dev/block/mmcblk0rpmb/dev/block/mmcblk0p1/dev/block/mmcblk0p2/dev/block/mmcblk0p3/dev/block/mmcblk0p4/dev/block/mmcblk0p5/dev/block/mmcblk0p6/dev/block/mmcblk0p7/dev/block/mmcblk0p8/dev/block/mmcblk0p9/dev/block/mmcblk0p10/dev/block/mmcblk0p11/dev/block/mmcblk0p12/dev/block/mmcblk0p13/dev/block/mmcblk0p14/dev/block/mmcblk0p15/dev/block/mmcblk0p16/dev/block/mmcblk0p17/dev/block/mmcblk0p18/dev/block/mmcblk0p19/dev/block/mmcblk0p20
每一个分区会根据实际的功能来设定名称。
root@xxx:/ # ls -l /dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/lrwxrwxrwx root root 2015-01-03 04:03 boot -> /dev/block/mmcblk0p22lrwxrwxrwx root root 2015-01-03 04:03 cache -> /dev/block/mmcblk0p30lrwxrwxrwx root root 2015-01-03 04:03 custom -> /dev/block/mmcblk0p3lrwxrwxrwx root root 2015-01-03 04:03 devinfo -> /dev/block/mmcblk0p28lrwxrwxrwx root root 2015-01-03 04:03 expdb -> /dev/block/mmcblk0p4lrwxrwxrwx root root 2015-01-03 04:03 flashinfo -> /dev/block/mmcblk0p32lrwxrwxrwx root root 2015-01-03 04:03 frp -> /dev/block/mmcblk0p5lrwxrwxrwx root root 2015-01-03 04:03 keystore -> /dev/block/mmcblk0p27lrwxrwxrwx root root 2015-01-03 04:03 lk -> /dev/block/mmcblk0p20lrwxrwxrwx root root 2015-01-03 04:03 lk2 -> /dev/block/mmcblk0p21lrwxrwxrwx root root 2015-01-03 04:03 logo -> /dev/block/mmcblk0p23lrwxrwxrwx root root 2015-01-03 04:03 md1arm7 -> /dev/block/mmcblk0p17lrwxrwxrwx root root 2015-01-03 04:03 md1dsp -> /dev/block/mmcblk0p16lrwxrwxrwx root root 2015-01-03 04:03 md1img -> /dev/block/mmcblk0p15lrwxrwxrwx root root 2015-01-03 04:03 md3img -> /dev/block/mmcblk0p18lrwxrwxrwx root root 2015-01-03 04:03 metadata -> /dev/block/mmcblk0p8lrwxrwxrwx root root 2015-01-03 04:03 nvdata -> /dev/block/mmcblk0p7lrwxrwxrwx root root 2015-01-03 04:03 nvram -> /dev/block/mmcblk0p19lrwxrwxrwx root root 2015-01-03 04:03 oemkeystore -> /dev/block/mmcblk0p12lrwxrwxrwx root root 2015-01-03 04:03 para -> /dev/block/mmcblk0p2lrwxrwxrwx root root 2015-01-03 04:03 ppl -> /dev/block/mmcblk0p6lrwxrwxrwx root root 2015-01-03 04:03 proinfo -> /dev/block/mmcblk0p13lrwxrwxrwx root root 2015-01-03 04:03 protect1 -> /dev/block/mmcblk0p9lrwxrwxrwx root root 2015-01-03 04:03 protect2 -> /dev/block/mmcblk0p10lrwxrwxrwx root root 2015-01-03 04:03 recovery -> /dev/block/mmcblk0p1
eMMC 总线协议
eMMC 总线接口
eMMC 总线接口定义如下图所示:
CLK
CLK 信号用于从 Host 端输出时钟信号,进行数据传输的同步和设备运作的驱动。
在一个时钟周期内,CMD 和 DAT0-7 信号上都可以支持传输 1 个比特,即SDR (Single Data Rate) 模式。此外,DAT0-7 信号还支持配置为DDR (Double Data Rate) 模式,在一个时钟周期内,可以传输 2 个比特。
Host 可以在通讯过程中动态调整时钟信号的频率(注,频率范围需要满足 Spec 的定义)。通过调整时钟频率,可以实现省电或者数据流控(避免 Over-run 或者 Under-run)功能。在一些场景中,Host 端还可以关闭时钟,例如 eMMC 处于 Busy 状态时,或者接收完数据,进入 Programming State 时。
CMD
CMD 信号主要用于 Host 向 eMMC 发送 Command 和 eMMC 向 Host 发送对于的 Response。
DAT0-7
DAT0-7 信号主要用于 Host 和 eMMC 之间的数据传输。在 eMMC 上电或者软复位后,只有 DAT0 可以进行数据传输,完成初始化后,可配置 DAT0-3 或者 DAT0-7 进行数据传输,即数据总线可以配置为 4 bits 或者 8 bits 模式。
Data Strobe
Data Strobe 时钟信号由 eMMC 发送给 Host,频率与 CLK 信号相同,用于 Host 端进行数据接收的同步。Data Strobe 信号只能在HS400 模式下配置启用,启用后可以提高数据传输的稳定性,省去总线 tuning 过程。
eMMC 总线模型
eMMC 总线中一个 Host可以有多个 eMMC Devices。总线上的所有通讯都由 Host 端以一个 Command 开发发起,Host 一次只能与一个 eMMC Device 通讯。
系统在上电启动后,Host 会为所有 eMMC Device 逐个分配地址(RCA,Relative device Address)。当 Host 需要和某一个 eMMC Device 通讯时,会先根据 RCA 选中该 eMMC Device,只有被选中的 eMMC Device 才会响应 Host 的 Command。
1. 速率模式
随着 eMMC 协议的版本迭代,eMMC 总线的速率越来越高。为了兼容旧版本的 eMMC Device,所有 Devices 在上电启动或者 Reset 后,都会先进入兼容速率模式(Backward Compatible Mode)。在完成 eMMC Devices 的初始化后,Host 可以通过特定的流程,让 Device 进入其他高速率模式,目前支持以下的几种速率模式。
注:
Extended CSD byte[185] HS_TIMING 寄存器可以配置总线速率模式
Extended CSD byte[183] BUS_WIDTH 寄存器用于配置总线宽度和 Data Strobe
2. 通信模型
Host 与 eMMC Device 之间的通信都是由 Host 以一个 Command 开始发起的,eMMC Device 在完成 Command 所指定的任务后,则返回一个 Response。
2.1 Read Data
Host 从 eMMC Device 读取数据的流程如上图所示。
如果 Host 发送的是 Single Block Read 的 Command,那么 eMMC Device 只会发送一个 Block 的数据。
如果 Host 在发送 Multiple Block Read 的 Command 前,先发送一个设定需要读取的 Block Count 的 Command。eMMC Device 在完成指定 Block Count 的数据发送后,就自动结束数据传输,不需要 Host 主动发送 Stop Command。
如果 Host 没有发送设定需要读取的 Block Count 的 Command,发送 Multiple Block Read 的 Command 后,eMMC Device 会持续发送数据,直到 Host 发送 Stop Command 停止数据传输。
注:从 eMMC Device 读数据都是按 Block 读取的。Block 大小可以由 Host 设定,或者固定为 512 Bytes,不同的速率模式下有所不同。
2.2 Write Data
Host 向 eMMC Device 写入数据的流程如上图所示。
如果 Host 发送的是 Single Block Write Command,那么 eMMC Device 只会将后续第一个 Block 的数据写入的存储器中。
如果 Host 在发送 Multiple Block Write 的 Command 前,先发送一个设定需要读取的 Block Count 的 Command。eMMC Device 在接收到指定 Block Count 的数据后,就自动结束数据接收,不需要 Host 主动发送 Stop Command。
如果 Host 没有发送设定需要读取的 Block Count 的 Command,发送 Multiple Block Write 的 Command 后,eMMC Device 会持续接收数据,直到 Host 发送 Stop Command 停止数据传输。eMMC Device 在接收到一个 Block 的数据后,会进行 CRC 校验,然后将校验结果通过 CRC Token 发送给 Host。
发送完 CRC Token 后,如果 CRC 校验成功,eMMC Device 会将数据写入到内部存储器时,此时 DAT0 信号会拉低,作为 Busy 信号。Host 会持续检测 DAT0 信号,直到为高电平时,才会接着发送下一个 Block 的数据。如果 CRC 校验失败,那么 eMMC Device 不会进行数据写入,此次传输后续的数据都会被忽略。
注:向 eMMC Device 写数据都是按 Block 写入的。Block 大小可以由 Host 设定,或者固定为 512 Bytes,不同的速率模式下有所不同。
2.3 No Data
在 Host 与 eMMC Device 的通信中,有部分交互是不需要进行数据传输的,还有部分交互甚至不需要 eMMC Device 的回复 Response。
2.4 Command
如上图所示,eMMC Command 由 48 Bits 组成,各个 Bits 的解析如下所示:
Start Bit 固定为 "0",在没有数据传输的情况下,CMD 信号保持高电平,当 Host 将 Start Bit 发送到总线上时,eMMC Device 可以很方便检测到该信号,并开始接收 Command。
Transmission Bit 固定为 "1",指示了该数据包的传输方向为 Host 发送到 eMMC Device。
Command Index 和 Argument 为 Command 的具体内容,不同的 Command 有不同的 Index,不同的 Command 也有各自的 Argument。更多的细节,请参考eMMC Commands 章节。
CRC7 是包含 Start Bit、Transmission Bit、 Command Index 和 Argument 内容的 CRC 校验值。End Bit 为结束标志位,固定为"1"。
注:CRC 校验简单来说,是发送方将需要传输的数据“除于”(模2除)一个约定的数,并将得到的余数附在数据上一并发送出去。接收方收到数据后,再做同样的“除法”,然后校验得到余数是否与接收的余数相同。如果不相同,那么意味着数据在传输过程中发生了改变。更多的细节不在本文展开描述,感兴趣的读者可以参考 CRC wiki 中的介绍。
2.5 Response
eMMC Response 有两种长度的数据包,分别为 48 Bits 和 136 Bits。
Start Bit 与 Command 一样,固定为 "0",在没有数据传输的情况下,CMD 信号保持高电平,当 eMMC Device 将 Start Bit 发送到总线上时,Host 可以很方便检测到该信号,并开始接收 Response。
Transmission Bit 固定为 "0",指示了该数据包的传输方向为 eMMC Device 发送到 Host。
Content 为 Response 的具体内容,不同的 Command 会有不同的 Content。更多的细节,请参考eMMC Responses 章节。CRC7 是包含 Start Bit、Transmission Bit 和 Content 内容的 CRC 校验值。End Bit 为结束标志位,固定为"1"。
【转自https://blog.csdn.net/u013686019/article/details/66472291】
相关问答
qcn是什么芯片?qcn是你手机的射频参数,一般不会用到,有时在做手机校准时会用到。QCN文件存储的都是NV项目,一般主要是RF/NV项,不能配置在代码中,要写进Flash的特定分区表...
电脑 硬盘分区 读取扇区错误是什么意思 - 懂得可能有逻辑坏道,你格式化在测试一下,如果格式化后无此现象就不是物理坏道。如果会用MHDD检测那个是比较准确的。硬盘上可能有坏道,建议找专业技术...
浏览器的两种 flash player有什么不同吗-ZOL问答以下载雅虎助手来修复IE中关村在线vivoX90Pro+举报手机MotoMotoFLASH...点击控制面板在Internet选项中,点击程序有一个内容就是(管理加载项)找到相关项...
求教awdflash的使用方法,详细些,我是初學者。-ZOL问答如果你要升级的bios文件和awdflash一个目录,叫做a.bin直接在dos下面输入“awdflasha.bin”就行了(格式awdflash空格文件路径),回车后,只显示:...
把 flash 导出动态GIF图为什么我勾选“透明”,输出图片还是带白色背景?1.点击“文件”菜单中的“发布设置”命令,在随后的“发布设置”对话框中的“格式”选项下,你会发现,软件默认只勾选了“Flash(.swf)”和“HTML(.htm)”这...
装了 flash 插件仍然无法显示 flash 怎么办?若未被禁用,你可再次尝试从腾讯电脑管家的软件管理中下载AdobeFlashPlayerUninstaller这个官方提供的卸载工具进行卸载。然后运行REGEDIT,定位到HKEY_LO...
BIOS设置里Q- Flash 有什么用?怎么设置? - 小红薯5D43ABC0 的...技嘉的Q-Flash能够让你不用再在DOS下刷新BIOS,开机时按End进入或在CMOS设置界面按F8进入,选择UpdataFromDriver其他品牌类似功能的有华硕的EZ-Fl...
在开机的时候提示按进入Qflash是什么意思?-ZOL问答在开机时按下end按钮或者在BIOS菜单中按下F8都可以进入菜单中的选项名称和按钮说明非常明了,操作上不会有任何困难。Q-Flash的应用用Q-Flash可以用硬盘、USB设...
DVD怎么打开的啊?-ZOL问答weixin_kz910847右键选择弹出就可以打开的有用(0)回复aiyaya186如果有光盘盘符,右键选择弹出就可以打开了有用(0)回复tq6g84进入我的电脑,点击DVD什么....
u盘有两个 分区 ,第一个分区被设置只读,无法格式化,文件不能删除,第二个分区正常。量产工具不能识别?这是因为没有找对量产工具,第一个分区就是usb-cdrom格式,第二个分区才是U盘格式,往往礼品U盘都用第一个分区放广告。量产除了找对芯片型号,找对flash的型号...