日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DM3730 X-load 分析

發(fā)布時(shí)間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DM3730 X-load 分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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:b?? ?resetldr?? ?pc, _hangldr?? ?pc, _hangldr?? ?pc, _hangldr?? ?pc, _hangldr?? ?pc, _hangldr?? ?pc, _hangldr?? ?pc, _hangreset:/** set the cpu to SVC32 mode*/mrs?? ?r1,cpsrbic?? ?r1,r1,#0x1forr?? ?r1,r1,#0xd3msr?? ?cpsr,r1/* Save the booting parameter structure ?** (passed via pointer from r0 from ROM) ** (12 bytes) ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/adr?? ?r1, booting_parameter? //保存Rom code讀取到的啟動(dòng)設(shè)備參數(shù)ldmia?? ?r0!, {r4-r7}stmia?? ?r1!, {r4-r7}/* Copy vectors to mask ROM indirect addr */adr ? ? r0, _start ? ? ? ? ? ? ?/* r0 <- current position of code ? */add ? ? r0, r0, #4?? ??? ?/* skip reset vector ? ? ? ? ? ? ? ?*/mov ? ? r2, #64 ? ? ? ? ? ? ? ? /* r2 <- size to copy ? ? ? ? ? ? ? */add ? ? r2, r0, r2 ? ? ? ? ? ? ?/* r2 <- source end address ? ? ? ? */mov ? ? r1, #SRAM_OFFSET0 ? ? ? /* build vect addr ? ? ? ? ? ? ? ? ?*/mov ? ? r3, #SRAM_OFFSET1add ? ? r1, r1, r3mov ? ? r3, #SRAM_OFFSET2add ? ? r1, r1, r3 next:ldmia ? r0!, {r3-r10} ? ? ? ? ? /* copy from source address [r0] ? ?*/stmia ? r1!, {r3-r10} ? ? ? ? ? /* copy to ? target address [r1] ? ?*/cmp ? ? r0, r2 ? ? ? ? ? ? ? ? ?/* until source end address [r2] ? ?*/bne ? ? next ? ? ? ? ? ? ? ? ? ?/* loop until equal */bl?? ?cpy_clk_code ? ? ? ? ? ?/* put dpll adjust code behind vectors *//* the mask ROM code should have PLL and others stable */bl ?cpu_init_critldr?? ?pc, _start_armboot?? ?/* jump to C code ? ? ? ? ? ? ? ? ? */_start_armboot: .word start_armboot

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。