DM3730 X-load 分析
DM3730的啟動(dòng)過程:ROM code -->MLO-->u-boot.bin-->解析boot.scr-->uImage->掛載文件系統(tǒng)
其中MLO就是x-load編譯而來,相當(dāng)于SPL
以我現(xiàn)在使用的LogicPD SOM-LV核心板及其SDK為例,該SDK是在官方SDK基礎(chǔ)上小改而來,大同小異
X-loader編譯
cd rpm/BUILD/x-loader-1.46/
make distclean?
make CROSS_COMPILE=/opt/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi- dm3730logic_config
make CROSS_COMPILE=/opt/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-?
具體編譯腳本請(qǐng)查看目錄下的makefile
編譯OK后,會(huì)生成MLO x-load x-load.bin x-load_usb x-load_usb.bin?
由編譯腳本可知:
$(obj)MLO:?? ?$(obj)x-load.bin.ift
?? ?cp $(obj)x-load.bin.ift $(obj)MLO
$(obj)x-load.bin.ift:?? ?$(obj)x-load.bin $(obj)scripts/signGP
?? ?$(obj)scripts/signGP $(obj)x-load.bin $(CONFIG_SYS_TEXT_BASE)
$(obj)scripts/signGP: ?? ?$(src)scripts/signGP.c
?? ?mkdir -p $(obj)scripts
?? ?$(HOSTCC) -o $@ $<
$(obj)x-load.bin:?? ?$(obj)x-load
?? ??? ?$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
MLO是通過signGP工具從x-loader.bin生成而來,具體可看 scripts/signGP.c的實(shí)現(xiàn),實(shí)質(zhì)是在x-load.bin的基礎(chǔ)上增加了一個(gè)4字節(jié)的header,header內(nèi)容是4個(gè)字節(jié)的x-loader長(zhǎng)度和x-loader被load的目標(biāo)地址。
本開發(fā)板的目標(biāo)地址是定義在board/dm3730logic/config.mk下?CONFIG_SYS_TEXT_BASE=0x40200800 該變量在編譯腳本中被傳給了signGP,
先用連接腳本board/dm3730logic/x-load.lds開始
OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS {. = 0x00000000;. = ALIGN(4);.text ? ? ?:{cpu/omap3/start.o?? ?(.text)*(.text)}. = ALIGN(4);.rodata : { *(.rodata) }. = ALIGN(4);.data : { *(.data) }. = ALIGN(4);.got : { *(.got) }. = ALIGN(4);__bss_start = .;.bss : { *(.bss) }_end = .; }
指定了入口函數(shù)_start以及最先執(zhí)行的程度代碼start.S
start.S里面先設(shè)置CPU工作方式,保存啟動(dòng)設(shè)備參數(shù),初始化CPU,最好調(diào)_stat_armboot?
?? ?// cpu/omap3/start.S?
?? ?bl ?cpu_init_crit ?// cpu/ompa3/start.S?
?? ??? ??? ?bl?? ?lowlevel_init?? ?// cpu/omap3/platform.S?
?? ??? ??? ? ? ??? ?bl ? ? ?s_init ?// board/dm3730logic.c? ?//進(jìn)行主要的CPU級(jí)初始化,bss,watchdog,clk,timer,serial, ddr, nand,i2c等
特別說明logicpd這個(gè)核心板,硬件默認(rèn)優(yōu)先nand啟動(dòng),
一切初始化OK之后,跳到lib/board.c:start_armboot() 開始執(zhí)行C代碼
init_fnc_t *init_sequence[] = {
?? ?cpu_init,?? ??? ?/* basic cpu dependent setup */
?? ?board_init,?? ??? ?/* basic board dependent setup */
#ifdef CFG_PRINTF
??? ?serial_init,?? ??? ?/* serial communications setup */
?? ?trace_dump,
?? ?print_info,
#endif
? ?? ?nand_init,?? ??? ?/* board specific nand init */
? ?? ?NULL,
};
misc_init_r();
?? ?/* go run U-Boot and never return */
??? ?((init_fnc_t *)boot_fnc_ptr)();
這個(gè)函數(shù)中先是進(jìn)一步初始化了一些外設(shè)和CPU功能,然后根據(jù)Romcode識(shí)別到的啟動(dòng)設(shè)備,從啟動(dòng)設(shè)備加載u-boot.bin 到啟動(dòng)地址,然后直接跳轉(zhuǎn)執(zhí)行。(注意我手頭的x-load只實(shí)現(xiàn)了從nand,emmc,usb啟動(dòng),沒有實(shí)現(xiàn)從nor啟動(dòng))
有一個(gè)問題,為什么TI 平臺(tái)不直接用u-boot或者bootloader,而要先搞一個(gè)x-loader呢?
在回答這個(gè)問題之前,我們先回顧下Nor和Nand的區(qū)別,Nand Flash的讀寫速度慢,但是容量大,價(jià)格相對(duì)便宜,壽命更長(zhǎng)。Nor編程簡(jiǎn)單,有獨(dú)立的地址引腳,可以方便的存取其內(nèi)容的每一個(gè)字節(jié)。一般的,Nandflash用于存儲(chǔ)數(shù)據(jù),NorFlash一般用于存儲(chǔ)啟動(dòng)代碼。
Samsuang公司未了彌補(bǔ)Nandflash的不足,在Nandflahs芯片內(nèi)集成了一個(gè)RAM接口,命令未OneNandFlash,這類Flash擁有和NorFlash相同的簡(jiǎn)單接口,而且不受地址引腳的限制,即容量與地址引腳無關(guān)。簡(jiǎn)單的說,OneNandFlash就是采用了Nor的接口,Nand的架構(gòu),是兩者的性能得到了綜合。傳統(tǒng)的bootloader是放在Nand的架構(gòu)下的,而CPU卻是從Nor的接口下讀取bootloader到SDRAM中,因此需要有一個(gè)步驟,就是怎么把Bootloader/uboot從OneNand架構(gòu)下復(fù)制到SDRAM中,這就是x-loader的功能,不僅初始化OneNand,并且把u-boot從Nand的架構(gòu)下復(fù)制到bufferRam中,再?gòu)?fù)制到SDRAM中。
X-loader還支持從SD/MMC/下引導(dǎo)uboot。本質(zhì)上x-loader起到了初始化OneNand和引導(dǎo)u-boot的作用。
TI平臺(tái)的GPMC ,可以接Nor,也可以和FPGA等通信,通過不同的CS片選來通信,本開發(fā)板所使用的RAM和Nand,是直接POP到CPU的,即DM3730背上貼有一片MCP(DDR+NAND)
對(duì)于GPMC,本文不詳訴,參考網(wǎng)絡(luò)資料。
有其他疑問,歡迎留言提問,我有空會(huì)回復(fù)解答
總結(jié)
以上是生活随笔為你收集整理的DM3730 X-load 分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android刷机 概念整理
- 下一篇: 北京中科白癜风医院转姐,回家吧