昨天,我們修改了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寫入到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時出現以下錯誤:
錯誤是:general flash programming error
我把這個錯誤哪到源碼裡去搜尋了一下,其在:
打開該檔案看看,查為flash_perror(int err)函數在執行。而該函數隻負責列印錯誤資訊。
查到cp指令的執行函數,為 common/cmd_mem.c檔案中的 do_mem_cp()。
跟蹤 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晶片喲?”
好了,夜很深了,明天再繼續探究。