賈 亮, 岳 瀟, 崔迎煒
(1.沈陽航空航天大學(xué) 電子信息工程學(xué)院,遼寧 沈陽 110136;2.北京方天長久科技有限公司 北京 100084)
U-Boot(Universal Boot Loader)是德國 DENX 小組開發(fā)的開放源碼項目,它支持多種CPU體系結(jié)構(gòu)的開發(fā)板,并且支持多種嵌入式操作系統(tǒng)內(nèi)核,U-Boot已經(jīng)成為功能最多、靈活性最強的開放源碼BootLoader。作為一種通用的Boot Loader,U-Boot可以非常方便地移植到其他硬件平臺上[1-2]。文中是基于MPC8548E的嵌入式目標(biāo)板(即FTC7110)和UBoot源碼資源來進行設(shè)計的,分析了U-Boot的目錄結(jié)構(gòu)和啟動流程,同時對U-Boot源碼設(shè)計以及設(shè)備自檢程序的設(shè)計也做了相關(guān)的介紹,最后講解如何通過設(shè)置環(huán)境變量來引導(dǎo)內(nèi)核的啟動。
FTC7110板卡基于mpc8548e作為處理器,板上資源有2個 網(wǎng) 口 、Nor Flash、Nand Flash、FPGA、CPLD、PHY 芯 片BCM5482s、DDR2、SRIO 交換機、PCI橋片等。 圖 1是本次設(shè)計的嵌入式目標(biāo)板卡FTC7110的主要硬件資源結(jié)構(gòu)框圖。
圖1 FTC7110硬件結(jié)構(gòu)框圖Fig.1 Structure diagram of the hardware of FTC7110
U-Boot源程序包在頂層目錄下一共有17個子目錄,它們分別用于存放和管理不同的源程序。目錄結(jié)構(gòu)如下[3]:
U-Boot的啟動大致可以分為兩個階段。第1個階段在Nor Flash中執(zhí)行,主要由匯編語言編寫。第2階段主要用C語言編寫的,用于實現(xiàn)較復(fù)雜的硬件設(shè)備的初始化,同時也增加了代碼的可移植性。
U-Boot運行啟動流程如圖2所示,U-Boot在復(fù)位啟動后執(zhí)行的第1個文件是 start.s,它位于arch/powerpc/cpu/mpc85xx中,接下來進行U-Boot啟動的第1個階段,完成一些針對MPC8548E的硬件初始化,主要包括初始化內(nèi)核e500、清楚指令cache和數(shù)據(jù) cache、設(shè)置中斷向量、清除和建立一些寄存器、設(shè)置HID寄存器、配置MMU、初始化堆棧等,為系統(tǒng)創(chuàng)建一個有序可靠的初始環(huán)境,然后就進入到U-Boot啟動的第2個階段,首先進入第1個C語言函數(shù)cpu_init_early_f中,在這里主要是來初始化TLB和LAW,為系統(tǒng)中的硬件設(shè)備來映射對應(yīng)的地址空間。接著進入到第2個C語言函數(shù)cpu_init_f中,這里主要是對TLB和LAW進行詳細的配置以實現(xiàn)相應(yīng)的功能。之后進入比較重要的C語言函數(shù)board_init_f中,這里是對板上的硬件進行第1階段初始化,主要由數(shù)組init_sequence[]完成,該數(shù)組中的相關(guān)硬件初始化可以依據(jù)不同的目標(biāo)板通過定義相關(guān)的宏定義來進行增加和刪減。數(shù)組中的主要硬件初始化函數(shù)及函數(shù)功能如下:
在完成上述初始化后開始執(zhí)行relocate_code函數(shù),將代碼從Flash中拷貝到RAM中,并記下當(dāng)前執(zhí)行代碼的偏移,最后跳轉(zhuǎn)到RAM中相應(yīng)的位置繼續(xù)執(zhí)行板上硬件的第二階段初始化,第二階段是在board_init_r函數(shù)中執(zhí)行,主要初始化包括有 PCI,PCIe,網(wǎng)口,Nor Flash,Nand Flash 等。在一切設(shè)備初始化完成之后,就進入函數(shù)main_loop中,等待U-Boot下命令的輸入。
圖2 U-Boot啟動運行流程Fig.2 Booting mechanism of U-Boot
U-Boot中由于沒有針對本目標(biāo)板的源碼,所以本次移植依據(jù)該源碼的目錄層次結(jié)構(gòu)需要在U-Boot的board目錄下為FTC7110嵌入式目標(biāo)板新建FTC文件夾,添加FTC文件夾的目的是在該文件夾下可以建立基于CPU和硬件資源比較接近的FTC系列的其他板卡文件夾目錄,所以這里需要在FTC文件夾下添加針對本次所采用的嵌入式板卡FTC7110文件夾,具體主要步驟如下:
1)添加include/configs/FTC7110.h。這個文件是開發(fā)板的配置文件。它主要是添加定義開發(fā)板硬件資源的映射地址和大小以及添加針對目標(biāo)板的資源信息的來進行增加,比如實現(xiàn)MPC8548e對Nand Flash的訪問,這里需要添加對MPC8548e的BR和OR寄存器的配置[4]。
2)添加位于board/FTC/FTC7110/下的 tlb.c和 law.c。第1個tlb.c文件是設(shè)置開發(fā)板硬件資源對應(yīng)的映射地址和映射大小。第2個law.c文件是控制是否使能訪問這些映射的地址空間。
3)添加board/FTC/FTC7110/FTC7110.c。該文件主要是完成對FTC7110目標(biāo)板上相關(guān)硬件的初始化工作。
4)在FTC目錄下添加common文件夾,該文件夾用于存放一些FTC系列板卡都支持的硬件配置代碼或者是相關(guān)的硬件初始化代碼,其主要目的是增加U-Boot源碼的可擴展性。這里根據(jù)具體的實際需求,需要添加針對MPC8548E支持的PCI、Nand Flash和時鐘等的相關(guān)配置代碼。
5)U-Boot源碼不支持對本目標(biāo)板Nor Flash的支持,需要自己添加編寫針對該Nor Flash的驅(qū)動程序。
6)根據(jù)對板卡其他功能的設(shè)置和需求來對U-Boot源代碼進行進一步的增加刪除。
在進行完前五步后就已經(jīng)可以進行編譯,實現(xiàn)對U-Boot的啟動。其中第6步主要是完善優(yōu)化U-Boot的啟動界面和根據(jù)實際的需求增加相應(yīng)的功能和命令。截止到這里就已經(jīng)實現(xiàn)了針對目標(biāo)板資源的配置。這里編譯的操作系統(tǒng)是RHEL5.0,交叉編譯環(huán)境是 ppc_85xx-gcc。 編譯 U-Boot分為兩步,第1步是配置編譯的板卡,由于這里的FTC7110板卡目錄是新增加的,所以需要在U-Boot根目錄下的boards.cfg中添加相關(guān)配置文件以及在FTC7110和common文件夾下添加相應(yīng)的Makefile文件,配置完成后在U-Boot源碼根目錄下輸入make FTC7110_config命令。第2步編譯,直接輸入make命令即可。編譯完成后在U-Boot頂層目錄下會生成幾個映像文件,這里通常采用將u-boot.bin二進制文件燒入到Bootrom中。目標(biāo)板重新上電啟動后,在超級終端下顯示如下信息表示啟動成功:
針對本目標(biāo)板的實際設(shè)計需求,對Nor Flash、SRIO總線等進行了自檢程序的設(shè)計,確保各個設(shè)備和相關(guān)總線在UBoot在啟動后可以正常工作。
本目標(biāo)板采用Nor Flash自檢的原理是首先將NorFlash中的內(nèi)容暫存到內(nèi)存中去,接著依次對Nor Flash中的每個扇區(qū)采用flash_write接口函數(shù)向Nor Flash地址中寫入固定值,然后再從該地址中讀取,將讀取的值與寫入的固定值作比較,兩值相等表示Nor Flash設(shè)備工作正常,否則表示異常,當(dāng)然在向Nor Flash中寫入數(shù)據(jù)之前須對Nor Flash進行擦除操作。最后將Nor Flash中原有內(nèi)容再從內(nèi)存中存入到Nor Flash中去。
如果該Nor Flash具有寫保護功能時,在擦除Flash時,先檢測寫保護是否關(guān)閉。本目標(biāo)板設(shè)計檢測Flash寫保護是通過讀取FPGA的某一寄存器的值是否為0來進行判斷,具體如下:
如果Nor Flash中已經(jīng)存在內(nèi)容,則需先將內(nèi)容暫存到內(nèi)存中,然后在一塊內(nèi)存區(qū)域中寫入一個Nor Flash扇區(qū)大小的固定值來作為寫入Nor Flash的值,采用memset函數(shù)實現(xiàn),具體設(shè)計如下:
上述完成之后采用flash_erase函數(shù)、flash_write函數(shù)等來進行擦除寫入驗證該Nor Flash是否正常,具體設(shè)計如下:
最后驗證確定無誤后,再將之前暫存到內(nèi)存的內(nèi)容存回到Nor Flash中去。
本目標(biāo)板采用的SRIO交換機芯片是IDT公司的TSI578。對于SRIO自檢的設(shè)計,本設(shè)計采用的原理是通過配置SRIO總線來讀取TSI578的ID號,以此來驗證SRIO總線工作是否正常。
首先需要對SRIO總線進行必要的配置,通常分為3步:第1步配置TLB;第2步配置LAW;第3步配置Maintenance Window[5-6]。由于前兩步在U-Boot固件的時候已經(jīng)做了相關(guān)的配置,所以這里只需對Maintenance Window進行相關(guān)的配置,具體設(shè)計如下:
這里把通過SRIO總線對TSI578芯片的讀操作叫做維護讀。然后需要編寫維護讀的接口函數(shù),這里采用宏定義的方法,函數(shù)名稱為MAINT_READ,具體設(shè)計如下:
最后調(diào)用MAINT_READ函數(shù)通過SRIO總線來讀取TSI578設(shè)備的ID號,以此做出相應(yīng)的判斷,這里假定TSI578的ID號是0x0578000d,具體如下:
U-Boot修改配置的最終目的是引導(dǎo)VxWorks操作系統(tǒng)內(nèi)核,由于該VxWorks操作系統(tǒng)內(nèi)核文件是ELF格式,而對于 ELF文件格式主要由 ELF Header、Program Header Table、Section Header Table組成,所以本設(shè)計在 U-Boot下采用bootelf命令來引導(dǎo)。
bootelf命令首先檢測該ELF文件是否有效,具體參考代碼如下:
對于上述valid_elf_image接口函數(shù)中的參數(shù) addr就是VxWorks系統(tǒng)內(nèi)核所存放的具體地址。接著bootelf命令開始解析該 ELF格式內(nèi)核文件的 ELF Header、Section Header Table和Program Header Table部分,這一部分主要通過load_elf_image_phdr和load_elf_image_shdr這兩個接口函數(shù)來實現(xiàn)的。最后通過設(shè)置環(huán)境變量來引導(dǎo)啟動該操作系統(tǒng)內(nèi)核,假設(shè)這里通過網(wǎng)絡(luò)下載到Nor Flash中然后來引導(dǎo)啟動vxworks.st內(nèi)核。具體輸入以下命令:
0xf0000000是本目標(biāo)板的操作系統(tǒng)鏡像文件的起始地址。
文中研究分析了將U-Boot成功移植到目標(biāo)板FTC7110上,在U-Boot源碼中添加FTC7110板卡的相關(guān)文件,同時該設(shè)計支持在線更新固件等功能,并在此基礎(chǔ)上成功的引導(dǎo)了VxWorks操作系統(tǒng),為后面的應(yīng)用程序的開發(fā)奠定基礎(chǔ)。對于不同的CPU和開發(fā)板,本U-Boot的啟動原理分析和移植有一定的借鑒意義。
[1]周慶松,史小軍.U-Boot在AT91RM9200上的移植及啟動分析[J].東南大學(xué):電子科學(xué)與工程學(xué)院,2008:1-3.
ZHOU Qing-song,SHI Xiao-jun.Porting and start analysis of U-Boot based on AT91RM9200 board[J].Southeast University:Department of Electronic Science and Engineering,2008:1-3.
[2]馮忠?guī)X,童英華.ARM平臺下U-Boot的移植[J].青海師范大學(xué),2008:1-2.
FENG Zhong-ling,TONG Ying-hua.Transplanting of U-Boot under the ARM Platform[J].Qinghai Normal University,2008:1-2.
[3]段薇.U-Boot在MPC8265平臺上的移植與分析 [J].武漢船舶通信研究所,2010:2-3.
DUAN Wei.Transplanting and analysis of U-Boot on the MPC8265 platform[J].Wuhan Maritime Communication Reseach Institute,2010:2-3.
[4]Freescale Semiconductor Inc.PowerPC MPC8548e reference manual[EB/OL].(2007-02-02).http://cache.freescale.com/files/32bit/doc/ref_manual/MPC8548ERM.pdf fsrch=1&sr=35.pdf.
[5]Freescale Semiconductor Inc.MPC8548E PowerQUICC III Integrated Processor Hardware Specifications[EB/OL].(2012-09-02).http://cache.freescale.com/files/32bit/doc/data_sheet/MPC8548EEC.pdf pspll=1.pdf.
[6]Freescale Semiconductor Inc.RapidIO Bring-Up Procedure on PowerQUICC III reference manual[EB/OL].(2004-01-11).http://cache.freescale.com/files/32bit/doc/app_note/AN2753.pdf fsrch=1&sr=2.pdf.