Support up to 7 banks for ids as specified in JEDEC JEP106Z

see http://www.jedec.org/download/search/jep106Z.pdf
Add some second source legacy flash chips 256x8.

Signed-off-by: Niklaus Giger <niklaus.giger@member.fsf.org>
Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
Niklaus Giger 2009-07-22 17:13:24 +02:00 committed by Stefan Roese
parent d3870bd2d8
commit 3a7b2c21fb
3 changed files with 89 additions and 3 deletions

View File

@ -106,6 +106,8 @@
#define ATM_CMD_SOFTLOCK_START 0x80
#define ATM_CMD_LOCK_SECT 0x40
#define FLASH_CONTINUATION_CODE 0x7F
#define FLASH_OFFSET_MANUFACTURER_ID 0x00
#define FLASH_OFFSET_DEVICE_ID 0x01
#define FLASH_OFFSET_DEVICE_ID2 0x0E
@ -1541,13 +1543,22 @@ static int cmdset_intel_init(flash_info_t *info, struct cfi_qry *qry)
static void cmdset_amd_read_jedec_ids(flash_info_t *info)
{
ushort bankId = 0;
uchar manuId;
flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
flash_unlock_seq(info, 0);
flash_write_cmd(info, 0, info->addr_unlock1, FLASH_CMD_READ_ID);
udelay(1000); /* some flash are slow to respond */
info->manufacturer_id = flash_read_uchar (info,
FLASH_OFFSET_MANUFACTURER_ID);
manuId = flash_read_uchar (info, FLASH_OFFSET_MANUFACTURER_ID);
/* JEDEC JEP106Z specifies ID codes up to bank 7 */
while (manuId == FLASH_CONTINUATION_CODE && bankId < 0x800) {
bankId += 0x100;
manuId = flash_read_uchar (info,
bankId | FLASH_OFFSET_MANUFACTURER_ID);
}
info->manufacturer_id = manuId;
switch (info->chipwidth){
case FLASH_CFI_8BIT:

View File

@ -68,6 +68,17 @@
#define SST39SF010A 0x00B5
#define SST39SF020A 0x00B6
/* MXIC */
#define MX29LV040 0x004F
/* WINBOND */
#define W39L040A 0x00D6
/* AMIC */
#define A29L040 0x0092
/* EON */
#define EN29LV040A 0x004F
/*
* Unlock address sets for AMD command sets.
@ -225,6 +236,62 @@ static const struct amd_flash_info jedec_table[] = {
ERASEINFO(0x10000,8),
}
},
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = MX29LV040,
.name = "MXIC MX29LV040",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA /* x8 */
},
.DevSize = SIZE_512KiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 1,
.regions = {
ERASEINFO(0x10000, 8),
}
},
{
.mfr_id = (u16)WINB_MANUFACT,
.dev_id = W39L040A,
.name = "WINBOND W39L040A",
.uaddr = {
[0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
},
.DevSize = SIZE_512KiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 1,
.regions = {
ERASEINFO(0x10000, 8),
}
},
{
.mfr_id = (u16)AMIC_MANUFACT,
.dev_id = A29L040,
.name = "AMIC A29L040",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA /* x8 */
},
.DevSize = SIZE_512KiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 1,
.regions = {
ERASEINFO(0x10000, 8),
}
},
{
.mfr_id = (u16)EON_MANUFACT,
.dev_id = EN29LV040A,
.name = "EON EN29LV040A",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA /* x8 */
},
.DevSize = SIZE_512KiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 1,
.regions = {
ERASEINFO(0x10000, 8),
}
},
#endif
#ifdef CONFIG_SYS_FLASH_LEGACY_512Kx16
{

View File

@ -46,7 +46,7 @@ typedef struct {
ushort cmd_reset; /* vendor specific reset command */
ushort interface; /* used for x8/x16 adjustments */
ushort legacy_unlock; /* support Intel legacy (un)locking */
uchar manufacturer_id; /* manufacturer id */
ushort manufacturer_id; /* manufacturer id */
ushort device_id; /* device id */
ushort device_id2; /* extended device id */
ushort ext_addr; /* extended query table address */
@ -154,6 +154,7 @@ extern flash_info_t *flash_get_info(ulong base);
* Device IDs
*/
/* Manufacturers inside bank 0 have ids like 0x00xx00xx */
#define AMD_MANUFACT 0x00010001 /* AMD manuf. ID in D23..D16, D7..D0 */
#define FUJ_MANUFACT 0x00040004 /* FUJITSU manuf. ID in D23..D16, D7..D0 */
#define ATM_MANUFACT 0x001F001F /* ATMEL */
@ -166,6 +167,13 @@ extern flash_info_t *flash_get_info(ulong base);
#define TOSH_MANUFACT 0x00980098 /* TOSHIBA manuf. ID in D23..D16, D7..D0 */
#define MT2_MANUFACT 0x002C002C /* alternate MICRON manufacturer ID*/
#define EXCEL_MANUFACT 0x004A004A /* Excel Semiconductor */
#define AMIC_MANUFACT 0x00370037 /* AMIC manuf. ID in D23..D16, D7..D0 */
#define WINB_MANUFACT 0x00DA00DA /* Winbond manuf. ID in D23..D16, D7..D0 */
/* Manufacturers inside bank 1 have ids like 0x01xx01xx */
#define EON_MANUFACT 0x011C011C /* EON manuf. ID in D23..D16, D7..D0 */
/* Manufacturers inside bank 2 have ids like 0x02xx02xx */
/* Micron Technologies (INTEL compat.) */
#define MT_ID_28F400_T 0x44704470 /* 28F400B3 ID ( 4 M, top boot sector) */