1. 程式人生 > >嵌入式Linux專題(三)——嵌入式Linux常用BootLoader——U-Boot介紹

嵌入式Linux專題(三)——嵌入式Linux常用BootLoader——U-Boot介紹

一、U-Boot簡介

U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的從FADSROM、8xxROM、PPCBOOT逐步發展演化而來的開放原始碼專案。 在作業系統方面,U-Boot不僅支援嵌入式Linux系統的引導,它還支援NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式作業系統。目前支援的目標作業系統是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。 在CPU架構方面,U-Boot除了支援PowerPC系列的處理器外,還能支援MIPS、 x86、ARM、NIOS、XScale等諸多常用系列的處理器。 U-Boot專案的開發目標是支援儘可能多的嵌入式處理器和嵌入式作業系統。

二、U-Boot主要目錄結構

目錄 說明
board 目標板相關檔案,主要包含SDRAM、FLASH驅動
common 獨立於處理器體系結構的通用程式碼,如記憶體大小探測與故障檢測
cpu 與處理器相關的檔案。如mpc8xx子目錄下含串列埠、網口、LCD驅動及中斷初始化等檔案
driver 通用裝置驅動,如CFI FLASH驅動(目前對INTEL FLASH支援較好)
doc U-Boot的說明文件
examples 可在U-Boot下執行的示例程式;如hello_world.c,timer.c
include U-Boot標頭檔案;尤其configs子目錄下與目標板相關的配置標頭檔案是移植過程中經常要修改的檔案
lib_xxx 處理器體系相關的檔案,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的檔案
net 與網路功能相關的檔案目錄,如bootp,nfs,tftp
post 上電自檢檔案目錄。尚有待於進一步完善
rtc RTC驅動程式
tools 用於建立U-Boot S-RECORD和BIN映象檔案的工具

三、U-Boot的特性

Uboot的特性:

  1. 開放原始碼;
  2. 支援多種嵌入式作業系統核心,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;支援多種嵌入式作業系統核心,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
  3. 支援多個處理器系列,如PowerPC、ARM、x86、MIPS;支援多個處理器系列,如PowerPC、ARM、x86、MIPS;
  4. 較高的可靠性和穩定性;較高的可靠性和穩定性;
  5. 高度靈活的功能設定,適合U-Boot除錯、作業系統不同引導要求、產品釋出等;高度靈活的功能設定,適合U-Boot除錯、作業系統不同引導要求、產品釋出等;
  6. 豐富的裝置驅動原始碼,如串列埠、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;豐富的裝置驅動原始碼,如串列埠、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
  7. 較為豐富的開發除錯文件與強大的網路技術支援;較為豐富的開發除錯文件與強大的網路技術支援;

四、主要功能

U-Boot支援的主要功能:

  1. 系統引導支援NFS掛載、RAMDISK(壓縮或非壓縮)形式的根檔案系統;支援NFS掛載、從FLASH中引導壓縮或非壓縮系統核心;
  2. 基本輔助功能強大的作業系統介面功能;可靈活設定、傳遞多個關鍵引數給作業系統,適合系統在不同開發階段的除錯要求與產品釋出,尤以Linux支援最為強勁;支援目標板環境引數多種儲存方式,如FLASH、NVRAM、EEPROM;基本輔助功能強大的作業系統介面功能;可靈活設定、傳遞多個關鍵引數給作業系統,適合系統在不同開發階段的除錯要求與產品釋出,尤以Linux支援最為強勁;支援目標板環境引數多種儲存方式,如FLASH、NVRAM、EEPROM;
  3. CRC32校驗可校驗FLASH中核心、RAMDISK映象檔案是否完好; CRC32校驗可校驗FLASH中核心、RAMDISK映象檔案是否完好;
  4. 裝置驅動串列埠、SDRAM、FLASH、乙太網、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅動支援;裝置驅動串列埠、SDRAM、FLASH、乙太網、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅動支援;
  5. 上電自檢功能SDRAM、FLASH大小自動檢測;SDRAM故障檢測;CPU型號;上電自檢功能SDRAM、FLASH大小自動檢測;SDRAM故障檢測;CPU型號;
  6. 特殊功能XIP核心引導;特殊功能XIP核心引導;

