焕发生机|嵌入式存储eMMC原理解析
1.EMMC背景回顾
EMMC存储的发展历史可以追溯到1997年,当时该技术是为了解决移动设备中存储器的问题而提出的。当时移动设备的存储器主要是NOR flash,这种存储器虽然读写速度快,但是造价高、容量小,不适合大规模应用。而EMMC的出现,将存储器和处理器或其他电子元件一起集成到单一芯片中,形成小巧、轻便的封装模块,解决了这个问题。随着技术的不断发展,EMMC规格的标准也逐渐从eMMC4.3时代发展到eMMC4.4时代,并进一步发展出eMMC4.5和eMMC 5.0等版本。其中,eMMC 5.0是三星于2013年7月29日首先量产的行业首款eMMC 5.0存储产品。
2.EMMC基本原理
eMMC是嵌入式MultiMediaCard的简称,它是对MMC存储卡标准的一个拓展,以满足更高标准的性能、成本、体积、稳定、易用等的需求。eMMC整体架构主要可以分为Flash Memory、Flash Controller以及Host Interface三大部分。
其中,Flash Memory是eMMC存储数据的主要部分,属于非易失性存储器,用于存放系统、应用和数据等,类似于PC系统中的硬盘。在eMMC内部,Flash Memory会被划分成不同的区域,包括BOOT Area Partition、RPMB Partition、General Purpose Partition和User Data Area等。
3.EMMC应用场景
由于EMMC具有大容量、高可靠性、低功耗、可扩展性强等特点,被广泛应用于各种嵌入式系统中,如手机和平板等移动设备。在这些设备中,eMMC通常会与处理器或SOC配合使用,以实现数据的存储和读取。开发者可以使用eMMC存储和读取设备中的系统和应用数据,包括操作系统代码、用户数据、应用程序等。
同时,随着技术的发展,EMMC的读写速度也不断提升,比如最新的eMMC 5.1读写速度已经可以达到UHS-II等级的速度。此外,EMMC也被应用于一些新兴的技术领域,比如DPU。在DPU中,EMMC作为存储器使用,支持DPU处理大量数据时所需的大容量存储器,同时满足DPU对高速数据传输的需求。
业内也有一个iNAND,是西部数据公司符合eMMC协议的一种芯片系列名称。也就是说,iNAND是一种eMMC,它基于eMMC协议进行设计和生产。是由存储系统和接口电路构成的,但它的接口电路比较复杂,功能很健全。它不仅提供了块的ECC校验相关的逻辑,而且本身自己完成了存储系统的ECC功能。这样,当SoC使用iNAND时,它就不需要自己编写代码来进行ECC相关操作,从而大大简化了SoC的编程难度。
另外,WD在HDD上采用的OptiNAND不是EMMC,基于UFS的产品。此前,WD针对HDD的创新提出了OptiNAND技术。OptiNAND技术的核心就是新增了iNAND UFS EFD,把磁道记录等元数据记录在iNAND之中。
根据官方的介绍,OptiNAND可以提升容量、性能和可靠性。
- 容量:采用triple stage actuator (TSA) 技术,实现更大的实现更大的TPI(每英寸磁道)数量和更高的面密度,在不需要增加碟片数量和磁头数量的情况下,实现容量的提升。原来放置在碟片的元数据,现在放在iNAND,也相当于给用户腾空了原来占用的数据空间,利于用户容量的提升。
- 性能:降低了相邻磁道的干扰ATI,也可以降低写缓存的刷新频率,这样就可以减少延迟,提升性能
- 可靠性:主要在EPO突然掉电场景,iNAND下刷的用户数据比之前DRAM缓存更多。
4.eMMC健康状态查询
在linux下,eMMC也是一个块设备,类似 /dev/mmcblk*。查看块设备的smartctl工具,对emmc也能查到一部分信息,但是信息很少。
# smartctl -a /dev/mmcblk0
smartctl 6.6 2021-07-22 r5044 [x86_64-linux-4.18.0-140-generic] (local build)
Copyright (C) 2002-18, Bruce Allen <brucea@smartmontools.org>
=== START OF INFORMATION SECTION ===
model number: SanDisk Ultra Fit (Toshiba 1306)
firmware version: OI_R248R354E4B8AF6AFAAI405T54JABOHX7244_SD03_V06.1036_V315A0943_AB32970F-S
LU WWN Device Id: 5 00a0d 661566343
serial number: D70262389048F5D6ECC342A5B9CBFA5C3 OI_R248R354E4B8AF6AFAAI4E87U46OUIA_SDS6P0W03E1A9E9A1B7A7F7C7E9E9B8F8D8C7A2D
capacity: 111,385,296 (56GiB)
formatted capacity: 111,385,296 (56GiB)
form factor: 1.8 cm and below
streaming mode features: (none)
mode page present: yes
default block size: 512 bytes
sector size: 512 bytes
cylinder size: 32 sectors
heads: 8
sectors per track: 32
capacity (logical): 111,385,296 (56GiB)
capacity (physical): 111,385,296 (56GiB)
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART capabilities include: read-look-ahead capable
using internal smoking ritual to test write performance and bytematch against unprotected area (ETag 0x5d9a0bcb) ... or we could have a serious problem. If the ritual completes, it has吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁吁。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。ok, all tests complete, but my head is off.也许是到了换我了时候了吧,,., ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,。,,,。,,(((((())))))))))))))))))))))))))))。。.,.。.,。.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.
在linux一般用MMC-utils是一个用于管理和调试eMMC设备,以下是一些常用的命令和用法:
- 查看EMMC设备信息:
mmc dev
当执行“mmc dev”命令时,它返回关于所有已连接的eMMC设备的信息,返回结果可能是:
/dev/mmcblk0: [ 0.000] capacity=111.4G features=0x1ff80600
/dev/mmcblk0boot0: [ 0.000] capacity= 64M features=0x1ff80600
在这个示例中,第一行显示了主eMMC设备的信息,包括设备节点为/dev/mmcblk0,容量为111.4GB,以及一些其他特征信息。第二行显示了一个启动分区的信息,这个启动分区的设备节点为/dev/mmcblk0boot0,容量为64MB。
- 读取EMMC设备的CSD数据:
mmc extcsd read /dev/mmcblk0
该命令将读取/dev/mmcblk0设备的CSD数据,并将其打印出来。CSD数据包含了EMMC设备的各种信息,如容量、块大小、读写速度等。返回结果可能是:
Device: /dev/mmcblk0
Card version: 2.0
Card revision: 0x01
Maximum data block length: 512 bytes
Card size: 128 GiB (16 GB)
Card capacity: 128 GiB (16 GB)
Card block size: 512 bytes
Card erase block size: 4096 bytes
Card write block size: 512 bytes
Card read block size: 512 bytes
Card bus width: 8 bits
Card speed: 20 MHz
Card type: MMC
Card mode: DDR
Card interface version: 2.0
Card OCR (operating voltage range): 2.7-3.6V
Card command set: MMC
当有异常返回时,比如:
mmc_cmd_err(CMD1): cmd_timeout cmd1 arg 0x00000000
这个结果表示EMMC设备发生了错误,无法执行CMD1命令。出现这个问题的原因可能是设备不支持该命令,或者该命令的语法不正确。
- 查看EMMC设备的健康状态:
mmc health /dev/mmcblk0
该命令将显示/dev/mmcblk0设备的健康状态,包括介质错误、读写错误等信息。返回结果可能是:
Device: /dev/mmcblk0
Type: MMC
...
CRC error count: 0
Data read error count: 0
Data CRC error count: 0
Endurance level: Class A
Bus width: 4-bit
Power class: 6
Switch off voltage: 1.8V
Switch mode voltage: 1.8V
Minimum voltage: 1.7V
Maximum voltage: 3.6V
...
- 检查EMMC设备的写保护状态:
mmc writeprotect boot get /dev/mmcblk0
该命令将显示/dev/mmcblk0设备boot分区的写保护状态。
- 设置EMMC设备的写保护状态:
mmc writeprotect boot set /dev/mmcblk0 1
该命令将设置/dev/mmcblk0设备boot分区的写保护状态为开启(1表示开启,0表示关闭)。
当eMMC出现异常时,可以使用mmc工具来查看返回结果。下面是一个示例案例,展示了如何使用mmc工具来检查eMMC的状态并解析返回结果:
$ sudo mmc read 0x18000000 0x200
上述命令中,mmc read用于读取eMMC的数据,0x18000000是要读取的起始地址,0x200是要读取的数据长度。
如果eMMC正常,返回的结果将是读取到的数据。如果eMMC出现异常,返回的结果可能包含错误代码或状态信息。
例如,如果eMMC出现坏块,返回的结果可能类似于以下内容:
$ sudo mmc read 0x18000000 0x200
Error: Block address 0x18000000 is bad
上述结果中,Error: Block address 0x18000000 is bad表示在地址0x18000000处存在一个坏块。