diff options
Diffstat (limited to 'board/emk/common/flash.c')
-rw-r--r-- | board/emk/common/flash.c | 96 |
1 files changed, 81 insertions, 15 deletions
diff --git a/board/emk/common/flash.c b/board/emk/common/flash.c index adfa9a0..966bb5c 100644 --- a/board/emk/common/flash.c +++ b/board/emk/common/flash.c @@ -40,9 +40,11 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */ #define FLASH_CYCLE2 0x02aa #define FLASH_ID1 0 #define FLASH_ID2 1 + #define FLASH_ID3 0x0e + #define FLASH_ID4 0x0F #endif -#if defined (CONFIG_TOP5200) +#if defined (CONFIG_TOP5200) && !defined (CONFIG_LITE5200) typedef unsigned char FLASH_PORT_WIDTH; typedef volatile unsigned char FLASH_PORT_WIDTHV; #define FLASH_ID_MASK 0xFF @@ -54,6 +56,24 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */ #define FLASH_CYCLE2 0x0555 #define FLASH_ID1 0 #define FLASH_ID2 2 + #define FLASH_ID3 0x1c + #define FLASH_ID4 0x1E +#endif + +#if defined (CONFIG_TOP5200) && defined (CONFIG_LITE5200) + typedef unsigned char FLASH_PORT_WIDTH; + typedef volatile unsigned char FLASH_PORT_WIDTHV; + #define FLASH_ID_MASK 0xFF + + #define FPW FLASH_PORT_WIDTH + #define FPWV FLASH_PORT_WIDTHV + + #define FLASH_CYCLE1 0x0555 + #define FLASH_CYCLE2 0x02aa + #define FLASH_ID1 0 + #define FLASH_ID2 1 + #define FLASH_ID3 0x0E + #define FLASH_ID4 0x0F #endif /*----------------------------------------------------------------------- @@ -183,6 +203,15 @@ void flash_print_info (flash_info_t *info) case FLASH_AM160B: fmt = "29LV160%s (16 Mbit, %s)\n"; break; + case FLASH_AMLV640U: + fmt = "29LV640M (64 Mbit)\n"; + break; + case FLASH_AMDLV065D: + fmt = "29LV065D (64 Mbit)\n"; + break; + case FLASH_AMLV256U: + fmt = "29LV256M (256 Mbit)\n"; + break; default: fmt = "Unknown Chip Type\n"; break; @@ -239,7 +268,6 @@ void flash_print_info (flash_info_t *info) ulong flash_get_size (FPWV *addr, flash_info_t *info) { int i; - ulong offset; /* Write auto select command: read Manufacturer ID */ /* Write auto select command sequence and test FLASH answer */ @@ -278,27 +306,64 @@ ulong flash_get_size (FPWV *addr, flash_info_t *info) info->flash_id += FLASH_AM160B; info->sector_count = 35; info->size = 0x00200000; -#ifdef CFG_LOWBOOT - offset = 0; -#else - offset = 0x00e00000; -#endif - info->start[0] = (ulong)addr + offset; - info->start[1] = (ulong)addr + offset + 0x4000; - info->start[2] = (ulong)addr + offset + 0x6000; - info->start[3] = (ulong)addr + offset + 0x8000; + info->start[0] = (ulong)addr; + info->start[1] = (ulong)addr + 0x4000; + info->start[2] = (ulong)addr + 0x6000; + info->start[3] = (ulong)addr + 0x8000; for (i = 4; i < info->sector_count; i++) { - info->start[i] = (ulong)addr + offset + 0x10000 * (i-3); + info->start[i] = (ulong)addr + 0x10000 * (i-3); + } + break; + + case (FPW)AMD_ID_LV065D: + info->flash_id += FLASH_AMDLV065D; + info->sector_count = 128; + info->size = 0x00800000; + for (i = 0; i < info->sector_count; i++) + { + info->start[i] = (ulong)addr + 0x10000 * i; } break; + case (FPW)AMD_ID_MIRROR: + /* MIRROR BIT FLASH, read more ID bytes */ + if ((FPW)addr[FLASH_ID3] == (FPW)AMD_ID_LV640U_2 && + (FPW)addr[FLASH_ID4] == (FPW)AMD_ID_LV640U_3) + { + info->flash_id += FLASH_AMLV640U; + info->sector_count = 128; + info->size = 0x00800000; + for (i = 0; i < info->sector_count; i++) + { + info->start[i] = (ulong)addr + 0x10000 * i; + } + break; + } + if ((FPW)addr[FLASH_ID3] == (FPW)AMD_ID_LV256U_2 && + (FPW)addr[FLASH_ID4] == (FPW)AMD_ID_LV256U_3) + { + /* attention: only the first 16 MB will be used in u-boot */ + info->flash_id += FLASH_AMLV256U; + info->sector_count = 256; + info->size = 0x01000000; + for (i = 0; i < info->sector_count; i++) + { + info->start[i] = (ulong)addr + 0x10000 * i; + } + break; + } + + /* fall thru to here ! */ default: - printf ("unknown AMD device=%x ", (FPW)addr[FLASH_ID2]); + printf ("unknown AMD device=%x %x %x", + (FPW)addr[FLASH_ID2], + (FPW)addr[FLASH_ID3], + (FPW)addr[FLASH_ID4]); info->flash_id = FLASH_UNKNOWN; info->sector_count = 0; - info->size = 0; - return (0); /* => no or unknown flash */ + info->size = 0x800000; + break; } /* Put FLASH back in read mode */ @@ -329,6 +394,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last) switch (info->flash_id & FLASH_TYPEMASK) { case FLASH_AM160B: + case FLASH_AMLV640U: break; case FLASH_UNKNOWN: default: |