五、工作模式

U-Boot的工作模式有啟動載入模式和下載模式。

1、啟動載入模式

啟動載入模式是Bootloader的正常工作模式,嵌入式產品釋出時,Bootloader必須工作在這種模式下,Bootloader將嵌入式作業系統從FLASH中載入到SDRAM中執行,整個過程是自動的。

2、下載模式

下載模式就是Bootloader通過某些通訊手段將核心映像或根檔案系統映像等從PC機中下載到目標板的FLASH中。使用者可以利用Bootloader提供的一些命令介面來完成自己想要的操作。開發人員可以使用各種命令,通過串列埠連線或網路連線等通訊手段從主機(Host)下載檔案(比如核心映像、檔案系統映像),將它們直接放在記憶體執行或是燒入Flash類固態儲存裝置中。 板子與主機間傳輸檔案時,可以使用串列埠的xmodem/ymodem/zmodem協議,還可以使用網路通過tftp、nfs協議來傳輸,以及USB下載等方法。 一般來說,嵌入式開發人員採用下載模式進行開發嵌入式系統。通常採用交叉網線將PC與目標開發板連線,通過TFTP伺服器下載核心,用NFS伺服器掛載檔案系統。

六、移植前的準備

  1. 首先讀讀uboot自帶的readme檔案,瞭解了一個大概。
  2. 看看common.h,這個檔案定義了一些基本的東西,幷包含了一些必要的標頭檔案。再看看flash.h,這個檔案裡面定義了 flash_info_t為一個struct。包含了flash的一些屬性定義。並且定義了所有的flash的屬性,其中,AMD的有:AMD_ID_LV320B,定義為“#define AMD_ID_LV320B 0x22F922F9”。
  3. 對於“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:“void flash_identification(flash_info_t *info)”這個函式的目的是確認flash的型號。注意的是,這個函式裡面有一些巨集定義,直接讀寫了flash並獲得ID號。
  4. 修改:”./board/at91rm9200dk/config.mk”為修改:”./board/at91rm9200dk/config.mk”為TEXT_BASE=0x21f80000 為TEXT_BASE=0x21f00000 (當然,你應該根據自己的板子來修改,和一級boot的定義的一致即可)。
  5. 再修改”./include/configs/at91rm9200dk.h”為修改flash和SDRAM的大小。
  6. 另外一個要修改的檔案是: ./borad/at91rm9200dk/flash.c。這個檔案修改的部分比較的多。 a. 首先是OrgDef的定義,加上目前的flash。 b. 接下來,修改”#define FLASH_BANK_SIZE 0x200000”為自己flash的 容量 c. 在修改函式flash_identification(flash_info_t * info)裡面的列印資訊,這部分將在u-boot啟動的時候顯示。 d. 然後修改函式flash_init(void)裡面對一些變數的賦值。 e. 最後修改的是函式flash_print_info(flash_info_t * info)裡面實際列印的函式資訊。 f. 還有一個函式需要修改,就是:“flash_erase”,這個函式要檢測先前知道的flash型別是否匹配,否則,直接就返回了。把這裡給註釋掉。
  7. 接下來看看SDRAM的修改。這個裡面對於“SIZE”的定義都是基於位元組計算的。只要修改”./include/configs/at91rm9200dk.h”裡面的“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以位元組為單位的。
  8. 還有一個地方要注意就是按照目前的設定,一級boot把u_boot載入到了SDRAM的空間為:21F00000 -> 21F16B10,這恰好是SDRAM的高階部分。另外,BSS為21F1AE34。
  9. 編譯後,可以寫入flash了。 a. 壓縮這個u-boot.bin “gzip –c u-boot.bin > u-boot.gz” b. 接著把boot.bin和u-boot.gz燒到flash裡面去。 你可能對一下文章感興趣: 嵌入式Linux專題(一)——嵌入式Linux系統構成及啟動流程 嵌入式Linux專題(二)——嵌入式Linux系統啟動流程詳述