本系列使用的平台為百問網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
鏈接文件和主匯編文件我將在下一節中進行分析