|     解(jie)壓u-boot-2010.03.tar.bz2就可以(yi)得到全(quan)部(bu)U-Boot源程(cheng)序。在(zai)頂層目錄下有29個子(zi)目錄,分別存放和(he)管理不同的源程(cheng)序。這(zhe)些(xie)目錄中所要(yao)存放的文(wen)件有其規則,可以(yi)分為3類(lei)。     ● 與處理器體系結構或者開發板硬件直接相關。● 一些通用的函數或者驅動程序。
 ● U-Boot的應用程序(xu)、工具或者文件。
     表1.5列(lie)出(chu)了U-Boot頂層目(mu)錄下各級目(mu)錄的存放原則。 表(biao)1.5  U-Boot的源碼(ma)頂層目錄說明(ming) 
    
    | 目    錄 | 特    性 | 解 釋 說 明 |  
    | 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的源代碼包含對幾十種(zhong)處理器、數(shu)百種(zhong)開(kai)發(fa)板的支(zhi)持。可是對于特定的開(kai)發(fa)板,配置編譯過(guo)程(cheng)(cheng)只需其中部分程(cheng)(cheng)序(xu)。這里(li)以S3C2410處理器為(wei)例,具(ju)體分析S3C2410處理器和(he)開(kai)發(fa)板所依(yi)賴的程(cheng)(cheng)序(xu),以及U-Boot的通(tong)用函數(shu)和(he)工具(ju)。     U-Boot的(de)源碼是通(tong)過(guo)gcc和Makefile組織編譯的(de)。頂層目錄下(xia)的(de)Makefile可(ke)以設置開發板的(de)定義,然后遞歸地調用各(ge)級子目錄下(xia)的(de)Makefile,后把編譯過(guo)的(de)程序鏈(lian)接成U-Boot映像(xiang)。     1)頂層目錄下的(de)Makefile     Makefile負責U-Boot整體配置(zhi)編譯,按照配置(zhi)的順序閱讀其(qi)中關(guan)鍵(jian)的幾(ji)行(xing)。     每一種開發板在Makefile下(xia)都需要有主板配置的定(ding)義。例(li)如,smdk2410開發板的定(ding)義如下(xia):     smdk2410_config	:	unconfig  @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
     執行(xing)配(pei)置U-Boot的(de)(de)命令make smdk2410_config,通過mkconfig腳本生(sheng)成include/config.mk的(de)(de)配(pei)置文件,文件內容正是根據Makefile對開發板的(de)(de)配(pei)置生(sheng)成的(de)(de)。     ARCH    = armCPU     = arm920t
 BOARD  = smdk2410
 VENDOR = samsung
    SoC     = s3c24x0
     上面的include/config.mk文(wen)件定(ding)義(yi)了ARCH、CPU、BOARD、VENDOR、SoC這(zhe)(zhe)些(xie)變量,這(zhe)(zhe)樣,硬件平(ping)臺(tai)依(yi)賴(lai)的目錄文(wen)件可以(yi)根據這(zhe)(zhe)些(xie)定(ding)義(yi)來確(que)定(ding)。SMDK2410平(ping)臺(tai)相關目錄如下(xia):     board/Samsung/smdk2410cpu/arm920t/
 cpu/arm920t/s3c24x0/
 lib_arm/
    include/configs/smdk2410.h
     再回到頂層目錄的(de)Makefile文(wen)件開始的(de)部分,其中,下列幾行(xing)包含(han)了這(zhe)些變量的(de)定義:      # load ARCH, BOARD, and CPU configurationinclude $(obj)include/config.mk
   export  ARCH CPU BOARD VENDOR SOC
     Makefile的(de)編(bian)譯選項和規則在頂層目錄的(de)config.mk文件(jian)中定義(yi),各(ge)種(zhong)體系(xi)結(jie)構通(tong)用的(de)規則直接在這個文件(jian)中定義(yi)。通(tong)過ARCH、CPU、BOARD、VENDOR、SoC等(deng)變量(liang)為不(bu)同硬件(jian)平臺定義(yi)不(bu)同選項。不(bu)同體系(xi)結(jie)構的(de)規則分別(bie)包含在ppc_config.mk、arm_config.mk、mips_config.mk等(deng)文件(jian)中。     頂層目錄的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默認的(de)(de)編(bian)譯目標(biao)為all,包括u-boot.srec、u-boot.bin和(he)System.map。u-boot.srec和(he)u-boot.bin就是通過(guo)ld命令按照U-Boot.map地址表把(ba)目標(biao)文件組裝成U-Boot的(de)(de)。其他Makefile內容(rong)就不再詳(xiang)細(xi)分析了,通過(guo)上述(shu)代(dai)碼分析應該可(ke)以為讀者(zhe)閱讀代(dai)碼提供一些線索。     2)開發板(ban)配置頭文件     除了編譯(yi)過程(cheng)Makefile以外,還(huan)要在程(cheng)序中(zhong)為開發板定義配置選項或者參數。這個頭文(wen)件(jian)是(shi)include/configs/<board_name>.h。<board_name>用相應的BOARD定義代(dai)替。     這個(ge)頭文件中主(zhu)要(yao)定義了兩類形式(shi)的(de)參數(shu)。     一類形式的參數用來選(xuan)擇處(chu)理(li)器(qi)、設備接(jie)口、命令、屬性等,以及定(ding)義總(zong)線(xian)頻(pin)率(lv)、串口波特率(lv)、Flash地址等參數。     大部(bu)分參數前(qian)綴是CONFIG_,例如:     #define CONFIG_ARM920T  		1#define CONFIG_KGDB_BAUDRATE    115200
 #define CONFIG_CS8900
 #define CONFIG_KGDB_BAUDRATE    115200
     另一類形(xing)式的參數為:     #define PHYS_FLASH_SIZE         0x00100000#define  USE_920T_MMU            1
     根據對(dui)Makefile的(de)分析,編譯(yi)分為(wei)兩步。第(di)1步是配(pei)置(zhi),如make smdk2410_config;第(di)2步是編譯(yi),執行make就(jiu)可以了。     編譯(yi)完成后,可以(yi)得到U-Boot各種(zhong)格(ge)式的映像文件和符號表,如表1.6所(suo)示。 表1.6  U-Boot編譯生成的映(ying)像文件 
    
    | 文 件 名 稱 | 說    明 | 文 件 名 稱 | 說    明 |  
    | System.map | U-Boot映像的符號表 | u-boot.bin | U-Boot映像原始的二進制格式 |  
    | u-boot | U-Boot映像的ELF格式 | u-boot.srec | U-Boot映像的S-Record格式 |      U-Boot的(de)3種映(ying)像格(ge)式都可以(yi)燒寫(xie)到(dao)Flash中,但(dan)需要看(kan)加載(zai)器(qi)能否識別這些格(ge)式。一(yi)般u-boot.bin為常用,直接按照二進制格(ge)式下載(zai),并且按照絕對地址燒寫(xie)到(dao)Flash中就可以(yi)了。U-Boot和u-boot.srec格(ge)式映(ying)像都自帶(dai)定位信息。     本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》    熱點鏈接:      
         1、U-Boot源代碼下載地址2、Bootloader的種類
 3、配置主機交叉開發環境
 4、搭建嵌入式交叉編譯環境
 5、構建嵌入式Linux交叉開發環境
 
 更多新聞>>  |