i.MX6處理器u-boot.imx文件解析

一、u-boot.imx與u-boot.bin的關係

    u-boot.imxu-boot.bin文件的主要關係是:u-boot.imx是在u-boot.bin的前面附加上一個image header,主要包含IVT header、 Boot data、DCD header;整個header的大小限制爲3Kbyte。
    由於在eMMC上,還需要預留前1KB用來存儲分區信息,所以uboot.imx在eMMC上的存儲分佈如下圖:
eMMC中u-boot.imx分佈

二、u-boot.imx文件解析

    瞭解了u-boot.imx在eMMC空間的分佈之後,下面就詳細介紹IVT header、Boot Data、DCD header三個部分的細節。以下圖所示爲u-boot.imx文件內容的文件頭,後面詳細解釋其含義:
uboot.imx頭部信息IVTBoot data
DCD

三、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\tools\imximage.h文件中定義,在手冊文檔8.6.2 Device Configuration Data (DCD)節說明DCD最大長度爲1768byte
    爲何拷貝的是eMMC的前4K數據:因爲在u-boot\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的值爲0x877FF400,boot_data的值爲0x877FF420,那麼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。

四、u-boot.imx文件生成

    在新版本的uboot中,使用mkimage工具生成u-boot.imx。
    mkimage包含的目標文件類型-T參數中新增了imximage選項;mkimage會調用格式類型imximage的解釋器來生成針對i.mx系列芯片的 IVT、boot Data、DCD的格式頭。
具體的代碼實現在tools/imximage.c中。我們以board/freescale/mx6ul_topeet爲例,生成u-boot.imx時執行:./tools/mkimage -n board/freescale/mx6ul_topeet/imximage.cfg.cfgtmp -T imximage -e 0x87800000 -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代碼實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章