4. 切换升级存储器

4.1. 前言

本文介绍当主机同时存在 eMMC(默认) 和 NOR Flash 这两种存储器的时候,在烧录固件的时候,需根据以下的启动模式和情况来升级固件。

如下图,则设备有贴 Nor Falsh 存储器。

_images/nor_flash-position.jpg

4.2. Loader 模式

如果是通过 软件执行 reboot loader 或者 通过硬件Recovery 按键进入的Loader 下载模式的话,可不需要看接下来的内容,直接跳到 《使用USB线缆升级固件》 操作。

4.3. Maskrom 模式

如果是通过 《MaskRom模式》 章节进入了Maskrom 模式(或设备异常,经过擦除设备进入Maskrom),而板子同时存在NOR flash和 eMMC 两种存储器,这个时候想要烧录固件,需要区分存储器:

4.3.1. 固件下载到NOR flash

系统在Maskrom模式下默认将固件下载到NOR flash中,不过由于NOR flash 比较小,不足以装载系统镜像,所以一般只会烧写比较小的文件,如MiniLoaderAll.bin。如果不小心将整个固件下载到NOR flash中,会出现下载固件失败的现象, 此时大家可以参考FAQ去处理

4.3.2. 固件下载到eMMC

有两种方法可以将固件烧写进eMMC中,一种是RK原厂提供的烧写方法,需要烧写MiniLoaderAll.bin并切换存储器;另一种是Firefly为了方便大家烧写,提供的一种参考烧写方法,该方法操作上无需要切换存储器,也可以使用Linux端的烧写工具upgrade_tool进行烧写

4.3.2.1. 方法一(Firefly)

此方法仅在官方最新SDK编译或者最新的官方固件中可用。如果在Maskrom模式下不慎将固件下载到NOR flash中,导致重启后无法正常启动, 那么可以进入《MaskRom模式》,烧录最新SDK编译或者官方提供的固件;不管烧录成功还是失败,当机器重启后,假如NOR flash 存在数据则自动擦除,擦除时间大概30~60s,擦除成功后,自动进入Loader模式,之后直接烧录固件即可。

4.3.2.2. 方法二(原厂)

若要将固件下载到eMMC中,需要先下载MiniLoaderAll.bin, 然后选择将存储器切换到eMMC。具体操作步骤如下:

1.先准备好 MiniLoaderAll.bin,一般存放在以下路径(需提前编译固件):

#Android SDK
path/to/SDK/rockdev/Image-rk3566_roc_pc/MiniLoaderAll.bin

#Linux SDK
path/to/SDK/rockdev/MiniLoaderAll.bin

如果还没有编译SDK,可以从以下链接下载 一个对应CPU型号的MiniLoaderAll.bin

2.点击下载工具的Advanced Function,然后将准备好的MiniLoaderAll.bin下载到存储器中,见下图

_images/load_emmc_with_flash01.png

3.点击List Storage读取存储器,此时存储列表选中的是SPINOR,为确保Nor flash为空,我们选择EraseAll擦除

_images/maskrom_erease_spinor_flash.png

  • X 表示设备不存在该存储器

  • 0 表示存在该存储器,但未选中

  • 表示存在该存储器并处于被选中状态

4.在存储列表中选中Emmc后点击Switch Storage

_images/load_emmc_with_flash02.png

可以看到存储列表中的Emmc状态就会从0切到,表示选择将固件下载到eMMC

_images/load_emmc_with_flash03.png

5.点击EraseAll擦除

_images/load_emmc_with_flash04.png

6.点击下载工具的Upgrade Firmware,然后选择我们想要下载进eMMC中的固件进行升级

_images/load_emmc_with_flash05.png

4.4. FAQ

4.4.1. Maskrom模式烧写失败

_images/maskrom_download_failed_with_flash.png

该现象是因为固件直接烧写进NOR flash中引起的,出现该现象时大家可以根据当前的情况进行处理:

情况一下载失败时没有断电或重启

可以直接点击EraseFlash擦除NOR flash

_images/Maskrom_EraseFlash.png

之后按照章节固件下载到eMMC的步骤进行固件升级即可

情况二有进行过重启或断电的操作

通过Recovery按键进入Loader模式, 然后点击AndroidTool的Go maskrom进入Maskrom模式

_images/Go_maskrom.png

之后按照章节固件下载到eMMC的步骤进行固件升级即可。若不清楚如何通过Recovery按键进入Loader模式请参考使用USB线缆升级固件章节

如果大家有接串口,可以查看一下log信息,其中Bootdev(atags): mtd 2说明系统启动到NOR flash存储器的uboot中

Bootdev(atags): mtd 2
GUID Partition Table Header signature is wrong: 0xA9425BF5A94153F3 != 0x5452415020494645
*** ERROR: Can't write GPT header ***
Backup GPT repair fail!
PartType: EFI
...
Device 0: unknown device
No ethernet found.
missing environment variable: pxeuuid
...
Retrieving file: pxelinux.cfg/default
No ethernet found.
Config file not found
No ethernet found.
No ethernet found.
=>

我们可以直接在这个模式擦除NOR flash

=> mtd erase nor0
Erasing 0x00000000 ... 0x01ffffff (8192 eraseblock(s))
=> reboot

也可以通过rbrom回到Maskrom模式

=> rbrom

进入到Maskrom模式后,固件升级都需要按照固件下载到eMMC的步骤进行操作

4.4.2. Go Maskrom无效

点击AndroidTool的Go Maskrom无法进入Maskrom模式,rbrom命令同样也不行,原因是部分旧固件不支持从NOR flash的bootloader回到Maskrom模式,此时可通过Recovery按键重新进入Loader模式,点击AndroidTool的EraseFlash进行擦除

_images/Loader_EraseFlash.png

无论是否提示擦除IDB失败都重启一下板子,重启后可进入Maskrom模式

_images/EraseFlash_IDB_failed.png

4.4.3. 其它

烧写异常问题可参考帖子rk3566/rk3568 烧写异常问题,若遇到其它问题也可以到社区论坛对应的板块发帖