如何利用JLINK燒寫U-boot到NAND Flash中
很多同學使用筆記本作為自己的ARM開發和學習的平臺,絕大多數筆記本都沒有並口,也就是無法使用JTag除錯和燒寫程式到Nand Flash中,幸好我們還有JLINK,用JLINK燒寫U-boot到Nor Flash中很簡單,大部分NOR Flash都已經被JLink的軟體SEGGER所支援,而新手在學習的時候經常會實驗各種各樣的命令,最悲劇的莫過於將NAND Flash中原有的bootloader給刪除了,這時候開發板上電後由於沒有bootloader,硬體沒有被初始化,在NAND Flash中的作業系統也就無法被載入,開發板成“磚”了,這時候筆記本又無法利用JTag燒寫程式進Nand Flash。其實這些可以利用JLink通過兩種方法解決:
一、方法一,利用NOR Flash。
這種方法是利用JLink能夠燒寫程式到NOR Flash來完成的,首先利用J-FLASH ARM將u-boot.bin燒寫進NOR Flash(記得燒寫到NOR Flash的0x0起始地址處),然後設定開發板從NOR Flash啟動,這時候系統進入U-boot命令列模式,這時候開啟J-Link commander,輸入命令:r 看JLink是否能識別開發板的資訊(也就是判斷JLink是否連線正常)。
以下是在J-Link commander裡的命令,先假設u-boot.bin在你電腦的D盤根目錄下。
1. speed 12000 //設定TCK為12M,下載程式時會很快 2. loadbin d:\u-boot.bin 0x30000000 注意:0x30000000是你想要下載u-boot.bin到開發板的記憶體地址,記憶體地址根據不同的開發板設定不同,因為本文中使用的是FL2440,片上系統是S3C2440,記憶體掛載的地址區域是0x30000000~0x33ffffff,我們只需要把u-boot.bin下載到這片區域即可,
然後我們在U-boot命令列模式輸入NAND Flash擦除和寫入命令即可:
nand erase 0 40000
// 擦除從0地址開始的大小為0x40000的Nnad Flash扇區,0x40000是待寫入的U-boot.bin的大致長度,長度必須為NAND Flash頁大小的整數倍,通常會需要比u-boot.bin實際長度長。
nand write 30000000 0 40000 // 把前面下載到0x30000000的u-boot.bin燒寫到Nand去
然後我們再設定開發板從NAND Flash啟動即可。
二、方法二,直接通過JLink
假如你的開發板沒有NOR Flash或者是你使用的NOR Flash還未被J-FLASH ARM
#define CONFIG_SKIP_LOWLEVEL_INIT 1 //用來支援uboot在記憶體中直接執行
新增這個巨集定義之後,U-boot就跳過了記憶體初始化的部分,因為此時我們的記憶體已經先由“2440init.bin“初始化好了,再次初始化會出現記憶體資料的丟失。
做好上面的準備工作之後,首先將開發板設為從NAND Flash啟動,啟動J-Link commander,先假設“u-boot.bin”和“2440init.bin”在電腦的D盤根目錄下。
loadbin d:\2440init.bin 0
setpc 0
g
為什麼需要把"2440init.bin"複製到0x0地址是因為S3C2440有4K的SRAM,它不需要初始化就可以直接執行程式,從NAND Flash啟動時,這個SRAM的地址會掛載到0x0~0x1000的地址空間,我們先把"2440init.bin"複製到SRAM中執行,執行這部分後S3C2440的SDRAM記憶體就初始化好了(地址空間0x30000000~0x33ffffff)。也許有人會說為什麼不一開始就把u-boot_SDRAM.bin放在SRAM中執行啊?SRAM只有4K的大小,而U-boot通常在100~300K,SRAM的空間顯然不夠,而"2440init.bin"的大小隻有不到2K,它可以在SRAM中執行。
記憶體初始化成功後,下載特製的u-boot_SDRAM.bin:
h
loadbin e:\u-boot_SDRAM.bin 0x33f80000
setpc 0x33f80000
g
這時你應該可以在串列埠看到U-boot的輸出資訊了,然後我們在U-boot命令列模式輸入NAND Flash擦除和寫入命令即可:
nand erase 0 40000
// 擦除從0地址開始的大小為0x40000的Nnad Flash扇區,0x40000是待寫入的U-boot.bin的大致長度,長度必須為NAND Flash頁大小的整數倍,通常會需要比u-boot.bin實際長度長。
nand write 30000000 0 40000 // 把前面下載到0x30000000的u-boot.bin燒寫到Nand去
根據上面的步驟就可以完成u-boot到NAND Flash的燒寫了,實際上是利用一個SDRAM中執行的u-boot去燒寫u-boot.bin到NAND Flash中。