SSD_EMMC升级方案
1. 概述¶
eMMC upgrade方案是在UBOOT下,键入emmcstar命令后从eMMC flash中获取upgrade image,烧录进对应的boot flash中。
为了支持upgrade,eMMC在UDA分区中需要划分一块区域用于保存升级数据,又因为在kernel下要支持读写该区域数据,因此该区域需要使用能被kernel识别的emmc partition,分区设计如下:
图1 eMMC upgrade方案分区设计
upgrade分区必须是emmc partition中的第一个分区,这是uboot下识别emmc partiition的code逻辑决定的,当upgrade时,将其他所有分区全被删除掉,upgrade分区不被影响所以只能是第一个分区。
图1中的UDA分区划分介绍如下:
head:
总共64个 block,第一个block存储分区标识信息,标识创建的分区类型为EMMC类型,第1~64共63个block,每个block存储创建的对应分区的信息,包括分区名称,起始地址以及大小等。
reserved:
reserved 区域是预留出来做其他用途的,比如env数据就存储在该区域
partition:
即upgrade,kernel,rootfs等逻辑分区,是存储head中对应分区数据的区域,一般从第615200个block开始,根据head中存储分区信息的block数,该区域容许存储63个block分区的数据。
2. 使能eMMC upgrade¶
编译project,制作eMMC upgrade包:
cd project make dispcam_p3_emmc-nor.glibc-9.1.0-ext4fs.s01a.64.qfn128_defconfig make menuconfig # Image --> # (emmc.ext4fs.partition.config) Image Partition Config # [*] eMMC boot linux # (nor) boot.bin burn in which flash(nor/spinand) when emmc boot # (0xC800000) eMMC upgrade partition size(byte) when linux boot from eMMC # /*上面这一项设定的是upgrade分区的size,我们需要根据实际image包的size进行设定,需要不小于 images包,以block为单位,这里设定值为0xC800000(200M)。保存并退出。*/ make clean; make image-nocheck -j32 # 制作支持emmc upgrade的image_upgrade包。-o选项是可选的,若使用-o选项其值必须设为1,否则使用的是其他的打包方案。 sh make_emmc_upgrade_sigmastar.sh # 根据需要升级的文件选择Y或N,默认是Y。image/output/images/SigmastarUpgradeEMMC.bin为最终生成的eMMC upgrade image。
3. eMMC upgrade方法¶
-
首先通过网络或USB或母片烧录的方法将上一步制作的image烧录到对应的flash中,成功启动到linux。此时eMMC的分区结构如图1所示。
-
upgrade
分区在kernel下被识别为/dev/mmcblk0p1
。接下来可以将升级数据(如上一步制作的SigmastarUpgradeEMMC.bin)以二进制数据烧录到mmcblk0p1
的0地址处。我这里使用的是dd
命令。这样,升级数据就准备完成了。 -
reboot到uboot,在uboot命令行下键入
emmcstar 1
即可从eMMC flash中的upgrade
分区里,将升级数据更新至flash中。完成升级后,需要手动reset重启新系统。注意:
emmcstar
命令后必须带一个非零参数,否则均不会使用这套upgrade方案。