一直以來,眾多的開發工具都是基於windows的,nand flash的燒寫工具也一樣。
我手頭有數塊s3c2410/s3c2440/at91sam9263/pxa310等開發板,除了在windows下,好像也找不到合適的燒寫工具。對於s3c2410僅僅只有jflash,通過並口和wiggler來燒寫。大多數筆記本根本沒有並口,連台式機有並口的都在慢慢消失,幸好我的筆記本有。但是公司的筆記本全是無並口的linux。
ARM的模擬器種類很多,比較常見的jlink, 也只能用於windows環境。偶然機會,發現OpenOCD這個好東西.接著又發現了OpenJTAG, 一個和jtagkey 是同一種layout的模擬器,而且一般配合OpenOCD使用。並且OpenJTAG用的是FT2232, 內部含兩個uart通道, 再加了一個max的uart --> rs232電平訊號轉換晶片,這樣就可以為我們的筆記本節省了一個usb轉串的線了。在USB口比較稀少的本本上,甚至為你節省了一個USB hub. 但是網上一般都賣到180一個,個人覺得太離譜了,90塊錢頂了天.
沒辦法,在taobao拍了一個, 拿過來裡面有張光碟片,裡面講的燒寫flash的方法居然是先init sdram, 再將u-boot放到sdram,通過u-boot來燒寫nand. 這和我要求相差很遠,因為我是要燒自已開發的bootloader,不是要燒別的,這樣雖然可以做到,但是也太麻煩。沒辦法,我就下了個最新版的OpenOCD,查看裡面的代碼,居然有燒寫nand的部分,而且支援好幾種nand.
好了,廢話少說,先說怎麼實現直接燒寫吧,下面以s3c2440為例:
這裡省略OpenOCD 編譯,可以到csdn的下載中心搜尋我上傳的openjtag.tar.bz2的打包檔案,裡面openocd的代碼我做了小更改,並且在README有編譯和使用的詳細步驟.
首先在你的openocd.cfg中的最後加入:
nand device s3c2440 0
然後啟動openocd:
openocd
再用telnet連上openocd:
telnet 127.0.0.1 4444
然後在執行nand的命令的前,都要先用nand probe探測:
nand probe 0
看是否找到你的nand flash, 記得給開發板上電喲.
有的平台可能會出現 Address translation failure, 那是因為Openocd有bug, 本來D cache沒有開,它認為了開了,並且認為MMU也開了,訪問的每個地址都會進行轉換,而又找不到頁表,所以就出現轉換錯誤。解決辦法就是用:
reset; halt
將開發重啟,注意, 將reset;halt輸在一行,中間用分號隔開,這樣arm剛重啟就暫停了,這個時候d cache肯定是關著的。這個時候再用:
nand probe 0
就不會出現地址轉換失敗了.
接下來就可以進行讀、擦除、寫了:
從第0個nand上第10位元組開始讀512個位元組到dump.bin檔案中:
nand dump 0 /dump.bin 10 512
從第0個nand上第9塊擦除到第15塊(共擦除了7 * block_size個位元組):
nand erase 0 9 15
將/u-boot.bin寫到第0個nand上的4K開始的地方:
nand write 0 /u-boot.bin 4096
注意,寫之前都要先擦除。寫的時候是根據你檔案大小來寫的。
很多時候會出現寫不成功的情況,你可以在寫完用nand dump看一下寫成功沒有,沒有的話再寫一遍就OK了。