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)

该方法需要烧写两次统一固件。第一次在MaskRom下直接烧写Firefly提供的修复小固件RK356x_NorFlash2eMMC-Loader_xxx.img,该固件会自动擦除NOR flash并切换到eMMC的Loader模式,第二次直接烧写你需要升级的固件

4.3.2.1.1. Windows端操作方法

推荐烧写工具版本:RKDevTool_Release_v2.84.zip

  • 烧写RK356x_NorFlash2eMMC-Loader_xxx.img _images/firefly_nor2emmc_1.png

  • 烧写成功后等待20s左右,系统进入Loader模式 _images/firefly_nor2emmc_2.PNG

  • 再次点击Firmware选择要更新的固件,如update.img,然后点击Upgrade升级 _images/firefly_nor2emmc_3.PNG

4.3.2.1.2. Linux端操作方法
firefly@T-chip:~/severdir/down_firmware$ upgrade_tool
Program Data in /home/firefly/.config/upgrade_tool
List of rockusb connected
DevNo=1	Vid=0x2207,Pid=0x350a,LocationID=16	Mode=Maskrom
Found 1 rockusb,Select input DevNo,Rescan press <R>,Quit press <Q>:q 

firefly@T-chip:~/severdir/down_firmware$ upgrade_tool uf RK356x_NorFlash2eMMC-Loader_20211209.img 

firefly@T-chip:~/severdir/down_firmware$ upgrade_tool
Program Data in /home/firefly/.config/upgrade_tool
List of rockusb connected
DevNo=1	Vid=0x2207,Pid=0x350a,LocationID=16	Mode=Loader
Found 1 rockusb,Select input DevNo,Rescan press <R>,Quit press <Q>:q 

firefly@T-chip:~/severdir/down_firmware$ upgrade_tool uf update.img 

4.3.2.2. 方法二(原厂)

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

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

#Android SDK
path/to/SDK/rockdev/Image-rk3568_firefly_roc_pc_se/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 烧写异常问题,若遇到其它问题也可以到社区论坛对应的板块发帖