首先,讓我們明確這個概念,啟動Linux操作系統時有很多啟動階段;
然後我們需要知道image應該如何打包,image所在的位置;
最後,我們將解釋如何寫入不同的媒體並從那裡啟動。
這是Rockchip預發布的二進製文件,可能會在後面提到:
https://github.com/rockchip-linux/rkbin
和Rockcip Linux GPT分區在這裡。
引導流程
下面是一個表格,詳細介紹了我們可能在Rockchip平台上使用的2個啟動階段:
- 使用U-Boot SPL;
- 使用由Rockchip ddr init bin和miniloader bin組合的Rockchp idbLoader;
+--------+----------------+----------+-------------+---------+
| 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 |including u-boot if not use miniloader
| | Program | SPL |idbspl.img | |
| | Loader (SPL) | | | |
| | | | | |
| 3 | - | U-Boot | u-boot.itb | 0x4000 | including u-boot and atf
| | | | u-boot.bin | |
| | | | uboot.img | | only used with miniloader
| | | | | |
| | | ATF | trust.img | 0x6000 | only used with miniloader for armv8
| | | | | |
| 4 | - | kernel | boot.img | 0x8000 |
| | | | | |
| 5 | - | rootfs | rootfs.img | 0x40000 |
+--------+----------------+----------+-------------+---------+
然後,當我們談論從eMMC / SD / U-Disk / net啟動時,它們有不同的概念:
- 階段1始終處於啟動狀態,它加載階段2並可能加載階段3(啟用SPL_BACK_TO_BROM選項時)。
- 從SPIFlash啟動意味著SPIFlash中的階段2和3(僅限SPL和U-Boot)以及其他位置的階段4/5的固件;
- 從eMMC引導意味著eMMC中的所有固件(包括第2,3,4,5階段);
- 從SD卡啟動意味著SD卡中的所有固件(包括第2,3,4,5級);
- 從U盤引導意味著磁盤中第4和第5階段(不包括SPL和U-Boot)的固件,可選擇僅包括第5階段;
- 從net / tftp引導意味著網絡上的第4和第5階段(不包括SPL和U-Boot)的firmeware;
引導流程1是Rockchip miniloader的典型Rockchip引導流程;
Boot Flow 2用於大多數SoC,U-Boot TPL用於ddr init,SPL用於信任(ATF / OP-TEE)加載並進入下一階段;
Boot Flow 3僅用於支持SPL ATF的RK3399;
Boot Flow 4用於不支持信任的armv7 SoC;
注意1.如果loader1有超過1個階段,程序將返回bootrom和bootrom加載並進入下一階段。例如。如果loader1是tpl和spl,則bootrom將首先執行到tpl,tpl init ddr並返回bootrom,然後bootrom加載並執行到spl。
注意2.如果啟用了信任,則loader1需要加載trust和u-boot,然後在安全模式下執行信任(armv8中的EL3),信任執行初始化並以非安全模式執行U-Boot(EL2)在armv8)。
注3.對於trust(在trust.img或u-boot.itb中),armv7只有一個tee.bin有或沒有ta,armv8有bl31.elf和bl32選項。
注意4.在boot.img中,內容可以是zImage及其dtb for Linux,也可以是grub.efi,可以是AOSP boot.img,ramdisk是選項;
包裝選項
在我們了解了引導階段之後,
以下是第2~4階段包之前的文件列表:
- 來自源代碼:
- 從U-Boot:u-boot-spl.bin,u-boot.bin(可以使用u-boot-nodtb.bin和u-boot.dtb代替),
- 從LINUX核心:LINUX核心Image / zImage文件,LINUX核心dtb,
- 來自ATF:bl31.elf ;
- 來自Rockchip二進製文件:
- ddr,usbplug,miniloader,bl31 / op-tee,(所有芯片'rkxx_'前綴和版本'_x.xx.bin'後綴);
我們為不同的解決方案提供兩種不同的引導加載程序方法,步驟和請求文件也完全不同。但並非所有平台都支持這兩種引導加載程序方法。以下是從這些文件打包image的類型:
預引導程序
Rockchip Miniloader
從Rockchip二進製文件打包image:
無需為eMMC打包idbloader,因為您可以使用以下命令從loader編寫idbloader:
- ddr,usbplug,miniloader,bl31 / op-tee,(所有芯片'rkxx_'前綴和版本'_x.xx.bin'後綴);
rkdeveloptool db rkxx_ddr_vx.xx.bin
rkdeveloptool ul rkxx_ddr_vx.xx.bin
對於SD啟動,您需要一個idbloader(與ddr和miniloader組合)來寫入SD卡。
tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
cat rkxx_miniloader_vx.xx.bin >> idbloader.img
帶有tpl / spl的idbloader.img
tools/mkimage -n rkxxxx -T rksd -d tpl/u-boot-tpl.bin idbloader.img
cat spl/u-boot-spl.bin >> idbloader.img
idbspl.img
U-Boot SPL支持ddr init和下一階段的加載數據,現在僅在rk3399中可用。
mkimage -n rkxxxx -T rksd -d spl/u-boot-spl.bin idbspl.img
將idbloader.img / idbspl.imgFlash到偏移量0x40(包括階段2),並且啟動階段3需要uboot.img。
的U-Boot
uboot.img
當使用Rockchip miniloader的idbLoader時,需要通過Rockchip工具loaderimage將u-boot.bin打包成miniloader可加載格式。
tools/loaderimage --pack --uboot u-boot.bin uboot.img
U型boot.itb
使用SPL加載ATF / OP-TEE時,將bl31.bin,u-boot-nodtb.bin和uboot.dtb打包成一個FITimage。您可以跳過步驟以打包信任image並在下一部分中刷新該image。
make u-boot.itb
注意:請將trust binary()複製到u-bootroot目錄並將其重命名為tee.bin(armv7)或bl31.elf(armv8)。
Trust
trust.img
當使用Rockchip miniloader的idbLoader時,需要通過Rockchip工具trustmerge將bl31.bin包裝成miniloader可加載格式。
tools/trustmerge tools/rk_tools/RKTRUST_RKXXXXTRUST.ini
Flash trust.img偏移0x6000,這是使用Rockchip miniloader
boot.img的
這個映像將LINUX核心映像和dtb文件打包成一個知道文件系統(FAT或EXT2)映像,用於發行版啟動。
有關從LINUX核心zImage/Image,dtb生成boot.img的詳細信息,請參閱安裝LINUX核心。
Flash boot.img偏移0x8000,即第4階段。
rootfs.img
Flash rootfs.img偏移量0x40000,這是第5階段。只要您選擇的LINUX核心可以支持該文件系統,image的格式就沒有限制。
rkxx_loader_vx.xx.xxx.bin
這是由Rockchip以二進制模式提供的,用於通過rkdeveloptool進行eMMC的固件升級,不能直接用於媒體設備。
這是來自ddr.bin,usbplug.bin,miniloader.bin的一個軟件包,Rockchip工具DB命令將使usbplug.bin在目標中執行,作為Rockusb設備執行。您可以跳過打包此image,Rockchip將在大部分時間提供此image。
從Media設備進行Flash和啟動
這裡我們介紹如何將image寫入不同的Medeia設備。
準備好image:
- 對於帶SPL且啟用了SPL_BACK_TO_BROM選項的armv7:
- idbLoader.img
- boot.img或boot文件夾裡面有zImage,dtb和exitlinulx
- rootfs.img
- 對於帶SPL且沒有SPL_BACK_TO_BROM選項的armv7:
- idbspl.img
- U型BOOT.BIN
- boot.img或boot文件夾裡面有zImage,dtb和exitlinulx
- rootfs.img
- 對於帶有miniloader的armv7
- idbLoader.img
- uboot.img
- boot.img或boot文件夾裡面有zImage,dtb和exitlinulx
- rootfs.img
- 對於帶SPL的armv8:
- idbspl.img
- bl3.itb
- boot.img或啟動文件夾裡面有Image,dtb和exitlinulx
- rootfs.img
- 對於armv8與miniloader
- idbLoader.img
- uboot.img
- trust.img
- boot.img或啟動文件夾裡面有Image,dtb和exitlinulx
- rootfs.img
從eMMC啟動
eMMC在硬件板上,因此我們需要:
- 讓電路板進入maskrom模式 ;
- 使用USB線將目標連接到PC;
- 使用rkdeveloptool將image閃爍到eMMC
Flash映像到目標的示例命令。
將gpt分區Flash到目標:
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool gpt parameter_gpt.txt
- 對於帶SPL且啟用了SPL_BACK_TO_BROM選項的armv7(rk3036,rk3188,rk3288):
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x40 idbloader.img
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd
- 對於帶SPL的armv7,禁用SPL_BACK_TO_BROM選項(rk3288):
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x40 idbspl.img
rkdeveloptool wl 0x4000 u-boot.bin
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd
- 對於帶有miniloader的armv7(rk3036,rk3188,rk3288)
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool ul rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x4000 uboot.img
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd
- 對於帶SPL的armv8(rk3399):
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x40 idbspl.img
rkdeveloptool wl 0x4000 bl3.itb
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd
- 對於帶有miniloader的armv8(rk3399,rk3328)
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
從SD / TF卡啟動
我們可以很容易地用Linux PC dd命令編寫SD / TF卡。
將SD卡插入PC,我們假設/ dev / sdb是SD卡設備。
- 對於帶SPL且啟用了SPL_BACK_TO_BROM選項的armv7(rk3036,rk3188,rk3288):
dd if=idbloader.img of=sdb seek=64
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144
- 對於帶SPL的armv7,禁用SPL_BACK_TO_BROM選項(rk3288):
dd if=idbspl.img of=sdb seek=64
dd if=u-boot.bin of=sdb seek=16384
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144
- 對於帶有miniloader的armv7(rk3036,rk3188,rk3288)
dd if=idbloader.img of=sdb seek=64
dd if=uboot.img of=sdb seek=16384
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144
- 對於帶SPL的armv8(rk3399):
dd if=idbspl.img of=sdb seek=64
dd if=bl3.itb of=sdb seek=16384
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144
- 對於帶有miniloader的armv8(rk3399,rk3328)
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
為了確保在拔出電源之前所有內容都已寫入SD卡,建議執行以下命令:
sync
注意,當使用從SD卡啟動時,需要更新LINUX核心cmdline(在extlinux.conf中)以獲取正確的root值。
append earlyprintk console=ttyS2,115200n8 rw root=/dev/mmcblk1p7 rootwait rootfstype=ext4 init=/sbin/init
在U-Boot中將GPT分區表寫入SD卡,然後U-Boot可以找到啟動分區並執行到LINUX核心。
gpt write mmc 0 $partition
從U盤啟動
與 boot-from-sdcard相同,但請注意U盤僅支持第4階段和第5 階段,有關詳細信息,請參閱Boot Stage。
如果U盤用於第4階段和第5階段,以gpt格式格式化U盤並至少格式化2個分區,則在這些分區中寫入boot.img和rootfs.img ;
如果U形DIST僅用於階段5中,我們可以DD的rootfs.img直接向U盤設備。
注意,需要更新LINUX核心cmdline(在extlinux.conf中)以獲取正確的root值。
append earlyprintk console=ttyS2,115200n8 rw root=/dev/sda1 rootwait rootfstype=ext4 init=/sbin/init
留言列表