关于eMMC的特性介绍:https://blog.csdn.net/CSDN1013/article/details/100859235
以下内容部分参考自JEDEC eMMC-5.1-JESD84-B51标准文档。
eMMC系统
应用处理器(AP)内部一般包含了eMMC Host Controller。其通过Clock,CMD, Data和Data Strobe与eMMC连接。
eMMC的部分主要包括Device Controller和内部的Flash。
寻址
eMMC 4.1的寻址方式是字节寻址(32bit)。==>带来的限制就是最大容量到2GB
为了支持更大容量的eMMC,添加了新的sector寻址的方式(1 sector=512bytes)。容量大于2GB的设备,都是采用sector寻址的方式。
传输
命令:命令(command)的传输方向为Host→Device, 通过CMD线串行传输
应答:应答(response)的传输方向为Host→ Device, 通过CMD线传输
数据:数据(Data)的传输方向是双向的(Host->Device或者Device->Host)。可以选择1位(DAT0),4位(DAT0-DAT3)或8位线传输(DAT0-DAT7)。
分区管理
eMMC默认有4个物理区域:RPMB, Boot Area Partition 1(第一个启动分区), Boot Area Partition 2(第二个用于启动的分区), User Data Area.
Boot Area Partition 1/2 本身有一些默认值.
RPMB(Replay Protected Memory Block重放保护内存块)分区的具体应用场景还没有遇到。可以参考这篇文章了解一下:https://blog.csdn.net/xiezhi123456/article/details/81479793
根据芯片厂商的启动过程文档和ROM大小,可以查看eMMC里不同的地址对应的image文件。
了解这个地址是实现以下目标的前提:
- 通过U-boot烧写/更新文件系统
- 供应商开发自己的USB FW Update功能的话,需要弄清楚ROM的分布(u-boot, SNOR及eMMC其他分区的地址,大小)
我们知道在AP启动的时候,一般会有一个倒计时(时间可以设定,比如10s或5s等)。在这个倒计时时间范围内,用户可以选择正常启动,进入U-boot console或者其他模式。
当选择U-boot命令行时,我们可以通过U-boot mmc相关的命令来查看:以下是MMC device 0的User Area Partition的信息。
#mmc part
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
1 0x00000022 0x00032021 "secure"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 30453444-3741-4544-4642-414234443045
2 0x00032022 0x00034021 "boot"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 30453846-4231-3035-3842-433834383446
3 0x00034022 0x0007f021 "system"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 31413234-3633-3639-3538-323734433843
4 0x0007f022 0x0007f821 "env"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 41444630-3833-4244-4445-344334344235
5 0x0007f822 0x0008f821 "home"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 36313735-3935-3439-3744-343534364533
6 0x0008f822 0x0008f8e9 "dtb"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 33444544-3133-4442-3039-343234433342
7 0x0008f8ea 0x00e8ffdd "data"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 30373137-4438-4630-3335-303434394235
U-boot命令行下emmc相关的命令可以查看: https://blog.csdn.net/CSDN1013/article/details/109453915
但是,这些分区的信息并没有ARM-TF,DRAM配置信息,U-boot ROM在emmc中的具体地址。需要参考芯片厂商给的信息描述。如下图:
eMMC ROM layout
U-boot header信息节选:
Image | Offest | Size | Parameter |
U-boot | 0 | 4 | u-boot Target Address |
4 | 4 | DRAM Parameters |
首先,需要切换Partition,因为Boot loader header和前期启动需要的ROM放在Boot Area Partition 1中。以DRAM参数为例:
切换到Boot partition 1,然后用mmc read读取emmc中的数据到内存中,然后把内存对应地址的数据显示出来。
#mmc dev 0 1
switch to partitions #1, OK
mmc0(part 1) is current device
//emmc layout表格中可以看到DRAM Parameters Size包含在U-boot header中,U-boot header的sector offset为504(MICOM OFFSET+248).所以需要先读取sector 504的数据
//从第0x000001F8(十进制为504)个sector开始,读取1298(16进制转换为512)个sector,到地址为0x24000000的内存中
# mmc read 0x24000000 0x000001F8 512
MMC read: dev # 0, block # 504, count 1298 ... 1298 blocks read: OK
(79.2 MiB/s)
//从U-boot header表格中,可以看到DRAM Parameter size的offest是4,size也是4
//从0x24000000开始,显示内存中的数据。DRAM Parameter size的值为0x200
# md 0x24000000
24000000: 30000000 00000200 0009e600 0001f400 ...0............
24000010: 00000000 00004400 00000000 00000001 .....D..........
24000020: 40000000 29b00000 00000000 00000000 ...@...)........
24000030: 00000000 00000000 00000000 00000000 ................
24000040: 00000000 00000000 00000000 00000000 ................
24000050: 00000000 00000000 00000000 00000000 ................
24000060: 00000000 00000000 00000000 00000000 ................
24000070: 00000000 00000000 00000000 00000000 ................
24000080: 00000000 00000000 00000000 00000000 ................
24000090: 00000000 00000000 00000000 00000000 ................
240000a0: 00000000 00000000 00000000 00000000 ................
240000b0: 00000000 00000000 00000000 00000000 ................
240000c0: 00000000 00000000 00000000 00000000 ................
240000d0: 00000000 00000000 00000000 00000000 ................
240000e0: 00000000 00000000 00000000 00000000 ................
240000f0: 00000000 00000000 00000000 00000000 ................
其他部分的参数查找方法类似,只是你需要从芯片厂商那里获得其他ROM的offset和大小。
如果芯片厂商给了你所有ROM的起始sector, offest和size,那么你就可以知道它们在emmc中的位置。