内容
[KEYWORDS]
Flash Combo;eMMC Combo;Flash兼容
[DESCRIPTION]
Flash combo可以简单分为两个部分,一个是DRAM的combo,同一份load中兼容若干颗ID/Type/Size不同的Flash,在开机过程preloader阶段,正确识别主板上使用的Flash,进行EMI时序的配置;另一种是ROM的combo,根据ROM类型,可以分为eMMC和nand,对于eMMC,因为其自带controller,且具有相对固定的分区格式:Boot1、Boot2、RPMB和User region,combo的目的是将同一份load正确下载到不同分区情况的eMMC上;nand flash上没有controller,需要正确的时序进行初始化,且不同page size的nand flash,其存储方式不同,combo的目的是同一份load可以实现不同page size上的正确存取。
[SOLUTION]
1) DRAM Combo
因为EMI controller设计的原因,不同平台上的处理方式不同,目前71/72平台上DRAM的兼容情况及实现请参考FAQ11403 如何在MT6571/MT6572平台上兼容MCP,注意:FlashTool 版本需要更新至 SP_Flash_Tool_v5.1349.05。
其它平台(如82/89/92等)上的DRAM 兼容分为两种情况:MCP和Discrete Dram,有如下限制条件:
A. MCP类型的Flash 兼容,Flash ID必须各不相同;
B. Discrete Flash和MCP Flash的兼容,要求Vendor ID(MemoryDeviceList_MTxxxx.xls中的MODE_REG5)各不相同,并且所有兼容的DRAM的类型(LPDDR2/LPDDR3)必须相同,如果有PCDDR3类型的DRAM,也不可以进行兼容;
C. Discrete Flash和MCP Flash的兼容,Discrete eMMC的Flash ID不能和MCP中的Flash ID相同。
注意:Discrete Dram的配置方式是在custom_MemoryDevice.h中配置DRAM的part number,软件中没有配置Discrete eMMC,但是Discrete eMMC的选用还是要参考Memory_Validation_List_External_Wxxxx.xlsx中Discrete eMMC页中的Flash,因为eMMC中有controller,其中有Firmware,只有选用xlsx中验证过的Flash才能保证系统正常工作。
2) ROM Combo
对于nand flash上2KB/4KB page size的兼容,请参考FAQ07801 NAND Flash 2K和4K兼容。
在解释eMMC flash上的combo之前,先简单介绍一下eMMC Flash的架构,eMMC flash上有如下几个分区:Boot1、Boot2、RPMB和User Region,前三个分区通常称为:Special Region。
Linux操作系统在启动过程,规定是从User Region中获取MBR image的内容,所以MBR及其它的image都必须存储在User Region中,preloader image存储在boot1中,如下图所示:
因为不同的eMMC flash,Boot1、Boot2及RPMB 分区的size可能会有所不同,为了满足MBR必须存储在User Region中的要求,MT6592之前的平台的做法是取所有兼容的eMMC上最大的Special region做为MBR分区的起始地址,比如兼容了三颗Flash,MBR的存储位置如下图所示:
Boot1、Boot2及RPMB的值可以查看文件MemoryDeviceList_MTxxxx.xls中的emmc_region页,同一part number的Flash,其Boot1、Boot2及RPMB的值是固定的;但是对于Discrete eMMC的兼容,custom_MemoryDevice.h中配置的part number仅表示DRAM的型号,所以无法从emmc_region中获取对应的Boot1、Boot2及RPMB,为了处理这种情况,在文件mbr_addr.pl(KK和L版本)和cust_part_mbr.c(L版本)中设定了一个MBR的默认值:$MBR_Start_Adress_KB,这个值需要通过使用Flashtool的memory test进行确认并修改,如下图:
最终在编译过程,Ptgen.pl中通过对比max(Boot1+Boot2+RPMB) 和 mbr_addr.pl的默认值,将较大的值做为MBR的起始地址,实现多个eMMC的兼容。但这种兼容方式有如下几点不足之处:
A. 因为选择最大的Boot1+Boot2+RPMB做为MBR的起始地址,对于部分Flash来说会造成空间浪费;
B. MBR的地址可能不是User Region的0x0地址,会出现地址不对齐的现象,影响Flash操作的performance;
C. 对于已经出货的机器,如果后续采用的Flash的Boot1+Boot2+RPMB值变大,会导致整个系统partition layout的变化,这样会影响OTA升级。
为了解决以上的不足,在MT6592平台及后面的新平台上,使用了新的兼容方式:使用物理地址(region, offset),在下载的时候,DA读取Flash上Boot1和User Region的位置,分别将preloader下载到boot1的0x0位置;将MBR等其它image下载到User Region的0x0地址开始的位置,如下图所示: