【嵌入式Linux學習七步曲之第三篇 Linux系統bootlaoder移植】U-BOOT全線移植分析系列之三--U-BOOT在AT91RM9200上的移植

U-BOOT全線移植分析系列之三

――U-BOOT在AT91RM9200上的移植

 

Sailor_forever  [email protected]轉載請註明

http://blog.csdn.net/sailor_8318/archive/2008/08/05/2773307.aspx

 

【摘要】本節介紹了U-boot在AT91RM9200上移植的詳細過程。首先分析AT91RM9200片內片外啓動的詳細流程,接着介紹了AT91RM9200啓動所需幾個文件的執行流程。針對片內片外存儲器的映射情況,介紹了bootloader、內核及文件系統的內存分佈。最後介紹了uboot在AT91RM9200上移植所需要的基本文件,並根據開發板的配置情況介紹了詳細的移植過程。

 

【關鍵詞】AT91RM9200,U-boot,片內啓動,片外啓動,loader,內存分佈

 

U-BOOT在AT91RM9200上的移植

3.1 at91rm9200的啓動方式

在這裏我主要介紹通過片內引導和片外引導, 片內引導通常主要採用串口下載並引導u-boot,並將程序被燒寫到 Flash上,然後就可以通過跳線的方式從片外引導執行已經燒寫到片外Flash上的引導程序(bootloader)。

 

3.1.1 片內引導

1)       片內引導的基本原理

系統上電,檢測BMS,選擇系統的啓動方式,如果BMS爲高電平,則系統從片內ROM啓動。AT91RM9200的內部ROM上電後被映射到了0x0和0x100000處,在這兩個地址處都可以訪問到ROM。由於9200的ROM中固化了一個BOOTLOAER程序。所以PC從0X0處開始執行這個BOOTLOAER(準確的說應該是一級BOOTLOADER)。這個BOOTLOADER依次完成以下步驟:

²      PLL SETUP。設置PLLB產生48M時鐘頻率提供給USB DEVICE。同時DEBUG USART也被初始化爲48M的時鐘頻率。

²      相應模式下的堆棧設置

²      檢測主時鐘源(Main oscillator

²      中斷控制器(AIC)的設置

²      C 變量的初始化

²      跳到主函數

 

完成以上步驟後,我們可以認爲BOOT過程結束,接下來的就是LOADER的過程,或者也可以認爲是裝載二級BOOTLOER。AT91RM9200按照DATAFLASH、EEPROM、連接在外部總線上的8位並行FLASH的順序依次來找合法的BOOT程序。所謂合法的指的是在這些存儲設備的開始地址處連續的存放的32個字節,也就是8條指令必須是跳轉指令或者裝載PC的指令,其實這樣規定就是把這8條指令當作是異常向量表來處理。必須注意的是第6條指令要包含將要裝載的映像的大小。關於如何計算和寫這條指令可以參考用戶手冊。一旦合法的映像找到之後,則BOOT程序會把找到的映像搬到內部SRAM中去,所以映像的大小是非常有限的,不能超過16K的大小。當BOOT程序完成了把合法的映像搬到SRAM的任務以後,接下來就進行存儲器的REMAP,經過REMAP之後,SRAM從映設前的0X200000地址處被映設到了0X0地址並且程序從0X0處開始執行。而ROM這時只能在0X100000這個地址處看到了。至此9200就算完成了一種形式的啓動過程。

 

如果BOOT程序在以上所列的幾種存儲設備中未找到合法的映像,則自動初始化DEBUG USART口和USB DEVICE口以準備從外部載入映像,大多數情況都是如此。對DEBUG口的初始化包括設置參數115200 8 N 1以及運行XMODEM協議。對USB DEVICE進行初始化以及運行DFU協議。現在用戶可以從外部(假定爲PC平臺)載入你的映像了。在PC平臺下,以WIN2000爲例,你可以用超級終端來完成這個功能,但是還是要注意你的映像的大小不能超過13K。一旦正確從外部裝載了映像,接下來的過程就是和前面一樣重映設然後執行映像了。

 

注意:通常所說的片內引導是指沒有燒寫合法的印象的情況下,但並不意外着燒些了合法印象的情況下不能採用片內引導的方式。通常第一次下載了啓動印象後就會選擇片外啓動的方式了。並且燒些的印象通常第6條指令都不含將要裝載的映像的大小,所以片內啓動時一般不能運行這些印象。關於片內引導的詳細過程可以參看at91rm9200的芯片說明書――引導程序一章。

 

Boot program Flow Diagram

Device Setup

|

Boot SPI DataFlash Boot --> Download from DataFlash --> run

|

TWI EEPROM Boot --> Download from EEPROM --> run

|

Parallel Boot --> Download from 8-bit Device -->

|

| Xmodem protocol

| |---DBGU Serial Download ---------------------> run

|____|

| DFU protocol

|-----USB download -----------------------> run

at91rm9200片內引導流程圖

 

2)       at91rm9200片內引導u-boot的實現過程

at91rm9200內部本身有128k的片內rom,其固化了一個bootloader和uploader,其他存儲設備上沒有合法的映象時,片內引導將啓動uploader,uploader開啓xmodem協議,等待用戶上傳程序,上傳的程序將載入片內SRAM,重映射,然後pc跳轉到片內SRAM執行上傳的用戶程序,即loader.bin

注:片內SRAM只有16k,除去3-4k片內啓動程序的佔用的部分數據空間,因此下載的程序大小限制在12k內。

 

裸板只能用片內引導方式,載入一個12k以內的小程序loader.bin到內部SRAM運行,而這個小程序初始化SDRAM後,再把u-boot.bin下載到SDRAM的高端運行(u-boot大於12k,不能直接下載的原因就在於此),pc跳到SDRAM的u-boot位置運行u-boot,u-boot啓動後再用u-boot自己的命令把boot.bin 及u-boot.gz下載到SDRAM的低端,再用flash燒寫命令燒到flash去,以後就可以片外flash啓動了。

 

3.1.2 片外引導

如果BMS爲低電平,則AT91RM9200會從片外的FLASH啓動,這時片外的FLASH的起始地址就是0X0了,要求已經在此地址燒些了啓動映象了,接下來的過程和片內啓動的過程是一樣的,只不過這時就需要自己寫啓動代碼了,至於怎麼寫,大致的內容和ROM的BOOT差不多,不同的硬件設計可能有不一樣的地方,但基本的都是一樣的。由於片外FLASH可以設計的大,所以這裏編寫的BOOTLOADER可以一步到位,也就是說不用像片內啓動可能需要BOOT好幾級了

 

對於AT91RM9200,通常選擇在flash的首地址處放的是boot.bin,由其將u-boot.bin.gz解壓到高端RAM中,再運行真正的u-boot.bin,也就是實際的啓動映象。

 

3.2 loader.bin, boot.bin, u-boot.bin代碼執行流分析

以上三個文件是at91rm9200啓動所需要的三個bin,他們的實現代碼並不難。

3.2.1 loader.bin

執行流程,這個文件主要在片內啓動從串口下載U-boot.bin代碼時會用到,一般固化在CPU的內部ROM中,用戶無需改動。

loader/entry.S init cpu

b main ---> crt0.S

--> copydata --> clearbss --> b boot

main.c --> boot -->

/*Get internel rom service address*/

/* Init of ROM services structure */

pAT91 = AT91C_ROM_BOOT_ADDRESS;

/* Xmodem Initialization */

--> pAT91->OpenSBuffer

--> pAT91->OpenSvcXmodem

/* System Timer initialization */

---> AT91F_AIC_ConfigureIt

/* Enable ST interrupt */

AT91F_AIC_EnableIt

AT91F_DBGU_Printk("XMODEM: Download U-BOOT ");

Jump.S

// Jump to Uboot BaseAddr exec

Jump((unsigned int)AT91C_UBOOT_BASE_ADDRESS) 跳到下載的U-boot.bin執行

 ××××××××××××××××××××××××××××××××××

lader.bin主要有3個功能,初始化SDRAM,啓動xmodem接收u-boot並寫到SDRAM中,pc跳轉到SDRAM運行。

 

xmodem的實現

只需要接收部分,發送部分用win下的”超級終端”等工具就可。先找來協議文檔,熟悉協議,看看現有的xmodem協議源碼。協議本身並不複雜,只是它的握手部分實現有點技巧。接收端要不停的發送字符“C”到串口,發送端收到“C”後發送數據SOH和第一個數據包。接收端檢測到SOH後停止發送“C”並開始處理數據。官方的loader啓動了一個時間服務,每隔1s發送一個“C”,在這個我使用了偷懶的算法。

    while(Getchar()!=AT91C_XMODEM_SOH)

    {

        if (0xFFFF==++n )

        {

            SendChar(AT91C_XMODEM_CRCCHR);

            n=0;

        }

    }

 

握手解決了,後面的處理都沒什麼問題。

 

寫SDRAM    

unsigned char *pSdram = (unsigned char *)AT91C_UBOOT_BASE_ADDRESS;

    for ( n = 0; n<128 ; n ++ )

    {

                *pSdram++=data[n];

    }

 

PC跳轉

添加一個文件jump.S到工程

                AREA    reset, CODE, READONLY

                EXPORT  Jump

Jump

        mov pc, r0               

               END

;---------------------------------------------------------------------------------

 

在main中使用下面的函數跳轉

Jump((unsigned int)AT91C_UBOOT_BASE_ADDRESS);

 

loader的調試過程

xmodem部分可以傳一個調試文件,傳進去後全部send回串口,看返回的信息就可以判斷是否正常工作。

寫SDRAM,依然是寫入後再讀出來看看是否一致,在這裏卡了很久,發現每隔2個地址就不能使用,後來發現是SDRAM沒有初始化,重寫後正常。

Jump測試,得傳入一個可以運行的程序到內存才能判斷,用先前編譯好的u-boot-1.0.0試一試,出現u-boot的提示符了,也就是說jump沒問題。

×××××××××××××××××××××××××××××××××××

 

3.2.2 boot.bin執行流程

該文件會在從片內啓動時由U-boot.bin下載到板子上,以後還會被燒寫到片外Flash中,以便在片外啓動時用它來引導並解壓u-boot.gz,並跳轉到解壓後的u-boot來執行。

boot/entry.S

b main --> crt0.S --> copydata --> clearbss --> b boot

T91F_DBGU_Printk(" ");

AT91F_DBGU_Printk("************************************** ");

AT91F_DBGU_Printk("** Welcome to at91rm9200 ** ");

AT91F_DBGU_Printk("************************************** ");

boot/misc.s /* unzip uboot.bin.gz */

----> decompress_image(SRC,DST,LEN) --> gunzip

//jump to ubootBaseAddr exec 這裏跳轉到解壓後的u-boot地址處直接開始執行u-boot

asm("mov pc,%0" : : "r" (DST));

修改main.c中下面2項

#define SRC 0x10010000   (u-boot.gz將燒入flash的位置)

#define DST 0x21f00000  (u-boot.gz被解壓後載入SDRAM的位置,和loader中保持一致)

 

3.2.1 uboot.bin執行流程

u-boot/cpu/at91rm9200/start.S

start --->reset

---> copyex ---> cpu_init_crit

---> /* set up the stack */ --> start_armboot

u-boot/lib_arm/board.c

init_fnc_t *init_sequence[] = {

cpu_init, /* basic cpu dependent setup */

board_init, /* basic board dependent setup */

interrupt_init, /* set up exceptions */

env_init, /* initialize environment */

init_baudrate, /* initialze baudrate settings */

serial_init, /* serial communications setup */

console_init_f, /* stage 1 init of console */

display_banner, /* say that we are here */

dram_init, /* configure available RAM banks */

display_dram_config,

checkboard,

NULL,

};

