S3c2440如何利用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是可以像記憶體SDRAM一樣直接操作,但是NAND Flash必須操作nand的控制器。
一、方法一,利用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是否連線正常)。/* 此時SDRAM已經初始化好了 */
以下是在J-Link commander裡的命令,先假設u-boot.bin在你電腦的D盤根目錄下。
執行命令方式如下:
h
speed 12000 //設定TCK為12M,下載程式時會很快
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的 0 ~40000
二、方法二,直接通過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/fl2440.h檔案中新增:
#define CONFIG_SKIP_LOWLEVEL_INIT 1 //用來支援uboot在記憶體中直接執行 跳過底層初始化 。新增這個巨集定義之後,U-boot就跳過了記憶體初始化的部分,因為此時我們的記憶體已經先由“2440init.bin“初始化好了,再次初始化會出現記憶體資料的丟失。
做好上面的準備工作之後,首先將開發板設為從NAND Flash啟動,啟動J-Link commander,先假設“uboot.bin”和“2440init.bin”,"u-boot_SDRAM.bin"在電腦的D盤根目錄下。
h
speed 12000
loadbin d:\2440init.bin 0 /* 初始化SDRAM的程式,就是U-boot的start.S修改的 */
setpc 0
g
h
為什麼需要把"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
loadbin d:\u-boot.bin 0x30000000 //用來臨時存放資料,存放的是真正的u-boot.bin
loadbin d:\u-boot_sdram.bin 0x33f80000 / /0x33f80000 是把U-boot放在SDRAM記憶體最上面的512k的空間
setpc 0x33f80000 /* 啟動我們跳過底層初始化的u-boot.bin */
g //TEXT_BASE = 0x33F80000
這時你應該可以在串列埠看到U-boot的輸出資訊了,然後我們在U-boot命令列模式輸入NAND Flash擦除和寫入命令即可:
nand erase 0 40000 //
nand write 30000000 0 40000 //把前面下載到0x3000000的u-boot.bin下載NAND
根據上面的步驟就可以完成u-boot到NAND Flash的燒寫了,實際上是利用一個SDRAM中執行的u-boot去燒寫u-boot.bin到NAND Flash中。