#ifdef CFG_FLASH_CFI
uchar portwidth; /* the width of the port */ uchar chipwidth; /* the width of the chip */ ushort buffer_size; /* # of bytes in write buffer */ ulong erase_blk_tout; /* maximum block erase timeout */
ulong write_tout; /* maximum write timeout */ ulong buffer_write_tout; /* maximum buffer write timeout */
ushort vendor; /* the primary vendor id */ ushort cmd_reset; /* Vendor specific reset command */ ushort interface; /* used for x8/x16 adjustments */ #endif } flash_info_t;
下面就是对这个结构的填充 */
flash_info[i].flash_id = //我这块sbc2410的NorFlash型号是29LV160DB
#if defined(CONFIG_AMD_LV400)
(AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV400B & FLASH_TYPEMASK); #elif defined(CONFIG_AMD_LV800)
(AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV800B & FLASH_TYPEMASK);
#else
#error \
//以上没有这个型号,若默认编译,只能认出是512K的,实际是2M的,若要移植到sbc2410上,这里要修改才能得到正确的容量 #endif
flash_info[i].size = FLASH_BANK_SIZE;
//在/include/configs/smdk2410.h文件中定义了此块NorFlash的PHY_FLASH_SIZE,我这个应该是2M
flash_info[i].sector_count = CFG_MAX_FLASH_SECT;
//擦除的单元总数,在smdk2410.h中定义为19(1M容量的NorFlash,我这块应该是多少个?),即flash中的扇区总数目
memset (flash_info[i].protect, 0, CFG_MAX_FLASH_SECT);//取消扇区的写保护?
if (i == 0)
flashbase = PHYS_FLASH_1; else
panic (\); //只有一块Norflash,如果i > 0了表示不止一块
for (j = 0; j < flash_info[i].sector_count; j++) {
//初始化每个扇区的首地址。其中,前4个扇区的大小和后面不同,需要分开设置。??
if (j <= 3) {
/* 1st one is 16 KB */ if (j == 0) {
flash_info[i].start[j] = flashbase + 0; }
/* 2nd and 3rd are both 8 KB */ if ((j == 1) || (j == 2)) { flash_info[i].start[j] = flashbase + 0x4000 + (j - 1) * 0x2000; }
/* 4th 32 KB */ if (j == 3) {
flash_info[i].start[j] = flashbase + 0x8000; } } else {
flash_info[i].start[j] =
flashbase + (j - 3) * MAIN_SECT_SIZE; //后面的扇区都是0x10000,即64KB } }
size += flash_info[i].size; //计算此块flash的总size,供最后return }
flash_protect (FLAG_PROTECT_SET, CFG_FLASH_BASE,
CFG_FLASH_BASE + monitor_flash_len - 1, &flash_info[0]); //此函数有待研究
flash_protect (FLAG_PROTECT_SET, CFG_ENV_ADDR,
CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);
return size; }