AT91RM9200的U-BOOT啓動燒寫過程

Uboot 燒寫過程

 

1.一開始令BMS=1(拔掉跳線),則系統從片內ROM中啓動。內部啓動程序初始化調試串口和USB設備接口從外部載入啓動程序。在Windows平臺下,啓動超級終端,發送文件loader.bin和u-boot.bin到SDRAM,成功啓動u-boot.

2.啓動了u-boot後就利用u-boot的功能,發送boot.bin和u-boot.gz到SDRAM,然後再拷貝到FLASH,那麼FLASH裏面就固化了啓動程序boot.bin和u-boot.gz。

3. 燒寫FLASH的過程如下:

 

U-Boot>protect off all (注:清除Flash全部塊的寫保護)

U-Boot>erase all (注:擦除Flash全部塊的內容)

U-Boot>loadb 20000000(注:用KERMIT協議接收boot.bin到SDRAM)

U-Boot>cp.b 20000000 10000000 5fff(注:拷貝boot.bin到Flash)

U-Boot>loadb 21000000(注:用KERMIT協議接收u-boot.gz)

U-Boot>cp.b 21000000 10010000ffff(注:拷貝u-boot.gz到Flash)

U-Boot>protect on all (注:設置Flash全部塊的寫保護)

4. 這時,插上跳線,令BMS=0,然後重啓,那麼系統就從FLASH啓動了,啓動u-boot.

5.啓動了u-boot之後,就可以利用它來下載內核文件zImage和Ramdisk.gz映象文件到SDRAM,然後用命令啓動linux。

6. 在linux下,利用u-boot的工具程序mkimage將內核映象文件zImage.gz(通過命令:gzip -9zImage>zImage.gz壓縮成zImage.gz)和Ramdisk.gz映象文件封裝成u-boot格式的映象文件:uImage和uramdisk,然後將他們一起燒寫入FLASH,然後就可以實現從FLASH啓動u-boot,再啓動linux。

7. 燒寫完FLASH之後一定要插上跳線,即令BMS=0,使系統再重啓動時從FLASH啓動。
8. 系統從FLASH啓動時,系統先啓動boot,然後解壓縮u-boot.gz,然後啓動u-boot.

 

 

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

以上三個文件時at91rm9200啓動所需要的三個bin,他們的實現代碼並不難。
如果是你是採用at91rm9200的評估版,應該能得到其源碼。

2.1 loader.bin 執行流程,這個文件主要在片內啓動從串口下載代碼時會用到
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)

 

2.2 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.gz的地址處直接開始執行u-boot
asm("mov pc,%0" : : "r" (DST));

2.3 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解壓到特定的位置並開始執行內核代碼。


三. 綜述
總之, 不同廠商的出的Soc片子在啓動方式大都提供片內和片外啓動兩種方式,一般都是在片內固化一段小程序
方便於程序開發而已,在其DataSheet文檔中有詳盡的描述。若是對at92rm9200有興趣或玩過的朋友,可以與我共同探討相互學習。

再進一步解析:

     uboot是一個龐大的公開源碼的軟件。他支持一些系列的arm體系,包含常見的外設的驅動,是一個功能強大的板極支持包。其代碼可以從http://sourceforge.net/projects/u-boot下載。
      在9200上,爲了啓動uboot,還有兩個boot軟件包,分別是loader和boot。分別完成從sram和flash中的一級boot。其源碼可以從atmel的官方網站下載。
      我們知道,當9200系統上電後,如果bms爲高電平,則系統從片內rom啓動,這時rom中固化的boot程序初始化了debug口並向其發送'c',這時我們打開超級終端會看到ccccc...。這說明系統已經啓動,同時xmodem協議已經啓動,用戶可以通過超級終端下載用戶的bootloader。
      作爲第一步,我們下載loader.bin.loader.bin將被下載到片內的sram中。這個loder完成的功能主要是初始化時鐘,sdram和xmodem協議,爲下載和啓動uboot做準備。當下載了loader.bin後,超級終端會繼續打印:ccccc....。這時我們就可以下在uboot了。uboot將被下載到sdram中的一個地址後並把pc指針調到此處開始執行uboot。
      接着我們就可以在終端上看到uboot的shell啓動了,提示符uboot>,用戶可以uboot>help看到命令列表和大概的功能。uboot的命令包含了對內存、flash、網絡、系統啓動等一些命令。
      如果系統上電時bms爲低電平,則系統從片外的flash啓動。爲了從片外的flash啓動uboot,我們必須把boot.bin放到0x0地址出,使得從flash啓動後首先執行boot.bin,而要燒寫boot.bin

      要先完成上面我們講的那些步驟,首先開始從片內rom啓動uboot。然後再利用uboot的功能完成把boot.bin和uboot.gz燒寫到flash中的目的,假如我們已經啓動了uboot,可以這樣操作:
      uboot>protect off all
      uboot>erase all
      uboot>loadb 20000000
      uboot>cp.b 20000000 10000000 5fff
      uboot>loadb 21000000
      uboot>cp.b 210000000 10010000 ffff

      然後系統復位,就可以看到系統先啓動boot,然後boot解壓縮uboot.gz,然後啓動uboot。注意,這裏uboot必須壓縮成.gz文件,否則會出錯。


      怎麼編譯這三個源碼包呢,首先要建立一個arm的交叉編譯環境,關於如何建立,此處不予說明。建立好了以後,分別解壓源碼包,然後修改Makefile中的編譯器項目,正確填寫你的編譯器的所在路徑。
      對於loader和boot,直接make。
      對於uboot:
      第一步:make at91rm9200dk_config   

      第二步:make。這樣就會在當前目錄下分別生成*.bin文件,對uboot.bin,我們還要壓縮成.gz文件。

      也許有的人對loader和boot搞不清楚爲什麼要兩個,有什麼區別嗎?有區別。
      boot主要完成從flash中啓動uboot的功能,他要對uboot的壓縮文件進行解壓,除此之外,他和loader並無大的區別,你可以把boot理解爲在loader的基礎上加入瞭解壓縮.gz的功能而已。所以這兩個並無多大的本質不同,只是他們的使命不同而已。
      特別說明的是這三個軟件包都是開放源碼的,所以用戶可以根據自己的系統的情況修改和配置以及裁減,打造屬於自己系統的bootloder。

 

燒寫過程:

1.  內部啓動

2. 下載loader.bin 到 內部SRAM

3. 下載uboot.bin  到 外部的SDRAM 並把pc指針調到此處開始執行uboot。

4. 利用uboot的功能完成把boot.bin和uboot.gz燒寫到flash中。

      uboot>protect off all
      uboot>erase all
      uboot>loadb 20000000
      uboot>cp.b 20000000 10000000 5fff
      uboot>loadb 21000000
      uboot>cp.b 210000000 10010000 ffff

啓動過程:

1.選擇片外啓動

2.boot.bin初始化硬件, 將uboot.gz解壓到sdram中

3.啓動uboot


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