• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    U-BOOT移植心得

    作者: 時(shí)間:2012-08-04 來源:網(wǎng)絡(luò) 收藏
    最近跑完裸機(jī)之后,便開始跑系統(tǒng),但想著裸機(jī)與系統(tǒng)之間隔著個(gè)Bootloader,反正以前也沒怎么深入研究,便說花一到兩周時(shí)間來搞搞
    參考了fzb和趙春江兩位大牛的,也研究了2010.06版本的和2011.06版本兩個(gè)經(jīng)典版本,也對(duì)比了TQ(我買的板是天嵌的)自己寫的,學(xué)到了不少,也發(fā)現(xiàn)了很多東西,以下便記錄以下自己的心得吧,以便以后可以自己參考下。

    的兩個(gè)階段:(2010.06經(jīng)典版來說)
    第一階段:start.S的路徑位于archarmcpuarm920t這段匯編代碼一般被稱作第一階段初始化代碼。主要作用是初始化運(yùn)行環(huán)境;初始化內(nèi)存;重新放置UBOOT代碼到內(nèi)存中;跳入到內(nèi)存中執(zhí)行第二段初始化代碼
    1 關(guān)閉開門狗,屏蔽所有中斷
    2 設(shè)置分頻比
    3 bl cpu_init_crit() 關(guān)MMU,初始化內(nèi)存
    bl lowlevel_init() 配置內(nèi)存,修改內(nèi)存刷新率參數(shù)等
    4 relocate 判斷當(dāng)前代碼是在NORFLASH還是RAM
    copy_loop循環(huán) 將FLASH代碼復(fù)制至RAM中
    5 stack_setup 棧設(shè)置
    clear_bss _bss_start到_bss_end之間的數(shù)據(jù)清0
    6 ldr pc , start_armboot 跳轉(zhuǎn)到第二階段
    //=====================================================================
    第二階段:board.c的路徑位于arch/arm/lib/board.c,這段代碼為U-BOOT的第二階段初始化代碼。主要作用是初始化兩個(gè)重要數(shù)據(jù)結(jié)構(gòu),對(duì)SDRAM的內(nèi)存分配設(shè)置,對(duì)各種需要用到的外設(shè)進(jìn)行初始化,最后循環(huán)跳入main_loop()函數(shù)
    二階段start_armboot分為board_init_f 和 board_init_r兩部分

    先執(zhí)行的board_init_f部分:
    1、為gd數(shù)據(jù)結(jié)構(gòu)分配地址,并清零
    2、執(zhí)行init_fnc_ptr函數(shù)指針數(shù)組中的各個(gè)初始化函數(shù),如下
    board_early_init_f , timer_init , env_init init_baudrate serial_init
    console_init_f display_banner dram_init
    3、A、 分配SDRAM高64KB為TLB,用于U-BOOT
    B、分配SDRAM下一單元為U-BOOT代碼段,數(shù)據(jù)段,BSS段
    (這里插一句,原來BSS段是用來存放未初始化的全局變量與靜態(tài)變量)
    C、接著開辟malloc空間,存bd , gd , 3個(gè)字大小的異常堆空間
    4、將relorate的地址值賦給gd結(jié)構(gòu)體相應(yīng)變量(2011.06版本的,用于返回start.S)

    后執(zhí)行的board_init_r部分:
    1、對(duì)gd , bd 數(shù)據(jù)結(jié)構(gòu)賦值初始化
    2、各種外設(shè)初始化:
    初始化NORFLASH, NANDFLASH, 初始化ONENAND FLASH
    初始化環(huán)境變量 初始化PCI 設(shè)置IP地址 初始化各類外設(shè):IIC、LCD、鍵盤、USB 初始化控制臺(tái) 建立IRQ中斷堆棧 初始化以太網(wǎng)
    初始化跳轉(zhuǎn)表(定義了U-Boot中基本的常用函數(shù)庫)。。這不算外設(shè)
    3、一個(gè)死循環(huán)執(zhí)行 main_loop()函數(shù)

    /**********************************
    兩個(gè)版本的U-BOOT啟動(dòng)對(duì)比:
    ************************************/
    其實(shí)在總體上都差不多,只不過相對(duì)于經(jīng)典版(2010.06版),新版之后都變惡心了
    主要有這樣的區(qū)別:
    1、原版本第一階段的第5步棧設(shè)置被放到第4步relorate前(這個(gè)沒什么)
    2、原版第二階段的board_init_f被放到第一階段第4步relorate前,就是說執(zhí)行完
    stack_setup棧設(shè)置后變進(jìn)入了第二階段的部分初始化,然后通過4、將relorate的地址值賦給gd結(jié)構(gòu)體相應(yīng)變量(2011.06版本的,用于返回start.S)又返回來第一階段。。。感覺新版改后很亂,很沒條理(開源的每年改,就是煩呀,哈哈)


    //=================================================
    以下列出兩個(gè)階段可能要用到的函數(shù)的路徑,方便以后找:(按2011.06版本)
    一階段:
    lowlevel_init函數(shù),它是在board/samsung/smdk2410目錄下的lowlevel_init.s文件中定義
    二階段:
    gd是一個(gè)保存在ARM的r8寄存器中的gd_t結(jié)構(gòu)體的指針,它是在/include/asm目錄下的global_data.h文件內(nèi)被定義的
    bd結(jié)構(gòu)體的數(shù)據(jù)原型為bd_t數(shù)據(jù)結(jié)構(gòu),它表示的是“板級(jí)信息”結(jié)構(gòu)體,它是在/include/asm目錄下的u-boot.h文件中定義的。
    init_fnc_ptr函數(shù)指針數(shù)組中的各個(gè)初始化函數(shù):
    board_early_init_f函數(shù)在board/samsung/smdk2410目錄下的smdk2410.c文件內(nèi)timer_init函數(shù)在arch/arm/cpu/arm920t/s3c24x0目錄下的timer.c文件內(nèi)
    env_init函數(shù)在common目錄下的env_flash.c文件內(nèi)
    init_baudrate函數(shù)在arch/arm/lib目錄下的board.c文件內(nèi)
    serial_init函數(shù)在drivers/serial目錄下的serial_s3c24x0.c文件內(nèi),在include/configs/smdk2410.h中定義了CONFIG_S3C24X0_SERIAL
    console_init_f函數(shù)在common目錄下的console.c文件內(nèi)
    display_banner函數(shù)在arch/arm/lib目錄下的board.c文件內(nèi)
    dram_init函數(shù)在board/samsung/smdk2410目錄下的smdk2410.c文件內(nèi)
    各種外設(shè)的初始化:
    flash_init函數(shù)是在drivers/mtd目錄下的cfi_flash.c文件內(nèi)(因?yàn)閕nclude/configs/smdk2410.h中定義了CONFIG_FLASH_CFI_DRIVER)
    nand_init函數(shù)是在divers/mtd/nand目錄下的nand.c文件內(nèi)定義的
    env_relocate函數(shù)是在common目錄下的env_common.c文件中定義的
    stdio_init ()在common目錄下的stdio.c文件中定義的
    jumptable_init ()在common目錄下的exports.c文件中定義的
    console_init_r ()是在common目錄下的console.c文件中定義的
    interrupt_init () enable_interrupts ()都是在arch/arm/lib目錄下的interrupts.c文件中定義
    eth_initialize()函數(shù)是在net目錄下的eth.c文件的第209行至第298行定義的
    main_loop()在common目錄下的main.c文件內(nèi)定義的

    上一頁 1 2 下一頁

    關(guān)鍵詞: U-BOOT 移植 啟動(dòng)過程

    評(píng)論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 临朐县| 普安县| 江安县| 陆河县| 法库县| 德化县| 沙湾县| 朝阳区| 通山县| 大石桥市| 枣庄市| 澄江县| 揭东县| 珠海市| 清苑县| 读书| 绥阳县| 宁阳县| 西昌市| 永泰县| 开鲁县| 东台市| 朔州市| 文水县| 建瓯市| 无棣县| 余干县| 阳西县| 贺州市| 平湖市| 黄山市| 喀喇| 镇平县| 禄劝| 墨脱县| 桃江县| 八宿县| 江城| 金湖县| 文昌市| 泾川县|