賈 亮, 岳 瀟, 崔迎煒
(1.沈陽航空航天大學 電子信息工程學院,遼寧 沈陽 110136;2.北京方天長久科技有限公司 北京 100084)
U-Boot(Universal Boot Loader)是德國 DENX 小組開發的開放源碼項目,它支持多種CPU體系結構的開發板,并且支持多種嵌入式操作系統內核,U-Boot已經成為功能最多、靈活性最強的開放源碼BootLoader。作為一種通用的Boot Loader,U-Boot可以非常方便地移植到其他硬件平臺上[1-2]。文中是基于MPC8548E的嵌入式目標板(即FTC7110)和UBoot源碼資源來進行設計的,分析了U-Boot的目錄結構和啟動流程,同時對U-Boot源碼設計以及設備自檢程序的設計也做了相關的介紹,最后講解如何通過設置環境變量來引導內核的啟動。
FTC7110板卡基于mpc8548e作為處理器,板上資源有2個 網 口 、Nor Flash、Nand Flash、FPGA、CPLD、PHY 芯 片BCM5482s、DDR2、SRIO 交換機、PCI橋片等。 圖 1是本次設計的嵌入式目標板卡FTC7110的主要硬件資源結構框圖。

圖1 FTC7110硬件結構框圖Fig.1 Structure diagram of the hardware of FTC7110
U-Boot源程序包在頂層目錄下一共有17個子目錄,它們分別用于存放和管理不同的源程序。目錄結構如下[3]:


U-Boot的啟動大致可以分為兩個階段。第1個階段在Nor Flash中執行,主要由匯編語言編寫。第2階段主要用C語言編寫的,用于實現較復雜的硬件設備的初始化,同時也增加了代碼的可移植性。
U-Boot運行啟動流程如圖2所示,U-Boot在復位啟動后執行的第1個文件是 start.s,它位于arch/powerpc/cpu/mpc85xx中,接下來進行U-Boot啟動的第1個階段,完成一些針對MPC8548E的硬件初始化,主要包括初始化內核e500、清楚指令cache和數據 cache、設置中斷向量、清除和建立一些寄存器、設置HID寄存器、配置MMU、初始化堆棧等,為系統創建一個有序可靠的初始環境,然后就進入到U-Boot啟動的第2個階段,首先進入第1個C語言函數cpu_init_early_f中,在這里主要是來初始化TLB和LAW,為系統中的硬件設備來映射對應的地址空間。接著進入到第2個C語言函數cpu_init_f中,這里主要是對TLB和LAW進行詳細的配置以實現相應的功能。之后進入比較重要的C語言函數board_init_f中,這里是對板上的硬件進行第1階段初始化,主要由數組init_sequence[]完成,該數組中的相關硬件初始化可以依據不同的目標板通過定義相關的宏定義來進行增加和刪減。數組中的主要硬件初始化函數及函數功能如下:

在完成上述初始化后開始執行relocate_code函數,將代碼從Flash中拷貝到RAM中,并記下當前執行代碼的偏移,最后跳轉到RAM中相應的位置繼續執行板上硬件的第二階段初始化,第二階段是在board_init_r函數中執行,主要初始化包括有 PCI,PCIe,網口,Nor Flash,Nand Flash 等。在一切設備初始化完成之后,就進入函數main_loop中,等待U-Boot下命令的輸入。

圖2 U-Boot啟動運行流程Fig.2 Booting mechanism of U-Boot
U-Boot中由于沒有針對本目標板的源碼,所以本次移植依據該源碼的目錄層次結構需要在U-Boot的board目錄下為FTC7110嵌入式目標板新建FTC文件夾,添加FTC文件夾的目的是在該文件夾下可以建立基于CPU和硬件資源比較接近的FTC系列的其他板卡文件夾目錄,所以這里需要在FTC文件夾下添加針對本次所采用的嵌入式板卡FTC7110文件夾,具體主要步驟如下:
1)添加include/configs/FTC7110.h。這個文件是開發板的配置文件。它主要是添加定義開發板硬件資源的映射地址和大小以及添加針對目標板的資源信息的來進行增加,比如實現MPC8548e對Nand Flash的訪問,這里需要添加對MPC8548e的BR和OR寄存器的配置[4]。
2)添加位于board/FTC/FTC7110/下的 tlb.c和 law.c。第1個tlb.c文件是設置開發板硬件資源對應的映射地址和映射大小。第2個law.c文件是控制是否使能訪問這些映射的地址空間。
3)添加board/FTC/FTC7110/FTC7110.c。該文件主要是完成對FTC7110目標板上相關硬件的初始化工作。
4)在FTC目錄下添加common文件夾,該文件夾用于存放一些FTC系列板卡都支持的硬件配置代碼或者是相關的硬件初始化代碼,其主要目的是增加U-Boot源碼的可擴展性。這里根據具體的實際需求,需要添加針對MPC8548E支持的PCI、Nand Flash和時鐘等的相關配置代碼。
5)U-Boot源碼不支持對本目標板Nor Flash的支持,需要自己添加編寫針對該Nor Flash的驅動程序。
6)根據對板卡其他功能的設置和需求來對U-Boot源代碼進行進一步的增加刪除。
在進行完前五步后就已經可以進行編譯,實現對U-Boot的啟動。其中第6步主要是完善優化U-Boot的啟動界面和根據實際的需求增加相應的功能和命令。截止到這里就已經實現了針對目標板資源的配置。這里編譯的操作系統是RHEL5.0,交叉編譯環境是 ppc_85xx-gcc。 編譯 U-Boot分為兩步,第1步是配置編譯的板卡,由于這里的FTC7110板卡目錄是新增加的,所以需要在U-Boot根目錄下的boards.cfg中添加相關配置文件以及在FTC7110和common文件夾下添加相應的Makefile文件,配置完成后在U-Boot源碼根目錄下輸入make FTC7110_config命令。第2步編譯,直接輸入make命令即可。編譯完成后在U-Boot頂層目錄下會生成幾個映像文件,這里通常采用將u-boot.bin二進制文件燒入到Bootrom中。目標板重新上電啟動后,在超級終端下顯示如下信息表示啟動成功:

