Unpack/Packing Rockchip Firmware¶
Rockchip Firmware Format¶
The rockchip firmware release_update.img
, contains the boot loader loader.img
and the real firmware data update.img
:
release_update.img
|- loader.img
`- update.img
update.img
is packed with multiple image files, described by a control file named package-file
. A typical package-file
is:
# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
trust Image/trust.img
uboot Image/uboot.img
misc Image/misc.img
baseparameter Image/baseparameter.img
resource Image/resource.img
kernel Image/kernel.img
boot Image/boot.img
recovery Image/recovery.img
system Image/system.img
vendor Image/vendor.img
oem Image/oem.img
backup RESERVED
#update-script update-script
#recover-script recover-script
package-file
: packing description ofupdate.img
, which is also included byupdate.img
.Image/MiniLoaderAll.bin
: The first bootloader loaded by cpu rom code.Image/parameter.txt
: Parameter file where you can set the kernel boot parameters and partition layout.Image/trust.img
: The Arm Trusted Image.Image/misc.img
: misc partition image, used to control boot mode of Android.Image/kernel.img
: Android kernel image.Image/resource.img
: Resource image with boot logo and kernel device tree blob.Image/boot.img
: Android initramfs, a root filesystem loaded in normal boot, contains important initialization and services description.Image/recovery.img
: Recovery mode image.Image/system.img
: Android system partition image.Image/oem.img
: It is an additional partition for global customizationImage/vendor.img
:Contains all binaries that cannot be distributed to the Android open source project (AOSP).
Unpacking is extracting update.img
from release_update.img
, and then unpacking all the image files inside.
While repacking, it is the inverse process. It synthesizes the image files described by the package-file
, into update.img
, which will be further packed together with the bootloader to create the final release_update.img
.
Installation of Tools¶
git clone https://github.com/TeeFirefly/rk2918_tools.git
cd rk2918_tools
make
sudo cp afptool img_unpack img_maker mkkrnlimg /usr/local/bin
Unpacking Rockchip Firmware¶
Unpacking
release_update.img
:$ cd /path/to/your/firmware/dir $ img_unpack Firefly-RK3399_20161027.img img rom version: 6.0.1 build time: 2016-10-27 14:58:18 chip: 33333043 checking md5sum....OK
Unpacking
update.img
:$ cd img $ afptool -unpack update.img update Check file...OK ------- UNPACK ------- package-file 0x00000800 0x000002D4 Image/MiniLoaderAll.bin 0x00001000 0x0002794E Image/parameter.txt 0x00029000 0x000003E1 Image/trust.img 0x00029800 0x00400000 Image/uboot.img 0x00429800 0x00400000 Image/misc.img 0x00829800 0x0000C000 Image/baseparameter.img 0x00835800 0x00100000 Image/resource.img 0x00935800 0x007DF600 Image/kernel.img 0x01115000 0x01217814 Image/boot.img 0x0232D000 0x0016C200 Image/recovery.img 0x02499800 0x008D5020 Image/system.img 0x02D6F000 0x2B2700F4 Image/vendor.img 0x2DFDF800 0x092B707C Image/oem.img 0x37297000 0x0002907C RESERVED 0x00000000 0x00000000 UnPack OK!
Check the file tree in the update directory:
$ cd update/ $ tree . ├── Image │ ├── baseparameter.img │ ├── boot.img │ ├── kernel.img │ ├── MiniLoaderAll.bin │ ├── misc.img │ ├── oem.img │ ├── parameter.txt │ ├── recovery.img │ ├── resource.img │ ├── system.img │ ├── trust.img │ ├── uboot.img │ └── vendor.img ├── package-file └── RESERVED 1 directory, 15 files
Packing Rockchip Firmware¶
First of all, make sure system
partition in parameter.txt
file is larger enough to hold system.img
. You can reference Parameter file format to understand the partition layout.
For example, in the line prefixed with “CMDLINE” in parameter.txt
, you will find the description of system
partition similiar to the following content:
0x00200000@0x000B0000(system)
The heximal string before the “@” is the partiton size in sectors (1 sector = 512 bytes here), therefore the size of the system partition is:
$ echo $(( 0x00200000 * 512 / 1024 / 1024 ))M
1024M
To create release_update_new.img
:
# The current directory is still update/, which contains package-file,
# and files that package-file lists still exist
# Copy the parameter file to paramter, because afptool is used by default
$ cp package-file parameter
$ afptool -pack . ../update_new.img
------ PACKAGE ------
Add file: ./package-file
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/parameter.txt
Add file: ./Image/trust.img
Add file: ./Image/uboot.img
Add file: ./Image/misc.img
Add file: ./Image/baseparameter.img
Add file: ./Image/resource.img
Add file: ./Image/kernel.img
Add file: ./Image/boot.img
Add file: ./Image/recovery.img
Add file: ./Image/system.img
Add file: ./Image/vendor.img
Add file: ./Image/oem.img
Add file: ./RESERVED
Add CRC...
------ OK ------
Pack OK!
$ img_maker -rk33 loader.img update_new.img release_update_new.img
generate image...
append md5sum...
success!
Customization¶
Customizing system.img¶
system.img is an ext4 file system format image file which can be mounted directly to the system for modification:
sudo mkdir -p /mnt/system
sudo mount Image/system.img /mnt/system
cd /mnt/system
# Modify the contents of the inside.
# Pay attention to the free space,
# You can not add too many APKs
# When finished, you need to unmount it
cd /
sudo umount /mnt/system
Note that the free space of system.img
is almost 0. If you need to expand the image file, do adjust the partition layout in parameter.txt
accordingly.
The following is an example of how to increase the size of the image file by 128MB.
Before expanding, make sure system.img
is not mounted by running:
mount | grep system
Resize the image file:
dd if=/dev/zero bs=1M count=128 >> Image/system.img
# Expand file system information
e2fsck -f Image/system.img
resize2fs Image/system.img