如何生成Nboot(轉)

S3C2410處理器支持將啓動代碼存儲在NAND Flash中。爲了實現這一功能,2410配備了一個名爲“Steppingstone”的內部SRAM。在啓動時,NAND Flash中第一個4K字節的內容將被加載到Steppingstone中並執行。這個工作由MCU主動完成,而我們只需將NAND Flash配置爲Auto Boot模式即可。

       一般來說,啓動代碼會拷貝存儲在NAND Flash中的內容至SDRAM中。在使用ECC校驗時,NAND Flash中數據的有效性將被確認。在完成拷貝的工作後,啓動代碼將跳轉到已加載到SDRAM中的主程序中,這時啓動代碼的使命完成,MCU由主程序來控制。

       WinCE操作系統從文件的組成來看一般分爲兩部分:BOOTLOADER和NK.bin。在WinCE中,BOOTLOADER一般爲EBOOT。它的主要功能是初始化硬件設備,主要包括CPU內部的相關控制器、內存、網絡、串口甚至USB口和LCD。在初始化完成後,它將通過網絡或USB從外部下載NK.bin,或從本地Flash中加載NK.bin並執行,從而啓動WinCE操作系統。可以看到Eboot雖然是啓動代碼,但它得完成相當多的工作,最終的映像文件也將超過4K。所以,我們不能直接將Eboot存放在NAND Flash的第一個4K字節中。我們需要一個更小的啓動代碼,這就是通常所說的NBOOT(NAND BOOT)。

       通過上面的介紹,我們知道了NBOOT在整個系統中扮演的角色,它負責將EBOOT加載到內存並運行。在EBOOT開始執行後,NBOOT就退出了歷史的舞臺,事實上也不再有上場的機會。

       在NBOOT的代碼實現中,我們必須完成以下幾個部分。

1.       初始化CPU內部相關控制器,如設置GPIO,關閉Watch Dog,關閉中斷,設置系統時鐘。

2.       初始化內存。

3.       初始化串口,主要用來輸出調試信息。

4.       初始化NAND Flash,因爲在MCU啓動時默認是Auto Boot模式,爲了從NAND Flash中讀取EBOOT,需要將其配置成 NAND Flash Mode。

5.       讀取NAND Flash中的EBOOT映像文件,並放在內存指定的位置,這個地址是跟EBOOT有關,介紹EBOOT時再詳細說明。

6.       完成讀取之後,跳轉到EBOOT的起始位置,執行EBOOT代碼。

一般來說,前面兩個功能在startup.s中實現,WinCE6.0下可以參考文件C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT"startup.s的相關代碼。後面四個功能可在main.c中實現。總之,在實現必備功能的情況下,儘可能減少代碼量,以將最後的NBOOT映像文件控制在4K以內。

NBOOT的編譯環境一般有兩種,ADS1.2(或RVDS)、Platform Builder。用ADS1.2編譯NBOOT是比較方便的,需要注意的就是RO Base和RW Base的設置,RO Base必須設置爲0x0。否則,系統啓動時NBOOT將不被運行。在Post-Linker中選擇ARM from ELF,在Linker——ARM fromELF——Output Format中選擇Plain Binary,這樣,編譯完成後最終生成NBoot.bin。該文件就可以固化在NAND Flash的第0個BLOCK中。Platform Builder 6.0是作爲VS2005的插件來用的,所以,我們現在也可以用VS2005來編譯NBOOT,這樣就免得再安裝ADS或RVDS等軟件。用VS2005來編譯NBOOT也有兩種方法,第一種跟編譯EBOOT映像文件類似,第二種是自己寫makefile文件,然後用命令行的方式調用ARM編譯器來編譯。兩種方法各有優點,第一種方法在編譯OS時,會自動編譯生成映像,而第二種方法可由ADS下的程序直接移植過來,不過,要寫好makefile文件是相當困難的事情。一般還是少用爲好。

下面就介紹如何用VS2005來編譯NBOOT。

首先修改BSP的目錄2410"SRC"Bootloader"的dir文件,添加NBOOT,dir文件的內容:

bootloader下創建NBOOT目錄,並創建makefile、makefile.inc、sources、nboot.bib文件,也可從EBOOT的目錄下拷貝對應文件過來進行修改。

Code
DIRS=            /
        Nboot     /
         eboot    /
         bootpart

Makefile.inc文件的內容:

 

Code
nboot_romimage:

!IF "$(NOLINK)" == ""

    romimage $(ROMIMAGE_FLAGS) nboot.bib

!IF "$(WINCEREL)"=="1"
    copy $(_PLATFORMROOT)"$(_TGTPLAT)"target"$(_TGTCPU)"$(WINCEDEBUG)"nboot.* $(_FLATRELEASEDIR)
!ENDIF

!ENDIF


Nboot.bib文件的內容:

Code
MEMORY
;   Name      Start     Size      Type

;   -------   -------- -------- ----
    NBOOT   00000000 00003000 RAMIMAGE
    STACK   31400000 00001000 RESERVED
    RAM     31500000 00010000 RAM

CONFIG
       COMPRESSION=ON
       PROFILE=OFF
       KERNELFIXUPS=ON

       ROMSTART=00000000
       ROMWIDTH=32
       ROMSIZE=00001000

MODULES

;   Name        Path                                                               Memory Type

;   ---------- --------------------------------------------------------------     -----------

    nk.exe      $(_TARGETPLATROOT)"target"$(_TGTCPU)"$(WINCEDEBUG)"nboot.exe        NBOOT

 sources文件的內容:

 

Code
TARGETNAME=nboot
TARGETTYPE=PROGRAM
RELEASETYPE=PLATFORM
EXEENTRY=StartUp
NOMIPS16CODE=1

LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO

TARGETLIBS=$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/fulllibc.lib

SOURCES=          /
        startup.s /
        main.c    /
        nand.s

WINCETARGETFILES=nboot_romimage

再將對應的代碼文件拷貝到NBOOT的目錄下,這裏需要提醒一點的是,在main.c中需要添加一個全局變量的定義,這在ADS1.2的工程代碼中是沒有的,也是不須的。否則,最終生成的Nboot.bin就只有一個文件頭。做完相關代碼的修改之後,就可以編譯NBOOT了。

Code
// Globals variables.
//
ROMHDR * volatile const pTOC = (ROMHDR *)-1;

 

    

 

 

 

 

              

 

 

可以看到,最終編譯生成了Nboot.bin、NBOOT.nb0、NBOOT.nb1、NBOOT.nb2。上面我們提到用ADS1.2編譯最後可用的NBOOT映像爲NBOOT.bin,但這裏我們卻得用NBOOT.nb1。對比一下ADS下生成的Nboot.bin和Nboot.nb1文件。    

 

      

 

      

     最後,再看一下反彙編nboot.exe的樣子,將其跟startup.s對比一下,一樣!         

 

        

      

     至此,我們就完成了用VS2005編譯得到NBOOT的映像文件,NBOOT.nb1,應該來說還是比較簡單的,但這中間還有些小的問題需要考慮,下次再整理。

       當然,S3C2410&&WinCE6.0也可以用Nor Flash存儲啓動代碼,這種情況下,就不必用NBOOT,直接用Eboot.nb0就行。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jonathandj/archive/2009/12/31/5113038.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章