diff --git a/Makefile b/Makefile index b3f8b2f..62c6a74 100644 --- a/Makefile +++ b/Makefile @@ -36,20 +36,19 @@ ifeq ($(OS_ARCH), Darwin) CPPFLAGS += -I/opt/local/include -I/usr/local/include LDFLAGS += -framework IOKit -framework DirectIO -L/opt/local/lib -L/usr/local/lib endif ifeq ($(OS_ARCH), FreeBSD) CPPFLAGS += -I/usr/local/include LDFLAGS += -L/usr/local/lib endif CHIP_OBJS = jedec.o stm50flw0x0x.o w39v080fa.o sharplhf00l04.o w29ee011.o \ - sst28sf040.o am29f040b.o mx29f002.o m29f400bt.o pm29f002.o w39v040c.o \ - w49f002u.o 82802ab.o pm49fl00x.o sst49lf040.o en29f002a.o m29f002.o \ + sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \ sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o LIB_OBJS = layout.o CLI_OBJS = flashrom.o cli_classic.o cli_output.o print.o PROGRAMMER_OBJS = udelay.o programmer.o all: pciutils features dep $(PROGRAM) diff --git a/flash.h b/flash.h index f0ac246..290a91a 100644 --- a/flash.h +++ b/flash.h @@ -148,20 +148,26 @@ enum chipbustype { #define NUM_ERASEREGIONS 5 /* * How many different erase functions do we have per chip? */ #define NUM_ERASEFUNCTIONS 5 #define FEATURE_REGISTERMAP (1 << 0) #define FEATURE_BYTEWRITES (1 << 1) +#define FEATURE_EITHER_RESET (0 << 4) +#define FEATURE_SHORT_RESET (1 << 4) +#define FEATURE_LONG_RESET FEATURE_EITHER_RESET #define FEATURE_ADDR_FULL (0 << 2) #define FEATURE_ADDR_MASK (3 << 2) +#define FEATURE_ADDR_2AA (1 << 2) +#define FEATURE_ADDR_AAA (2 << 2) +#define FEATURE_ADDR_SHIFTED 0 struct flashchip { const char *vendor; const char *name; enum chipbustype bustype; /* * With 32bit manufacture_id and model_id we can cover IDs up to diff --git a/flashchips.c b/flashchips.c index 03686e6..6ffefa2 100644 --- a/flashchips.c +++ b/flashchips.c @@ -56,44 +56,46 @@ struct flashchip flashchips[] = { { .vendor = "AMD", .name = "Am29F010A/B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F010B, /* Same as Am29F010A */ .total_size = 128, .page_size = 16 * 1024, - .tested = TEST_OK_PRW, - .probe = probe_29f040b, + .feature_bits = FEATURE_ADDR_2AA, + .tested = TEST_OK_PR, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 8} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_pm29f002, + .write = write_jedec, .read = read_memmapped, }, { .vendor = "AMD", .name = "Am29F002(N)BB", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F002BB, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, @@ -113,18 +115,19 @@ struct flashchip flashchips[] = { { .vendor = "AMD", .name = "Am29F002(N)BT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F002BT, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, @@ -144,148 +147,154 @@ struct flashchip flashchips[] = { { .vendor = "AMD", .name = "Am29F016D", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F016D, .total_size = 2 * 1024, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, - .probe = probe_29f040b, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {2048 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMD", .name = "Am29F040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F040B, .total_size = 512, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, - .probe = probe_29f040b, + .feature_bits = FEATURE_ADDR_2AA, + .tested = TEST_OK_PR, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMD", .name = "Am29F080B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29F080B, .total_size = 1024, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMD", .name = "Am29LV040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29LV040B, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, - .probe = probe_29f040b, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMD", .name = "Am29LV081B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMD_ID, .model_id = AM_29LV080B, .total_size = 1024, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, - .probe = probe_29f040b, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "ASD", .name = "AE49F2008", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ASD_ID, .model_id = ASD_AE49F2008, .total_size = 256, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_FIXME, .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, @@ -835,18 +844,19 @@ struct flashchip flashchips[] = { { .vendor = "Atmel", .name = "AT29C512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C512, .total_size = 64, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_jedec, .probe_timing = 10000, /* 10mS, Enter=Exec */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -859,18 +869,19 @@ struct flashchip flashchips[] = { { .vendor = "Atmel", .name = "AT29C010A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C010A, .total_size = 128, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10000, /* 10mS, Enter=Exec */ .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -882,18 +893,19 @@ struct flashchip flashchips[] = { { .vendor = "Atmel", .name = "AT29C020", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C020, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_jedec, .probe_timing = 10000, /* 10ms */ .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -905,18 +917,19 @@ struct flashchip flashchips[] = { { .vendor = "Atmel", .name = "AT29C040A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_29C040A, .total_size = 512, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10000, /* 10 ms */ .erase = NULL, .block_erasers = { { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -1072,41 +1085,43 @@ struct flashchip flashchips[] = { { .vendor = "Atmel", .name = "AT49BV512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_49BV512, .total_size = 64, .page_size = 64, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Atmel", .name = "AT49F002(N)", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_49F002N, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, @@ -1114,30 +1129,31 @@ struct flashchip flashchips[] = { {96 * 1024, 1}, {128 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Atmel", .name = "AT49F002(N)T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ATMEL_ID, .model_id = AT_49F002NT, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, @@ -1145,19 +1161,19 @@ struct flashchip flashchips[] = { {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, /* The next two chip definitions have top/bottom boot blocks, but has no device differenciation between the two */ { .vendor = "AMIC", .name = "A25L40PT", .bustype = CHIP_BUSTYPE_SPI, @@ -1223,95 +1239,98 @@ struct flashchip flashchips[] = { { .vendor = "AMIC", .name = "A29002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A29002B, .total_size = 256, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, - .block_erase = erase_sector_29f002, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, }, }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMIC", .name = "A29002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A29002T, .total_size = 256, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_OK_PR, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, - .block_erase = erase_sector_29f002, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, }, }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMIC", .name = "A29040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A29040B, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_OK_PR, - .probe = probe_29f040b, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "AMIC", .name = "A49LF040A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = AMIC_ID_NOPREFIX, .model_id = AMIC_A49LF040A, @@ -1338,18 +1357,19 @@ struct flashchip flashchips[] = { { .vendor = "EMST", .name = "F49B002UA", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EMST_ID, .model_id = EMST_F49B002UA, .total_size = 256, .page_size = 4096, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, @@ -1357,19 +1377,19 @@ struct flashchip flashchips[] = { {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Eon", .name = "EN25B05", .bustype = CHIP_BUSTYPE_SPI, .manufacture_id = EON_ID_NOPREFIX, .model_id = EN_25B05, @@ -2145,18 +2165,19 @@ struct flashchip flashchips[] = { { .vendor = "EON", .name = "EN29F002(A)(N)B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EON_ID, .model_id = EN_29F002B, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, @@ -2176,18 +2197,19 @@ struct flashchip flashchips[] = { { .vendor = "EON", .name = "EN29F002(A)(N)T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EON_ID, .model_id = EN_29F002T, .total_size = 256, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, @@ -2207,80 +2229,83 @@ struct flashchip flashchips[] = { { .vendor = "Fujitsu", .name = "MBM29F004BC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F004BC, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 7}, }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, .write = NULL, .read = read_memmapped, }, { .vendor = "Fujitsu", .name = "MBM29F004TC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F004TC, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, .write = NULL, .read = read_memmapped, }, { .vendor = "Fujitsu", .name = "MBM29F400BC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F400BC, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_SHIFTED, .tested = TEST_UNTESTED, .probe = probe_m29f400bt, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, @@ -2300,18 +2325,19 @@ struct flashchip flashchips[] = { { .vendor = "Fujitsu", .name = "MBM29F400TC", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = FUJITSU_ID, .model_id = MBM29F400TC, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_SHIFTED, .tested = TEST_UNTESTED, .probe = probe_m29f400bt, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, @@ -2331,18 +2357,19 @@ struct flashchip flashchips[] = { { .vendor = "Intel", .name = "28F001BX-B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = INTEL_ID, .model_id = P28F001BXB, .total_size = 128, .page_size = 128 * 1024, /* 8k + 2x4k + 112k */ + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_BAD_WRITE, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {8 * 1024, 1}, @@ -2358,18 +2385,19 @@ struct flashchip flashchips[] = { { .vendor = "Intel", .name = "28F001BX-T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = INTEL_ID, .model_id = P28F001BXT, .total_size = 128, .page_size = 128 * 1024, /* 112k + 2x4k + 8k */ + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PR|TEST_BAD_WRITE, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {112 * 1024, 1}, @@ -2385,18 +2413,19 @@ struct flashchip flashchips[] = { { .vendor = "Intel", .name = "82802AB", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = INTEL_ID, .model_id = I_82802AB, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_82802ab_block, @@ -2408,18 +2437,19 @@ struct flashchip flashchips[] = { { .vendor = "Intel", .name = "82802AC", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = INTEL_ID, .model_id = I_82802AC, .total_size = 1024, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_82802ab_block, @@ -2798,156 +2828,161 @@ struct flashchip flashchips[] = { { .vendor = "Macronix", .name = "MX29F001B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F001B, .total_size = 128, .page_size = 32 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_OK_PR, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {8 * 1024, 1}, {4 * 1024, 2}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 1}, }, - .block_erase = erase_sector_29f002, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, } }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Macronix", .name = "MX29F001T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F001T, .total_size = 128, .page_size = 32 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_OK_PR, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 1}, {32 * 1024, 1}, {8 * 1024, 2}, {4 * 1024, 2}, {8 * 1024, 1}, }, - .block_erase = erase_sector_29f002, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, } }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Macronix", .name = "MX29F002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F002B, .total_size = 256, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {32 * 1024, 1}, {64 * 1024, 3}, }, - .block_erase = erase_sector_29f002, /* This erase function has 64k blocksize for eLiteFlash */ + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, }, }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Macronix", .name = "MX29F002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29F002T, .total_size = 256, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_OK_PR, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, - .block_erase = erase_sector_29f002, /* This erase function has 64k blocksize for eLiteFlash */ + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, }, }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Macronix", .name = "MX29LV040", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = MX_ID, .model_id = MX_29LV040, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .tested = TEST_OK_PR, - .probe = probe_29f002, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, - .block_erase = erase_sector_29f002, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f002, + .block_erase = erase_chip_block_jedec, }, }, .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Numonyx", .name = "M25PE10", @@ -3281,98 +3316,101 @@ struct flashchip flashchips[] = { { .vendor = "PMC", .name = "Pm29F002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_29F002T, .total_size = 256, .page_size = 8 * 1024, - .tested = TEST_OK_PRW, - .probe = probe_29f040b, + .feature_bits = FEATURE_ADDR_2AA, + .tested = TEST_OK_PR, + .probe = probe_jedec, .probe_timing = TIMING_FIXME, .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_pm29f002, + .write = write_jedec, .read = read_memmapped, }, { .vendor = "PMC", .name = "Pm29F002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_29F002B, .total_size = 256, .page_size = 8 * 1024, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_UNTESTED, - .probe = probe_29f040b, + .probe = probe_jedec, .probe_timing = TIMING_FIXME, .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, {8 * 1024, 2}, {96 * 1024, 1}, {128 * 1024, 1}, }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, }, }, - .write = write_pm29f002, + .write = write_jedec, .read = read_memmapped, }, { .vendor = "PMC", .name = "Pm39LV010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_39F010, .total_size = 128, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 2} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "PMC", .name = "Pm49FL002", .bustype = CHIP_BUSTYPE_LPC|CHIP_BUSTYPE_FWH, /* A/A Mux*/ .manufacture_id = PMC_ID_NOPREFIX, .model_id = PMC_49FL002, @@ -3458,18 +3496,19 @@ struct flashchip flashchips[] = { { .vendor = "Sharp", .name = "LHF00L04", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SHARP_ID, .model_id = SHARP_LHF00L04, .total_size = 1024, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_ZERO, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 15}, @@ -3745,18 +3784,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST28SF040A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_28SF040, .total_size = 512, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_28sf040, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst28sf040.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {128, 4096} }, .block_erase = erase_sector_28sf040, @@ -3771,18 +3811,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST29EE010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29EE010, .total_size = 128, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -3794,18 +3835,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST29LE010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29LE010, .total_size = 128, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -3817,18 +3859,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST29EE020A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29EE020A, .total_size = 256, .page_size = 128, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_OK_PRW, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -3840,18 +3883,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST29LE020", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_29LE020, .total_size = 256, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -3877,230 +3921,238 @@ struct flashchip flashchips[] = { { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39SF010A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF010, .total_size = 128, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39SF020A", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF020, .total_size = 256, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39SF040", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39SF040, .total_size = 512, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39VF512", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF512, .total_size = 64, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns*/ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39VF010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF010, .total_size = 128, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39VF020", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF020, .total_size = 256, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39VF040", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF040, .total_size = 512, .page_size = 4096, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PROBE, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST39VF080", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SST_ID, .model_id = SST_39VF080, .total_size = 1024, .page_size = 4096, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST49LF002A/B", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF002A, @@ -4193,18 +4245,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST49LF004C", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = SST_ID, .model_id = SST_49LF004C, .total_size = 512, .page_size = 4 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_49lfxxxc, @@ -4254,18 +4307,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST49LF008C", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = SST_ID, .model_id = SST_49LF008C, .total_size = 1024, .page_size = 4 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sector_49lfxxxc, @@ -4285,18 +4339,19 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST49LF016C", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = SST_ID, .model_id = SST_49LF016C, .total_size = 2048, .page_size = 4 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, .block_erase = erase_sector_49lfxxxc, @@ -4316,164 +4371,169 @@ struct flashchip flashchips[] = { { .vendor = "SST", .name = "SST49LF020", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF020, .total_size = 256, .page_size = 16 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {16 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = NULL, } }, - .write = write_49lf040, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST49LF020A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF020A, .total_size = 256, .page_size = 4 * 1024, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {16 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = NULL, } }, - .write = write_49lf040, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST49LF040", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF040, .total_size = 512, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 1, /* 150 ns */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = NULL, } }, - .write = write_49lf040, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST49LF040B", .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF040B, .total_size = 512, .page_size = 64 * 1024, - .feature_bits = FEATURE_REGISTERMAP, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 1, /* 150ns | routine is wrapper to probe_jedec (sst_fwhub.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = NULL, } }, - .write = write_49lf040, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST49LF080A", .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = SST_ID, .model_id = SST_49LF080A, .total_size = 1024, .page_size = 4096, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_FIXME, .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = NULL, } }, - .write = write_49lf040, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SST", .name = "SST49LF160C", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = SST_ID, .model_id = SST_49LF160C, .total_size = 2048, .page_size = 4 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ .erase = erase_49lfxxxc, .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, @@ -4812,18 +4872,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M29F002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F002B, .total_size = 256, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_AAA, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, @@ -4831,87 +4892,90 @@ struct flashchip flashchips[] = { {32 * 1024, 1}, {64 * 1024, 3}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_m29f002b, + .write = write_jedec, .read = read_memmapped, }, { .vendor = "ST", .name = "M29F002T/NT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F002T, .total_size = 256, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_ADDR_AAA, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_m29f002t, + .write = write_jedec, .read = read_memmapped, }, { .vendor = "ST", .name = "M29F040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F040B, .total_size = 512, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, - .probe = probe_29f040b, + .feature_bits = FEATURE_ADDR_2AA, + .tested = TEST_OK_PR, + .probe = probe_jedec, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, - .block_erase = erase_sector_29f040b, + .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_29f040b, + .block_erase = erase_chip_block_jedec, } }, - .write = write_29f040b, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "ST", .name = "M29F400BT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29F400BT, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_ADDR_SHIFTED, .tested = TEST_UNTESTED, .probe = probe_m29f400bt, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 7}, @@ -4931,18 +4995,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M29W010B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29W010B, .total_size = 128, .page_size = 16 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 8}, }, .block_erase = erase_sector_jedec, @@ -4957,18 +5022,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M29W040B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = ST_ID, .model_id = ST_M29W040B, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_sector_jedec, @@ -5123,18 +5189,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M50FW002", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW002, .total_size = 256, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_49lfxxxc, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, @@ -5154,18 +5221,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M50FW016", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW016, .total_size = 2048, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 32}, }, .block_erase = erase_block_stm50flw0x0x, @@ -5180,18 +5248,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M50FW040", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW040, .total_size = 512, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8}, }, .block_erase = erase_block_stm50flw0x0x, @@ -5206,18 +5275,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M50FW080", .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50FW080, .total_size = 1024, .page_size = 64 * 1024, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_82802ab, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16}, }, .block_erase = erase_block_stm50flw0x0x, @@ -5232,18 +5302,19 @@ struct flashchip flashchips[] = { { .vendor = "ST", .name = "M50LPW116", .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */ .manufacture_id = ST_ID, .model_id = ST_M50LPW116, .total_size = 2048, .page_size = 64 * 1024, + .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 16}, @@ -5264,122 +5335,127 @@ struct flashchip flashchips[] = { { .vendor = "SyncMOS", .name = "S29C31004T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C31004T, .total_size = 512, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {1 * 1024, 512} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SyncMOS", .name = "S29C51001T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C51001T, .total_size = 128, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {512, 256} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SyncMOS", .name = "S29C51002T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C51002T, .total_size = 256, .page_size = 128, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {512, 512} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "SyncMOS", .name = "S29C51004T", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = SYNCMOS_ID, .model_id = S29C51004T, .total_size = 512, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = NULL, .block_erasers = { { .eraseblocks = { {1 * 1024, 512} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, }, }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "TI", .name = "TMS29F002RB", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = TI_OLD_ID, .model_id = TI_TMS29F002RB, .total_size = 256, .page_size = 16384, /* Non-uniform sectors */ + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {16 * 1024, 1}, @@ -5399,18 +5475,19 @@ struct flashchip flashchips[] = { { .vendor = "TI", .name = "TMS29F002RT", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = TI_OLD_ID, .model_id = TI_TMS29F002RT, .total_size = 256, .page_size = 16384, /* Non-uniform sectors */ + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, @@ -5675,19 +5752,20 @@ struct flashchip flashchips[] = { { .vendor = "Winbond", .name = "W29C011", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C011, .total_size = 128, .page_size = 128, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, /* used datasheet for the W29C011A */ .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } @@ -5698,19 +5776,19 @@ struct flashchip flashchips[] = { { .vendor = "Winbond", .name = "W29C020C", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C020C, .total_size = 256, .page_size = 128, - .tested = TEST_OK_PRW, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } @@ -5721,18 +5799,19 @@ struct flashchip flashchips[] = { { .vendor = "Winbond", .name = "W29C040P", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C040P, .total_size = 512, .page_size = 256, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -5744,18 +5823,19 @@ struct flashchip flashchips[] = { { .vendor = "Winbond", .name = "W29EE011", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_29C011, .total_size = 128, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRW, .probe = probe_w29ee011, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (w29ee011.c) */ .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = erase_chip_block_jedec, @@ -5767,213 +5847,221 @@ struct flashchip flashchips[] = { { .vendor = "Winbond", .name = "W39V040A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V040A, .total_size = 512, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W39V040B", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V040B, .total_size = 512, .page_size = 64 * 1024, - .tested = TEST_OK_PR | TEST_BAD_WRITE, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W39V040C", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V040C, .total_size = 512, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, - .probe = probe_w39v040c, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, + .probe = probe_jedec, .probe_timing = TIMING_FIXME, .erase = NULL, /* Was erase_w39v040c */ .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_w39v040c, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W39V040FA", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_39V040FA, .total_size = 512, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = erase_block_jedec, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W39V080A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_39V080A, .total_size = 1024, .page_size = 64 * 1024, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W49F002U", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = W_49F002U, .total_size = 256, .page_size = 128, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W49V002A", .bustype = CHIP_BUSTYPE_LPC, .manufacture_id = WINBOND_ID, .model_id = W_49V002A, .total_size = 256, .page_size = 128, - .tested = TEST_OK_PRW, + .feature_bits = FEATURE_LONG_RESET, + .tested = TEST_OK_PR, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W49V002FA", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_49V002FA, .total_size = 256, .page_size = 128, + .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = 10, .erase = NULL, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, @@ -5981,19 +6069,19 @@ struct flashchip flashchips[] = { {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = erase_sector_jedec, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = erase_chip_block_jedec, } }, - .write = write_49f002, + .write = write_jedec_1, .read = read_memmapped, }, { .vendor = "Winbond", .name = "W39V080FA", .bustype = CHIP_BUSTYPE_FWH, .manufacture_id = WINBOND_ID, .model_id = W_39V080FA, diff --git a/jedec.c b/jedec.c index 055fbc3..84bacfd 100644 --- a/jedec.c +++ b/jedec.c @@ -21,18 +21,19 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "flash.h" #define MAX_REFLASH_TRIES 0x10 #define MASK_FULL 0xffff #define MASK_2AA 0x7ff +#define MASK_AAA 0xfff /* Check one byte for odd parity */ uint8_t oddparity(uint8_t val) { val = (val ^ (val >> 4)) & 0xf; val = (val ^ (val >> 2)) & 0x3; return (val ^ (val >> 1)) & 0x1; } @@ -92,20 +93,19 @@ void data_polling_jedec(chipaddr dst, uint8_t data) void start_program_jedec_common(struct flashchip *flash, unsigned int mask) { chipaddr bios = flash->virtual_memory; chip_writeb(0xAA, bios + (0x5555 & mask)); chip_writeb(0x55, bios + (0x2AAA & mask)); chip_writeb(0xA0, bios + (0x5555 & mask)); } -int probe_jedec_common(struct flashchip *flash, - unsigned int mask, int long_reset) +int probe_jedec_common(struct flashchip *flash, unsigned int mask) { chipaddr bios = flash->virtual_memory; uint8_t id1, id2; uint32_t largeid1, largeid2; uint32_t flashcontent1, flashcontent2; int probe_timing_enter, probe_timing_exit; if (flash->probe_timing > 0) probe_timing_enter = probe_timing_exit = flash->probe_timing; @@ -146,19 +146,19 @@ int probe_jedec_common(struct flashchip *flash, largeid1 |= id1; } if (id2 == 0x7F) { largeid2 <<= 8; id2 = chip_readb(bios + 0x101); largeid2 |= id2; } /* Issue JEDEC Product ID Exit command */ - if (long_reset) + if ((flash->feature_bits & FEATURE_SHORT_RESET) == 0) { chip_writeb(0xAA, bios + (0x5555 & mask)); if (probe_timing_exit) programmer_delay(10); chip_writeb(0x55, bios + (0x2AAA & mask)); if (probe_timing_exit) programmer_delay(10); } chip_writeb(0xF0, bios + (0x5555 & mask)); @@ -373,101 +373,125 @@ retry: return failed; } int getaddrmask(struct flashchip *flash) { switch (flash->feature_bits & FEATURE_ADDR_MASK) { case FEATURE_ADDR_FULL: return MASK_FULL; break; + case FEATURE_ADDR_2AA: + return MASK_2AA; + break; + case FEATURE_ADDR_AAA: + return MASK_AAA; + break; default: fprintf(stderr, "%s called with unknown mask\n", __func__); return 0; break; } } int write_jedec(struct flashchip *flash, uint8_t *buf) { + int mask; int i, failed = 0; int total_size = flash->total_size * 1024; int page_size = flash->page_size; + mask = getaddrmask(flash); + if (erase_chip_jedec(flash)) { fprintf(stderr,"ERASE FAILED!\n"); return -1; } printf("Programming page: "); for (i = 0; i < total_size / page_size; i++) { printf("%04d at address: 0x%08x", i, i * page_size); if (write_page_write_jedec_common(flash, buf + i * page_size, - i * page_size, page_size, MASK_FULL)) + i * page_size, page_size, mask)) failed = 1; printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); } printf("\n"); return failed; } int write_jedec_1(struct flashchip *flash, uint8_t * buf) { int i; chipaddr bios = flash->virtual_memory; chipaddr dst = bios; + int mask; + + mask = getaddrmask(flash); programmer_delay(10); if (erase_flash(flash)) { fprintf(stderr, "ERASE FAILED!\n"); return -1; } printf("Programming page: "); for (i = 0; i < flash->total_size; i++) { if ((i & 0x3) == 0) printf("address: 0x%08lx", (unsigned long)i * 1024); - write_sector_jedec_common(flash, buf + i * 1024, dst + i * 1024, 1024, MASK_FULL); + write_sector_jedec_common(flash, buf + i * 1024, dst + i * 1024, 1024, mask); if ((i & 0x3) == 0) printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); } printf("\n"); return 0; } /* erase chip with block_erase() prototype */ int erase_chip_block_jedec(struct flashchip *flash, unsigned int addr, unsigned int blocksize) { + int mask; + + mask = getaddrmask(flash); if ((addr != 0) || (blocksize != flash->total_size * 1024)) { fprintf(stderr, "%s called with incorrect arguments\n", __func__); return -1; } - return erase_chip_jedec_common(flash, MASK_FULL); + return erase_chip_jedec_common(flash, mask); } int probe_jedec(struct flashchip *flash) { int mask; mask = getaddrmask(flash); - return probe_jedec_common(flash, mask, 1); + return probe_jedec_common(flash, mask); } int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int size) { - return erase_sector_jedec_common(flash, page, size, MASK_FULL); + int mask; + + mask = getaddrmask(flash); + return erase_sector_jedec_common(flash, page, size, mask); } int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int size) { - return erase_block_jedec_common(flash, page, size, MASK_FULL); + int mask; + + mask = getaddrmask(flash); + return erase_block_jedec_common(flash, page, size, mask); } int erase_chip_jedec(struct flashchip *flash) { - return erase_chip_jedec_common(flash, MASK_FULL); + int mask; + + mask = getaddrmask(flash); + return erase_chip_jedec_common(flash, mask); }