用J-LINK燒寫Bootloader到ARM開發板的Nand Flash
起因:以往電腦燒寫bootloader到 nand中是採用jtag以及jflash,jtag是使用並口連線的,目前電腦一般沒有並口了,現今一般是使用較便宜入手的J-LINK,使用USB,就不能再使用以往的jflash燒寫了。因此需要找到一個J-LINK燒寫Nand的方法。
以下說明J-LINK燒寫Nand的原理。
以realarm2410開發板為例子說明,該開發板要把跳線設定為Nand Flash啟動模式才可以操作Nand,此時的記憶體對映如下圖:
圖1 |
如圖1,記憶體中並沒有對Nand的對映,而只能通過S3C2410A中的Nand Flash的控制器訪問Nand,而訪問nand的這一段程式大小,肯定會超過4KB,因此只能放在SDRAM 中執行。假設板子出廠時是完全空白的,nand中沒有程式,斷電情況下,SDRAM和SRAM中更不可能儲存程式。那麼,可按照下面思路來進行,結合圖2的記憶體分配圖來說明。
圖2:SRAM和SDRAM的分配圖 |
把SRAM用於執行初始化SDRAM的程式init.bin,該程式小於4KB;要燒寫的bootloader.bin放在SDRAM最開始的1MB空間內,通常bootloader只有幾十KB,留出1MB的空間已足夠;從0x33df3000-0x33ef3000的1MB空間用於存放燒寫的執行程式碼RO的段,1MB的Heap和20K的Stack也如圖2所示分配,剩下的SDRAM用作RW段。
因此,燒寫步驟為:
- 準備好init.bin,bootloader.bin,program.bin三個檔案;
- 把init.bin載入到SRAM中,並執行;
- 把bootloader.bin載入到SDRAM的0x30000000-0x30100000;
- 把program.bin載入到SDRAM的0x33df3000-0x33ef3000中,並執行;
下面進行具體說明。
二、準備好init.bin,bootloader.bin,program.bin檔案
init.bin是一小段在SRAM中執行的,初始化SDRAM的程式,如何通過分散載入檔案來設定程式的載入段,參考我的另一篇博文Keil MDK使用J-LINK分別在Sram,Nor Flash以及Sdram中除錯程式碼的原理和方法,該文介紹了設定RO、RW、Stack、Heap等載入位置的原理和方法。程式的實現也很簡單,不再贅述。這裡提供init.bin的MDK工程
bootloader.bin本文采用vivi,因為不同的開發板bootloader不一樣,所以請根據實際選擇。
program.bin涉及到nand flash的控制器對nand的操作,以及壞塊識別、ecc糾錯等,具體可參照S3C2410A以及NAND FLASH的資料手冊,本文主要不是論述nand驅動的,不在本文贅述;要把程式設定為在SDRAM的0x33df3000起始位置載入執行,也請參考我的另一篇博文Keil MDK使用J-LINK分別在Sram,Nor Flash以及Sdram中除錯程式碼的原理和方法。這裡提供program.bin的MDK工程下載。
三、載入Init.bin到SRAM中執行
載入bin檔案可以使用J-LINK進行,為方便敘述,把準備好的init.bin,vivi(就是bootloader.bin),program.bin放到JLink.exe的目錄中,執行JLink.exe,進入控制檯。連線開發板串列埠0到電腦串列埠,並開啟電腦的串列埠終端(建議使用SecureCRT)。在JLink控制檯按如下進行操作:
J-Link復位:
J-Link> r
載入init.bin到0x0位置(即SRAM的起始地址),設定PC為0x0,並執行:
J-Link> Loadbin InitSdram.bin 0
J-Link> setpc 0
J-Link> go
這樣SDRAM就被初始化了。
四、載入bootloader.bin到0x30000000-0x30100000
這裡bootloader.bin就是vivi檔案。按如下操作:
暫停init.bin的執行:
J-Link> h
載入vivi到0x30000000起始的位置:
J-Link> Loadbin vivi 0x30000000
五、載入program到0x33df3000並執行
載入program.bin到0x33df3000並執行:
J-Link> Loadbin program.bin 0x33df3000
J-Link> setpc 0x33df3000
J-Link> go
在電腦串列埠終端上可以看到列印的燒寫Nand Flash過程的資訊,以及校驗結果。燒寫完成後,重新啟動開發板就可以看到vivi的啟動介面以及串列埠列印資訊了。
修改或移植了新的bootloader後,仍可按照這個方式燒寫。有了bootloader後,核心以及檔案系統的燒寫自然就不在話下了。