新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AT91RM9200的UBOOT啟動燒寫過程

        AT91RM9200的UBOOT啟動燒寫過程

        作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
        Uboot 燒寫過程

        本文引用地址:http://www.104case.com/article/201611/318146.htm

        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全部塊的寫保護(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. 這時,插上跳線,令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中,以便在片外啟動時
        用它來引導(dǎo)并解壓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啟動并進(jìn)入u-boot的執(zhí)行流分析。后面u-boot還會將uImage解壓到特定的位置并開始執(zhí)行內(nèi)核代碼。


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

        再進(jìn)一步解析:

        uboot是一個龐大的公開源碼的軟件。他支持一些系列的arm體系,包含常見的外設(shè)的驅(qū)動,是一個功能強大的板極支持包。其代碼可以從http://sourceforge.net/projects/u-boot 下載。
        在9200上,為了啟動uboot,還有兩個boot軟件包,分別是loader和boot。分別完成從sram和flash中的一級boot。其源碼可以從atmel的官方網(wǎng)站下載。
        我們知道,當(dā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做準(zhǔn)備。當(dāng)下載了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)復(fù)位,就可以看到系統(tǒng)先啟動boot,然后boot解壓縮uboot.gz,然后啟動uboot。注意,這里uboot必須壓縮成.gz文件,否則會出錯。


        怎么編譯這三個源碼包呢,首先要建立一個arm的交叉編譯環(huán)境,關(guān)于如何建立,此處不予說明。建立好了以后,分別解壓源碼包,然后修改Makefile中的編譯器項目,正確填寫你的編譯器的所在路徑。
        對于loader和boot,直接make。
        對于uboot:
        第一步:make_at91rm9200dk
        第二步:make。這樣就會在當(dāng)前目錄下分別生成*.bin文件,對uboot.bin,我們還要壓縮成.gz文件。

        也許有的人對loader和boot搞不清楚為什么要兩個,有什么區(qū)別嗎?有區(qū)別。
        boot主要完成從flash中啟動uboot的功能,他要對uboot的壓縮文件進(jìn)行解壓,除此之外,他和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



        關(guān)鍵詞: AT91RM9200UBOOT燒寫過

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 潞西市| 宁陕县| 博白县| 龙岩市| 海阳市| 五常市| 武定县| 固镇县| 三台县| 永胜县| 夏河县| 尚义县| 杭州市| 太湖县| 蚌埠市| 突泉县| 新民市| 包头市| 敦化市| 通辽市| 太谷县| 寿阳县| 富平县| 荥阳市| 新密市| 西乌珠穆沁旗| 博乐市| 北碚区| 广昌县| 台南市| 临清市| 伊金霍洛旗| 北京市| 崇仁县| 纳雍县| 雷山县| 永新县| 神农架林区| 景德镇市| 湖北省| 定西市|