1、uboot移植和imx文件分析


 


本系列使用的平台為百問網IMX6ULL,通過對NXP提供uboot的分析和修改,使其支持百問網IMX6ULL

本系列參考了正點原子和百問網的IMX6ULL教程,在此表示衷心感謝

本章參考文件有:《i.MX 6 BSP Porting Guide》、《ARMv7架構參考手冊》

百度網盤鏈接:

https://pan.baidu.com/s/1h3LjDtOmAYChti7Rr30aSA

提取碼為:07yl


 

 

一、uboot准備過程

首先需要解壓uboot,解壓后得到的頂層文件夾有:

 

《i.MX 6 BSP Porting Guide》中1.2.1節所述流程如下:

1. 復制開發板目錄中相關文件夾(我選擇的是mx6ull_ddr3_arm2)到自定義文件夾:

$ cp -R ./board/freescale/mx6ullevk/ ./board/freescale/mx6ull_lioker

$ mv ./board/freescale/mx6ull_lioker/mx6ullevk.c ./board/freescale/mx6ull_lioker/mx6ull_lioker.c

2. 復制頭文件目錄中相關文件為自定義文件:

$ cp ./include/configs/mx6ullevk.h ./include/configs/mx6ull_lioker.h

3. 復制配置文件目錄中相關文件為自定義文件:

$ cp ./configs/mx6ull_14x14_evk_emmc_defconfig ./configs/mx6ull_lioker_defconfig

4. 修改上述自定義文件

修改后的文件存放在百度網盤鏈接的./uboot-imx-rel_imx_4.1.15_2.1.0_ga_lioker/文件夾中

5. 修改相關的配置文件:arch/arm/cpu/armv7/mx6/Kconfig

  

a. 仿照TARGET_IMX6ULL_等配置項添加自定義配置選項

b. 添加自定義配置文件

 

在解壓uboot之后,通常還需要打補丁、配置和編譯。如:

1. $ patch -p1 < u-boot-2012.04.01_100ask.patch

2. $ make 100ask24x0_config

3. $ make

其中,配置和編譯都會調用uboot的頂層Makefile,接下來我會簡單分析此過程

 

本文所使用的uboot中並沒有補丁文件,因此只需要清除、配置和編譯操作:

1. 清除:$ make ARCH=arm CROSS_COMPILE=arm-linux- distclean

2. 配置:$ make ARCH=arm CROSS_COMPILE=arm-linux- mx6ull_lioker_defconfig

2. 編譯:make V=1 ARCH=arm CROSS_COMPILE=arm-linux-

 

配置過程通過scripts/kconfig/conf生成.config,若想獲取更多信息可通過修改頂層Makefile中“Q = ”實現:

 

通過編譯過程圖,可以確定以下兩點:

1. 編譯過程所使用的鏈接文件和主匯編文件分別為u-boot.lds和arch/arm/cpu/armv7/start.S

2. 編譯過程所生成的文件是u-boot,並通過拷貝命令生成u-boot.bin

 

但是我們需要燒寫的並不是u-boot.bin,而是通過編譯圖中如下命令生成的u-boot.imx文件

make -f ./scripts/Makefile.build obj = arch/arm/imx-common u-boot.imx

u-boot.imx燒寫過程請參考第二節

 

 

二、u-boot.imx燒寫過程

本節使用SD卡進行燒寫,步驟如下:

1. SD Card Formatter.exe中選中當前SD卡,點擊Format按鍵(需要注意File system是否為FAT32)

 

2. ubuntu中執行$ ls /dev/sd*

3. 虛擬機連接SD卡

4. ubuntu中重新執行$ ls /dev/sd*,新出現的設備為SD卡(在我的系統里為sdc)

5. 切換到u-boot目錄,執行$ sudo dd if=u-boot.imx of=/dev/sdc bs=1k seek=1 conv=fsync

 

 

三、u-boot.imx分析

在分析時,我們可以通過Hex Editor Neo等hex查看器打開imx文件查看對應數值,如下圖:

 

imx文件構成可以在imx6ull datesheet的8.7一節中找到答案:

布局如下圖:

接下來,我將一一對其進行介紹

 

1. IVT:用於存放程序地址、DCD地址等數據

根據imx6ull datesheet的Figure 8.1可以確定內部ROM在初始化時鍾、DDR等外設后會將imx文件拷貝至DDR中

為正確讀取imx文件,ROM將IVT定位在固定的地址,該地址由連接到芯片的引導設備確定,如下圖:

 

其結構如下表,其中每一項均占據32bit

其header格式如下:

其他項的結果分別為:

entry(代碼鏈接地址):0x87800000

dcd地址:0x877ff42c

boot data地址:0x877ff420

self(IVT地址):0x877ff400

csf:0

 

2. boot data:用於記錄程序的起始地址和大小

其結構如下圖,其中每一項均占據32bit

各項的結果分別為:

start(imx起始地址):0x877ff000

length(imx大小):0x0006c000

plugin:0

 

3. dcd:device configuration data,存儲着地址和變量,用於重新設置時鍾和DDR等外設

其結構如下圖,其中每一項均占據32bit

CMD的結構圖下圖,其中每一行均占據32bit

dcd的大小為entry - dcd = 0xbd4

 

鏈接文件和主匯編文件我將在下一節中進行分析

 

 

下一章  2、struct gd_t gd成員設置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM