uboot移植總結

1.uboot的介紹及體系結構

 

1.1 uboot的介紹

 

Uboot是德國DENX小組的開發用於多種嵌入式CPU的bootloader程序, UBoot不僅僅支持嵌入式Linux系統的引導,當前,它還支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系統。UBoot除了支持PowerPC系列的處理器外,還能支持MIPS、 x86、ARM、NIOS、XScale等諸多常用系列的處理器。

 

1.2 uboot的體系結構

 

目錄樹

 

|--board

|--common

|--cpu

|--disk

|--doc

|--drivers

|--dtt

|--examples

|--fs

|--include

|--lib_arm

|--lib_generic

|--net

|--post

|--rtc

|--tools

 

 

 

2. board:和一些已有開發板有關的文件. 每一個開發板都以一個子目錄出現在當前目錄中,比如說: leopard2a子目錄中存放與我們開發板相關的配置文件.

3. common:實現uboot命令行下支持的命令,每一條命令都對應一個文件。例如bootm命令對應就是cmd_bootm.c。

4. cpu:與特定CPU架構相關目錄,每一款Uboot下支持的CPU在該目錄下對應一個子目錄,比如有子目錄arm926ejs就是我們開發板上使用的cpu架構目錄。

5. disk:對磁盤的支持。

5. doc:文檔目錄。Uboot有非常完善的文檔,推薦大家參考閱讀。

6. drivers:Uboot支持的設備驅動程序都放在該目錄,比如各種網卡、支持CFI的Flash、串口和USB等。

7. fs: 支持的文件系統,Uboot現在支持cramfs、fat、fdos、jffs2和registerfs。

8. include:Uboot使用的頭文件,還有對各種硬件平臺支持的彙編文件,系統的配置文件和對文件系統支持的文件。該目錄耤onfigs目錄有與開發 板相關的配置頭文件,如leopard2a.h。該目錄下的asm目錄有與CPU體系結構相關的頭文件,asm對應的是asmarm.

9. lib_xxxx: 與體系結構相關的庫文件。如與ARM相關的庫放在lib_arm中。

10. net:與網絡協議棧相關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS文件系統的實現。

11. tools:生成Uboot

的工具,如:mkimage, crc等等。

2. uboot的運行過程分析

2.1 啓動模式介紹

大多數 Boot Loader 都包含兩種不同的操作模式:"啓動加載"模式和"下載"模式,這種區別僅對於開發人員纔有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統,而並不存在所謂的啓動加載模式與下載工作模式的區別。

啓動加載(Boot loading)模式:這種模式也稱爲"自主"(Autonomous)模式。也即 Boot Loader 從目標機上的某個固態存儲設備上將操作系統加載到 RAM 中運行,整個過程並沒有用戶的介入。這種模式是 BootLoader 的正常工作模式,因此在嵌入式產品發佈的時侯,Boot Loader 顯然必須工作在這種模式下。

下載(Downloading)模式:在這種模式下,目標機上的 Boot Loader 將通過串口連接或網絡連接等通信手段從主機(Host)下載文件,比如:下載內核映像和根文件系統映像等。從主機下載的文件通常首先被 BootLoader 保存到目標機的 RAM 中,然後再被 BootLoader 寫到目標機上的FLASH 類固態存儲設備中。BootLoader 的這種模式通常在第一次安裝內核與根文件系統時被使用;此外,以後的系統更新也會使用 BootLoader 的這種工作模式。工作於這種模式下的 Boot Loader 通常都會向它的終端用戶提供一個簡單的命令行接口。

UBoot這樣功能強大的 Boot Loader 同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。

 

2.2 運行過程

       大多數bootloader都分爲階段1(stage1)和階段2(stage2)兩大部分,uboot也不例外。依賴於CPU體系結構的代碼(如CPU 初始化代碼等)通常都放在階段1中且通常用彙編語言實現,而階段2則通常用C語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。

 

