0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AT91RM9200的UBOOT啟動燒寫過程詳解

電子工程師 ? 作者:工程師陳翠 ? 2018-06-18 14:41 ? 次閱讀

不同廠商的出的Soc片子在啟動方式大都提供片內(nèi)和片外啟動兩種方式,一般都是在片內(nèi)固化一段小程序方便于程序開發(fā)而已。

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

2. 啟動了u-boot后就利用u-boot的功能,發(fā)送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全部塊的內(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全部塊的寫保護)

4. 這時,插上跳線,令BMS=0,然后重啟,那么系統(tǒng)就從FLASH啟動了,啟動u-boot.

5. 啟動了u-boot之后,就可以利用它來下載內(nèi)核文件zImage和Ramdisk.gz映象文件到SDRAM,然后用命令啟動linux。

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

7. 燒寫完FLASH之后一定要插上跳線,即令BMS=0,使系統(tǒng)再重啟動時從FLASH啟動。

8. 系統(tǒng)從FLASH啟動時,系統(tǒng)先啟動boot,然后解壓縮u-boot.gz,然后啟動u-boot.

二.loader.bin, boot.bin, u-boot.bin代碼執(zhí)行流分析。

以上三個文件時at91rm9200啟動所需要的三個bin,他們的實現(xiàn)代碼并不難。

如果是你是采用at91rm9200的評估版,應(yīng)該能得到其源碼。

2.1 loader.bin 執(zhí)行流程,這個文件主要在片內(nèi)啟動從串口下載代碼時會用到

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í)行流程 該文件會在從片內(nèi)啟動時被下載到板子上,以后還會被燒寫到片外Flash中,以便在片外啟動時

