内存版u-boot制作
我這里的設(shè)備上,一般都是在NOR-Flash上跑U-boot,但有時(shí)候?yàn)榱苏{(diào)試等的方便,要讓u-boot在內(nèi)存中跑。?Flash版本的u-boot是不能直接在內(nèi)存中跑的(至少我這里的情況是這樣)。
?
???????下面,主要按照我這的情況,簡(jiǎn)單說(shuō)說(shuō)內(nèi)存版u-boot的制作。制作出來(lái)的u-boot,可以:
1)用仿真器下載到內(nèi)存中運(yùn)行;
2)通過(guò)設(shè)備中已經(jīng)有的u-boot,用tftp下載到內(nèi)存中,再用go 0xxxx運(yùn)行。
?
內(nèi)存版u-boot的制作簡(jiǎn)單地說(shuō),就是注釋掉不需要運(yùn)行的相關(guān)代碼,主要是:
1)內(nèi)存,flash的初始化
2)ARM的內(nèi)存重映射
3)相關(guān)時(shí)鐘初始化
?
這里,我是這樣做的:
修改u-boot-1.0.2/cpu/arm940t/start.S,注釋相關(guān)代碼:
。。。。。。
reset:
???????//bl platformsetup?????????
/*這里的platformsetup是具體設(shè)備的內(nèi)存、Flash相關(guān)初始化;注釋掉這個(gè)步驟,因?yàn)閮?nèi)存版u-boot運(yùn)行時(shí),內(nèi)存、Flash已初始化好。*/
。。。。。。
。。。。。。
clbss_l:
????str???r2, [r0]
???????add??r0, r0, #4
???????cmp?r0, r1
???????bne??clbss_l
???????ldr???pc, _start_armboot
_start_armboot:??????.word start_armboot?????????????//跳到C程序start_armboot執(zhí)行
。。。。。。
?
???????再注釋board_init函數(shù)中調(diào)用的時(shí)鐘初始化函數(shù)init_clk:
void init_clk(void)
{
???????icache_disable();
#if 0
???????PMUSetFCS(PLL_331776000);
???????PMUSetTurboMode(1);?// 1: On, 0: Off
???????PMUSetPLL3();
#endif
???????icache_enable();
}?
【轉(zhuǎn)】u-boot 內(nèi)存中調(diào)試的實(shí)現(xiàn)方法
方法產(chǎn)生的原因:
公司ARM11的板子需要移植yaffs2文件系統(tǒng),linux驅(qū)動(dòng)已移植完成,現(xiàn)需要移植u-boot的yaffs2文件系統(tǒng)燒寫(xiě)
u-boot版本1.1.6??? linux版本2.6.22?? flash AM29LV040B?? nand flash 三星256MB
方法產(chǎn)生的經(jīng)過(guò):
在網(wǎng)上找了幾個(gè)u-boot移植代碼,使用flash燒寫(xiě)器燒進(jìn)去后都起不來(lái),串口無(wú)輸出,而且該產(chǎn)品板并沒(méi)有買(mǎi)JATG調(diào)試器,flash燒寫(xiě)器 是生產(chǎn)部門(mén)的,u-boot掛了,總是要打斷燒寫(xiě)MM的正常工作,十分不好意思.在嘗試危險(xiǎn)的熱插拔后,決定尋找更方便的方法去調(diào)試(熱插拔:公司的 flash芯片并不是直接焊在板子上,而是使用插座.所以我使用兩片flash,總是保留一片正常的flash,在另一片flash掛掉后,使用正常的 flash啟動(dòng),然后上電狀態(tài)下?lián)Q上壞的flash用u-boot直接燒寫(xiě),這個(gè)和電腦主板的BIOS修復(fù)類(lèi)似,實(shí)際上該操作十分危險(xiǎn),而且成功率不 高,u-boot總是死機(jī))
方法產(chǎn)生的思路:
既然linux內(nèi)核可以在內(nèi)存中啟動(dòng),為什么u- boot不可以呢,回顧一下u-boot的啟動(dòng)順序和工作原理,發(fā)現(xiàn)理論上是可行的,u-boot本身就是復(fù)制到內(nèi)存中運(yùn)行的,所以改變u-boot在內(nèi) 存中運(yùn)行的地址,就可以用一個(gè)u-boot啟動(dòng)另外一個(gè)u-boot.
方法:
首先將內(nèi)存u- boot的TEXT_BASE改為和flash u-boot不一樣的地址,然后使用tftp將內(nèi)存u-boot下載到其對(duì)應(yīng)的地址,go TEXT_BASE,這里我發(fā)現(xiàn)死機(jī)了,第一次嘗試失敗,回顧u-boot的啟動(dòng)過(guò)程,前期有flash to ram的過(guò)程,而內(nèi)存的uboot并不需要復(fù)制(雖然代碼有判斷uboot自身是否在內(nèi)存中運(yùn)行).所以我這里參考了編譯好的內(nèi)存u-boot的map, 找到 start_armboot所在內(nèi)存的地址(*.map文件中可以找到),然后go start_armboot,啟動(dòng)成功,但是nand flash識(shí)別錯(cuò)誤,之后我也沒(méi)分析其原因,我直接換了go的地址,使用了內(nèi)存搬移后的動(dòng)作---堆棧初始化stack_setup這個(gè)地址,go之后一 切正常,因?yàn)槭窃趦?nèi)存中啟動(dòng),環(huán)境變量使用了默認(rèn)值,但不影響我的調(diào)試,之后的調(diào)試,我發(fā)現(xiàn)是yaffs2的mkyaffs2image這個(gè)程序有 BUG,他沒(méi)有生成壞塊標(biāo)志0xff,修bug后,在內(nèi)存中運(yùn)行的u-boot可以正常燒寫(xiě)yaffs2文件系統(tǒng).
結(jié)束語(yǔ):
本文為拋磚引玉,該方法在arm系列平臺(tái)應(yīng)該都適用,u-boot內(nèi)存調(diào)試,不僅僅是為了解決移植yaffs2燒寫(xiě)問(wèn)題,是提供了開(kāi)發(fā)u-boot驅(qū)動(dòng)時(shí)的新方法,既減少了芯片的燒寫(xiě)次數(shù),而且省去了jtag調(diào)試工具.
http://www.360doc.com/content/13/0130/04/7775902_263163496.shtml
總結(jié)
以上是生活随笔為你收集整理的内存版u-boot制作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: u-boot命令解释
- 下一篇: 关于real210开发板linux系统可