close

首先,讓我們明確這個概念,啟動Linux操作系統時有很多啟動階段;

然後我們需要知道image應該如何打包,image所在的位置;

最後,我們將解釋如何寫入不同的媒體並從那裡啟動。

這是Rockchip預發布的二進製文件,可能會在後面提到:

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

Rockcip Linux GPT分區在這裡。

 

引導流程

下面是一個表格,詳細介紹了我們可能在Rockchip平台上使用的2個啟動階段:

- 使用U-Boot SPL;

- 使用由Rockchip ddr init binminiloader 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中的階段23(僅限SPLU-Boot)以及其他位置的階段4/5的固件;
  • eMMC引導意味著eMMC中的所有固件(包括第2,3,4,5階段);
  • SD卡啟動意味著SD卡中的所有固件(包括第2,3,4,5級);
  • U盤引導意味著磁盤中第4和第5階段(不包括SPLU-Boot)的固件,可選擇僅包括第5階段;
  • net / tftp引導意味著網絡上的第4和第5階段(不包括SPLU-Boot)的firmeware;

     

    引導流程1Rockchip miniloader的典型Rockchip引導流程
    Boot Flow 2
    用於大多數SoCU-Boot TPL用於ddr initSPL用於信任(ATF / OP-TEE)加載並進入下一階段
    Boot Flow 3
    僅用於支持SPL ATFRK3399; 
    Boot Flow 4
    用於不支持信任的armv7 SoC; 

    注意1.如果loader1有超過1個階段,程序將返回bootrombootrom加載並進入下一階段。例如。如果loader1tplspl,則bootrom將首先執行到tpltpl init ddr並返回bootrom,然後bootrom加載並執行到spl
    注意2.如果啟用了信任,則loader1需要加載trustu-boot,然後在安全模式下執行信任(armv8中的EL3),信任執行初始化並以非安全模式執行U-BootEL2)在armv8)。
    3.對於trust(在trust.imgu-boot.itb中),armv7只有一個tee.bin有或沒有taarmv8bl31.elfbl32選項。
    注意4.boot.img中,內容可以是zImage及其dtb for Linux,也可以是grub.efi,可以是AOSP boot.imgramdisk是選項;

包裝選項

在我們了解了引導階段之後,

以下是第2~4階段包之前的文件列表:

  • 來自源代碼:
    • U-Bootu-boot-spl.binu-boot.bin(可以使用u-boot-nodtb.binu-boot.dtb代替),
    • LINUX核心:LINUX核心Image / zImage文件,LINUX核心dtb
    • 來自ATFbl31.elf ;
  • 來自Rockchip二進製文件:
    • ddrusbplugminiloaderbl31 / op-tee,(所有芯片'rkxx_'前綴和版本'_x.xx.bin'後綴);

      我們為不同的解決方案提供兩種不同的引導加載程序方法,步驟和請求文件也完全不同。但並非所有平台都支持這兩種引導加載程序方法。以下是從這些文件打包image的類型:

       

       

      預引導程序

      Rockchip Miniloader

      Rockchip二進製文件打包image

      無需為eMMC打包idbloader,因為您可以使用以下命令從loader編寫idbloader

rkdeveloptool db rkxx_ddr_vx.xx.bin

rkdeveloptool ul rkxx_ddr_vx.xx.bin

對於SD啟動,您需要一個idbloader(與ddrminiloader組合)來寫入SD卡。

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

cat rkxx_miniloader_vx.xx.bin >> idbloader.img

帶有tpl / splidbloader.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 miniloaderidbLoader時,需要通過Rockchip工具loaderimageu-boot.bin打包成miniloader可加載格式。

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

 

Uboot.itb

使用SPL加載ATF / OP-TEE時,將bl31.binu-boot-nodtb.binuboot.dtb打包成一個FITimage。您可以跳過步驟以打包信任image並在下一部分中刷新該image

make u-boot.itb

注意:請將trust binary()複製到u-bootroot目錄並將其重命名為tee.binarmv7)或bl31.elfarmv8)。

Trust

trust.img

