方法產(chǎn)生的原因:
公司ARM11的板子需要移植yaffs2文件系統(tǒng),linux驅(qū)動已移植完成,現(xiàn)需要移植u-boot的yaffs2文件系統(tǒng)燒寫
u-boot版本1.1.6 linux版本2.6.22 flash AM29LV040B nand flash 三星256MB
方法產(chǎn)生的經(jīng)過:
在網(wǎng)上找了幾個(gè)u-boot移植代碼,使用flash燒寫器燒進(jìn)去后都起不來,串口無輸出,而且該產(chǎn)品板并沒有買JATG調(diào)試器,flash燒寫器 是生產(chǎn)部門的,u-boot掛了,總是要打斷燒寫MM的正常工作,十分不好意思.在嘗試危險(xiǎn)的熱插拔后,決定尋找更方便的方法去調(diào)試(熱插拔:公司的 flash芯片并不是直接焊在板子上,而是使用插座.所以我使用兩片flash,總是保留一片正常的flash,在另一片flash掛掉后,使用正常的 flash啟動,然后上電狀態(tài)下?lián)Q上壞的flash用u-boot直接燒寫,這個(gè)和電腦主板的BIOS修復(fù)類似,實(shí)際上該操作十分危險(xiǎn),而且成功率不 高,u-boot總是死機(jī))
方法產(chǎn)生的思路:
既然linux內(nèi)核可以在內(nèi)存中啟動,為什么u- boot不可以呢,回顧一下u-boot的啟動順序和工作原理,發(fā)現(xiàn)理論上是可行的,u-boot本身就是復(fù)制到內(nèi)存中運(yùn)行的,所以改變u-boot在內(nèi) 存中運(yùn)行的地址,就可以用一個(gè)u-boot啟動另外一個(gè)u-boot.
方法:
首先將內(nèi)存u- boot的TEXT_BASE改為和flash u-boot不一樣的地址,然后使用tftp將內(nèi)存u-boot下載到其對應(yīng)的地址,go TEXT_BASE,這里我發(fā)現(xiàn)死機(jī)了,第一次嘗試失敗,回顧u-boot的啟動過程,前期有flash to ram的過程,而內(nèi)存的uboot并不需要復(fù)制(雖然代碼有判斷uboot自身是否在內(nèi)存中運(yùn)行).所以我這里參考了編譯好的內(nèi)存u-boot的map, 找到 start_armboot所在內(nèi)存的地址(*.map文件中可以找到),然后go start_armboot,啟動成功,但是nand flash識別錯(cuò)誤,之后我也沒分析其原因,我直接換了go的地址,使用了內(nèi)存搬移后的動作---堆棧初始化stack_setup這個(gè)地址,go之后一 切正常,因?yàn)槭窃趦?nèi)存中啟動,環(huán)境變量使用了默認(rèn)值,但不影響我的調(diào)試,之后的調(diào)試,我發(fā)現(xiàn)是yaffs2的mkyaffs2image這個(gè)程序有 BUG,他沒有生成壞塊標(biāo)志0xff,修bug后,在內(nèi)存中運(yùn)行的u-boot可以正常燒寫yaffs2文件系統(tǒng).
結(jié)束語:
本文為拋磚引玉,該方法在arm系列平臺應(yīng)該都適用,u-boot內(nèi)存調(diào)試,不僅僅是為了解決移植yaffs2燒寫問題,是提供了開發(fā)u-boot驅(qū)動時(shí)的新方法,既減少了芯片的燒寫次數(shù),而且省去了jtag調(diào)試工具.
文章內(nèi)容為原創(chuàng),轉(zhuǎn)載請注明出處,若有火星之處請見諒,本身也是第一次調(diào)試U-boot
馬桶吸盤
于2010年7月26日arm11 u-boot調(diào)試手札