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

时间:2022-05-25 17:16:49

硬件平台: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 allUn-Protect Flash Bank # 1TQ2440 # 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 10Total of 16 byte(s) were the same
same说明写进去了。

norflash读操作

TQ2440 # md.b 33f8000033f80000: 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 33FBFFF033fbfff0: 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中,没有成功启动。什么原因呢?
明天继续。