很多同學使用筆記本作為自己的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盤根目錄下。
**執行命令方式如下:**
~~~
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去 ?
~~~
## 二、方法二,直接通過JLink
假如你的開發板沒有NOR Flash或者是你使用的NOR Flash還未被J-FLASH ARM所支持,這時上面的方法你就無法使用了,這時候你需要一個初始化內存SDRAM的程序,這個程序完成的功能也就是配置好SDRAM的寄存器,使它能正常工作,fl2440的內存初始化程序[下載地址](http://download.csdn.net/detail/yanghao23/4391863):“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 ? ? ? //就是光盤上的初始化內存函數
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 ? ? //用來臨時存放數據
//setpc 0x30000000 ? ? //是不能運行的,運行后會出錯,相當于初始化兩次SDRAM,數據將丟失
//g ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //在這里只是把這個需要燒寫的程序放在這個地址空間。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//后面這個u-boot.bin(再次強調是個特殊u-boot) 你可以當作一個臺階,用著與燒寫真正的u-boot.bin?
loadbin d:\u-boot.bin 0x33f80000 ? ? ? ? ? / /0x33f80000 是把U-boot放在SDRAM內存最上面的512k的空間
setpc 0x33f80000 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //u-boot-2010.09\board\fl2440\config.mk文件里面放在把U-boot放在內存的那個地址空間
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中。
`mv u-boot.bin u-boot_SDRAM.bin ?&& chmod 777 u-boot_SDRAM.bin `
參考地址:http://blog.csdn.net/yanghao23/article/details/7689534
- 前言
- FL2440的u-boot-2010.09移植(一)
- FL2440的u-boot-2010.09移植(二)
- FL2440的U-boot-2009.08移植(三)支持Nor FLASH
- FL2440的U-boot-2009.08移植(四) 支持DM900網卡
- FL2440的U-boot-2009.08移植(五)uboot架構中NAND Flash驅動修改
- FL2440如何利用JLINK燒寫U-boot到NAND Flash中
- uboot中的快捷菜單的制作說明
- env_relocate 函數深入分析
- U-boot mkimage指定Linux內核地址時的兩種方式
- 實現u-boot對yaffs/yaffs2文件系統下載的支持