Difference between revisions of "Boot option"

From Rockchip open source Document
Jump to: navigation, search
 
(64 intermediate revisions by 5 users not shown)
Line 1: Line 1:
  
 
 
 
 
 
  
 
= Boot introduce =
 
= Boot introduce =
 
 
 
  
 
First, let's make the concept clear, there are many boot stages when we boot up a Linux OS;
 
First, let's make the concept clear, there are many boot stages when we boot up a Linux OS;
Line 12: Line 7:
 
Then we need to know about how the image should packaged, where the image locate;
 
Then we need to know about how the image should packaged, where the image locate;
  
At lase, we will explain how to write to different media and boot from there.
+
At last, we will explain how to write to different media and boot from there.
 +
 
 +
Here is Rockchip pre-released binaries which may be mentioned later:
 +
 
 +
[https://github.com/rockchip-linux/rkbin https://github.com/rockchip-linux/rkbin]
 +
 
 +
And [http://opensource.rock-chips.com/wiki_Partitions Rockcip Linux GPT partition] here.
 +
 
 +
 
  
== Boot stage ==
+
== Boot flow ==
  
Here is a table show the detail what we may use in Rockchip platform, for 2 boot stage:
+
This chapter introduce the generic boot flow for Rockchip Application Processors, including the detail about what image we may use in Rockchip platform for kind of boot path:
  
- optionally can use U-Boot SPL;
+
- use U-Boot TPL/SPL from upsream or rockchip U-Boot, fully source code;
  
-  or use Rockchp idbLoader which is combinded by Rockchip ddr init bin and miniloader bin;
+
- use Rockchp idbLoader which is combinded by Rockchip ddr init bin and miniloader bin from Rockchip [https://github.com/rockchip-linux/rkbin rkbin project];
<pre>+--------+----------------+----------+-----------+
+
<pre>+--------+----------------+----------+-------------+---------+
| Boot  | Terminology #1 | Actual  | Rockchip |
+
| Boot  | Terminology #1 | Actual  | Rockchip   | Image  |
| stage  |                | program  |  Loader  |
+
| stage  |                | program  |  Image      | Location|
| number |                | name    |  Name   |
+
| number |                | name    |  Name     | (sector)|
+--------+----------------+----------+-----------+
+
+--------+----------------+----------+-------------+---------+
| 1      |  Primary      | ROM code | BootRom   |
+
| 1      |  Primary      | ROM code | BootRom     |        |
|        |  Program      |          |           |
+
|        |  Program      |          |             |        |
|        |  Loader        |          |           |
+
|        |  Loader        |          |             |        |
|        |                |          |           |
+
|        |                |          |             |        |
| 2      |  Secondary    | U-Boot  | idbLoader | 0x40
+
| 2      |  Secondary    | U-Boot  |idbloader.img| 0x40   | pre-loader
|        |  Program      | SPL     |           |
+
|        |  Program      | TPL/SPL |            |         |
|        |  Loader (SPL)  |          |           |
+
|        |  Loader (SPL)  |          |             |        |
|        |                |          |           |
+
|        |                |          |             |        |
| 3      |  -            | U-Boot  |  U-Boot   | 0x4000
+
| 3      |  -            | U-Boot  | u-boot.itb  | 0x4000 | including u-boot and atf
|        |                |          |           |
+
|        |                |          | uboot.img   |         | only used with miniloader
|        |                |          |           |
+
|        |                |          |             |        |
| 4      |  -            | kernel  |  kernel  | 0x8000
+
|        |                | ATF/TEE  | trust.img  | 0x6000  | only used with miniloader
|        |                |          |           |
+
|        |                |          |             |        |
| 5      |  -            | rootfs  |  rootfs  | 0x40000
+
| 4      |  -            | kernel  | boot.img    | 0x8000 |
+--------+----------------+----------+-----------+
+
|        |                |          |             |        |
 +
| 5      |  -            | rootfs  | rootfs.img | 0x40000 |
 +
+--------+----------------+----------+-------------+---------+
 
</pre>
 
</pre>
  
Line 51: Line 56:
 
*Boot from U-Disk means firmware for stage 4 and 5(not including SPL and U-Boot) in Disk, optionally only including stage 5;  
 
*Boot from U-Disk means firmware for stage 4 and 5(not including SPL and U-Boot) in Disk, optionally only including stage 5;  
 
*Boot from net/tftp means firmeware for stage 4 and 5(not including SPL and U-Boot) on the network;  
 
*Boot from net/tftp means firmeware for stage 4 and 5(not including SPL and U-Boot) on the network;  
 +
 +
&nbsp;
 +
 +
[[File:Rockchip bootflow20181122.jpg|1000x1000px|Rockchip bootflow.jpg]]
 +
 +
Boot Flow 1 is typical Rockchip boot flow with Rockchip miniloader;<br/> Boot Flow 2 is used for most SoCs with U-Boot TPL for ddr init and SPL for trust(ATF/OP-TEE) load and run into next stage;<br/> <br/> Note 1. If loader1 have more than 1 stage, program will back to bootrom and bootrom load and run into next stage. eg. If loader1 is tpl and spl, the bootrom will run into tpl first, tpl init ddr and back to bootrom, bootrom then load and run into spl.<br/> Note 2. If trust is enabled, loader1 need to load both trust and u-boot, and then run into trust in secure mode(EL3 in armv8), trust do the initialize and run into U-Boot in non-secure mode(EL2 in armv8).<br/> Note 3. For trust(in trust.img or u-boot.itb), armv7 has only one tee.bin with or without ta, armv8 has bl31.elf and option with bl32.<br/> Note 4. In boot.img, content can be zImage and its dtb for Linux, and can optionally be grub.efi, and can be AOSP boot.img, ramdisk is option;
  
 
== Package option ==
 
== Package option ==
Line 59: Line 70:
  
 
*From source code:  
 
*From source code:  
**From U-Boot: u-boot-spl.bin, u-boot.bin(may use u-boot-nodtb.bin and u-boot.dtb instead),  
+
**From U-Boot: '''u-boot-spl.bin''', '''u-boot.bin'''(may use u-boot-nodtb.bin and u-boot.dtb instead),  
**From kernel: kernel Image/zImage file, kernel dtb,  
+
**From kernel: kernel '''Image/zImage''' file, kernel dtb,  
**From ATF: bl31.bin;   
+
**From ATF: '''bl31.elf''';   
 
*From Rockchip binary:  
 
*From Rockchip binary:  
**ddr, usbplug, miniloader, bl31, (all with&nbsp;chip 'rkxx_'&nbsp; prefix and with version '_x.xx.bin' postfix);   
+
**ddr, usbplug, miniloader, bl31/op-tee, (all with&nbsp;chip 'rkxx_'&nbsp; prefix and with version '_x.xx.bin' postfix);   
  
Here are the types to&nbsp;package image from those files:
+
We offer two different boot-loader methods for different solutions, the steps and request files are also complete different. But not all the platforms supports the both boot-loader methods. Here are the types to&nbsp;package image from those files:
  
=== idbspl.img ===
+
&nbsp;
  
U-Boot SPL, with&nbsp;SPL_BACK_TO_BROM option '''disabled'''.
 
<pre>mkimage -n rkxxxx -T rksd -d spl/u-boot-spl.bin idbspl.img</pre>
 
  
Flash the idbspl.img to offset 0x40 which only including stage 2, and need flash stage 3 &nbsp;image to 0x200(which is defineded by CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR), the stage 3 image may be&nbsp;u-boot.bin directly(when there no ATF requirement), or FIT image bl3.itb(for ATF load from SPL, including bl31.bin, u-boot-nodtb.bin and u-boot.dtb).
 
  
=== idbloader.img ===
 
  
U-Boot SPL, with&nbsp;SPL_BACK_TO_BROM option '''enabled''':
 
<pre>tools/mkimage -n rkxxxx -T rksd -d spl/u-boot-spl.bin idbloader.img
 
cat u-boot.bin >> idbloader.img</pre>
 
  
Flash the idbloader.img to offset 0x40 which including boot stage 2 and 3.
+
=== The Pre-bootloader(IDBLoader) ===
  
Package the image from Rockchip binary:
+
==== What is idbloader ====
<pre>tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
 
cat rkxx_miniloader_vx.xx.bin >> idbloader.img</pre>
 
  
Flash the idbloader.img to offset 0x40 which including stage 2, and you will need a uboot.img for boot stage 3.
+
idbloader.img is a Rockchip format pre-loader suppose to work at SoC start up, it contains:
  
=== bl3.itb ===
+
- IDBlock header which is known by Rockchip BootRom;
  
When using SPL to load the ATF, package the bl31.bin, u-boot-nodtb.bin and uboot.dtb into one FIT image.
+
- DRAM init program which is load by MaskRom and running at internal SRAM;
<pre>tools/mkimage -f fit4spl.its -E bl3.itb
 
</pre>
 
  
Flash the bl3.itb to offset 0x200, while&nbsp;need idbspl.img flasht to offset 0x40.
+
- loader for next stage which is load by MaskRom and running at DDR SDRAM;
  
=== uboot.img ===
+
You can get idbloader with below methods.
  
When using idbLoader from&nbsp;Rockchip miniloader, need package u-boot.bin into miniloader loadable format by Rockchip tool loaderimage.
+
==== Get idbloader for eMMC from Rockchip release loader ====
<pre>tools/loaderimage --pack --uboot u-boot.bin uboot.img</pre>
 
  
Flash the uboot.img to offset 0x4000 which is stage 3;
+
No need to package a idbloader.img for eMMC if you are using Rockchip release loader, you can get idbloader on eMMC with below command:
 +
<pre>rkdeveloptool db rkxx_loader_vx.xx.bin
 +
rkdeveloptool ul rkxx_loader_vx.xx.bin</pre>
  
=== trust.img ===
+
==== Package the idbloader.img from Rockchip binary: ====
  
When using idbLoader from&nbsp;Rockchip miniloader, need package bl31.bin into miniloader loadable format by Rockchip tool trustmerge.
+
For SD boot or eMMC(update with rockusb wl cmd), you need a idbloader(combinded with ddr and miniloader) .
<pre>tools/trustmerge tools/rk_tools/RKTRUST_RKXXXXTRUST.ini</pre>
+
<pre>tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
 +
cat rkxx_miniloader_vx.xx.bin >> idbloader.img
 +
</pre>
  
Flash the trust.img to offset 0x6000 which is for using Rockchip miniloader
+
==== Package the idbloader.img from U-Boot&nbsp;TPL/SPL(which is fully open source): ====
 +
<pre>tools/mkimage -n rkxxxx -T rksd -d tpl/u-boot-tpl.bin idbloader.img
 +
cat spl/u-boot-spl.bin >> idbloader.img
 +
</pre>
  
=== rkxx_loader_vx.xx.xxx.bin ===
+
Flash the idbloader.img to offset 0x40 which including stage 2, and you will need a uboot.img for boot stage 3.
  
This is provide by Rockchip in binary mode, which is used for firmware upgrade to eMMC with [[Rkdevelptool|rkdeveloptool]].
+
=== U-Boot ===
  
= Flash and boot from Media device =
+
==== uboot.img ====
  
Here we introduce how to write image to different Medeia device.
+
When using idbLoader from&nbsp;Rockchip miniloader, need package u-boot.bin into miniloader loadable format by Rockchip tool loaderimage.
 +
<pre>tools/loaderimage --pack --uboot u-boot.bin uboot.img $SYS_TEXT_BASE</pre>
  
== Boot from eMMC ==
+
Where SoCs may have different&nbsp;$SYS_TEXT_BASE.
  
=== &nbsp;To get tool&nbsp; ===
+
==== u-boot.itb ====
  
[[Rkdevelptool|tools]]
+
When using SPL to load the ATF/OP-TEE, package the bl31.bin, u-boot-nodtb.bin and uboot.dtb into one FIT image. You can skip the step to package the Trust image and flash that image in the next section.
 +
<pre>make u-boot.itb
 +
</pre>
  
=== Flash&nbsp;to the board by USB ===
+
Note: please copy the trust binary() to u-boot root directory and rename it to tee.bin(armv7) or bl31.elf(armv8).
  
In order to&nbsp;flash&nbsp;by USB,you must get your board into ROM boot mode, either by erasing<br/> your MMC or holding the maskrom button when you boot the board.
+
=== Trust ===
  
&nbsp;
+
==== trust.img ====
  
==== RK3288(upgrade_tool) ====
+
When using idbLoader from&nbsp;Rockchip miniloader, need package bl31.bin into miniloader loadable format by Rockchip tool trustmerge.
 +
<pre>tools/trustmerge tools/rk_tools/RKTRUST_RKXXXXTRUST.ini</pre>
  
To create a suitable image and flash&nbsp;it to the board:<br/> default&nbsp;: with CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+
Flash the trust.img to offset 0x6000 which is for using Rockchip miniloader
<pre>tools/mkimage -n rk3288 -T rksd -d spl/u-boot-spl-dtb.bin out<br/> cat u-boot-dtb.bin >> out<br/> sudo upgrade_tool db&nbsp; ../rkbin/rk32/RK3288UbootLoader_V2.30.06.bin<br/> sudo upgrade_tool wl 64 out<br/> sudo upgrade_tool rd</pre>
 
 
 
<br/> others&nbsp;: firefly(Recommend using sd card)
 
 
 
&nbsp;
 
  
&nbsp;
+
=== boot.img ===
  
==== RK3036 ====
+
This image is package the kernel Image and dtb file into a know filesystem(FAT or EXT2) image for distro boot.
  
To create a suitable image and flash&nbsp;it to the board:
+
See [[Rockchip_Kernel#Install_Boot.2Fkernel|Install kernel]] for detail about generate boot.img from kernel zImage/Image, dtb.
<pre>tools/mkimage -n rk3036 -T rksd -d spl/u-boot-spl-dtb.bin out
 
cat u-boot-dtb.bin >> out
 
sudo upgrade_tool db  ../rkbin/rk30/RK3036MiniLoaderAll_V2.19.bin
 
sudo upgrade_tool wl 64 out
 
sudo upgrade_tool rd
 
</pre>
 
  
&nbsp;
+
Flash the boot.img to offset 0x8000 which is stage 4.
  
==== RK3399 ====
+
=== rootfs.img ===
<pre>cd ..
 
./rkbin/tools/trust_merger ./rkbin/tools/RK3399TRUST.ini
 
cd uboot
 
  
../rkbin/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img
+
Flash the rootfs.img to offset 0x40000 which is stage 5. As long as the kernel you chosen can support that filesystem, there is not limit in the format of the image.
  
sudo upgrade_tool UL  ../rkbin/rk33/RK3399MiniLoaderAll_V1.05.bin
+
=== rkxx_loader_vx.xx.xxx.bin ===
sudo upgrade_tool DI uboot uboot.img  ../rkbin/tools/rk3399_parameter.txt
 
sudo upgrade_tool DI trust ../trust.img  ../rkbin/tools/rk3399_parameter.txt
 
sudo upgrade_tool rd
 
</pre>
 
  
&nbsp;
+
This is provide by Rockchip in binary mode, which is used for firmware upgrade to eMMC with [[Rkdeveloptool|rkdeveloptool]], can not be wirte to media device directly.
  
&nbsp;
+
This is a package from ddr.bin, usbplug.bin, miniloader.bin, Rockchip tool ''DB ''command will make usbplug.bin running in target which perform as a Rockusb device. You can skip to package this image, Rockchip will offer this image at the most of time.
  
 
&nbsp;
 
&nbsp;
  
&nbsp;
+
= Flash and boot from Media device =
  
=== &nbsp;To flash kernel and rootfs ===
+
Here we introduce how to write image to different Medeia device.
  
Enter into the uboot and issue the following command on uboot: (otg should be connected)
+
Get image Ready:
<pre>gpt write mmc 0 $partitions
 
ums 0 mmc 0
 
</pre>
 
  
<br/> Now the board will act as an USB-drive.<br/> In host: (assuming sdb is ur device)
+
*For&nbsp;with SPL:
<pre>sudo mkfs.fat /dev/sdb6
+
**idbloader.img
</pre>
+
**u-boot.itb
 +
**boot.img or&nbsp;boot folder with Image, dtb and exitlinulx inside
 +
**rootfs.img 
 +
*For&nbsp;with miniloader
 +
**idbloader.img
 +
**uboot.img
 +
**trust.img
 +
**boot.img or&nbsp;boot folder with Image, dtb and exitlinulx inside
 +
**rootfs.img 
  
<br/> Copy zimage and dts file to dev/sdb6
+
&nbsp;
<pre>cp arch/arm/boot/zImage /media/chen/9F35-9565/
 
cp arch/arm/boot/dts/rk3288-fennec.dtb /media/chen/9F35-9565/rk3288-fennec.dtb
 
</pre>
 
  
Add extlinux/extlinux.conf to dev/sdb6<br/> (Please notice "mmcblk2p7" and "115200n8" is decide on your chip, Please refer to &nbsp;[[Linux_user_guide|Linux_user_guide]])
+
== Boot from eMMC ==
<pre>label kernel-4.4
 
    kernel /zImage
 
    fdt /rk3288-fennec.dtb
 
    append  earlyprintk console=tty1 console=ttyS2,115200n8 rw root=/dev/mmcblk2p7 rootfstype=ext4 init=/sbin/init
 
</pre>
 
  
<br/> To flash rootfs
+
The eMMC is on the hardware board, so we need:
<pre>sudo dd if=linaro-rootfs.img of=/dev/sdb7 conv=notrunc</pre>
 
  
&nbsp;
+
*Get the board into [[Rockusb#Maskrom_mode|maskrom mode]];  
 +
*Connect the target to PC with USB cable;
 +
*Flash the image to eMMC with [[Rkdeveloptool|rkdeveloptool]]
  
== Boot from SD/TF Card ==
+
Example commands for flash image to target.
  
=== Creating Image ===
+
Flash the gpt partition to target:
 +
<pre style="margin-left: 40px;">rkdeveloptool db rkxx_loader_vx.xx.bin
 +
rkdeveloptool gpt parameter_gpt.txt</pre>
  
Follow [[Linux_user_guide|Linux user guide to]] build kernel and U-Boot.<br/> get uboot-spl.img and u-boot-dtb.img
+
*For&nbsp;with SPL:
<pre>tools/mkimage -n rk3288 -T rksd -d spl/u-boot-spl-dtb.bin uboot-spl.img
+
<pre style="margin-left: 40px">rkdeveloptool db rkxx_loader_vx.xx.bin
 +
rkdeveloptool wl 0x40 idbloader.img
 +
rkdeveloptool wl 0x4000 u-boot.itb
 +
rkdeveloptool wl 0x8000 boot.img
 +
rkdeveloptool wl 0x40000 rootfs.img
 +
rkdeveloptool rd
 
</pre>
 
</pre>
  
&nbsp;
+
*For&nbsp;with miniloader
 
+
<pre style="margin-left: 40px">rkdeveloptool db rkxx_loader_vx.xx.bin
=== <br/> <var>build boot.img</var> ===
+
rkdeveloptool ul rkxx_loader_vx.xx.bin
<pre>sudo dd if=/dev/zero of=boot.img bs=1M count=128
+
rkdeveloptool wl 0x4000 uboot.img
sudo mkfs.fat boot.img
+
rkdeveloptool wl 0x6000 trust.img
mkdir boot
+
rkdeveloptool wl 0x8000 boot.img
sudo mount  boot.img boot
+
rkdeveloptool wl 0x40000 rootfs.img
sudo cp zImage boot
+
rkdeveloptool rd
sudo cp rk3288-fennec.dtb boot
 
sudo mkdir boot/extlinux
 
sudo cp extlinux.conf boot/extlinux
 
sudo umount boot
 
</pre>
 
 
 
Download rootfs image and rename it
 
<pre>mv linaro-rootfs.img rootfs.img
 
 
</pre>
 
</pre>
  
 
&nbsp;
 
&nbsp;
  
=== Making a SD Card for updating ===
 
  
Download&nbsp;[https://github.com/wzyy2/rk-initrd-build ramdisk source]&nbsp;and build.
+
== Boot from SD/TF Card ==
<pre>sh ./mk-initrd.sh
 
</pre>
 
  
Format SD card
+
We can write SD/TF card with Linux PC ''dd'' command very easily.
<pre>chen@chen-HP-ProDesk-680-G1-TWR:~/work/linaro-alip/ramdisk/update$ sudo gdisk /dev/sdb
 
GPT fdisk (gdisk) version 0.8.8
 
  
Partition table scan:
+
Insert SD card to PC and we assume the /dev/sdb is the SD card device.
  MBR: protective
 
  BSD: not present
 
  APM: not present
 
  GPT: present
 
  
Found valid GPT with protective MBR; using GPT.
+
*For&nbsp;with SPL:
 +
<pre style="margin-left: 40px">dd if=idbloader.img of=sdb seek=64
 +
dd if=u-boot.itb of=sdb seek=16384
 +
dd if=boot.img of=sdb seek=32768
 +
dd if=rootfs.img of=sdb seek=262144
 +
</pre>
  
Command (? for help): o
+
*For&nbsp;with miniloader:  
This option deletes all partitions and creates a new protective MBR.
+
<pre style="margin-left: 40px">dd if=idbloader.img of=sdb seek=64
Proceed? (Y/N): y
+
dd if=uboot.img of=sdb seek=16384
 +
dd if=trust.img of=sdb seek=24576
 +
dd if=boot.img of=sdb seek=32768
 +
dd if=rootfs.img of=sdb seek=262144</pre>
  
Command (? for help): n
+
In order to make sure everything has write to SD card before unpluged, recommand to run below command:
Partition number (1-128, default 1): 1
+
<pre>sync</pre>
First sector (34-126613470, default = 2048) or {+-}size{KMGTP}: 8192
 
Last sector (8192-126613470, default = 126613470) or {+-}size{KMGTP}:
 
Current type is 'Linux filesystem'
 
Hex code or GUID (L to show codes, Enter = 8300):  
 
Changed type of partition to 'Linux filesystem'
 
  
Command (? for help): w
+
Note, when using boot from SD card, need to update the kernel cmdline(which is in extlinux.conf) for the correct ''root ''value.
 +
<pre>append  earlyprintk console=ttyS2,115200n8 rw root=/dev/mmcblk1p7 rootwait rootfstype=ext4 init=/sbin/init
 +
</pre>
  
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
+
Write GPT partition table to SD card&nbsp;in U-Boot, and then U-Boot can find the boot partition and run into kernel.
PARTITIONS!!
+
<pre>gpt write mmc 0 $partitions
 
 
Do you want to proceed? (Y/N): y
 
OK; writing new GUID partition table (GPT) to /dev/sdc.
 
Warning: The kernel is still using the old partition table.
 
The new table will be used at the next reboot.
 
The operation has completed successfully.
 
</pre>
 
<pre>sudo umount /dev/sdb1
 
sudo mkfs.fat /dev/sdb1
 
</pre>
 
<pre>tools/mkimage -n rk3288 -T rksd -d spl/u-boot-spl-dtb.bin out&&
 
sudo dd if=out of=/dev/sdb seek=64&&sudo dd if=u-boot-dtb.img of=/dev/sdb seek=256
 
 
</pre>
 
</pre>
  
Copy zimage, dts and ramdisk to /dev/sdb1
+
== Boot from U-Disk ==
<pre>cp arch/arm/boot/zImage /media/chen/9F35-9565/
 
cp arch/arm/boot/dts/rk3288-fennec.dtb /media/chen/9F35-9565/rk3288-fennec.dtb
 
cp ../rk-initrd-build/initrd.img /media/chen/9F35-9565/
 
</pre>
 
  
Add extlinux/extlinux.conf to /dev/sdb1
+
Same as&nbsp;[[#Boot_from_SD.2FTF_Card|boot-from-sdcard]], but please note that U-Disk&nbsp;only support stage 4 and 5, see [[#Boot_Stage|Boot Stage]] for detail.
<pre>label kernel-4.4
 
    kernel /zImage
 
    fdt /rk3288-fennec.dtb
 
    initrd /initrd.img
 
    append  earlyprintk console=ttyS2,115200n8 rw root=/dev/ram0 rootfstype=ext4 init=/sbin/init ramdisk_size=49152
 
</pre>
 
  
Copy u-boot-dtb.img uboot-spl.img boot.img rootfs.img and&nbsp;[https://github.com/wzyy2/rk-initrd-build/blob/master/update/update.sh update.sh]&nbsp;to /dev/sdb1
+
If U-Disk used for stage 4 and 5, format the U-Disk in gpt format and at least 2 partitions, write ''boot.img'' and ''rootfs.img'' in those partitions;
<pre>mkdir /media/chen/9F35-9565/update
 
cp u-boot-dtb.img /media/chen/9F35-9565/update
 
cp uboot-spl.img /media/chen/9F35-9565/update
 
cp boot.img /media/chen/9F35-9565/update
 
cp rootfs.img /media/chen/9F35-9565/update
 
cp update.sh /media/chen/9F35-9565/update
 
</pre>
 
  
=== Updating the board ===
+
if U-Dist is only used for stage 5, we can ''dd ''the ''rootfs.img'' to U-Disk device directly.
  
Boot the board and it will flash image to eMMC
+
Note, need to update the kernel cmdline(which is in extlinux.conf) for the correct ''root ''value.
 +
<pre>    append  earlyprintk console=ttyS2,115200n8 rw root=/dev/sda1 rootwait rootfstype=ext4 init=/sbin/init
 +
</pre>
  
&nbsp;
+
== Boot from Network ==
  
== Boot from USB-Disk ==
+
To be continued.
  
Same as&nbsp;[[#Boot_from_SD.2FTF_Card|boot-from-sdcard]], but please note that U-Boot aren't allowed to boot from usb-disk because of restrict of maskrom, only kernel and rootfs can load from USB-Disk.
+
= See also =
  
Difference:
+
[[Rkdeveloptool|rkdeveloptool]]
<pre>label kernel-4.4
 
    kernel /zImage
 
    fdt /rk3288-fennec.dtb
 
    append  earlyprintk console=ttyS2,115200n8 rw root=/dev/sda1 rootfstype=ext4 init=/sbin/init
 
</pre>
 
<pre>gpt write usb 0 $partitions
 
ums 0 usb 0
 
</pre>
 
  
= Boot from Network =
+
[[Rockusb|rockusb]]
  
&nbsp;
+
[[Partitions|Rockchip Linux partition definition]]

Latest revision as of 03:52, 15 November 2019


Boot introduce

First, let's make the concept clear, there are many boot stages when we boot up a Linux OS;

Then we need to know about how the image should packaged, where the image locate;

At last, we will explain how to write to different media and boot from there.

Here is Rockchip pre-released binaries which may be mentioned later:

https://github.com/rockchip-linux/rkbin

And Rockcip Linux GPT partition here.

 

Boot flow

This chapter introduce the generic boot flow for Rockchip Application Processors, including the detail about what image we may use in Rockchip platform for kind of boot path:

- use U-Boot TPL/SPL from upsream or rockchip U-Boot, fully source code;

- use Rockchp idbLoader which is combinded by Rockchip ddr init bin and miniloader bin from Rockchip rkbin project;

+--------+----------------+----------+-------------+---------+
| Boot   | Terminology #1 | Actual   | Rockchip    | Image   |
| stage  |                | program  |  Image      | Location|
| number |                | name     |   Name      | (sector)|
+--------+----------------+----------+-------------+---------+
| 1      |  Primary       | ROM code | BootRom     |         |
|        |  Program       |          |             |         |
|        |  Loader        |          |             |         |
|        |                |          |             |         |
| 2      |  Secondary     | U-Boot   |idbloader.img| 0x40    | pre-loader
|        |  Program       | TPL/SPL  |             |         |
|        |  Loader (SPL)  |          |             |         |
|        |                |          |             |         |
| 3      |  -             | U-Boot   | u-boot.itb  | 0x4000  | including u-boot and atf
|        |                |          | uboot.img   |         | only used with miniloader
|        |                |          |             |         |
|        |                | ATF/TEE  | trust.img   | 0x6000  | only used with miniloader
|        |                |          |             |         |
| 4      |  -             | kernel   | boot.img    | 0x8000  |
|        |                |          |             |         |
| 5      |  -             | rootfs   | rootfs.img  | 0x40000 |
+--------+----------------+----------+-------------+---------+

Then when we talking about boot from eMMC/SD/U-Disk/net, they are in different concept:

  • Stage 1 is always in boot rom, it loads stage 2 and may load stage 3(when SPL_BACK_TO_BROM option enabled).
  • Boot from SPI flash means firmware for stage 2 and 3(SPL and U-Boot only) in SPI flash and stage 4/5 in other place;
  • Boot from eMMC means all the firmware(including stage 2, 3, 4, 5) in eMMC;
  • Boot from SD card means all the firmware(including stage 2, 3, 4, 5) in SD card;
  • Boot from U-Disk means firmware for stage 4 and 5(not including SPL and U-Boot) in Disk, optionally only including stage 5;
  • Boot from net/tftp means firmeware for stage 4 and 5(not including SPL and U-Boot) on the network;

 

Rockchip bootflow.jpg

Boot Flow 1 is typical Rockchip boot flow with Rockchip miniloader;
Boot Flow 2 is used for most SoCs with U-Boot TPL for ddr init and SPL for trust(ATF/OP-TEE) load and run into next stage;

Note 1. If loader1 have more than 1 stage, program will back to bootrom and bootrom load and run into next stage. eg. If loader1 is tpl and spl, the bootrom will run into tpl first, tpl init ddr and back to bootrom, bootrom then load and run into spl.
Note 2. If trust is enabled, loader1 need to load both trust and u-boot, and then run into trust in secure mode(EL3 in armv8), trust do the initialize and run into U-Boot in non-secure mode(EL2 in armv8).
Note 3. For trust(in trust.img or u-boot.itb), armv7 has only one tee.bin with or without ta, armv8 has bl31.elf and option with bl32.
Note 4. In boot.img, content can be zImage and its dtb for Linux, and can optionally be grub.efi, and can be AOSP boot.img, ramdisk is option;

Package option

After we know about the boot stages,

Here are the file list before package for stage 2~4:

  • From source code:
    • From U-Boot: u-boot-spl.bin, u-boot.bin(may use u-boot-nodtb.bin and u-boot.dtb instead),
    • From kernel: kernel Image/zImage file, kernel dtb,
    • From ATF: bl31.elf;
  • From Rockchip binary:
    • ddr, usbplug, miniloader, bl31/op-tee, (all with chip 'rkxx_'  prefix and with version '_x.xx.bin' postfix);

We offer two different boot-loader methods for different solutions, the steps and request files are also complete different. But not all the platforms supports the both boot-loader methods. Here are the types to package image from those files:

 



The Pre-bootloader(IDBLoader)

What is idbloader

idbloader.img is a Rockchip format pre-loader suppose to work at SoC start up, it contains:

- IDBlock header which is known by Rockchip BootRom;

- DRAM init program which is load by MaskRom and running at internal SRAM;

- loader for next stage which is load by MaskRom and running at DDR SDRAM;

You can get idbloader with below methods.

Get idbloader for eMMC from Rockchip release loader

No need to package a idbloader.img for eMMC if you are using Rockchip release loader, you can get idbloader on eMMC with below command:

rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool ul rkxx_loader_vx.xx.bin

Package the idbloader.img from Rockchip binary:

For SD boot or eMMC(update with rockusb wl cmd), you need a idbloader(combinded with ddr and miniloader) .

tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
cat rkxx_miniloader_vx.xx.bin >> idbloader.img

Package the idbloader.img from U-Boot TPL/SPL(which is fully open source):

tools/mkimage -n rkxxxx -T rksd -d tpl/u-boot-tpl.bin idbloader.img
cat spl/u-boot-spl.bin >> idbloader.img

Flash the idbloader.img to offset 0x40 which including stage 2, and you will need a uboot.img for boot stage 3.

U-Boot

uboot.img

When using idbLoader from Rockchip miniloader, need package u-boot.bin into miniloader loadable format by Rockchip tool loaderimage.

tools/loaderimage --pack --uboot u-boot.bin uboot.img $SYS_TEXT_BASE

Where SoCs may have different $SYS_TEXT_BASE.

u-boot.itb

When using SPL to load the ATF/OP-TEE, package the bl31.bin, u-boot-nodtb.bin and uboot.dtb into one FIT image. You can skip the step to package the Trust image and flash that image in the next section.

make u-boot.itb

Note: please copy the trust binary() to u-boot root directory and rename it to tee.bin(armv7) or bl31.elf(armv8).

Trust

trust.img

When using idbLoader from Rockchip miniloader, need package bl31.bin into miniloader loadable format by Rockchip tool trustmerge.

tools/trustmerge tools/rk_tools/RKTRUST_RKXXXXTRUST.ini

Flash the trust.img to offset 0x6000 which is for using Rockchip miniloader

boot.img

This image is package the kernel Image and dtb file into a know filesystem(FAT or EXT2) image for distro boot.

See Install kernel for detail about generate boot.img from kernel zImage/Image, dtb.

Flash the boot.img to offset 0x8000 which is stage 4.

rootfs.img

Flash the rootfs.img to offset 0x40000 which is stage 5. As long as the kernel you chosen can support that filesystem, there is not limit in the format of the image.

rkxx_loader_vx.xx.xxx.bin

This is provide by Rockchip in binary mode, which is used for firmware upgrade to eMMC with rkdeveloptool, can not be wirte to media device directly.

This is a package from ddr.bin, usbplug.bin, miniloader.bin, Rockchip tool DB command will make usbplug.bin running in target which perform as a Rockusb device. You can skip to package this image, Rockchip will offer this image at the most of time.

 

Flash and boot from Media device

Here we introduce how to write image to different Medeia device.

Get image Ready:

  • For with SPL:
    • idbloader.img
    • u-boot.itb
    • boot.img or boot folder with Image, dtb and exitlinulx inside
    • rootfs.img
  • For with miniloader
    • idbloader.img
    • uboot.img
    • trust.img
    • boot.img or boot folder with Image, dtb and exitlinulx inside
    • rootfs.img

 

Boot from eMMC

The eMMC is on the hardware board, so we need:

Example commands for flash image to target.

Flash the gpt partition to target:

rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool gpt parameter_gpt.txt
  • For with SPL:
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x40 idbloader.img
rkdeveloptool wl 0x4000 u-boot.itb
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd
  • For with miniloader
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool ul rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x4000 uboot.img
rkdeveloptool wl 0x6000 trust.img
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd

 


Boot from SD/TF Card

We can write SD/TF card with Linux PC dd command very easily.

Insert SD card to PC and we assume the /dev/sdb is the SD card device.

  • For with SPL:
dd if=idbloader.img of=sdb seek=64
dd if=u-boot.itb of=sdb seek=16384
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144
  • For with miniloader:
dd if=idbloader.img of=sdb seek=64
dd if=uboot.img of=sdb seek=16384
dd if=trust.img of=sdb seek=24576
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144

In order to make sure everything has write to SD card before unpluged, recommand to run below command:

sync

Note, when using boot from SD card, need to update the kernel cmdline(which is in extlinux.conf) for the correct root value.

append  earlyprintk console=ttyS2,115200n8 rw root=/dev/mmcblk1p7 rootwait rootfstype=ext4 init=/sbin/init

Write GPT partition table to SD card in U-Boot, and then U-Boot can find the boot partition and run into kernel.

gpt write mmc 0 $partitions

Boot from U-Disk

Same as boot-from-sdcard, but please note that U-Disk only support stage 4 and 5, see Boot Stage for detail.

If U-Disk used for stage 4 and 5, format the U-Disk in gpt format and at least 2 partitions, write boot.img and rootfs.img in those partitions;

if U-Dist is only used for stage 5, we can dd the rootfs.img to U-Disk device directly.

Note, need to update the kernel cmdline(which is in extlinux.conf) for the correct root value.

    append  earlyprintk console=ttyS2,115200n8 rw root=/dev/sda1 rootwait rootfstype=ext4 init=/sbin/init

Boot from Network

To be continued.

See also

rkdeveloptool

rockusb

Rockchip Linux partition definition