解壓u-boot-2010.03.tar.bz2就可以得到全部U-Boot源程序。在頂層目錄下有29個子目錄,分別存放和管理不同的源程序。這些目錄中所要存放的文件有其規則,可以分為3類。
● 與處理器體系結構或者開發板硬件直接相關。
● 一些通用的函數或者驅動程序。
● U-Boot的應用程序、工具或者文件。
表1.5列出了U-Boot頂層目錄下各級目錄的存放原則。
表1.5 U-Boot的源碼頂層目錄說明
目 錄 |
特 性 |
解 釋 說 明 |
board |
平臺依賴 |
存放電路板相關的目錄文件,如RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86) 等目錄 |
cpu |
平臺依賴 |
存放了CPU相關的目錄文件,如mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目錄 |
lib_ppc |
平臺依賴 |
存放對PowerPC體系結構通用的文件,主要用于實現PowerPC平臺通用的函數 |
lib_arm |
平臺依賴 |
存放對ARM體系結構通用的文件,主要用于實現ARM平臺通用的函數 |
lib_i386 |
平臺依賴 |
存放對X86體系結構通用的文件,主要用于實現X86平臺通用的函數 |
lib_avr32 |
平臺依賴 |
存放對AVR32體系結構通用的文件,主要用于實現AVR32平臺通用的函數 |
lib_blackfin |
平臺依賴 |
存放對BLACKFIN體系結構通用的文件,主要用于實現BLACKFIN平臺通用的函數 |
lib_m68k |
平臺依賴 |
存放對M68K體系結構通用的文件,主要用于實現M68K 平臺通用的函數 |
lib_microblaze |
平臺依賴 |
存放對Microblaze體系結構通用的文件,主要用于實現Microblaze平臺通用的函數 |
lib_mips |
平臺依賴 |
存放對MIPS體系結構通用的文件,主要用于實現MIPS平臺通用的函數 |
lib_nios |
平臺依賴 |
存放對NIOS體系結構通用的文件,主要用于實現NIOS平臺通用的函數 |
lib_nios2 |
平臺依賴 |
存放對NIOS體系結構通用的文件,主要用于實現NIOS2平臺通用的函數 |
lib_sh |
平臺依賴 |
存放對SH體系結構通用的文件,主要用于實現SH平臺通用的函數 |
lib_sparc |
平臺依賴 |
存放對SPARC體系結構通用的文件,主要用于實現SPARC平臺通用的函數 |
libfdt |
通用 |
支持設備樹的庫文件 |
api |
通用 |
存放U-Boot提供的接口函數 |
common |
通用 |
通用的代碼,涵蓋各個方面,以命令行處理為主 |
disk |
通用 |
磁盤分區相關代碼 |
nand_spl |
通用 |
NAND存儲器相關代碼 |
include |
通用 |
頭文件和開發板配置文件,所有開發板的配置文件都在configs目錄下 |
common |
通用 |
通用的多功能函數實現 |
lib_generic |
通用 |
通用庫函數的實現 |
net |
通用 |
存放網絡相關程序 |
fs |
通用 |
存放文件系統相關程序 |
post |
通用 |
存放上電自檢程序 |
drivers |
通用 |
通用的設備驅動程序,主要有以太網接口的驅動 |
disk |
通用 |
硬盤接口程序 |
examples |
應用例程 |
一些獨立運行的應用程序的例子,如helloworld |
tools |
工具 |
存放制作S-Record或者U-Boot格式的鏡像等工具,如mkimage |
doc |
文檔 |
開發使用文檔 |
Rtc |
通用 |
RTC的驅動程序 |
U-Boot的源代碼包含對幾十種處理器、數百種開發板的支持。可是對于特定的開發板,配置編譯過程只需其中部分程序。這里以S3C2410處理器為例,具體分析S3C2410處理器和開發板所依賴的程序,以及U-Boot的通用函數和工具。
U-Boot的源碼是通過gcc和Makefile組織編譯的。頂層目錄下的Makefile可以設置開發板的定義,然后遞歸地調用各級子目錄下的Makefile,后把編譯過的程序鏈接成U-Boot映像。
1)頂層目錄下的Makefile
Makefile負責U-Boot整體配置編譯,按照配置的順序閱讀其中關鍵的幾行。
每一種開發板在Makefile下都需要有主板配置的定義。例如,smdk2410開發板的定義如下:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
執行配置U-Boot的命令make smdk2410_config,通過mkconfig腳本生成include/config.mk的配置文件,文件內容正是根據Makefile對開發板的配置生成的。
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SoC = s3c24x0
上面的include/config.mk文件定義了ARCH、CPU、BOARD、VENDOR、SoC這些變量,這樣,硬件平臺依賴的目錄文件可以根據這些定義來確定。SMDK2410平臺相關目錄如下:
board/Samsung/smdk2410
cpu/arm920t/
cpu/arm920t/s3c24x0/
lib_arm/
include/configs/smdk2410.h
再回到頂層目錄的Makefile文件開始的部分,其中,下列幾行包含了這些變量的定義:
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
Makefile的編譯選項和規則在頂層目錄的config.mk文件中定義,各種體系結構通用的規則直接在這個文件中定義。通過ARCH、CPU、BOARD、VENDOR、SoC等變量為不同硬件平臺定義不同選項。不同體系結構的規則分別包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。
頂層目錄的Makefile中還要定義交叉編譯器,以及編譯U-Boot所依賴的目標文件
ifeq (arm,$(ARCH))
CROSS_COMPILE ?=arm-none-linux-gnueabi-
# 交叉編譯器的前綴
endif
# load other configuration
include $(TOPDIR)/config.mk
# U-Boot objects....order is important (i.e. start must be first)
OBJS = cpu/$(CPU)/start.o # 處理器相關的目標文件
…
#定義依賴的目錄,每個目錄下先把目標文件連接成*.a文件
LIBS = lib_generic/libgeneric.a
LIBS += lib_generic/lzma/liblzma.a
LIBS += lib_generic/lzo/liblzo.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ];
Then echo "board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
ifeq ($(CPU),ixp)
LIBS += cpu/ixp/npe/libnpe.a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
…
還有U-Boot鏡像編譯的依賴關系如下:
ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
$(U_BOOT_ONENAND)
all: $(ALL)
$(obj)u-boot.hex: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
$(obj)u-boot.srec: $(obj)u-boot
$(OBJCOPY) -O srec $< $@
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(obj)u-boot.ldr: $(obj)u-boot
$(CREATE_LDR_ENV)
$(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
$(obj)u-boot.ldr.hex: $(obj)u-boot.ldr
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
$(obj)u-boot.ldr.srec: $(obj)u-boot.ldr
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
$(obj)u-boot.img: $(obj)u-boot.bin
./tools/mkimage -A $(ARCH) -T firmware -C none \
-a $(TEXT_BASE) -e 0 \
-n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
sed -e 's/"[ ]*$$/ for $(BOARD) board"/') \-d $< $@
$(obj)u-boot.imx: $(obj)u-boot.bin
$(obj)tools/mkimage -n $(IMX_CONFIG) -T imximage \
-e $(TEXT_BASE) -d $< $@
$(obj)u-boot.kwb: $(obj)u-boot.bin
$(obj)tools/mkimage -n $(KWD_CONFIG) -T kwbimage \
-a $(TEXT_BASE) -e $(TEXT_BASE) -d $< $@
$(obj)u-boot.sha1: $(obj)u-boot.bin
$(obj)tools/ubsha1 $(obj)u-boot.bin
$(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@
Makefile默認的編譯目標為all,包括u-boot.srec、u-boot.bin和System.map。u-boot.srec和u-boot.bin就是通過ld命令按照U-Boot.map地址表把目標文件組裝成U-Boot的。其他Makefile內容就不再詳細分析了,通過上述代碼分析應該可以為讀者閱讀代碼提供一些線索。
2)開發板配置頭文件
除了編譯過程Makefile以外,還要在程序中為開發板定義配置選項或者參數。這個頭文件是include/configs/<board_name>.h。<board_name>用相應的BOARD定義代替。
這個頭文件中主要定義了兩類形式的參數。
一類形式的參數用來選擇處理器、設備接口、命令、屬性等,以及定義總線頻率、串口波特率、Flash地址等參數。
大部分參數前綴是CONFIG_,例如:
#define CONFIG_ARM920T 1
#define CONFIG_KGDB_BAUDRATE 115200
#define CONFIG_CS8900
#define CONFIG_KGDB_BAUDRATE 115200
另一類形式的參數為:
#define PHYS_FLASH_SIZE 0x00100000
#define USE_920T_MMU 1
根據對Makefile的分析,編譯分為兩步。第1步是配置,如make smdk2410_config;第2步是編譯,執行make就可以了。
編譯完成后,可以得到U-Boot各種格式的映像文件和符號表,如表1.6所示。
表1.6 U-Boot編譯生成的映像文件
文 件 名 稱 |
說 明 |
文 件 名 稱 |
說 明 |
System.map |
U-Boot映像的符號表 |
u-boot.bin |
U-Boot映像原始的二進制格式 |
u-boot |
U-Boot映像的ELF格式 |
u-boot.srec |
U-Boot映像的S-Record格式 |
U-Boot的3種映像格式都可以燒寫到Flash中,但需要看加載器能否識別這些格式。一般u-boot.bin為常用,直接按照二進制格式下載,并且按照絕對地址燒寫到Flash中就可以了。U-Boot和u-boot.srec格式映像都自帶定位信息。
本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》
熱點鏈接:
1、U-Boot源代碼下載地址
2、Bootloader的種類
3、配置主機交叉開發環境
4、搭建嵌入式交叉編譯環境
5、構建嵌入式Linux交叉開發環境
更多新聞>> |