不同廠商的出的Soc片子在啟動(dòng)方式大都提供片內(nèi)和片外啟動(dòng)兩種方式,一般都是在片內(nèi)固化一段小程序方便于程序開發(fā)而已。
1. 一開始令BMS=1(拔掉跳線),則系統(tǒng)從片內(nèi)ROM中啟動(dòng)。內(nèi)部啟動(dòng)程序初始化調(diào)試串口和USB設(shè)備接口從外部載入啟動(dòng)程序。在Windows平臺(tái)下,啟動(dòng)超級(jí)終端,發(fā)送文件loader.bin和u-boot.bin到SDRAM,成功啟動(dòng)u-boot.
2. 啟動(dòng)了u-boot后就利用u-boot的功能,發(fā)送boot.bin和u-boot.gz到SDRAM,然后再拷貝到FLASH,那么FLASH里面就固化了啟動(dòng)程序boot.bin和u-boot.gz。
3. 燒寫FLASH的過(guò)程如下:
U-Boot》protect off all (注:清除Flash全部塊的寫保護(hù))
U-Boot》erase all (注:擦除Flash全部塊的內(nèi)容)
U-Boot》loadb 20000000 (注:用KERMIT協(xié)議接收boot.bin到SDRAM)
U-Boot》cp.b 20000000 10000000 5fff (注:拷貝boot.bin到Flash)
U-Boot》loadb 21000000 (注:用KERMIT協(xié)議接收u-boot.gz)
U-Boot》cp.b 21000000 10010000 ffff(注:拷貝u-boot.gz到Flash)
U-Boot》protect on all (注:設(shè)置Flash全部塊的寫保護(hù))
4. 這時(shí),插上跳線,令BMS=0,然后重啟,那么系統(tǒng)就從FLASH啟動(dòng)了,啟動(dòng)u-boot.
5. 啟動(dòng)了u-boot之后,就可以利用它來(lái)下載內(nèi)核文件zImage和Ramdisk.gz映象文件到SDRAM,然后用命令啟動(dòng)linux。
6. 在linux下,利用u-boot的工具程序mkimage將內(nèi)核映象文件zImage.gz(通過(guò)命令:gzip -9 zImage》zImage.gz 壓縮成zImage.gz)和Ramdisk.gz映象文件封裝成u-boot格式的映象文件:uImage和uramdisk,然后將他們一起燒寫入FLASH,然后就可以實(shí)現(xiàn)從FLASH啟動(dòng)u-boot,再啟動(dòng)linux。
7. 燒寫完FLASH之后一定要插上跳線,即令BMS=0,使系統(tǒng)再重啟動(dòng)時(shí)從FLASH啟動(dòng)。
8. 系統(tǒng)從FLASH啟動(dòng)時(shí),系統(tǒng)先啟動(dòng)boot,然后解壓縮u-boot.gz,然后啟動(dòng)u-boot.
二.loader.bin, boot.bin, u-boot.bin代碼執(zhí)行流分析。
以上三個(gè)文件時(shí)at91rm9200啟動(dòng)所需要的三個(gè)bin,他們的實(shí)現(xiàn)代碼并不難。
如果是你是采用at91rm9200的評(píng)估版,應(yīng)該能得到其源碼。
2.1 loader.bin 執(zhí)行流程,這個(gè)文件主要在片內(nèi)啟動(dòng)從串口下載代碼時(shí)會(huì)用到
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執(zhí)行流程 該文件會(huì)在從片內(nèi)啟動(dòng)時(shí)被下載到板子上,以后還會(huì)被燒寫到片外Flash中,以便在片外啟動(dòng)時(shí)
用它來(lái)引導(dǎo)并解壓u-boot.gz,并跳轉(zhuǎn)到u-boot來(lái)執(zhí)行。
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 這里跳轉(zhuǎn)到解壓u-boot.gz的地址處直接開始執(zhí)行u-boot
asm(“mov pc,%0” : : “r” (DST));
2.3 uboot.bin執(zhí)行流程
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啟動(dòng)并進(jìn)入u-boot的執(zhí)行流分析。后面u-boot還會(huì)將uImage解壓到特定的位置并開始執(zhí)行內(nèi)核代碼。
三。 綜述
總之, 不同廠商的出的Soc片子在啟動(dòng)方式大都提供片內(nèi)和片外啟動(dòng)兩種方式,一般都是在片內(nèi)固化一段小程序方便于程序開發(fā)而已。
再進(jìn)一步解析:
uboot是一個(gè)龐大的公開源碼的軟件。他支持一些系列的arm體系,包含常見的外設(shè)的驅(qū)動(dòng),是一個(gè)功能強(qiáng)大的板極支持包。其代碼可以從 下載。
在9200上,為了啟動(dòng)uboot,還有兩個(gè)boot軟件包,分別是loader和boot。分別完成從sram和flash中的一級(jí)boot。其源碼可以從atmel的官方網(wǎng)站下載。
我們知道,當(dāng)9200系統(tǒng)上電后,如果bms為高電平,則系統(tǒng)從片內(nèi)rom啟動(dòng),這時(shí)rom中固化的boot程序初始化了debug口并向其發(fā)送‘c’, 這時(shí)我們打開超級(jí)終端會(huì)看到ccccc.。。。這說(shuō)明系統(tǒng)已經(jīng)啟動(dòng),同時(shí)xmodem協(xié)議已經(jīng)啟動(dòng),用戶可以通過(guò)超級(jí)終端下載用戶的 bootloader。
作為第一步,我們下載 loader.bin .loader.bin 將被下載到片內(nèi)的sram中。這個(gè)loder完成的功能主要是初始化時(shí)鐘,sdram和xmodem協(xié)議,為下載和啟動(dòng)uboot做準(zhǔn)備。當(dāng)下載了loader.bin 后,超級(jí)終端會(huì)繼續(xù)打印:ccccc.。。.。這時(shí)我們就可以下在uboot了。uboot將被下載到sdram中的一個(gè)地址后并把pc指針調(diào)到此處開始執(zhí)行uboot。
接著我們就可以在終端上看到uboot的shell啟動(dòng)了,提示符uboot》,用戶可以u(píng)boot》help 看到命令列表和大概的功能。uboot的命令包含了對(duì)內(nèi)存、flash、網(wǎng)絡(luò)、系統(tǒng)啟動(dòng)等一些命令。
如果系統(tǒng)上電時(shí)bms為低電平,則系統(tǒng)從片外的flash啟動(dòng)。為了從片外的flash啟動(dòng)uboot,我們必須把 boot.bin 放到0x0地址出,使得從flash啟動(dòng)后首先執(zhí)行boot.bin ,而要燒寫boot.bin 。
要先完成上面我們講的那些步驟,首先開始從片內(nèi)rom啟動(dòng)uboot。然后再利用uboot的功能完成把boot.bin 和uboot.gz燒寫到flash中的目的,假如我們已經(jīng)啟動(dòng)了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
然后系統(tǒng)復(fù)位,就可以看到系統(tǒng)先啟動(dòng)boot,然后boot解壓縮uboot.gz,然后啟動(dòng)uboot。注意,這里uboot必須壓縮成.gz文件,否則會(huì)出錯(cuò)。
怎么編譯這三個(gè)源碼包呢,首先要建立一個(gè)arm的交叉編譯環(huán)境,關(guān)于如何建立,此處不予說(shuō)明。建立好了以后,分別解壓源碼包,然后修改Makefile中的編譯器項(xiàng)目,正確填寫你的編譯器的所在路徑。
對(duì)于loader和boot,直接make。
對(duì)于uboot:
第一步:make_at91rm9200dk
第二步:make。這樣就會(huì)在當(dāng)前目錄下分別生成*.bin文件,對(duì)uboot.bin,我們還要壓縮成.gz文件。
也許有的人對(duì)loader和boot搞不清楚為什么要兩個(gè),有什么區(qū)別嗎?有區(qū)別。
boot主要完成從flash中啟動(dòng)uboot的功能,他要對(duì)uboot的壓縮文件進(jìn)行解壓,除此之外,他和loader并無(wú)大的區(qū)別,你可以把boot理解為在loader的基礎(chǔ)上加入了解壓縮.gz的功能而已。所以這兩個(gè)并無(wú)多大的本質(zhì)不同,只是他們的使命不同而已。
特別說(shuō)明的是這三個(gè)軟件包都是開放源碼的,所以用戶可以根據(jù)自己的系統(tǒng)的情況修改和配置以及裁減,打造屬于自己系統(tǒng)的bootloder。
燒寫過(guò)程:
1.內(nèi)部啟動(dòng)
2. 下載loader.bin 到 內(nèi)部SRAM
3. 下載uboot.bin 到 外部的SDRAM 并把pc指針調(diào)到此處開始執(zhí)行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
啟動(dòng)過(guò)程:
1.選擇片外啟動(dòng)
2.boot.bin初始化硬件, 將uboot.gz解壓到sdram中
3.啟動(dòng)uboot
-
AT91RM9200
+關(guān)注
關(guān)注
1文章
55瀏覽量
14917 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28267
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論