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方法

  1. 首先通过网络或USB或母片烧录的方法将上一步制作的image烧录到对应的flash中,成功启动到linux。此时eMMC的分区结构如图1所示。

  2. upgrade分区在kernel下被识别为/dev/mmcblk0p1。接下来可以将升级数据(如上一步制作的SigmastarUpgradeEMMC.bin)以二进制数据烧录到mmcblk0p1的0地址处。我这里使用的是dd命令。这样,升级数据就准备完成了。

  3. reboot到uboot,在uboot命令行下键入emmcstar 1即可从eMMC flash中的upgrade分区里,将升级数据更新至flash中。完成升级后,需要手动reset重启新系统。

    注意: emmcstar命令后必须带一个非零参数,否则均不会使用这套upgrade方案。