2008年9月10日 星期三

U-Boot簡介

 

Das U-boot (The Universal Boot Loader), 最早是由Magnus Damm2000年時加入sourceforge的一個open source project: PPCBoot所開始的, 2002年的時候這個project支援了4ARMprocessor, 因此改名為Das U-Boot, 目前的project leaderWolfgang 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 Systembootloader也相對比PCbootloader具有較複雜的行為。

簡 單來說, 一的Embedded System bootloader至少應該完成

(1)初始化硬體: 尤其是processormemory 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, Microblazex86, u-bootsource根目 錄下的cpu目錄可以找到你使用的 版本支援的processor。下面是U-Boot-1.1.6cpu目錄

list-cup
U-boot支援許多的開發板, 關於硬體相關的設定檔 存放在u-boot-version/include/configs的目錄下, 下面是1.1.6所支援的硬體

list-configs

如 果你使用的硬體有被支援, 你只要在U-Boot source的根目錄執行

 

make mrproper

make _config 為 你的開 發板名稱

 

U-Boot會自動將設定檔的compile條件設定好, 讓我們以ARM xscale的開發板lubbock為例。在lubbock.h, 首先設定cpu typeboard type

 

#define CONFIG_PXA250 1 /* This is an PXA250 CPU */

#define CONFIG_LUBBOCK 1 /* on an LUBBOCK Board */

 

這 裡設定了你的CPUxscale pxa250以及設定了board typelubbock。這些設定主要影響了 你的硬體連接設定, 舉例來說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 68來連接MMC, 所以要設其相對的GAFR (GPIO Alternate Function Register)68GPIOalternate 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的設備)

沒有留言:

張貼留言