开发环境:
系统:ubuntu 10.04.4
单板:tq2440
NAND FLASH:K9F1216U0A 256MB
NOR Flash:EN29LV160AB 2MB
SDRAM:HY57V561620 x2 64MB
NET:DM9000AEP
编译器:arm-linux-gcc-4.3.2
虽然单板现在支持NAND Flash、NOR Flash启动,但u-boot还不支持读写NAND Flash、NOR Flash,继续完善u-boot.修改u-boot支持NOR Flash
1.定义DEBUG,输出调试信息
drivers/mtd/cfi_flash.c:增加宏定义
#define _DEBUG 1//*add print message
#define DEBUG 1//*add print message
change@change:~$ cd Si/TQ2440/u-boot-2012.04.01/
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make distclean
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make TQ2440_config
Configuring for TQ2440 board...
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make
编译成功,烧写到NAND启动串口输出
U-Boot 2012.04.01 (May 03 2013 - 10:25:00)
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 f0 ea00 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 90 ea00 0
0 KB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: no support
TQ2440 #
上面是NOR Flash发出的各种命令,识别出JEDEC PROBE: ID f0 ea00 0
2.修改代码
change@change:~/Si/TQ2440/u-boot-2012.04.01$ grep "JEDEC PROBE" * -nR
drivers/mtd/cfi_flash.c:1699: debug("JEDEC PROBE: ID %x %x %x\n",
Binary file drivers/mtd/libmtd.o matches
Binary file drivers/mtd/cfi_flash.o matches
Binary file u-boot matches
Binary file u-boot.bin matches
change@change:~/Si/TQ2440/u-boot-2012.04.01$
进入drivers/mtd/cfi_flash.c:1699,看到打印ID后会跟jedec_flash_mach匹配,找到数组jedec_table[],去找与之匹配的id f0 ea00 0,找不到就增加该设备ID
结合NOR Flash手册修改代码drivers/mtd/jedec_flash.c370:
{
.mfr_id = 0xf0,//nanufaction id
.dev_id = 0xea00,//device id
.name = "TQ2440 NOR",
.uaddr = {/*Nor flash */
[1] = MTD_UADDR_0x0555_0x02AA /* x16 */
},
.DevSize = SIZE_2MiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x4000, 1),
ERASEINFO(0x2000, 2),
ERASEINFO(0x8000, 1),
ERASEINFO(0x10000, 31),
}
},
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make distclean
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make TQ2440_config
Configuring for TQ2440 board...
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make
烧写测试,NAND启动串口输出
U-Boot 2012.04.01 (May 03 2013 - 11:21:29)
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 f0 ea00 0
ERROR: too many flash sectors
1 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: no support
TQ2440 #
change@change:~/Si/TQ2440/u-boot-2012.04.01$ grep "too many flash sectors" * -nR
drivers/mtd/cfi_flash.c:2020: printf("ERROR: too many flash sectors\n");
Binary file drivers/mtd/libmtd.o matches
drivers/mtd/jedec_flash.c:444: printf("ERROR: too many flash sectors\n");
Binary file drivers/mtd/jedec_flash.o matches
Binary file drivers/mtd/cfi_flash.o matches
Binary file u-boot matches
Binary file u-boot.bin matches
change@change:~/Si/TQ2440/u-boot-2012.04.01$
修改include/configs/TQ2440.h191:
//#define CONFIG_SYS_MAX_FLASH_SECT (19)
#define CONFIG_SYS_MAX_FLASH_SECT (128)
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make distclean
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make TQ2440_config
Configuring for TQ2440 board...
change@change:~/Si/TQ2440/u-boot-2012.04.01$ make
烧写测试,NAND启动串口输出
U-Boot 2012.04.01 (May 03 2013 - 11:33:35)基本正常,可以看到单板支持NOR Flash