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 of update.img, which is also included by update.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 customization

  • Image/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