天天看點

IMX6Q的uboot.imx檔案解析uboot.imx與uboot.bin的關系uboot.imx檔案解析IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作uboot.imx檔案生成猜想

文章目錄

  • uboot.imx與uboot.bin的關系
  • uboot.imx檔案解析
  • IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作
  • uboot.imx檔案生成
  • 猜想

經過幾天的研究,徹底弄清楚了IMX6的ROM BOOT 流程,以及如何啟動uboot;2016-03 版本的uboot源碼編譯後生成的uboot.bin與uboot.imx是什麼關系,怎麼生成uboot.imx等等。

下面就把寫的筆記搬到這裡來,友善以後查閱。

uboot.imx與uboot.bin的關系

u-boot.imx與u-boot.bin檔案的主要關系是:u-boot.imx是在u-boot.bin的前面附加上一個image header,主要包含IVT header、 Boot data、DCD header;整個header的大小限制為3Kbyte。

為啥限制大小為3K,是因為在存儲器的0 位址預留一部分空間儲存分區資訊,以下表格為不同存儲器類型預留的空間大小。

IMX6Q的uboot.imx檔案解析uboot.imx與uboot.bin的關系uboot.imx檔案解析IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作uboot.imx檔案生成猜想

根據預留白間大小,将u-boot.imx檔案燒寫到eMMC時,需要偏移1K位元組,下圖為u-boot.imx在eMMC空間的分布。

IMX6Q的uboot.imx檔案解析uboot.imx與uboot.bin的關系uboot.imx檔案解析IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作uboot.imx檔案生成猜想

uboot.imx檔案解析

了解了u-boot.imx在eMMC空間的分布之後,下面就詳細介紹IVT header、Boot Data、DCD header三個部分的細節。以下圖所示為u-boot.imx的前一部分,下面詳細解釋其含義:

IMX6Q的uboot.imx檔案解析uboot.imx與uboot.bin的關系uboot.imx檔案解析IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作uboot.imx檔案生成猜想
IMX6Q的uboot.imx檔案解析uboot.imx與uboot.bin的關系uboot.imx檔案解析IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作uboot.imx檔案生成猜想

IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作

當我們選擇從eMMC啟動時,BOOT ROM會拷貝eMMC中的前4K bytes資料到片内RAM(OCRAM)。這初始的4K資料中必須包含IVT(Image vector table)、DCD(Device configuration data)和Boot Data structures,但eMMC啟動時,IVT的偏移為1K,是以剩餘的3K資料中必須包含IVT、DCD和Boot Data structures。(其實不到1K)

另外DCD最大長度限制由宏 MAX_HW_CFG_SIZE_V2決定,宏在\u-boot-2016.03-r0\tools\imximage.h檔案中定義,在手冊文檔8.6.2 Device Configuration Data (DCD)節說明DCD最大長度為1768byte

為何拷貝的是eMMC的欠欠4K資料:因為在\u-boot-2016.03-r0\tools\imximage.h檔案中定義

#define FLASH_LOADSIZE_STANDARD 0x1000;此宏定義說明BOOT ROM将eMMC起始的4K内容拷貝到片内RAM

接着BOOT ROM檢查OCRAM 4K資料中包含的IVT頭标志0xD1,然後執行DCD檢查。這些檢查無誤通過後,從boot data structure 中解析出下一步拷貝的目的位址和長度(記為length),然後從eMMC位址0,拷貝長度length的資料到上面解析出的目的位址處。

這裡有一個如何在OCRAM中定位boot data structure位址的問題。編譯生成的u-boot.imx,它的boot data内容即為boot data structure的位址,而該位址是一個絕對位址,實際為DDR位址,而OCRAM中此時的位址還是原始資料中的該位址。由于此時DDR還未準備好,還未執行u-boot.imx到DDR的拷貝,BOOT ROM不能使用boot data中的絕對(DDR位址)位址來定位boot data structure。而隻能使用偏移位址在OCRAM中定位boot data structure。那麼偏移位址怎麼得到呢?

注意IVT中還有一個self表項,它指向它自身,即IVT的首位址。此例u-boot.imx中的self的值為0x177FF400,boot_data的值為0x177FF420,那麼boot data structure的位址偏移為boot data structure offset = boot_data - self(IVT首位址) = 0x20,加載到OCRAM中後,boot data structure的有效位址為:OCRAM IVT 加載首位址 +boot data structure offset,同理也可以計算出DCD資料在OCRAM中的偏移為0x2C。

其實不用這麼麻煩,根據u-boot.imx在eMMC存儲器中的空間分布,IVT header占用固定的0x20 位元組,緊接着就是boot data structure,占用0x0C位元組;然後是DCD header;是以boot data的偏移為0x20 位元組,DCD header 的便宜為0x2C位元組;是以當ROM BOOT将eMMC的前4K空間拷貝到OCRAM中時 ,偏移并不會改變。

ROM BOOT在經過以上步驟以後,根據這些位址定位找到DCD的存儲位置,使用DCD中的配置參數,來初始化DDR,配置時鐘,以及其他啟動時必要的硬體設定; BOOT ROM會在必要的檢查和上述的初始化之後,将boot data structure資料訓示的位址與長度将uboot.imx資料拷貝到SDRAM然後跳轉到IVT訓示的entry執行uboot

uboot.imx在eMMC中的分布與拷貝到SDRAM中的分布如下圖所示:

IMX6Q的uboot.imx檔案解析uboot.imx與uboot.bin的關系uboot.imx檔案解析IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相關資料操作uboot.imx檔案生成猜想

uboot.imx檔案生成

u-boot-2015.07及以後的版本中,更改了u-boot.imx的産生方式,不再使用flash_header.S,而是使用mkimage工具直接生成。

mkimage包含的目标檔案類型-T參數中新增了imximage選項;mkimage會調用格式類型imximage的解釋器來生成針對i.mx(5系6系)系列晶片的 IVT、boot Data、DCD的格式頭。

具體的代碼實作在tools/imximage.c中。我們以board/freescale/mx6qsabreauto為例,生成u-boot.imx時執行:

./tools/mkimage -n board/freescale/mx6qsabreauto/imximage.cfg.cfgtmp -T imximage -e 0x17800000 -d u-boot.bin u-boot.imx

其中-n指明輸入檔案為imximage.cfg.cfgtmp,-T指明解釋器為imximage,-e為鏡像程式入口點。

mkimage調用選項-T的imximage 解釋器解析輸入檔案:imximage.cfg.cfgtmp,而檔案imximage.cfg.cfgtmp為imximage.cfg編譯時處理(使用gcc -E選項)後産生的臨時檔案。

更多細節需要參考imximage.c代碼實作。

猜想

由于IMX6 的ROM BOOT會将uboot.imx拷貝到SDRAM的0x177FF000,加上4K的image header偏移,uboot.bin正好對應到連結位址:0x17800000,因為uboot在執行代碼時已經在連結位址,是以應該不會進行代碼重定位操作