天天看點

調試U-Boot筆記(五)

    昨天,我們修改了u-boot中的部分代并成功地用axd把我們的u-boot跑起來了。這是一個很大的成就!我們不能自滿,今天将再接再厲,進一步探索。

    我們今天的目标是:使将u-boot燒錄到nandflash與norflash,并使之正常啟動。

    接着昨天的試驗,我們的程式能夠通過axd運作起來,那麼我們把程式用jlink指令加載到mini2440上也應該可以正常運作。我們來試一下……

    打開j-link commander程式。還是老步驟,先下載下傳init.bin檔案到0x40000000位址上并運作起來,等其完成了sdram的初始化之後,再将我們編譯的u-boot.bin下載下傳到0x33f80000位址上。依次鍵入如下指令:

    > r

    > loadbin e:init.bin 0x40000000

    > setpc 0x40000000

    > g

    看一下開發闆上的led有沒有正常閃爍,如有則繼續:

    > h

    > loadbin e:u-boot-gdbu-boot.bin 0x33f80000

    > setpc 0x33f80000

    ok!此時我已聽到一聲蜂鳴器叫的聲音,我們來看一下序列槽終端的顯示:

調試U-Boot筆記(五)

    這已說明我們的u-boot啟動起來了。

    然後,我們試一下将我們的u-boot寫入到nandflash去,我在筆記(一)中有寫其中的過程。

    (1)用j-link commander将u-boot.bin導入到0x30000000的位址上去。

    (2)在序列槽終端中執行u-boot指令将0x30000000位址上的資料寫到nandflash中去。

    好,我們馬上開始。我們在jlink指令行裡輸入以下指令:

    > loadbin e:u-boot-gdbu-boot.bin 0x30000000

    然後我們轉向序列槽調試終端,執行u-boot指令:

    看來并沒有想像中的那麼順利,在燒寫norflash的時候還是遇到以前同樣的問題。至于燒寫到nandflash,也失敗了。

    燒寫norflash時出現以下錯誤:

調試U-Boot筆記(五)

    錯誤是:general flash programming error

    我把這個錯誤哪到源碼裡去搜尋了一下,其在:

調試U-Boot筆記(五)

    打開該檔案看看,查為flash_perror(int err)函數在執行。而該函數隻負責列印錯誤資訊。

    查到cp指令的執行函數,為 common/cmd_mem.c檔案中的 do_mem_cp()。

調試U-Boot筆記(五)

    跟蹤 do_mem_cp() 函數:

    重點觀察l36~46之間的代碼,這段代碼的意思就是将資料複制到norflash中去。要想知道為什麼燒寫不成功,還得進: flash_write ( (char * )addr , dest , count *size ) ; 去看看。

    common/flash.c 檔案中定義: 

    最終是調用l54的 write_buff() 來實作flash資料寫入操作。我正想跟一下這個write_buff()函數,發現u-boot工程裡有很多個write_buff()函數。感覺u- boot根據每一種類型的flash晶片都做了一套flash驅動接口。這時,我在想:“我是不是沒有選對flash晶片喲?”

    好了,夜很深了,明天再繼續探究。 

繼續閱讀