(一)uboot 配置編譯分析
u-boot源碼是通過gcc和Makefile組織編譯的,頂層目錄下的Makefile可通過boards.cfg來設置開發板的定義
然后遞歸調用各級子目錄下的Makefile,把編譯過的程序連接成u-boot
boards.cfg文件:
開發板在Makefile下配置定義,例如:
Target | ARCH | CPU | Board name(開發版名) | Vendor(廠商) | SoC(具體系列) | Options |
---|---|---|---|---|---|---|
tiny4412 | arm | armv7 | tiny4412 | samsung | exynos |
make tiny4412_config 表示在當前目錄下的Makefile查找一個tiny4412的目標文件來執行,在Makefile中沒有tiny4412
但有%_config::unconfig %表示匹配模式,可以匹配任意字符
2. U-boot操作過程
- 將u-boot-1.3.4.tar.gz復制到Linux系統中,然后解壓縮該u-boot后,打開u-boot文件夾后,點右鍵從終端打開。
- 在終端中 輸入:make clobber (清工程文件,范圍大一些,清除原來已經編譯的文件)
make clean(清除文件)make xyd2440_config(將xyd2440_config文件導入準備編譯)make all (編譯)
- 然后可在文件夾中生成.bin的文件。
- 然后通過j-link將生成的.bin文件燒入NORFLASH中。J-LINK的用法詳見附錄3。
- 通過串口就可以看到u-boot運行的相關信息(在開始-附錄-通信-超級終端中查看)。
(二) U-boot移植測試過程
-
在u-boot添加具體一個開發板,需要添加哪些文件?
boards.cfg里面添加自己開發板的信息myboard4412 arm armv7 myboard4412 samsung exynos編譯: make myboard4412復制board/samsung/tiny4412/ 一份代碼,修改名字為myboard4412cp board/samsung/tiny4412/ -r board/samsung/myboard4412 -rf復制include/configs/tiny4412.h 一份代碼,修改名字為myboard4412.hcp include/configs/tiny4412.h include/configs/myboard4412.h
-
編譯
[root@localhost uboot_tiny4412]# make myboard4412_config
Configuring for myboard4412board...
[root@localhost uboot_tiny4412]# make -j8
提示錯誤:
arm-linux-ld: cannot find board/samsung/tiny4412/libtiny4412.o
make: *** [u-boot] 錯誤 1
錯誤說明:arm-linux-ld是編譯器的鏈接工具,也是就是鏈接時候出錯了,根據出錯信息,是在尋找board/samsung/tiny4412/libtiny4412.o 文件時候出錯了,仔細看一下發現,現在我們的板級文件是xyd4412 ,而不是tiny4412,但是,卻去找這個文件,很明顯,應答是在鏈接文件中指定需要這個文件。所以打開board/samsung/myboard4412/u-boot.lds文件,文件中有這樣的條語句:
board/samsung/tiny4412/libtiny4412.o (.text)
這個語句正是出錯提示的信息,很明顯這個位置要做相應修改,修改如下:
board/samsung/xyd4412/libxyd4412.o (.text)
修改后保存,重新編譯。
[root@localhost uboot_tiny4412]#make -j8
ers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o net/libnet.o post/libpost.o board/samsung/xyd4412/libxyd4412.o --end-group /media/sdb1/4412/u-boot/uboot_tiny4412/arch/arm/lib/eabi_compat.o -L /usr/local/arm/4.3.2/bin/…/lib/gcc/arm-none-linux-gnueabi/4.3.2 -lgcc -Map u-boot.map -o u-boot
arm-linux-objcopy -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
[root@localhost uboot_tiny4412]#
編譯正確,會得到 u-boot.bin文件。
(三)U-boot啟動:
程序入口是:arch/arm/cpu/armv7/start.S
由上面的代碼跳轉到C語言代碼,C的入口:arch/arm/lib/board.c
1)從uboot源碼頂層目錄boards.cfg文件中找到tinny4412配置信息,利用這些信息生成文件
2)根據配置信息在include下創建指向具體架構arm的軟件鏈接,arm芯片是指向arch/arm/include/asm/,
因為后面有文件包含#include<asm/config.h>,編譯時找到對應架構
3、根據配置信息創建include/config.mk,這個文件被頂層Makefie包含,內容
ARCH=arm
CPU=armv7
…
4、在include創建config.h文件 查看內容
增添了一塊開發板支持需要添加的文件(當前u-boot已經支持CPU)
boards 廠家名 開發板名
include/config 開發板名.h
以上步驟時候以一個最接近的板子為起點,移植到自己的開發板,開發平臺對應的u-boot的第一步,如果自己板子和參考版的最小系統(DDR EMMC CPU )不一樣,那就需要修改兩個開發平臺的硬件參數上的差異,具體的要求知道u-boot啟動的流程,從上電執行了哪些文件的代碼,然后執行代碼,那些是和硬件參數有關,要求相應的修改。