U-Boot-1.2.0源码学习(3)

书接前文,初始化函数列表执行完毕后,接下来就要进行一系列的外设初始化的工作了,首先进入 flash_init()函数,它的定义在 board/smdk2410/flash.c中:

ulong flash_init (void) { int i, j; ulong size = 0; for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) { ulong flashbase = 0; flash_info[i].flash_id = #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 "Unknown flash configured" #endif flash_info[i].size = FLASH_BANK_SIZE; flash_info[i].sector_count = CFG_MAX_FLASH_SECT; memset (flash_info[i].protect, 0, CFG_MAX_FLASH_SECT); if (i == 0) flashbase = PHYS_FLASH_1; else panic ("configured too many flash banks!/n"); for (j = 0; j < flash_info[i].sector_count; j++) { 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; } } size += flash_info[i].size; } 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; }

你可能感兴趣的:(工作,Flash)