|
|
|
@ -104,6 +104,7 @@ |
|
|
|
|
#define FLASH_OFFSET_DEVICE_ID2 0x0E |
|
|
|
|
#define FLASH_OFFSET_DEVICE_ID3 0x0F |
|
|
|
|
#define FLASH_OFFSET_CFI 0x55 |
|
|
|
|
#define FLASH_OFFSET_CFI_ALT 0x555 |
|
|
|
|
#define FLASH_OFFSET_CFI_RESP 0x10 |
|
|
|
|
#define FLASH_OFFSET_PRIMARY_VENDOR 0x13 |
|
|
|
|
#define FLASH_OFFSET_EXT_QUERY_T_P_ADDR 0x15 /* extended query table primary addr */ |
|
|
|
@ -154,6 +155,8 @@ typedef union { |
|
|
|
|
|
|
|
|
|
#define NUM_ERASE_REGIONS 4 /* max. number of erase regions */ |
|
|
|
|
|
|
|
|
|
static uint flash_offset_cfi[2]={FLASH_OFFSET_CFI,FLASH_OFFSET_CFI_ALT}; |
|
|
|
|
|
|
|
|
|
/* use CFG_MAX_FLASH_BANKS_DETECT if defined */ |
|
|
|
|
#ifdef CFG_MAX_FLASH_BANKS_DETECT |
|
|
|
|
static ulong bank_base[CFG_MAX_FLASH_BANKS_DETECT] = CFG_FLASH_BANKS_LIST; |
|
|
|
@ -343,7 +346,7 @@ unsigned long flash_init (void) |
|
|
|
|
if (flash_info[i].flash_id == FLASH_UNKNOWN) { |
|
|
|
|
#ifndef CFG_FLASH_QUIET_TEST |
|
|
|
|
printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n", |
|
|
|
|
i, flash_info[i].size, flash_info[i].size << 20); |
|
|
|
|
i+1, flash_info[i].size, flash_info[i].size << 20); |
|
|
|
|
#endif /* CFG_FLASH_QUIET_TEST */ |
|
|
|
|
} |
|
|
|
|
#ifdef CFG_FLASH_PROTECTION |
|
|
|
@ -1136,6 +1139,7 @@ static void flash_read_jedec_ids (flash_info_t * info) |
|
|
|
|
*/ |
|
|
|
|
static int flash_detect_cfi (flash_info_t * info) |
|
|
|
|
{ |
|
|
|
|
int cfi_offset; |
|
|
|
|
debug ("flash detect cfi\n"); |
|
|
|
|
|
|
|
|
|
for (info->portwidth = CFG_FLASH_CFI_WIDTH; |
|
|
|
@ -1144,20 +1148,22 @@ static int flash_detect_cfi (flash_info_t * info) |
|
|
|
|
info->chipwidth <= info->portwidth; |
|
|
|
|
info->chipwidth <<= 1) { |
|
|
|
|
flash_write_cmd (info, 0, 0, info->cmd_reset); |
|
|
|
|
flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI); |
|
|
|
|
if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q') |
|
|
|
|
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') |
|
|
|
|
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) { |
|
|
|
|
info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE); |
|
|
|
|
info->cfi_offset=flash_offset_cfi[cfi_offset]; |
|
|
|
|
debug ("device interface is %d\n", |
|
|
|
|
info->interface); |
|
|
|
|
debug ("found port %d chip %d ", |
|
|
|
|
info->portwidth, info->chipwidth); |
|
|
|
|
debug ("port %d bits chip %d bits\n", |
|
|
|
|
info->portwidth << CFI_FLASH_SHIFT_WIDTH, |
|
|
|
|
info->chipwidth << CFI_FLASH_SHIFT_WIDTH); |
|
|
|
|
return 1; |
|
|
|
|
for (cfi_offset=0; cfi_offset < sizeof(flash_offset_cfi)/sizeof(uint); cfi_offset++) { |
|
|
|
|
flash_write_cmd (info, 0, flash_offset_cfi[cfi_offset], FLASH_CMD_CFI); |
|
|
|
|
if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q') |
|
|
|
|
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') |
|
|
|
|
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) { |
|
|
|
|
info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE); |
|
|
|
|
info->cfi_offset=flash_offset_cfi[cfi_offset]; |
|
|
|
|
debug ("device interface is %d\n", |
|
|
|
|
info->interface); |
|
|
|
|
debug ("found port %d chip %d ", |
|
|
|
|
info->portwidth, info->chipwidth); |
|
|
|
|
debug ("port %d bits chip %d bits\n", |
|
|
|
|
info->portwidth << CFI_FLASH_SHIFT_WIDTH, |
|
|
|
|
info->chipwidth << CFI_FLASH_SHIFT_WIDTH); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|