---> start_armboot ---> call init_sequence

---> flash_init --> display_flash_config

---> nand_init ---> AT91F_DataflashInit

---> dataflash_print_info --> env_relocate

---> drv_vfd_init --> devices_init --> jumptable_init

---> console_init_r --> misc_init_r --> enable_interrupts

---> cs8900_get_enetaddr --> board_post_init -->

 

u-boot/common/main.c

for (;;)

{ /* shell parser */

main_loop () --> u_boot_hush_start --> readline

--> abortboot

-->printf("Hit any key to stop autoboot: %2d ", bootdelay);

}

 

以上是at91rm9200啓動並進入u-boot的執行流分析。後面u-boot還會將uImage解壓到特定的位置並開始執行內核代碼。

 

3.3 AT91RM9200開發板的存儲器情況

第一級地址譯碼由存儲控制器執行,即由具有附加功能的高級系統總線(ASB) 執行。譯碼將32位地址總線決定的4G的地址空間分爲16 個256M字節的區域。區域1 ~ 8 對應EBI,和外部片選NC0 ~NCS7相聯繫。區域0爲內部存儲器地址,第二級譯碼提供1M字節內部存儲空間。區域15爲外設地址,且提供對高級外設總線(APB) 的訪問。其它區域未使用,使用它們進行訪問時將向發出訪問請求的主機發出異常中斷。注意,地址的轉換都是按照字節爲單位的。

物理存儲空間分佈

 

3.3.1 內部存儲器映射

內部ROM:AT91RM9200集成了一個128-K字節的內部ROM。任何時候,ROM均被映射到地址0x10 0000。若復位時BMS 爲高,即片內啓動時,則在復位後到重新映射命令執行前,ROM有兩個地址,可訪問地址0x0。重映射之後SRAM將變爲0地址,內部ROM地址就只爲0x10 0000。

ROM容量爲128KB,即對應0x20000。所以範圍爲0x100000-0x120000。

 

內部RAM:AT91RM9200集成了高速,16-K 字節的內部SRAM。復位後到重新映射命令執行前,只可訪問SRAM 中0x20 0000的地址空間。重新映射後, SRAM 在地址0x0有效。

RAM容量爲16KB,即對應0x4000,所以範圍爲0x200000-0x204000。

 

USB 主機端口:AT91RM9200集成了一個USB主機端口開放主機控制器接口(OHCI)。ASB可直接訪問該接口寄存器,且同標準內部存儲器一樣映射到地址0x30 0000

 

內部存儲器映射

 

3.3.2 外部存儲器映射

 

嵌入式存儲設備通常主要是外部RAM 和作爲永久存儲媒質的Flash

現在所用的AT91RM9200開發板所用的SDRAM是K4S281632F,其容量爲4banks×2Mbits×16,即128Mbits=16Mbytes。SDRAM共有兩片K4S281632F,數據總線位寬16,兩片組成32位位寬,所以SDRAM容量爲32MB。

 

現在所用的Flash芯片爲Intel的28F128J3A,容量爲16M,地址映射從0x10000000到0x10FF FFFF。現在將Flash分爲128個扇區,每個扇區爲128KB=0x20000,每個扇區分爲兩個擦除塊,爲64KB=0x10000。

-------------------------------------------------------------------

Chip Select 0――Flash(0x1000 0000-0x10FF FFFF)

0x1000 0000第0扇區)

                boot.bin                    Flash

0x1001 0000第0扇區)

                u-boot.bin.gz     Flash

0x1002 0000(第1扇區)

                uImage                    Flash

.。。。。

0x1012 0000(第9扇區)

                ramdisk                    Flash

.

0x107E 0000(第127扇區)

                u-boot環境變量    Flash

-------------------------------------------------------------------

Chip Select 1――SDRAM(0x2000 0000-0x2200 0000)

