说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
Android源码编译完毕之后, 就需要将编译出的二进制文件进行更新, 这些二进制我们也叫做各种镜像, 本文重点介绍如何更新镜像。
镜像更新可参考官方网站
官网文章内容包含多种平台, 多种系统的说明, 本文更多是针对rk3399, 将官网的资料进行整理说明, 让大家能快速的直接上手操作。
一, 镜像整体介绍
Android源码编译完成之后,在rockdev/Image-xx目录下:
![](//file.elecfans.com/web2/M00/67/C1/poYBAGMZvReAUKAkAAEGjJwggoQ122.jpg)
boot.img 包含ramdis、kernel、dtb
dtbo.img Device Tree Overlays
kernel.img includekernel,目前无法单独烧写,需要打包到boot.img内烧写
MiniLoaderAll.bin 包含一级loader
misc.img 包含recovery-wipe开机标识信息,烧写后会进行recovery
odm.img 包含android odm,包含在super.img分区内,单独烧写需要用fastboot烧写
parameter.txt 包含分区信息
pcba_small_misc.img 包含pcba开机标识信息,烧写后会进入简易版pcba模式
pcba_whole_misc.img 包含pcba开机标识信息,烧写后会进入完整版pcba模式
recovery.img 包含recovery-ramdis、kernel、dtb
resource.img 包含dtb,kernel和uboot阶段的log及uboot充电logo,目前无法单独烧写,需要打包到boot.img内烧写
super.img 包含odm、vendor、system分区内容
system.img 包含android system,包含在super.img分区内,单独烧写需要同fastboot烧写
trust.img 包含BL31、BL32
uboot.img 包含uboot固件
vbmeta.img 包含avb校验信息,用于AVB校验
vendor.img 包含android vendor,包含在super.img分区内,单独烧写需要同fastboot烧写
update.img 包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包
二, update.img拆分
其实update.img其实就是源码编译出来的ROC-RK3399-PC-PLUS_Android10_HDMI_211112.img,
得到firefly-rk3399-linux-repack.tgz, 在linux主机上进行解压得到:
ldswfun@android:/mnt/ext-disk2/RK/unpack/firefly-rk3399-linux-repack$ ls
bin pack.sh Readme.md unpack.sh
把官方发布的固件或者自己编译的镜像拷贝到firefly-rk3399-linux-repack,重命名为update.img , 执行unpack.sh
ldswfun@android:/mnt/ext-disk2/RK/unpack/firefly-rk3399-linux-repack$ ./unpack.sh
start to unpack update.img...
RKImageMaker ver 1.66
Unpacking image, please wait...
Exporting boot.bin
Exporting firmware.img
Unpacking image success.
Android Firmware Package Tool v1.65
Check file... OK
------- UNPACK ------
package-file 0x0000000000000800 0x00000000000002B5
Image/MiniLoaderAll.bin 0x0000000000001000 0x000000000005F94E
Image/parameter.txt 0x0000000000061000 0x0000000000000354
Image/trust.img 0x0000000000061800 0x0000000000400000
Image/uboot.img 0x0000000000461800 0x0000000000400000
Image/misc.img 0x0000000000861800 0x000000000000C000
Image/boot.img 0x000000000086D800 0x0000000001A4E800
Image/dtbo.img 0x00000000022BC000 0x000000000000026F
Image/vbmeta.img 0x00000000022BC800 0x0000000000001000
Image/recovery.img 0x00000000022BD800 0x00000000023EA800
Image/super.img 0x00000000046A8000 0x00000000592E48E0
Image/oem.img 0x000000005D98D000 0x0000000000A3013C
Unpack firmware OK!
------ OK ------
Unpacking update.img OK.
Press any key to quit:
解包完成后,生成的文件在output目录下:
ldswfun@android:/mnt/ext-disk2/RK/unpack/firefly-rk3399-linux-repack$ tree output/
output/
├── Image
│ ├── boot.img
│ ├── dtbo.img
│ ├── misc.img
│ ├── oem.img
│ ├── recovery.img
│ ├── super.img
│ ├── trust.img
│ ├── uboot.img
│ └── vbmeta.img
├── MiniLoaderAll.bin
├── package-file
└── parameter.txt
通过Androidtool_2.71工具启动的界面,大体可以看到各个镜像将会烧录到哪些位置。
![](//file.elecfans.com/web2/M00/67/C1/poYBAGMZvReAT54EAAD1Q--7w-0368.jpg)
三, 更新方式
固件文件一般有两种:
单个统一固件:统一固件是由分区表、bootloader、uboot、kernel、system等所有文件打包合并成的单个文件。Firefly正式发布的固件都是采用统一固件格式,升级统一固件将会更新主板上所有分区的数据和分区表,并且擦除主板上所有数据。
多个分区镜像: 即各个功能独立的文件,如分区表、bootloader、kernel等,在开发阶段生成。独立分区镜像可以只更新指定的分区,而保持其它分区数据不被破坏,在开发过程中会很方便调试。
针对上面两种固件更新, 其实都是通过相关的手段进行烧录, 而手段主要是通过 USB线烧,或者通过SD/TF卡烧录方式来完成, SD/TF卡只能烧录单个统一镜像, USB线刷是可以完成上面两种。
注意:如果你的开发板将SD/TF卡作为主存储(比如我的开发板), 是无法使用线刷的, 也就是说,只能烧录单个统一镜像,不能更新单个分区。
四, SD/TF卡更新
因为只能烧录单个统一固件,
五, USB线更新系统(只针对带EMMC存储的情况)
注意:因本人没有emmc存储的开发板, 故以下内容并未验证, 只作为整理。
环境: window系统 + RK USB驱动 + 烧写上位机工具Androidtool_2.71
官方参考: 升级固件 — Firefly Wiki
1, 安装RK USB驱动
下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动
![](//file.elecfans.com/web2/M00/68/5A/pYYBAGMZvReACPGWAABssIakux4110.jpg)
2, 连接设备
设备进入升级模式的方式如下:
先断开电源适配器连接:
USB 一端连接主机,Type-C 一端连接开发板 Type-C 母口
按住设备上的 RECOVERY (恢复)键并保持
接上电源
大约两秒钟后,松开 RECOVERY 键
主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,则需要返回上一步重新安装驱动。
![](//file.elecfans.com/web2/M00/67/C1/poYBAGMZvReAD7qdAAEARtRPVK0301.jpg)
3, 烧写统一固件
使用Androidtool_2.71烧写Android10或Android9固件时使用默认配置即可。
Androidtool启动会如下显示(按照步骤2操作的效果,如果正常启动, 会显示没有发现设备)
![](//file.elecfans.com/web2/M00/68/5A/pYYBAGMZvReAJltpAAEsgqokPgU233.jpg)
切换至【升级固件页】。
按【固件按钮】,打开要升级的【固件文件】。升级工具会显示详细的固件信息。
按【升级按钮】开始升级。
如果升级失败,可以尝试先按擦除 Flash 按钮来擦除 Flash,然后再升级。一定要根据《使用USB线烧写须知(重要)》进行擦除烧写
注意:如果你烧写的固件 laoder 版本与原来的机器的不一致,请在升级固件前先执行擦除 Flash 。
![](//file.elecfans.com/web2/M00/67/C1/poYBAGMZvReAFkxNAADa5nFtkHE352.jpg)
![](//file.elecfans.com/web2/M00/67/C1/poYBAGMZvReAb2ItAAEYd49dNGw418.jpg)
4, 烧写分区映像,适合部分烧录文件
步骤如下:
切换至下载【镜像页】。
勾选需要烧录的分区,可以多选。
确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。
点击【执行】按钮开始升级,升级结束后设备会自动重启。
![](//file.elecfans.com/web2/M00/68/5A/pYYBAGMZvReAJioLAAFd2c_8-kA384.jpg)
5, Linux的烧录方式
下载 Linux_Upgrade_Tool (系统是 Android8.1则需要 Linux_Upgrde_Tool_for_android8.1), 并按以下方法安装到系统中,方便调用:
unzip Linux_Upgrade_Tool_xxxx.zip
cd Linux_UpgradeTool_xxxx
sudo mv upgrade_tool /usr/local/bin
sudo chown root:root /usr/local/bin/upgrade_tool
sudo chmod a+x /usr/local/bin/upgrade_tool
烧写统一固件 update.img:
sudo upgrade_tool uf update.img
烧写单独镜像:
sudo upgrade_tool di -b boot.img
sudo upgrade_tool di -dtbo dtbo.img
sudo upgrade_tool di -misc misc.img
sudo upgrade_tool di -parameter parameter.txt
sudo upgrade_tool di -r recovery.img
sudo upgrade_tool di -super super.img
sudo upgrade_tool di -trust trust.img
sudo upgrade_tool di -uboot uboot.img
sudo upgrade_tool di -vbmeta vbmeta.img
如果因 flash 问题导致升级时出错,可以尝试低级格式化、擦除 nand flash:
sudo upgrade_tool lf update.img # 低级格式化
sudo upgrade_tool ef update.img # 擦除
六, 总结
对于更新镜像, 能进行部分镜像更新那是最好, 没有的话,只能乖乖的更新整个镜像, 相对来说,花的时间会更多些。
原作者:旗浩QH