u-boot-2014.10移植第15天----nor flash操作

fulinux發表於2015-02-05

硬體平臺:tq2440

開發環境:Ubuntu-3.11

u-boot版本:2014.10

本文允許轉載,請註明出處:http://blog.csdn.net/fulinus


去除nor flash防寫

在已經執行起來的u-boot命令列去除nor flash防寫:
TQ2440 # flinfo

Bank # 1: EON EN29LV160AB flash (16 x 16)  Size: 2 MB in 35 Sectors
  AMD Legacy command set, Manufacturer ID: 0x1C, Device ID: 0x2249
  Erase timeout: 30000 ms, write timeout: 100 ms

  Sector Start Addresses:
  00000000   RO   00004000   RO   00006000   RO   00008000   RO   00010000   RO 
  00020000   RO   00030000        00040000        00050000        00060000      
  00070000   RO   00080000        00090000        000A0000        000B0000      
  000C0000        000D0000        000E0000        000F0000        00100000      
  00110000        00120000        00130000        00140000        00150000      
  00160000        00170000        00180000        00190000        001A0000      
  001B0000        001C0000        001D0000        001E0000        001F0000   
帶有RO標識的塊使能了防寫,是u-boot自己給這些塊防寫的。通過下面的命令將所有的塊解保護,不過重啟又會有:
TQ2440 # protect off all
Un-Protect Flash Bank # 1
TQ2440 # flinfo         

Bank # 1: EON EN29LV160AB flash (16 x 16)  Size: 2 MB in 35 Sectors
  AMD Legacy command set, Manufacturer ID: 0x1C, Device ID: 0x2249
  Erase timeout: 30000 ms, write timeout: 100 ms

  Sector Start Addresses:
  00000000        00004000        00006000        00008000        00010000      
  00020000        00030000        00040000        00050000        00060000      
  00070000        00080000        00090000        000A0000        000B0000      
  000C0000        000D0000        000E0000        000F0000        00100000      
  00110000        00120000        00130000        00140000        00150000      
  00160000        00170000        00180000        00190000        001A0000      
  001B0000        001C0000        001D0000        001E0000        001F0000      
TQ2440 # 


如果沒有norflash的讀者可以跳過這裡,u-boot從nor flash啟動之前先嚐試使用norflash的操作,如同對sdram的操作。

nor flash寫操作

將0x33F80000起始的16bytes寫到nor flash的0地址中去:
TQ2440 # cp.b 33f80000 0 10
如果你沒有關閉DEBUG定義,會有下面的資訊:
flash_is_busy: 0
fwc addr 00000aaa cmd aa 00aa 16bit x 16 bit
fwc addr 00000554 cmd 55 0055 16bit x 16 bit
fwc addr 00000aaa cmd a0 00a0 16bit x 16 bit
不用管這個資訊。

norflash比較操作

TQ2440 # cmp.b 0 33f80000 10
Total of 16 byte(s) were the same
same說明寫進去了。

norflash讀操作

TQ2440 # md.b 33f80000
33f80000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
33f80010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
33f80020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
33f80030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
TQ2440 #

你會很奇怪,怎麼都是0呢?我不是都把程式碼拷貝到0x33F80000這個位置了嗎?怎麼都會是0呢?我們仔細發現u-boot列印的資訊,發現u-boot做了重定向:
U-Boot code: 33F80000 -> 33FAA0E0  BSS: -> 33FAF838  u-boot的code段加上BSS段長度為194616bytes,大約190K
。。。。。。
ramsize: 04000000   SDRAM空間64M
TLB table from 33ff0000 to 33ff4000 TLB重定向到了33ff4000向上移動了0x4000(16K)
Top of RAM usable for U-Boot at: 33ff0000   u-boot可以用的空間頂點位置在33ff0000上面還有1M的預留空間(hide mem)
Reserving 190k for U-Boot at: 33fc0000 將u-boot重定位到了0x33FC0000位置
Reserving 4160k for malloc() at: 33bb0000 堆的首地址是在0x33BB0000位置,加上4160K為堆的頂點地址,即是0x33FC0000,也就是u-boot程式碼的首地址。
Reserving 28 Bytes for Board Info at: 33baffe4
Reserving 160 Bytes for Global Data at: 33baff44
New Stack Pointer is: 33baff38

也就是說u-boot程式碼被重新定位到了0x33FC0000位置,後面4160K做了堆,堆中的位元組被清0了,所以我們在讀0x33f80000位置的位元組時,它們都為0。讀0x33FC0000 - 0x10起始地址的內容:

TQ2440 # md.b 33FBFFF0
33fbfff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
33fc0000: be 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5    ................
33fc0010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5    ................
33fc0020: 60 00 f8 33 c0 00 f8 33 20 01 f8 33 80 01 f8 33    `..3...3 ..3...3
可見從0x33FC0000開始才是u-boot 的程式碼的起始位置。我們修改一下tq2440.h檔案中CONFIG_SYS_TEXT_BASE的值,讓程式碼直接從重定向的位置執行,這樣u-boot就不需要重定向操作了:
#define CONFIG_SYS_TEXT_BASE    0x33FC0000
編譯、燒錄、執行。注意燒錄和執行地址也要變。u-boot列印的資訊是和上面一樣的:
U-Boot 2014.10 (Nov 08 2014 - 17:39:09)


U-Boot code: 33FC0000 -> 33FEA0E0  BSS: -> 33FEF838
CPUID: 32440001
FCLK:  405.600 MHz
HCLK:  101.400 MHz
PCLK:   50.700 MHz
monitor len: 0002F838
ramsize: 04000000
TLB table from 33ff0000 to 33ff4000
Top of RAM usable for U-Boot at: 33ff0000
Reserving 190k for U-Boot at: 33fc0000
Reserving 4160k for malloc() at: 33bb0000
Reserving 28 Bytes for Board Info at: 33baffe4
Reserving 160 Bytes for Global Data at: 33baff44
New Stack Pointer is: 33baff38
RAM Configuration:
Bank #0: 30000000 64 MiB
。。。。。。

u-boot燒錄到nor flash中去:
1、解防寫
2、擦出nor flash;
TQ2440 # erase all

3、將0x33FC0000地址開始的190K位元組大小的內容複製到nor flash的0地址開始處。
flash寫的好慢,等了N久......
等了N久後我突然想到J-link好像可以直接向Nor flash中寫,這樣寫的就是乾淨的程式碼了。不過我還是要等這邊寫完,看看會有什麼現象。
等了半個小時還是不見停止,算了我還是將其中斷吧!

寫的速度跟蝸牛有得一比,Nor flash啊!在你和nand flash之間,叫我怎麼愛你?
看來我錯了,我把這個頻率設定的太低,所以寫的很慢。
我把它燒錄到nor flash中,沒有成功啟動。什麼原因呢?
明天繼續。



































相關文章