0x2000 0000

                                       SDRAM

.。。。。

0x2100 0000

                uImage            SDRAM

0x2110 0000

                ramdisk            SDRAM

------------------------------------------------------------------

0x0000 0000

                  ROM

0x1000 0000

           boot.bin       FLASH

0x1001 0000

          uboot.gz        FLASH

0x1002 0000

          ulmage         FLASH

0x1012 0000

          ramdisk        FLASH

        U-BOOT環境變量

8M_FLASH 63 扇區       FLASH

16M_FLASH 127扇區      

0x2000 0000

                        SDRAM

0x2100 0000

          ulmage        SDRAM

0x2110 0000

         ramdisk        SDRAM

 

各種文件的內存分佈圖

3.4 U-BOOT在at91rm9200上移植修改的文件

爲了使u-boot-1.0.0支持新的開發板,一種簡便的做法是在u-boot已經支持的開發板中參考選擇一種較接近板的進行修改, 幸運的是在u-boot-1.0.0中已經有了at91rm9200的支持。 下面將詳細闡述對其進行移植所需要關注的幾個方面:

l       修改原因:

硬件平臺不同部分:由於目標板對GPIO、串口等硬件的使用不同或選擇的RAM、flash等芯片的不同,都需要對相應的控制寄存器和硬件設備進行不同的初始化。

向bootloader增加新的功能:比如,有時想在目標平臺上增加USB或Ethernet下載功能等,同樣需要在源碼中加入相應的代碼。

l       移植相關內容:

²      在include/configs/at91rm9200dk.h 它包括開發板的CPU、系統時鐘、RAM、Flash系統及其它相關的配置信息。與具體的板子相關,是移植的最重要文件。

²      include/asm-arm/AT91RM9200.h, 該文件描述了9200寄存器的結構及若干宏定義。具體內容要參考相關處理器手冊。相同CPU的此文件相同,拷貝一份即可,無需修改。

 

²      cpu/at91rm9200/目錄下別爲cpu.cinterrupts.cserial.c等文件。

Ø       cpu.c 無需改動,緩存,中斷堆棧初始化,MMU映射等

Ø       interrupts.c無需修改。各種中斷的處理函數,U-boot運行無需中斷,同時實現爲重啓;定時中斷實現爲查詢方式,主要用於Xmodem協議傳輸文件。

Ø       serial.c 無需修改,串口初始化,接收發送等。

Ø       上述文件都是與CPU相關的,與板子本身的配置無關。通常選擇一個相同的CPU下的相關文件即可,無需修改。

 

²      board/at91rm9200dk/目錄下分別爲flash.cat91rm9200dk.cconfig.mkMakefileu-boot.lds

Ø      flash.c : u-boot讀、寫和刪除Flash設備的源代碼文件。由於不同開發板中Flash存儲器的種類各不相同(是移植的重點,可以從其他CPU目錄下看是否有相同的flash),所以,修改flash.c時需參考相應的Flash芯片手冊。

Ø      at91rm9200dk.c

板級初始化,DRAM地址初始化。修改文件

/* arch number of AT91RM9200DK-Board */

gd->bd->bi_arch_number = 251;

/* adress of boot parameters */

gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;

體系結構號,CPU相關,同CPU此值相同。

bi_boot_params內核啓動參數的首地址,通常爲PHYS_SDRAM + 0x100即SDRAM的100處,很重要,Linux內核移植時,此值需要匹配。

Ø      config.mk

