RBL, UBL, Uboot的關(guān)系
1)RBL=ROM Bootloader,UBL=user Bootloader。
2)RBL為TI固化在芯片ROM中的bootloader,OMAP上電啟動(dòng)過后首先將運(yùn)行RBL,然后通過RBL加載UBL,再通過UBL加載uboot,而uboot就是用來加載Linux內(nèi)核的。如果在具體應(yīng)用過程中不需要使用到Linux(實(shí)際上一般都會(huì)用到的),uboot甚至是UBL都可以省去。UBL為一級(jí)Bootloader,uboot為二級(jí)Bootloader,一級(jí)Bootloader的大小是有限制的(應(yīng)該是64KB以下,沒查到具體數(shù)值),這也是為什么會(huì)有二級(jí)Bootloader的原因。如果一個(gè)應(yīng)用程序小于這個(gè)大小,那么我們可以不需要燒寫UBL,而只用燒寫該應(yīng)用程序相應(yīng)的bin文件(下面第3點(diǎn)將闡述如何得到這個(gè)文件)就行了。
UBL的程序設(shè)計(jì),相對(duì)UBOOT、KERNEL、ROOTFS、設(shè)備驅(qū)動(dòng)、DSP開發(fā)來說,還是比較簡(jiǎn)單。我們先從DAVINCI的啟動(dòng)說起,了解UBL在DAVIN系統(tǒng)中的位置和作用。對(duì)于固件程序燒寫在NAND FLASH 的Davinci dm644x嵌入式系統(tǒng), 上電啟動(dòng)的過程如下:
RBL(ARM ROM Boot Loader)在芯片出廠的時(shí)候就已經(jīng)燒寫到ROM里了,這不需要大家關(guān)心,上電后,RBL會(huì)自動(dòng)從EMIFA EM_CS2 memory space (0x0200 0000). 執(zhí)行指令,這個(gè)地址就是NAND FLASH 或NOR FLASH的片選起始地址。當(dāng)你的系統(tǒng)設(shè)置為NAND BOOT的時(shí)候,UBL(User Boot Loader)是必不可少的,否則RBL不能直接把UBOOT給BOOT起來,因?yàn)镽BL只支持14K NAND FLASH 的 BOOT程序,而UBOOT編譯出來后的bin文件一般都大于80K,特別是版本越高,UBOOT的代碼越大,所以這時(shí)候就需要寫一個(gè)UBL。UBL 從NAND FLASH 讀取UBOOT,然后把UBOOT COPY 到 DDR2(RAM)的相關(guān)地址上,然后把UBOOT 給BOOT 起來。根據(jù)TI DAVIN RBL的規(guī)定,不同型號(hào)的NAND FLASH,UBL保存的地址是不同的,512字節(jié)PAGE 的NAND(即SMALL PAGE),保存的地址是:0x00004000;2048字節(jié)PAGE的NAND (即LARGE PAGE)保存的地址是:0x20000。至于如何通過XDS560仿真器燒寫UBL或通過UART BOOT燒寫UBL,本人放在DAVINCI UBOOT移植的文章介紹。(提示:RBL和UBL不要混淆!多看看BOOT的順序圖。)
UBL的移植,比較簡(jiǎn)單,當(dāng)然,前提條件你已經(jīng)搭好交叉編譯環(huán)境。進(jìn)入U(xiǎn)BL文件包最上層的文件夾,使用make 就可以編譯出:ubl_davinci_nand.bin。UBL主要有:
ubl.c
dm644x.c
util.c
nand.c
nandboot.c
nor.c
norboot.c
uart.c
uartboot.c
ubl_davinci.lds
相關(guān)的*.h 文件和兩個(gè)makefile文件。如果最上層的makefile選擇$(MAKE) -C src FLASH=nand,表示使用ARM nand flash boot模式,這時(shí)NOR,UART BOOT模式相關(guān)的c文件不會(huì)編譯。
介紹一下:
ubl_davinci.lds: 指定UBL的SECTIONS及UBL本身的入口地址;
ubl.c:從selfcopy函數(shù)開始運(yùn)行,COPY自己到RAM,然后跳到正常入口地址,執(zhí)行boot(),main()等函數(shù),調(diào)用DM644xInit(),COPY UBOOT到RAM相關(guān)地址,最后執(zhí)行UBOOT的入口地址(EntryPoint),這時(shí)UBOOT就可以運(yùn)行了。
dm644x.c:主要配置最小系統(tǒng),比如關(guān)中斷、PLL1、PLL2設(shè)置、DDR2 時(shí)序設(shè)置、UART設(shè)置,等等。
util.c:是一些相關(guān)的malloc等公共函數(shù)。
nand.c:主要是NAND FLASH的驅(qū)動(dòng);
nandboot.c:主要是實(shí)現(xiàn)NAND_Copy,把UBOOT從NAND COPY到相應(yīng)的DDR2(RAM)里。
UBL要移植的東西不是很多,主要是在dm644x.c里要定義好:
Uint32 PLL1_Mult = 22; // DSP=594 MHz for DM6446,DM6441一般使用Uint32 PLL1_Mult = 19; // DSP=513 MHz。在PLL2Init()函數(shù)里,使用不同型號(hào)的DDR,要設(shè)置不同的參數(shù),即時(shí)序參數(shù)等,這是關(guān)鍵的地方。
Nand.c及nand.h主要移植就是定義好UBOOT在NAND的存儲(chǔ)地址,不同型號(hào)的NAND FLASH ,比如SMALL PAGE(512字節(jié))和LARGE PAGE(2048字節(jié))這些都要修改除非你的NAND的類型和TI EVM 兼容。
nandboot.c主要任務(wù)就是如何把u-boot.bin或帶有頭的u-boot.img正確COPY到DDR里,這里最容易出問題,編譯出來的U-BOOT文件一般帶有Valid magic number(MAGIC_NUMBER_VALID),入口地址entrypaoit,這些信息不對(duì)都使UBOOT 運(yùn)行不起來,建議看一下或COPY UBOOT的image.h。
UBL把UBOOT運(yùn)行起來,很多事情都可以做了,LINUX KERNEL,ROOTFS,NFS,DSP,設(shè)備驅(qū)動(dòng),應(yīng)用等等,都可開始按部就班開發(fā)。