針對本目標板的實際設計需求,對Nor Flash、SRIO總線等進行了自檢程序的設計,確保各個設備和相關總線在UBoot在啟動后可以正常工作。
本目標板采用Nor Flash自檢的原理是首先將NorFlash中的內容暫存到內存中去,接著依次對Nor Flash中的每個扇區采用flash_write接口函數向Nor Flash地址中寫入固定值,然后再從該地址中讀取,將讀取的值與寫入的固定值作比較,兩值相等表示Nor Flash設備工作正常,否則表示異常,當然在向Nor Flash中寫入數據之前須對Nor Flash進行擦除操作。最后將Nor Flash中原有內容再從內存中存入到Nor Flash中去。
如果該Nor Flash具有寫保護功能時,在擦除Flash時,先檢測寫保護是否關閉。本目標板設計檢測Flash寫保護是通過讀取FPGA的某一寄存器的值是否為0來進行判斷,具體如下:

如果Nor Flash中已經存在內容,則需先將內容暫存到內存中,然后在一塊內存區域中寫入一個Nor Flash扇區大小的固定值來作為寫入Nor Flash的值,采用memset函數實現,具體設計如下:

上述完成之后采用flash_erase函數、flash_write函數等來進行擦除寫入驗證該Nor Flash是否正常,具體設計如下:

最后驗證確定無誤后,再將之前暫存到內存的內容存回到Nor Flash中去。
本目標板采用的SRIO交換機芯片是IDT公司的TSI578。對于SRIO自檢的設計,本設計采用的原理是通過配置SRIO總線來讀取TSI578的ID號,以此來驗證SRIO總線工作是否正常。
首先需要對SRIO總線進行必要的配置,通常分為3步:第1步配置TLB;第2步配置LAW;第3步配置Maintenance Window[5-6]。由于前兩步在U-Boot固件的時候已經做了相關的配置,所以這里只需對Maintenance Window進行相關的配置,具體設計如下:

這里把通過SRIO總線對TSI578芯片的讀操作叫做維護讀。然后需要編寫維護讀的接口函數,這里采用宏定義的方法,函數名稱為MAINT_READ,具體設計如下:

最后調用MAINT_READ函數通過SRIO總線來讀取TSI578設備的ID號,以此做出相應的判斷,這里假定TSI578的ID號是0x0578000d,具體如下:

U-Boot修改配置的最終目的是引導VxWorks操作系統內核,由于該VxWorks操作系統內核文件是ELF格式,而對于 ELF文件格式主要由 ELF Header、Program Header Table、Section Header Table組成,所以本設計在 U-Boot下采用bootelf命令來引導。
bootelf命令首先檢測該ELF文件是否有效,具體參考代碼如下:

對于上述valid_elf_image接口函數中的參數 addr就是VxWorks系統內核所存放的具體地址。接著bootelf命令開始解析該 ELF格式內核文件的 ELF Header、Section Header Table和Program Header Table部分,這一部分主要通過load_elf_image_phdr和load_elf_image_shdr這兩個接口函數來實現的。最后通過設置環境變量來引導啟動該操作系統內核,假設這里通過網絡下載到Nor Flash中然后來引導啟動vxworks.st內核。具體輸入以下命令:

0xf0000000是本目標板的操作系統鏡像文件的起始地址。
文中研究分析了將U-Boot成功移植到目標板FTC7110上,在U-Boot源碼中添加FTC7110板卡的相關文件,同時該設計支持在線更新固件等功能,并在此基礎上成功的引導了VxWorks操作系統,為后面的應用程序的開發奠定基礎。對于不同的CPU和開發板,本U-Boot的啟動原理分析和移植有一定的借鑒意義。
[1]周慶松,史小軍.U-Boot在AT91RM9200上的移植及啟動分析[J].東南大學:電子科學與工程學院,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]馮忠嶺,童英華.ARM平臺下U-Boot的移植[J].青海師范大學,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.