MINI2440有一个2M的NOR FLASH,NOR FLASH在MINI2440上其实是一个容量较小的ROM,不过它比NAND要好的地方在于可以执行代码。当开关打在nor的时候,就选择从NOR FLASH启动,NOR FLASH是直接映射到0x00000000地址上开始工作的。关于nor和nand的区别以及在mini2440上启动时候的差别请参看CSDN上的帖子,分析的挺好,这里不赘述了。
一.追踪cfi_flash.c和jedec_flash.c找出nor 型号
后面的移植工作参照网上大牛对tq2440的u-boot-2014.04的移植方法,在此对他们的工作表示感谢。
因为我们现在要在u-boot里面添加进去对我们板子上的nor flash的读写支持,
根据文件名,我查了下什么是cfi,什么是jedec,找到如下描述:
CFI为公共Flash接口[CommonFlash Interface], 用来帮助程序从Flash芯片中获取操作方式信息。
JEDEC用来帮助程序读取Flash的制造商ID和设备ID,以确定Flash的大小和算法。
首先在jedec_flash.c中添加mini2440的nor flash型号的内容。查阅mini2440用户手册知道mini2440使用的的nor flash型号为:SST39VF1602(AMD29LV160DB)与此引脚兼容。我们看到在jedec_flash.c的第47行:
#define SST39LF160 0x2782
#define SST39VF1601 0x234b
#define SST39LF512 0x00D4
同时与之兼容的AMD29LV160DB在第34行:
#define AM29LV160DT 0x22C4
#define AM29LV160DB 0x2249
#define AM29F017D 0x003D
但是我们在第一篇帖子启动的时候,最后出现的错误提示:
FLASH:***failed***
这里应该是FLASH部分出错了,我们在这两个文件里面追踪一下错误,打开DEBUG调试宏,可以看到调试信息。在两个文件头文件之前,记住一定要是头文件之前,打开DEBUG宏。
/* The DEBUG define must be before commonto enable debugging */
/*#define DEBUG*/
加入当前在u-boot的源码目录下,执行以下指令:
cd drivers/mtd/
vim jedec_flash.c
在头文件之前:defineDEBUG
另一个文件也是同样的操作,然后保存退出。重新回到源码目录重新编译。
生成的u-boot拷贝到tftpboot下。
tftp 0x30008000 u-boot.bin
go 0x30008000
结果出现如下信息:
U-Boot 2014.04 (Aug 24 2015 - 14:19:35)
CPUID: 32440001
FCLK: 400MHz
HCLK: 100MHz
PCLK: 50MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr 00000000 cmd f0 00f0 16bit x16 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 00000000 cmd f0 00f0 16bit x 16 bit
JEDEC PROBE: ID f0 ea00 0
fwc addr 00000000 cmd ff 00ff 16bit x 16 bit
fwc addr 00000000 cmd 90 0090 16bit x 16 bit
fwc addr 00000000 cmd ff 00ff 16bit x 16 bit
JEDEC PROBE: ID 90 ea00 0
*** failed ***
### ERROR ### Please RESET the board ###
u-boot探测到的 norflash型号我们的列表里没有,ea00。难道是因为没有从norflash启动的原因,为此我在自己的nor flash里面烧写一个u-boot,然后从nor 启动再将编译好的u-boot按照上面的方法下载进去试试。
这时候打印信息如下:
U-Boot 2014.04 (Aug 24 2015 - 14:19:35)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr 00000000 cmd f0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa 00aa 16bit x 16bit
fwc addr 00005554 cmd 55 0055 16bit x 16bit
fwc addr 0000aaaa cmd 90 0090 16bit x 16bit
fwc addr 00000000 cmd f0 00f0 16bit x 16bit
JEDEC PROBE: ID 1 2249 0
fwc addr 00000000 cmd ff 00ff 16bit x 16bit
fwc addr 00000000 cmd 90 0090 16bit x 16bit
fwc addr 00000000 cmd ff 00ff 16bit x 16bit
JEDEC PROBE: ID 14 ea00 0
*** failed ***
### ERROR ### Please RESET the board ###
我们探测到了自己的norflash的device_id为2249,和我们的AM29LV160DB是匹配的。但是他还是提示出错误,FLASH:***failed****
使用grep “FLASH:”* -nR搜索,程序定位在arch/arm/lib/board.c
第557行:
puts("Flash: ");
flash_size = flash_init();
if (flash_size > 0)
{
******
} else { //557行
puts(failed);
hang();
}
也就是说,如果flash_size>0,才会进去,否则就输出failed,而flash_size=flash_init(),也就是说flash_init()出了问题,切过去。
flash_init()函数在文件cfi_flash.c里面,在第2332行:
unsignedlong flash_init (void)
{
unsigned long size = 0;
int i;
#ifdefCONFIG_SYS_FLASH_PROTECTION
/* read environment from EEPROM */
char s[64];
getenv_f("unlock", s,sizeof(s));
#endif
/* Init: no FLASHes known */
for (i = 0; i flash_info[i].flash_id =FLASH_UNKNOWN; /* Optionally write flashconfiguration register */ cfi_flash_set_config_reg(cfi_flash_bank_addr(i), cfi_flash_config_reg(i)); if(!flash_detect_legacy(cfi_flash_bank_addr(i), i)) flash_get_size(cfi_flash_bank_addr(i),i); size += flash_info[i].size; if (flash_info[i].flash_id ==FLASH_UNKNOWN) { #ifndef CONFIG_SYS_FLASH_QUIET_TEST printf ("## Unknownflash on Bank %d " "- Size =0x%08lx = %ld MBn", i+1,flash_info[i].size, flash_info[i].size>> 20); #endif /*CONFIG_SYS_FLASH_QUIET_TEST */ } #ifdefCONFIG_SYS_FLASH_PROTECTION else if ((s != NULL) &&(strcmp(s, "yes") == 0)) { /* * Only the U-Boot image and it's environment * is protected, all other sectors are * unprotected (unlocked) if flash hardware * protection is used(CONFIG_SYS_FLASH_PROTECTION) * and the environment variable"unlock" is * set to "yes". */ if(flash_info[i].legacy_unlock) { int k; /* * Disable legacy_unlock temporarily, * since flash_real_protect would * relock all other sectors again * otherwise. */ flash_info[i].legacy_unlock= 0; /* * Legacy unlocking (e.g. Intel J3) -> * unlock only one sector. This will * unlock all sectors. */ flash_real_protect(&flash_info[i], 0, 0); flash_info[i].legacy_unlock= 1; /* * Manually mark other sectors as * unlocked (unprotected) */ for (k = 1; k flash_info[i].protect[k]= 0; } else { /* * No legancy unlocking -> unlock allsectors */ flash_protect(FLAG_PROTECT_CLEAR,
上一篇:U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析
下一篇:ARM AMBA AHB-LITE协议理解