1. 程式人生 > >如何利用JLINK燒寫U-boot到NAND Flash中

如何利用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

所支援,這時上面的方法你就無法使用了,這時候你需要一個初始化記憶體SDRAM的程式,這個程式完成的功能也就是配置好SDRAM的暫存器,使它能正常工作,fl2440的記憶體初始化程式下載地址:“2440init.bin”。你還需要準備一個特殊的u-boot_SDRAM.bin,它與你要燒寫到NAND Flash的u-boot.bin有區別,u-boot_SDRAM.bin編譯時需要在include/configs/開發板配置檔案.h檔案中新增:

#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中。