用它來引導并解壓u-boot.gz,并跳轉(zhuǎn)到u-boot來執(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啟動并進入u-boot的執(zhí)行流分析。后面u-boot還會將uImage解壓到特定的位置并開始執(zhí)行內(nèi)核代碼。

三。 綜述

總之, 不同廠商的出的Soc片子在啟動方式大都提供片內(nèi)和片外啟動兩種方式,一般都是在片內(nèi)固化一段小程序方便于程序開發(fā)而已。

再進一步解析:

uboot是一個龐大的公開源碼的軟件。他支持一些系列的arm體系,包含常見的外設(shè)的驅(qū)動,是一個功能強大的板極支持包。其代碼可以從 下載。

在9200上,為了啟動uboot,還有兩個boot軟件包,分別是loader和boot。分別完成從sram和flash中的一級boot。其源碼可以從atmel的官方網(wǎng)站下載。

我們知道,當9200系統(tǒng)上電后,如果bms為高電平,則系統(tǒng)從片內(nèi)rom啟動,這時rom中固化的boot程序初始化了debug口并向其發(fā)送‘c’, 這時我們打開超級終端會看到ccccc.。。。這說明系統(tǒng)已經(jīng)啟動,同時xmodem協(xié)議已經(jīng)啟動,用戶可以通過超級終端下載用戶的 bootloader。

作為第一步,我們下載 loader.bin .loader.bin 將被下載到片內(nèi)的sram中。這個loder完成的功能主要是初始化時鐘,sdram和xmodem協(xié)議,為下載和啟動uboot做準備。當下載了loader.bin 后,超級終端會繼續(xù)打?。篶cccc.。。.。這時我們就可以下在uboot了。uboot將被下載到sdram中的一個地址后并把pc指針調(diào)到此處開始執(zhí)行uboot。

接著我們就可以在終端上看到uboot的shell啟動了,提示符uboot》,用戶可以uboot》help 看到命令列表和大概的功能。uboot的命令包含了對內(nèi)存、flash、網(wǎng)絡(luò)、系統(tǒng)啟動等一些命令。

如果系統(tǒng)上電時bms為低電平,則系統(tǒng)從片外的flash啟動。為了從片外的flash啟動uboot,我們必須把 boot.bin 放到0x0地址出,使得從flash啟動后首先執(zhí)行boot.bin ,而要燒寫boot.bin 。

要先完成上面我們講的那些步驟,首先開始從片內(nèi)rom啟動uboot。然后再利用uboot的功能完成把boot.bin 和uboot.gz燒寫到flash中的目的,假如我們已經(jī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)復位,就可以看到系統(tǒng)先啟動boot,然后boot解壓縮uboot.gz,然后啟動uboot。注意,這里uboot必須壓縮成.gz文件,否則會出錯。

怎么編譯這三個源碼包呢,首先要建立一個arm的交叉編譯環(huán)境,關(guān)于如何建立,此處不予說明。建立好了以后,分別解壓源碼包,然后修改Makefile中的編譯器項目,正確填寫你的編譯器的所在路徑。

對于loader和boot,直接make。

對于uboot:

第一步:make_at91rm9200dk

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

也許有的人對loader和boot搞不清楚為什么要兩個,有什么區(qū)別嗎?有區(qū)別。

boot主要完成從flash中啟動uboot的功能,他要對uboot的壓縮文件進行解壓,除此之外,他和loader并無大的區(qū)別,你可以把boot理解為在loader的基礎(chǔ)上加入了解壓縮.gz的功能而已。所以這兩個并無多大的本質(zhì)不同,只是他們的使命不同而已。

特別說明的是這三個軟件包都是開放源碼的,所以用戶可以根據(jù)自己的系統(tǒng)的情況修改和配置以及裁減,打造屬于自己系統(tǒng)的bootloder。

燒寫過程:

1.內(nèi)部啟動

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

啟動過程:

1.選擇片外啟動

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

3.啟動uboot

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • AT91RM9200
    +關(guān)注

    關(guān)注

    1

    文章

    55

    瀏覽量

    14866
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    125

    瀏覽量

    28099
收藏 人收藏

    評論

    相關(guān)推薦

    TCP/IP協(xié)議在AT91RM9200上的實現(xiàn)

    TCP/IP協(xié)議在AT91RM9200上的實現(xiàn) 摘要:介紹了AT91RM9200[1]芯片與DM9161E[2]的硬件接口電路設(shè)計以及驅(qū)動程序開發(fā)。在此基礎(chǔ)上討論了TCP/IP[3]
    發(fā)表于 12-08 10:43 ?1355次閱讀

    at91rm9200定時器

    請問at91rm9200的linux驅(qū)動程序如何訪問定時器/計數(shù)器模塊相關(guān)的寄存器?如訪問PIO使能寄存器,驅(qū)動語句為:AT91_SYS->PIOA_PER |= 1;那訪問定時器0的TC通道模式寄存器TC_CMR驅(qū)動語句該是怎樣的?需要哪些內(nèi)核頭文件?謝謝!
    發(fā)表于 11-13 09:51

    S1D13506顯示控制器與AT91RM9200的接口設(shè)計

    設(shè)計,在此基礎(chǔ)上詳細闡述了μC/GUI移植到AT91RM9200過程,并給出一個應(yīng)用實例。1 S1D13506和AT91只M9200介紹AT9lRM
    發(fā)表于 12-21 08:37

    μCGUI移植到AT91RM9200過程及接口設(shè)計

    介紹了AT91RM9200處理器和S1D13506顯示控制器的接口設(shè)計,在此基礎(chǔ)上詳細闡述了μC/GUI移植到AT91RM9200過程,并給出一個應(yīng)用實例。1 S1D13506和AT91
    發(fā)表于 05-31 05:00

    AT91RM9200移植u-boot串口一直停留在顯示

    運行,再利用u-boot.bin將boot.bin和uboot.bin.gz下載到NorFlash中,斷電從NorFlash中啟動,AT91RM9200會利用NorFlash中的boot.bin
    發(fā)表于 06-21 05:45

    怎么實現(xiàn)OLED顯示模塊與AT91RM9200的接口設(shè)計?

    本文介紹了OLED顯示模塊P13501與AT91RM9200的接口電路設(shè)計,以及在嵌入式Linux下OLED驅(qū)動程序的編寫、編譯和加載。
    發(fā)表于 06-08 06:05

    AT91RM9200中文手冊 AT91RM9200中文資料

    AT91RM9200是完全圍繞ARM920T ARM Thumb處理器構(gòu)建的系統(tǒng)。它有豐富的系統(tǒng)與應(yīng)用外設(shè)及標準的接口,從而為低功耗、低成本、高性能的計算機寬范圍應(yīng)用提供一個單片解決方案。AT9
    發(fā)表于 04-22 13:20 ?359次下載

    MiniGUI在AT91RM9200開發(fā)板上的移植

    MiniGUI在AT91RM9200開發(fā)板上的移植
    發(fā)表于 03-28 09:52 ?18次下載

    MiniGUI 在AT91RM9200 開發(fā)板上的移植

    簡要介紹Atmel 公司生產(chǎn)的基于ARM9 內(nèi)核的AT91RM9200 開發(fā)板的結(jié)構(gòu)及其部分特性;詳細介紹如何將MiniGUI 圖形用戶界面移植到AT91RM9200 開發(fā)板上的全過程。
    發(fā)表于 05-16 14:16 ?26次下載

    AT91RM9200簡明手冊.pdf

    AT91RM9200簡明手冊.pdf 基于ARM920T的嵌入式微控制器——AT91RM9200總體特性:· 內(nèi)嵌ARM920TTM ARM® Thumb®微處理器- 180MHz/200MIPS- 16KB數(shù)據(jù)Cache、16KB指令
    發(fā)表于 03-01 15:47 ?43次下載

    at91rm9200啟動過程教程

    at91rm9200啟動過程教程 系統(tǒng)上電,檢測BMS,選擇系統(tǒng)的啟動方式,如果BMS為高電平,則系統(tǒng)從片內(nèi)ROM啟動。AT91RM9200
    發(fā)表于 03-08 15:57 ?44次下載

    基于AT91RM9200的手持設(shè)備的低功耗設(shè)計

    本文以基于AT91RM9200 的手持設(shè)備為例,分析了手持設(shè)備的低功耗設(shè)計的原理,同時給出了AT91RM9200 手持設(shè)備上基于Linux 操作系統(tǒng)的電源管理模塊的初步實現(xiàn)
    發(fā)表于 12-16 14:42 ?66次下載
    基于<b class='flag-5'>AT91RM9200</b>的手持設(shè)備的低功耗設(shè)計

    AT91RM9200用戶手冊

    AT91RM9200用戶手冊有需要的朋友下來看看
    發(fā)表于 01-11 14:05 ?8次下載

    AT91RM9200 說明書

    AT91RM9200 說明書
    發(fā)表于 09-29 11:36 ?7次下載
    <b class='flag-5'>AT91RM9200</b> 說明書

    AT91RM9200的手持設(shè)備的低功耗設(shè)計

    AT91RM9200的手持設(shè)備的低功耗設(shè)計
    發(fā)表于 10-15 10:42 ?12次下載
    <b class='flag-5'>AT91RM9200</b>的手持設(shè)備的低功耗設(shè)計