顯示具有 EmbededSystem 標籤的文章。 顯示所有文章
顯示具有 EmbededSystem 標籤的文章。 顯示所有文章

2008年9月10日 星期三

build出s3c2410x的 uboot.bin

Introduction就不提了
因為手中的板子是samsung 2410x的板子
所以就來build個可放在2410上的 bootloader
因為2410是 arm的processor所以首先將cross compiler裝起來
先至gnu arm 下載 看是喜歡自己重新build或是 直接使用己build 好的binary 包
依個人需求下載囉
下載好將path做個設定
令/etc/profile
多加一行 export PATH=$PATH:/usr/local/gnuarm-3.4.3/bin
以上為個人的設定,請依自己放置的路徑放置
方便可不用再每次都要設定
設好後測試一下,重新登入後,在console試一下
[root@localhost local]# arm-elf-gcc -v
Reading specs from /usr/local/gnuarm-3.4.3/bin/../lib/gcc/arm-elf/3.4.3/specs
Configured with: ../gcc-3.4.3/configure --target=arm-elf --prefix=/srv/shared/gnuarm/gnuarm-3.4.3 --enable-interwork --enable-multilib --with-newlib --with-headers=../newlib-1.12.0/newlib/libc/include --enable-languages=c,c++,java --disable-libgcj
Thread model: single
gcc version 3.4.3
這個部份很重要哦 先記一下我的compiler 是要用到是
arm-elf-gcc
若在cygwin環境下的朋友,請要 至 bin下確認 gcc的正確名字是什麼
我記在cygwin下的cross-compiler不是用這個名字 等會介紹 為什麼要記住這個部份
ok看到版本號碼 cross-compiler 己經完成
接著至sourceforge下載 uboot 現在的版本是 1.1.6版
下載後將它解壓縮 tar -jxvf u-boot-1.1.6.tar.bz2
進入u-boot cd u-boot-1.1.6
剛才有提到我的cross-compiler是
arm-elf-gcc
所以在Makefile我們需設定我的 CROSS_COMPILE
arm-elf- 沒錯就只要設到這裡就好
請依照Makefile內的內容做設定
(在原本的
CROSS_COMPILE後接的可能是 arm-linux-)
因為我們要biuld的是s3c2410x的bootloader
所以我們要請make指令幫我們做個configure
make smdk2410_config (i.e.若是其它的processor即make xxxx_config)
接著
再下
make
當我們看到了
arm-elf-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
這行字時,ok 我們bootloader就完成了
u-boot u-boot.bin


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的設備)