U - Boot 編譯後的代碼定義一般不超過100kB ,並且這100 kB 又分成兩個階段來執行. 第一階段的代碼在start . s 中定義,大小不超過10 kB ,它包括從系統上電後在0x00000000 地址開始執行的部分. 這部分代碼運行在Flash 中,它包括對arm926ejs的一些寄存器的初始化和將U - Boot 的第二階段代碼從Flash 拷貝到SDRAM 中. 除去第一階段的代碼,剩下的部分都是第二階段的代碼. 第二階段的起始地址是在第一階段代碼中指定的,被複制到SDRAM後,就從第一階段跳到這個入口地址開始執行剩餘部分代碼. 第二階段主要是進行一些BSS 段設置,堆棧的初始化等工作,最後會跳轉到main -loop 函數中,接受命令並進行命令處理. 圖1 給出了U - Boot 的詳細的運行過程包括對內核的設置、裝載及調用過程.

 

系統復位進入u-boot stage l的入口點

硬件設備的初始化

爲加載uboot stage 2準備ram空間

設置好堆棧

跳轉到stage 2C入口點

初始化本階段要用到的設備

檢查內存映射

kernel映像和文件映像從flash中讀到ram

爲內核設定啓動參數

調用內核

 

2.3 本開發板的地址分佈(leopard2a

可以根據變換後的分區結構,設置

uboot_addr,uboot_addr_end,kernel_addr,kernel_addr_end,rootfs_addr,rootfs_addr_end,

config_addr, config_addr_end等環境變量,調整bootloader

 

SDRAM的調整修改linux-2.4.20_mvl31/drivers/mtd/maps/physmap.c

 

2.4 運行代碼分析

2.4.1 stage 1

 

uboot的stage1代碼通常放在start.s文件中,它用彙編語言寫成,其主要代碼包括定義入口,設置異常向量,設置cpu的模式和頻率,配置內存區控制寄存器,安裝uboot的棧空間,關閉看門狗等。由於本人對ram的彙編不太熟悉,所以這一部分不作具體分析。

 

2.4.2 stage 2

lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啓動代碼中C語言的主函數,同時還是整個uboot(armboot)的主函數,該函數主要完成如下操作:

 

2.4.2.1 調用一系列初始化函數

 

1. 指定初始函數表:

init_fnc_t *init_sequence[] = {

cpu_init, /* cpu的基本設置 */

board_init, /* 開發板的基本初始化 */

interrupt_init, /* 初始化中斷 */

env_init, /* 初始化環境變量 */

init_baudrate, /* 初始化波特率 */

serial_init, /* 串口通訊初始化 */

console_init_f, /* 控制檯初始化第一階段 */

display_banner, /* 通知代碼已經運行到該處 */

dram_init, /* 配製可用的內存區 */

display_dram_config,

#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)

checkboard,

#endif

NULL,

};

執行初始化函數的代碼如下:

    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

        if ((*init_fnc_ptr)() != 0) {

            hang ();

        }

    }

2. 配置可用的Flash區

flash_init ()

3. 初始化內存分配函數

mem_malloc_init()

4. nand flash初始化

#if (CONFIG_COMMANDS & CFG_CMD_NAND)

    puts ("NAND:");

    nand_init();        /* go init the NAND */

#endif

5. 初始化環境變量

env_relocate ();

6. 外圍設備初始化

devices_init()

7. I2C總線初始化

i2c_init();

8. LCD初始化

drv_lcd_init();

9. VIDEO初始化

drv_video_init();

10. 鍵盤初始化

drv_keyboard_init();

11. 系統初始化

drv_system_init();

 

2.4.2.2初始化網絡設備

初始化相關網絡設備,填寫IP、MAC地址等。

1. 設置IP地址

    gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

 

2. 設置mac地址  

{

        int i;

        ulong reg;

        char *s, *e;

        uchar tmp[64];

 

        i = getenv_r ((uchar*)("ethaddr"), tmp, sizeof (tmp));

        s = (i > 0) ? (char*)tmp : NULL;

 

        for (reg = 0; reg < 6; ++reg) {

            gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;

            if (s)

                s = (*e) ? e + 1 : e;

        }

    }

2.4.2.3進入主UBOOT 命令行

進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。

for (;;) {

        main_loop ();

    }}

3. uboot的移植和測試

3.1 移植的過程

① 在宿主機上建立交叉編譯開發環境

 

② 修改cpu/arm926ejst目錄中的文件內容,

主要包含cpu.C,start.S,interrupts.C以及seria1.C,speed.C等文件

 

③ 在board目錄下創建自己的目標板(開發板)目錄leopard2a

在目錄下創建leopard2a.C,flash.C,memsetup.S

以及Makefile,u-bot.1ds,config.mk文件

 

④在include/configs目錄下創建leopard2a.h

 

⑤ 打開u-bot目錄下Makefile文件,加入如下兩行:

leopard2a_config :      unconfig

@./mkconfig $(@:_config=) arm arm926ejs leopard2a

 

⑨ 編譯。運行命令:

1. make leopard2a_config

2. make

編譯成功.生成基本的u—b00t.

 

⑦ 燒寫.把編譯成的u-bot.bin

至此移植u-bot過程結束.

 

3.2 移植主要修改的文件

移植u—boot到開發板上只需要修改和硬件相關的代碼即可。這首先就聯想到cpu目錄下的啓動代碼,另外參考u—boot/readme文件可知其他還需要修改的主要文件有:

Makefile文件,和include目錄下的目標板.h頭文件(leopard2a.h),board目錄下的目標板.C文件(leopard2a.c),flash.C文件,u-boot.1ds鏈接文件,以及cpu目錄下的串口驅動文件。

 

具體修改如下:

①      cpu/arm926ejst目錄下

 

◆ start.S啓動代碼。

 

②    board/leopard2a

  ◆  leopard2a.C文件。這個文件主要是SDRAM 的驅動程

序,主要完成SDRAM 的UPM 表設置,上電初始化。暫時不

改。

◆  flash.C文件。Flash的驅動程序就在此文件中。

 

◆      memsetup.S文件。

◆  config.mk文件.此文件用於設置程序鏈接的起始地

址.

◆u-boot.Ids文件。

 

③ include/configs目錄下leopard2a.h文件.此文件是

leopard2a目標板頭文件,大多數寄存器參數是在這一文件中

設置完成的.

 

3.3 uboot網絡下載功能的添加和RAM調試

commom/main.c 中的main_loop函數中添加tftp下載的函數,可以通過按鈕觸發下載rimagekimage

 

在燒錄u-boot.bin之前,需要進行ram調試,保證uboot可以在EVB上正常運行。

先下載U-bootSDRAM, 然後執行SDRAM 上的U-boot 程序, 以確認U-boot可以正常執行,

Command 如下:

1.       “tftp a00000 u-boot.bin” <= 下載程序到SDRAM

2.       “go a00000” <= SDRAM 執行程序

 

 

如果U-boot 可以相容於目前的硬件, 5VT EVB 會重新正常啟動

要是不能正常啟動,表示U-boot 不相容於目前的硬件, 請更換新的u-boot.

再重新測試, 直到被測試的U-boot可以正常啟動。


① 獲得發佈的最新版本U-Boot源碼,與Linux內核源碼類似,也是 bzip2的壓縮格式。可從U-Boot的官方網站http://sourceforge.net/projects/U-Boot上獲得;
② 閱讀相關文檔,主要是U-Boot源碼根目錄下的README文檔和U-Boot官方網站的DULG(The DENX U-Boot and Linux Guide)文檔http://www.denx.de/twiki/bin/view/DULG/Manual。尤其是DULG文檔,從如何安裝建立交叉開發環境和解決U-Boot移植中常見問題都一一給出詳盡的說明;
③ 訂閱U-Boot用戶郵件列表http://lists.sourceforge.net/lists/listinfo/u-boot-users。在移植U-Boot過程中遇有問題,在參考相關文檔和搜索U-Boot-User郵件檔案庫http://sourceforge.net/mailarchive/forum.php?forum_id=12898仍不能解決的情況下,第一時間提交所遇到的這些問題,衆多熱心的U-Boot開發人員會樂於迅速排查問題,而且很有可能,W.D本人會直接參與指導;
④ 在建立的開發環境下進行移植工作。絕大多數的開發環境是交叉開發環境。在這方面,DENX 和MontaVista均提供了完整的開發工具集;

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(62) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章