u-boot2012.04支持norflash
1. nand flash 启动启动代码
U-Boot 2012.04.01 (Jul 22 2016 - 13:26:28)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###
搜索:Flash:
puts("Flash: "); Board.c (arch\arm\lib)
代码关系:
==> nand flash 启动没有必要 hang 。
==>注销 puts(failed); hang();
2. 解决无法nor flash启动的问题
(结果为0)
面对复杂的问题。使用打印信息解决
打开cfi_flash 的 DEBUG宏
nor flash启动。 usb 下载
usb 1 30000000
protect off all
erase 0 7ffff
cp.b 30000000 0 80000
U-Boot 2012.04.01 (Jul 22 2016 - 22:02:57)
搜索:JEDEC PROBE
确定取得的ID 数据对不对
没有识别出所用的这个nor flasdh 芯片
修改:#define CONFIG_SYS_MAX_FLASH_SECT (19) 为
#define CONFIG_SYS_MAX_FLASH_SECT (120)
去掉 cfi_flash 的调试信息
make
//RO 软件指定为只读
测试 u-boot 之后的数据。能否写
SMDK2410 # erase 80000 8ffff
//如果在第二阶段之前,没有重新设置栈,将会有问题
可以使用loady 来进行下载 (使用超级终端 )
没有网络的情况下,可以使用这种方法,进行u-boot的更新
1. nand flash 启动启动代码
U-Boot 2012.04.01 (Jul 22 2016 - 13:26:28)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###
搜索:Flash:
puts("Flash: "); Board.c (arch\arm\lib)
代码关系:
board_init_r
puts("Flash: ");
flash_size = flash_init(); //对nor flash的初始化
if (flash_size > 0)
print_size(flash_size, "\n");
else {
puts(failed); // static char *failed = "*** failed ***\n";
hang(); // puts("### ERROR ### Please RESET the board ###\n") for (;;);
}
==> nand flash 启动没有必要 hang 。
==>注销 puts(failed); hang();
2. 解决无法nor flash启动的问题
unsigned long flash_init (void)
cfi_flash_bank_addr(在si中显示灰色) (drivers/mtd/cfi_flash.c:100:static phys_addr_t __cfi_flash_bank_addr(int i)
-->phys_addr_t cfi_flash_bank_addr(int i)
__attribute__((weak, alias("__cfi_flash_bank_addr")));
static phys_addr_t __cfi_flash_bank_addr(int i)
{
return ((phys_addr_t [])CONFIG_SYS_FLASH_BANKS_LIST)[i];
}
(结果为0)
面对复杂的问题。使用打印信息解决
打开cfi_flash 的 DEBUG宏
nor flash启动。 usb 下载
usb 1 30000000
protect off all
erase 0 7ffff
cp.b 30000000 0 80000
U-Boot 2012.04.01 (Jul 22 2016 - 22:02:57)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr (null) cmd f0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa 00aa 16bit x 16 bit
fwc addr 00005554 cmd 55 0055 16bit x 16 bit
fwc addr 0000aaaa cmd 90 0090 16bit x 16 bit
fwc addr (null) cmd f0 00f0 16bit x 16 bit
JEDEC PROBE: ID c2 2249 0
fwc addr (null) cmd ff 00ff 16bit x 16 bit
fwc addr (null) cmd 90 0090 16bit x 16 bit
fwc addr (null) cmd ff 00ff 16bit x 16 bit
JEDEC PROBE: ID 13 ea00 0
0 KB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: CS8900-0
搜索:JEDEC PROBE
确定取得的ID 数据对不对
没有识别出所用的这个nor flasdh 芯片
在 static const struct amd_flash_info jedec_table[] = { // Jedec_flash.c (drivers\mtd) 添加一下代码
/*jz2440 v2 MT29D160DT*/
{
.mfr_id = (u16)MX_MANUFACT, /*厂家 ID*/
.dev_id = 0X2249, /*设备ID*/
.name = "MXIC MT29D160DT", /*名字*/
.uaddr = { /*解锁地址 ,nor flash写之前需要解锁,这个地址是nor flash角度看到的地址*/
[1] = MTD_UADDR_0x0555_0x02AA /* x16 */
},
.DevSize = SIZE_2MiB, /*总大小*/
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4, /*擦除区域的个数,擦除块是多少*/
.regions = {
ERASEINFO(16 * 1024, 1),
ERASEINFO(8 * 1024, 2),
ERASEINFO(32 * 1024, 1),
ERASEINFO(64 * 1024, 31),
}
}
修改:#define CONFIG_SYS_MAX_FLASH_SECT (19) 为
#define CONFIG_SYS_MAX_FLASH_SECT (120)
去掉 cfi_flash 的调试信息
make
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: ERROR: too many flash sectors
2 MiB //已经识别出来
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: CS8900-0
SMDK2410 # flinfo
Bank # 1: MXIC MT29D160DT flash (16 x 16) Size: 2 MB in 19 Sectors
AMD Legacy command set, Manufacturer ID: 0xC2, 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 RO 00040000 RO 00050000 RO 00060000 RO
00070000 RO 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000
//RO 软件指定为只读
测试 u-boot 之后的数据。能否写
SMDK2410 # erase 80000 8ffff
. done
Erased 1 sectors
SMDK2410 # cp.b 30000000 80000 10000 //对刚才擦除的地方进行写
Copy to Flash... 9....8....7....6....5....4....3....2....1....done
md.b 30000000
SMDK2410 # md.b 30000000
30000000: 14 00 00 ea 14 f0 9f e5 14 f0 9f e4 14 f0 9f e5
30000010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5
30000020: 60 01 f0 33 c0 01 f0 33 20 02 f0 33 80 02 f0 33
30000030: e0 02 f0 33 40 03 f0 33 a0 03 f0 33 ef be ad de
SMDK2410 # md.b 80000
00080000: 14 00 00 ea 14 f0 9f e5 14 f0 9f e4 14 f0 9f e5
00080010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5
00080020: 60 01 f0 33 c0 01 f0 33 20 02 f0 33 80 02 f0 33
00080030: e0 02 f0 33 40 03 f0 33 a0 03 f0 33 ef be ad de
mw.b 30000000 12345678
erase 80000 8ffff
cp.b 30000000 80000 10000
cmp.b 30000000 80000 10000
SMDK2410 # cmp 30000000 800000 10000
word at 0x30000008 (0xe49ff014) != word at 0x00800008 (0xe59ff014)
Total of 2 words were the same
//如果在第二阶段之前,没有重新设置栈,将会有问题
可以使用loady 来进行下载 (使用超级终端 )
没有网络的情况下,可以使用这种方法,进行u-boot的更新