Das U-boot (The Universal Boot Loader), 最早是由Magnus Damm在2000年時加入sourceforge的一個open source project: PPCBoot所開始的, 在2002年的時候這個project支援了4個ARM的processor, 因此改名為Das U-Boot, 目前的project leader為Wolfgang Denk。
Bootloader (有時也可以叫作boot monitor) 是一小段硬體power on之後執行的程式碼, 我想在PC上面的linux大家應該對於lilo以及Grub非常熟悉, 這類bootloader的動作不外乎是等待BIOS作完硬體初始化動作後(包含CPU, memory controller...等等), 負責將linux kernel載入執行以及傳遞kernel參數給kernel image。 但是在大部份Embedded System中並不會有BIOS, 而且Embedded System中的processor通常不是像PC般的具有一般性, 彼此間的差異有時十分 之大, 因此Embedded System的bootloader也相對比PC的bootloader具有較複雜的行為。
簡 單來說, 一的Embedded System bootloader至少應該完成
(1)初始化硬體: 尤其是processor與memory controller
(2)載入kernel image與執行kernel (傳遞kernel參數也是一項, 但是我覺得不一定需要,因為linux kernel的參數可以在build kernel的階段予以設定, 我想Embedded linux應該比較不需要不同的 執行參數選擇)另 外, 一些開發時期的功能也 是bootloader的附加功能, 譬如讀寫特定記憶體的 內容, 經由其他媒介載入新的image (例如透過網路利用TFTP或是CompactFlash card), 還有從RAM寫回flash的方式。
U-boot目前支援許多不同的processor, 包含PowerPC, ARM, XScale, MIPS, Coldfire, NIOS, Microblaze與x86, 在u-boot的source根目 錄下的cpu目錄可以找到你使用的 版本支援的processor。下面是U-Boot-1.1.6的cpu目錄
list-cup
U-boot支援許多的開發板, 關於硬體相關的設定檔 存放在u-boot-version/include/configs的目錄下, 下面是1.1.6所支援的硬體
如 果你使用的硬體有被支援, 你只要在U-Boot source的根目錄執行
make mrproper
make
U-Boot會自動將設定檔的compile條件設定好, 讓我們以ARM xscale的開發板lubbock為例。在lubbock.h中, 首先設定cpu type與board type
#define CONFIG_PXA250 1 /* This is an PXA250 CPU */
#define CONFIG_LUBBOCK 1 /* on an LUBBOCK Board */
這 裡設定了你的CPU為xscale pxa250以及設定了board type為lubbock。這些設定主要影響了 你的硬體連接設定, 舉例來說pxa250具有MMC interface controller, 在lubbock的板子上也有使用MMC interface, 因此若你會看到在u-boot-1.1.1/cpu/pxa下面的mmc.c中有這麼一段
#ifdef CONFIG_LUBBOCK
set_GPIO_mode( GPIO6_MMCCLK_MD );
set_GPIO_mode( GPIO8_MMCCS0_MD );
#endif
lubbock使用GPIO 6與8來連接MMC, 所以要設其相對的GAFR (GPIO Alternate Function Register)第6與8個GPIO的alternate function, 所以如果你是非標準的 開發板, 相對的GPIO設定要加入相關的值才 能使得你的硬體正常運作。至於GPIO的 相關設定方式可能就 要與你的硬體人員研究一下, 而且我的硬體知識弱到 不行, 因此就不多加著墨啦。
另 外你的記憶體設定記得要設定正確 (假設你的配置與其他開 發板不同), lubbock.h裏面配置如下
#define CONFIG_NR_DRAM_BANKS 4 /* we have 2 banks of DRAM */
#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
#define PHYS_SDRAM_2 0xa4000000 /* SDRAM Bank #2 */
#define PHYS_SDRAM_2_SIZE 0x00000000 /* 0 MB */
#define PHYS_SDRAM_3 0xa8000000 /* SDRAM Bank #3 */
#define PHYS_SDRAM_3_SIZE 0x00000000 /* 0 MB */
#define PHYS_SDRAM_4 0xac000000 /* SDRAM Bank #4 */
#define PHYS_SDRAM_4_SIZE 0x00000000 /* 0 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */
#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */
#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */
#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */
#define CFG_DRAM_BASE 0xa0000000
#define CFG_DRAM_SIZE 0x04000000
#define CFG_FLASH_BASE PHYS_FLASH_1
若 是一切設定OK, 直接進行make的動作就可以產生出一 個U-Boot image (當然你要有相對映的cross-compiler), 接下來你便可以利用jtag將你的image燒進你的flash中啦 (或是任何可以寫入flash的設備)
沒有留言:
張貼留言