新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > U-BOOT移植心得

        U-BOOT移植心得

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

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

        先執行的board_init_f部分:
        1、為gd數據結構分配地址,并清零
        2、執行init_fnc_ptr函數指針數組中的各個初始化函數,如下
        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代碼段,數據段,BSS段
        (這里插一句,原來BSS段是用來存放未初始化的全局變量與靜態變量)
        C、接著開辟malloc空間,存bd , gd , 3個字大小的異常堆空間
        4、將relorate的地址值賦給gd結構體相應變量(2011.06版本的,用于返回start.S)

        后執行的board_init_r部分:
        1、對gd , bd 數據結構賦值初始化
        2、各種外設初始化:
        初始化NORFLASH, NANDFLASH, 初始化ONENAND FLASH
        初始化環境變量 初始化PCI 設置IP地址 初始化各類外設:IIC、LCD、鍵盤、USB 初始化控制臺 建立IRQ中斷堆棧 初始化以太網
        初始化跳轉表(定義了U-Boot中基本的常用函數庫)。。這不算外設
        3、一個死循環執行 main_loop()函數

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


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

        上一頁 1 2 下一頁

        關鍵詞: U-BOOT 移植 啟動過程

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 丰县| 忻州市| 台江县| 延安市| 沁阳市| 新干县| 江城| 邳州市| 建宁县| 林甸县| 沂南县| 师宗县| 高邑县| 阜宁县| 大余县| 东台市| 启东市| 嘉善县| 龙胜| 商都县| 库尔勒市| 稷山县| 沙雅县| 东源县| 南通市| 云南省| 灌云县| 旬阳县| 长兴县| 息烽县| 荣昌县| 河北省| 高台县| 金寨县| 天全县| 西青区| 通州市| 分宜县| 鲁山县| 云龙县| 玉门市|