當使用Rockchip miniloaderidbLoader時,需要通過Rockchip工具trustmergebl31.bin包裝成miniloader可加載格式。

tools/trustmerge tools/rk_tools/RKTRUST_RKXXXXTRUST.ini

Flash trust.img偏移0x6000,這是使用Rockchip miniloader

boot.img

這個映像將LINUX核心映像和dtb文件打包成一個知道文件系統(FATEXT2)映像,用於發行版啟動。

有關從LINUX核心zImage/Imagedtb生成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.binusbplug.binminiloader.bin的一個軟件包,Rockchip工具DB命令將使usbplug.bin在目標中執行,作為Rockusb設備執行。您可以跳過打包此imageRockchip將在大部分時間提供此image

 

Media設備進行Flash和啟動

這裡我們介紹如何將image寫入不同的Medeia設備。

準備好image

  • 對於帶SPL且啟用了SPL_BACK_TO_BROM選項的armv7
    • idbLoader.img
    • boot.imgboot文件夾裡面有zImagedtbexitlinulx
    • rootfs.img
  • 對於帶SPL且沒有SPL_BACK_TO_BROM選項的armv7
    • idbspl.img
    • UBOOT.BIN
    • boot.imgboot文件夾裡面有zImagedtbexitlinulx
    • rootfs.img
  • 對於帶有miniloaderarmv7
    • idbLoader.img
    • uboot.img
    • boot.imgboot文件夾裡面有zImagedtbexitlinulx
    • rootfs.img
  • 對於帶SPLarmv8
    • idbspl.img
    • bl3.itb
    • boot.img或啟動文件夾裡面有Imagedtbexitlinulx
    • rootfs.img
  • 對於armv8miniloader
    • idbLoader.img
    • uboot.img
    • trust.img
    • boot.img或啟動文件夾裡面有Imagedtbexitlinulx
    • rootfs.img

       

eMMC啟動

eMMC在硬件板上,因此我們需要:

  • 讓電路板進入maskrom模式 ;
  • 使用USB線將目標連接到PC;
  • 使用rkdeveloptoolimage閃爍到eMMC

    Flash映像到目標的示例命令。

    gpt分區Flash到目標:

rkdeveloptool db rkxx_loader_vx.xx.bin

rkdeveloptool gpt parameter_gpt.txt

  • 對於帶SPL且啟用了SPL_BACK_TO_BROM選項的armv7rk3036rk3188rk3288):

rkdeveloptool db rkxx_loader_vx.xx.bin

rkdeveloptool wl 0x40 idbloader.img

rkdeveloptool wl 0x8000 boot.img

rkdeveloptool wl 0x40000 rootfs.img

rkdeveloptool rd

  • 對於帶SPLarmv7,禁用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

  • 對於帶有miniloaderarmv7rk3036rk3188rk3288

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

  • 對於帶SPLarmv8rk3399):

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

  • 對於帶有miniloaderarmv8rk3399rk3328

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 / sdbSD卡設備。

  • 對於帶SPL且啟用了SPL_BACK_TO_BROM選項的armv7rk3036rk3188rk3288):

dd if=idbloader.img of=sdb seek=64

dd if=boot.img       of=sdb seek=32768

dd if=rootfs.img     of=sdb seek=262144

  • 對於帶SPLarmv7,禁用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

  • 對於帶有miniloaderarmv7rk3036rk3188rk3288

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

  • 對於帶SPLarmv8rk3399):

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

  • 對於帶有miniloaderarmv8rk3399rk3328

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階段和第階段,有關詳細信息,請參閱Boot Stage

如果U盤用於第4階段和第5階段,以gpt格式格式化U盤並至少格式化2個分區,在這些分區中寫入boot.imgrootfs.img ;

如果UDIST僅用於階段5中,我們可以DDrootfs.img直接向U盤設備。

注意,需要更新LINUX核心cmdline(在extlinux.conf中)以獲取正確的root值。

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

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 立你斯 的頭像
    立你斯

    立你斯學習記錄

    立你斯 發表在 痞客邦 留言(0) 人氣()