TEXT_BASE = 0x21f00000(u-boot將被載入SDRAM高端部分

注意,對於不同的系統RAM大小可能不一樣,要根據實際情況調整

Ø      Makefile 無需修改,除非改動了at91rm9200dk.c的名字,目標文件要改動。

OBJS        := at91rm9200dk.o flash.o

Ø      u-boot.lds 鏈接腳本, 設置u-boot中各個目標文件的連接地址。無需修改

 

²      Makefile

在u-boot-1.0.0/Makefile中

at91rm9200dk_config : unconfig

./mkconfig $(@:_config=) arm at91rm9200 at91rm9200dk

其中ARM是CPU的種類, at91rm9200是ARM CPU對應的代碼目錄,at91rm9200dk是自已主板對應的目錄。

 

3.5 移植的具體步驟

關於u-boot的移植如下,由於u-boot的軟件設計體系非常清晰,它的移植工作並不複雜,相信各位的代碼閱讀功力不錯的話,參照如下就可以完成。

×××××××××××××××××××××××××××××××××××

If the system board that you have is not listed, then you will need to port U-Boot to your hardware platform. To do this, follow these steps:

1. Add a new configuration option for your board to the toplevel "Makefile" and to the "MAKEALL" script, using the existing entries as examples. Note that here and at many other places boards and other names are listed in alphabetical sort order. Please keep this order.

2. Create a new directory to hold your board specific code. Add any files you need. In your board directory, you will need at least the "Makefile", a ".c", "flash.c" and "u-boot.lds".

3. Create a new configuration file "include/configs/.h" for your board

4. If you're porting U-Boot to a new CPU, then also create a new directory to hold your CPU specific code. Add any files you need.

5. Run "make _config" with your new name.

6. Type "make", and you should get a working "u-boot.srec" file

7. Debug and solve any problems that might arise. [Of course, this last step is much harder than it sounds.]

××××××××××××××××××××××××××××××××××××

 

(一)在board文件夾下面建立自己的開發板的文件夾。一般的,要選取與自己的開發板硬件設置最爲接近的型號。在u-boot-1.1.1中,已經支持at91rm9200,所以可以選取at91rm9200dk作爲模板進行修改。設置你的開發板的名字,隨意即可,我的設置爲:myboard

[root@dding u-boot-1.1.1]$ cd board

[root@dding board]$ cp -R at91rm9200dk/ myboard/

[root@dding board]$ cd myboard

[root@dding myboard]$ ls

at91rm9200dk.c  config.mk  flash.c  Makefile  u-boot.lds

 

(二)可以看到,這裏共有5個文件。首先,要修改主文件的名字,即要把at91rm9200dk.c更改爲myboard.c。其次,要更改config.mk中TEXT_BASE的數值,其爲uboot在RAM中的運行地址。注意,由於at91rm9200中是由boot.bin將uboot映象直接拷貝到RAM中了,TEXT_BASE值必須和boot.bin拷貝的地址一致。否則uboot發現運行地址和鏈接地址不同時會再次執行自拷貝過程,可能將自己覆蓋。由於接下來,因爲在at91rm9200dk用的是AMD的flash,而我的開發板上用的是Intel的28F128J3A,那麼需要另外找Intel的flash.C,以減少工作量。在strong ARM構架裏有xm250,它的flash是Intel的,修改的東西並不是很多。需要注意的是,xm250的flash位寬是32,而我的位寬是16,要根據這個進行相應的修改。最後,修改Makefile,主要是修改生成文件的名字。具體操作如下:


[root@dding myboard]$ mv at91rm9200dk.c myboard.c
[root@dding myboard]$ cat config.mk
TEXT_BASE = 0x21f80000
[root@dding myboard]$ vi config.mk

修改成:TEXT_BASE = 0x21f00000,然後保存退出。

[root@dding myboard]$ vi Makefile

include $(TOPDIR)/config.mk

LIB     = lib$(BOARD).a

OBJS    := myboard.o flash.o

SOBJS   :=

$(LIB): $(OBJS) $(SOBJS)

        $(AR) crv $@ $(OBJS) $(SOBJS)

clean:

        rm -f $(SOBJS) $(OBJS)

[root@dding myboard]$ rm flash.c

[root@dding myboard]$ cp ../xm250/flash.c ./

[root@dding myboard]$ ls

config.mk  flash.c  Makefile  myboard.c  u-boot.lds

[root@dding myboard]$ vi flash.c

 

     34 #undef FLASH_PORT_WIDTH32   /*不定義位寬32*/
     35 #define FLASH_PORT_WIDTH16  /*定義位寬16*/

216         switch (value) {
    217
    218         case (FPW) INTEL_ID_28F128J3A:
/*就是這個芯片*/

    219                 info->flash_id += FLASH_28F128J3A;
    220                 info->sector_count = 128;
    221                
info->size = 0x01000000;
    222                 break;                          /* => 16 MB     */

    223
    224         case (FPW)
INTEL_ID_28F640J3A:    

225                 info->flash_id += FLASH_28F640J3A;
    226                 info->sector_count = 64;
    227                 info->size = 0x00800000;
    228                 break;                          /* => 8 MB     */

 

[root@dding myboard]$ cd ../..

[root@dding u-boot-1.1.1]$ vi Makefile

#########################################################################

## AT91RM9200 Systems

#########################################################################

at91rm9200dk_config     :       unconfig

        @./mkconfig $(@:_config=) arm at91rm9200 at91rm9200dk

myboard_config  :       unconfig
        @./mkconfig $(@:_config=) arm at91rm9200 myboard

#########################################################################

在這裏,可以在命令模式下輸入“/at91rm9200”快速查找at91rm9200dk,仿照它的例子,寫出自己板子的配置。注意的是,第二行開頭要用TAB鍵,不是空格,否則報錯。選項arm表示目標板架構,at91rm9200表示CPU中對應的目錄myboard是你自己的開發板名字,對應board下的目錄。

 

(三)修改主要的配置文件。配置選項比較多,主要是配置cpu,波特率,flash和sdram的類型大小,環境變量的偏移量等等,容易出錯。應該首先了解硬件情況,仔細對應芯片資料進行修改。見上面的《AT91RM9200開發板的存儲器情況

[root@dding u-boot-1.1.1]$ cd include/configs
[root@dding configs]$ cp at91rm9200dk.h myboard.h
[root@dding configs]$ vi myboard.h

 

#define CONFIG_myboard     1    /* on an myboard Board      */

#undef CONFIG_USE_IRQ                    /* we don't need IRQ/FIQ stuff */

#define CONFIG_CMDLINE_TAG        1    /* enable passing of ATAGs      */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG     1

 

#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)

#define CONFIG_BAUDRATE 115200

 

#define CONFIG_BOOTDELAY      3               // u-boot延時等待時間

/* #define CONFIG_ENV_OVERWRITE  1 */

 

#define CONFIG_COMMANDS            /

                       ((CONFIG_CMD_DFL      | /

                       CFG_CMD_DHCP ) & /

                      ~(CFG_CMD_BDI | /

                       CFG_CMD_IMI | /

                       CFG_CMD_AUTOSCRIPT | /

                       CFG_CMD_FPGA | /

                       CFG_CMD_MISC | /

                       CFG_CMD_LOADS ))

 

/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */

#include <cmd_confdefs.h>

 

#define CONFIG_NR_DRAM_BANKS 1              // sdram banks,我的是一個,通常都是一個

#define PHYS_SDRAM 0x20000000                      // sdram起始地址,at91rm9200統一爲0x20000000

#define PHYS_SDRAM_SIZE 0x2000000  /* 32 M */  

// sdram容量32MB,需要根據實際情況修改,芯片爲兩片三星的16位×16M K4S281632F

#define CFG_MEMTEST_START PHYS_SDRAM

#define CFG_MEMTEST_END   CFG_MEMTEST_START + PHYS_SDRAM_SIZE – 0x10 0000

SDRAM高端部分此時運行着U-boot,測試時不能對自身進行

 

#define CONFIG_DRIVER_ETHER  支持以太網驅動

#define CONFIG_NET_RETRY_COUNT 20

 

// flash爲intel的16M 28F128J3A in 128 Sectors

#define PHYS_FLASH_1 0x10000000    //起始地址,at91rm9200統一爲0x10000000

#define PHYS_FLASH_SIZE 0x100 0000  /* 16M main flash */

#define CFG_FLASH_BASE          PHYS_FLASH_1            // PHYS_FLASH_1  flash起始地址別名

#define CFG_MAX_FLASH_BANKS 1 // flash最大banks數

#define CFG_MAX_FLASH_SECT 128          //扇區總數

#define CFG_FLASH_ERASE_TOUT    (2*CFG_HZ) /* Timeout for Flash Erase */

#define CFG_FLASH_WRITE_TOUT    (2*CFG_HZ) /* Timeout for Flash Write */

PHYS_FLASH_SIZE和CFG_MAX_FLASH_SECT通常都未用,因此上述錯誤沒有體現出來

 

#define     CFG_ENV_IS_IN_FLASH     1      // 環境變量保存在flash中

#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x20000×127)  // 環境變量在flash中的地址

#define CFG_ENV_SIZE   0x20000     // 環境變量的大小,一個sector

#define CFG_LOAD_ADDR 0x21000000  /* default load address */

// 內核印象默認的加載地址,需要與自啓動的參數匹配下

 

// 關於U-boot的啓動代碼等大小和地址對任何CPU都無需改動,但是實際往flash中存儲時需要按照此地址來進行

//boot.bin 0x1000 0000

//u-boot.gz 0x1001 0000

#define CFG_BOOT_SIZE             0x6000 /* 24 KBytes */            // boot.bin的大小

#define CFG_U_BOOT_BASE      (PHYS_FLASH_1 + 0x10000)  // u-boot.gz的存放位置,此位置不能隨意更改,必須和boot.bin中的地址一致

#define CFG_U_BOOT_SIZE         0x10000   /* 64 KBytes */  // u-boot.gz佔據的flash空間,半個sector

 

#define CFG_BAUDRATE_TABLE {115200 , 19200, 38400, 57600, 9600 }

 

#define CFG_PROMPT "Uboot> " /* Monitor Command Prompt */ // U-boot的提示符,可隨意更改

#define     CFG_CBSIZE 256 /* Console I/O Buffer Size */

#define CFG_MAXARGS 16 /* max number of command args */

#define     CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */

 

四、編譯u-boot

[root@dding configs]$ cd ../..

[root@dding u-boot-1.1.1]$ make myboard_config

Configuring for myboard board...

[root@dding u-boot-1.1.1]$ make CROSS_COMPILE=arm-linux-

 

生成三個文件:u-boot.bin, u-boot, u-boot.srec

u-boot.bin is a raw binary image

u-boot is an image in ELF binary format

u-boot.srec is in Motorola S-Record format (objcopy -O srec -R.note -R.comment -S [inputfile] [outfile]

u-boot ELF格式的文件,可以被大多數Debug程序識別;

u-boot.bin—二進制bin文件,純粹的U-BOOT二進制執行代碼,不保存ELF格式和調試信息。這個文件一般用於燒錄到用戶開發板中;

u-boot.srec— Motorola S-Record格式,可以通過串行口下載到開發板中。

然後把生成的u-boot.bin保存,並且壓縮一下得到u-boot.bin.gz。

 

一種方式是通過JTAG口將u-boot.bin燒寫到Flash的零地址,復位後就可以啓動系統了。此時無需boot.bin。

 

但是對於at91rm9200,我們是通過boot.bin來過渡的,燒寫的是u-boot.bin.gz。以上工作完成我們可以通過串口將u-boot.bin下載到主板的SDRAM中,它會自動執行, 並出現uboot>

 

這裏我們可以通過串口把boot.bin, u-boot.bin.gz下載到主板,再用u-boot的提供的寫flash功能分別把boot.bin, u-boot.bin.gz寫入到flash中,完成以上工作後,對主板跳線選擇片外啓動,板子復位後會自動啓動u-boot。其首先運行boot.bin,其將u-boot.bin.gz解壓縮到RAM中爲u-boot.bin,並跳轉至u-boot.bin開始執行。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章