From 1aa80b0648337cf3dcc50932fb237ee69fd82f82 Mon Sep 17 00:00:00 2001 From: Stefan Tauner Date: Thu, 25 Jul 2013 22:58:51 +0000 Subject: Rename Numonyx and ST (SGS/Thomson) chips to Micron Micron acquired Numonyx and asked us to change the vendor names to "Micron". For the chips clearly emerging from the former manufacturers we (will) use "Micron/Numonyx/ST" and the original name for the rest. Resorting the chip entries makes the diff unreadable, hence the stand-alone commit. Corresponding to flashrom svn r1703. Signed-off-by: Stefan Tauner Acked-by: Stefan Tauner --- flashchips.c | 2221 +++++++++++++++++++++++++--------------------------------- 1 file changed, 971 insertions(+), 1250 deletions(-) diff --git a/flashchips.c b/flashchips.c index 1b6a22ea..a693290e 100644 --- a/flashchips.c +++ b/flashchips.c @@ -4077,44 +4077,6 @@ const struct flashchip flashchips[] = { .voltage = {2700, 3600}, }, - { - .vendor = "Eon", - .name = "EN25QH256", - .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25QH256, - .total_size = 32768, - .page_size = 256, - /* supports SFDP */ - /* OTP: 512B total; enter 0x3A */ - /* QPI enable 0x38, disable 0xFF */ - /* EN4B: 0xB7, EX4B: 0xE9 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, - .tested = TEST_BAD_REW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = { - { - .eraseblocks = { {4 * 1024, 8192} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 512} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { { 32768 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { { 32768 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */ - .unlock = spi_disable_blockprotect_bp3_srwd, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - { .vendor = "Eon", .name = "EN25S10", @@ -6599,392 +6561,389 @@ const struct flashchip flashchips[] = { }, { - .vendor = "MoselVitelic", - .name = "V29C51000B", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29C51000B, + .vendor = "Micron/Numonyx/ST", + .name = "M25P05-A", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25P05A, .total_size = 64, - .page_size = 512, - .feature_bits = FEATURE_EITHER_RESET, - .tested = TEST_UNTESTED, - .probe = probe_jedec, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_OK_PREW, + .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {512, 128} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {32 * 1024, 2} }, + .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + .voltage = {2700, 3600}, }, + /* The ST M25P05 is a bit of a problem. It has the same ID as the + * ST M25P05-A in RES mode, but supports only 128 byte writes instead + * of 256 byte writes. We rely heavily on the fact that probe_spi_res1 + * only is successful if RDID does not work. + */ { - .vendor = "MoselVitelic", - .name = "V29C51000T", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29C51000T, + .vendor = "Micron/Numonyx/ST", + .name = "M25P05", + .bustype = BUS_SPI, + .manufacture_id = 0, /* Not used. */ + .model_id = ST_M25P05_RES, .total_size = 64, - .page_size = 512, - .feature_bits = FEATURE_EITHER_RESET, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probe = probe_spi_res1, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {512, 128} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {32 * 1024, 2} }, + .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {64 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_1, /* 128 */ + .read = spi_chip_read, + .voltage = {2700, 3600}, }, { - .vendor = "MoselVitelic", - .name = "V29C51400B", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29C51400B, - .total_size = 512, - .page_size = 1024, - .feature_bits = FEATURE_EITHER_RESET, - .tested = TEST_UNTESTED, - .probe = probe_jedec, + .vendor = "Micron/Numonyx/ST", + .name = "M25P10-A", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25P10A, + .total_size = 128, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_OK_PRE, + .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {1024, 512} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {32 * 1024, 4} }, + .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {128 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + .voltage = {2700, 3600}, }, + /* The ST M25P10 has the same problem as the M25P05. */ { - .vendor = "MoselVitelic", - .name = "V29C51400T", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29C51400T, - .total_size = 512, - .page_size = 1024, - .feature_bits = FEATURE_EITHER_RESET, + .vendor = "Micron/Numonyx/ST", + .name = "M25P10", + .bustype = BUS_SPI, + .manufacture_id = 0, /* Not used. */ + .model_id = ST_M25P10_RES, + .total_size = 128, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probe = probe_spi_res1, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {1024, 512} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {32 * 1024, 4} }, + .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {512 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {128 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_1, /* 128 */ + .read = spi_chip_read, + .voltage = {2700, 3600}, }, { - .vendor = "MoselVitelic", - .name = "V29LC51000", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29LC51000, - .total_size = 64, - .page_size = 512, - .feature_bits = FEATURE_EITHER_RESET, + .vendor = "Micron/Numonyx/ST", /* Numonyx */ + .name = "M25P20", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25P20, + .total_size = 256, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {512, 128} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {64 * 1024, 4} }, + .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {64 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {256 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp1, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, }, { - .vendor = "MoselVitelic", - .name = "V29LC51001", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29LC51001, - .total_size = 128, - .page_size = 512, - .feature_bits = FEATURE_EITHER_RESET, - .tested = TEST_UNTESTED, - .probe = probe_jedec, + .vendor = "Micron/Numonyx/ST", + .name = "M25P20-old", + .bustype = BUS_SPI, + .manufacture_id = 0, /* Not used. */ + .model_id = ST_M25P20_RES, + .total_size = 256, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_OK_PREW, + .probe = probe_spi_res1, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {512, 256} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {64 * 1024, 4} }, + .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {128 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {256 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp1, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, }, { - .vendor = "MoselVitelic", - .name = "V29LC51002", - .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = MVC_V29LC51002, - .total_size = 256, - .page_size = 512, - .feature_bits = FEATURE_EITHER_RESET, - .tested = TEST_UNTESTED, - .probe = probe_jedec, - .probe_timing = TIMING_ZERO, - .block_erasers = + .vendor = "Micron/Numonyx/ST", /* Numonyx */ + .name = "M25P40", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25P40, + .total_size = 512, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_OK_PREW, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = { { - .eraseblocks = { {512, 512} }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {64 * 1024, 8} }, + .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {512 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + .voltage = {2700, 3600}, }, { - .vendor = "Nantronics", - .name = "N25S10", + .vendor = "Micron/Numonyx/ST", + .name = "M25P40-old", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S10, - .total_size = 128, + .manufacture_id = 0, /* Not used. */ + .model_id = ST_M25P40_RES, + .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probe = probe_spi_res1, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 32} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {4 * 1024, 32} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {32 * 1024, 4} }, - .block_erase = spi_block_erase_52, - }, { - .eraseblocks = { {64 * 1024, 2} }, + .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {128 * 1024, 1} }, - .block_erase = spi_block_erase_60, + .eraseblocks = { {512 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "Micron/Numonyx/ST", + .name = "M25P80", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25P80, + .total_size = 1024, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_OK_PREW, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { {64 * 1024, 16} }, + .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {128 * 1024, 1} }, + .eraseblocks = { {1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp3, - .unlock = spi_disable_blockprotect_bp3_srwd, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .read = spi_chip_read, .voltage = {2700, 3600}, }, { - .vendor = "Nantronics", - .name = "N25S20", + .vendor = "Micron/Numonyx/ST", + .name = "M25P16", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S20, - .total_size = 256, + .manufacture_id = ST_ID, + .model_id = ST_M25P16, + .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PR, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 64} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {4 * 1024, 64} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {32 * 1024, 8} }, - .block_erase = spi_block_erase_52, - }, { - .eraseblocks = { {64 * 1024, 4} }, + .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {256 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { {256 * 1024, 1} }, + .eraseblocks = { {2 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp3, - .unlock = spi_disable_blockprotect_bp3_srwd, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .read = spi_chip_read, .voltage = {2700, 3600}, }, { - .vendor = "Nantronics", - .name = "N25S40", + .vendor = "Micron/Numonyx/ST", + .name = "M25P32", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S40, - .total_size = 512, + .manufacture_id = ST_ID, + .model_id = ST_M25P32, + .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 128} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {4 * 1024, 128} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {32 * 1024, 16} }, - .block_erase = spi_block_erase_52, - }, { - .eraseblocks = { {64 * 1024, 8} }, + .eraseblocks = { {64 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {512 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { {512 * 1024, 1} }, + .eraseblocks = { {4 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp3, - .unlock = spi_disable_blockprotect_bp3_srwd, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .read = spi_chip_read, .voltage = {2700, 3600}, }, { - .vendor = "Nantronics", - .name = "N25S80", + .vendor = "Micron/Numonyx/ST", + .name = "M25P64", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S80, - .total_size = 1024, + .manufacture_id = ST_ID, + .model_id = ST_M25P64, + .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 256} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {32 * 1024, 32} }, - .block_erase = spi_block_erase_52, - }, { - .eraseblocks = { {64 * 1024, 16} }, + .eraseblocks = { {64 * 1024, 128} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {1024 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { {1024 * 1024, 1} }, + .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp3, - .unlock = spi_disable_blockprotect_bp3_srwd, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .read = spi_chip_read, .voltage = {2700, 3600}, }, { - .vendor = "Nantronics", - .name = "N25S16", + .vendor = "Micron/Numonyx/ST", + .name = "M25P128", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S16, - .total_size = 2048, + .manufacture_id = ST_ID, + .model_id = ST_M25P128, + .total_size = 16384, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 512} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 32} }, + .eraseblocks = { {256 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {2048 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { {2048 * 1024, 1} }, + .eraseblocks = { {16 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp3, - .unlock = spi_disable_blockprotect_bp3_srwd, + .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ + .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .read = spi_chip_read, .voltage = {2700, 3600}, }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M25PE10", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7016,7 +6975,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M25PE20", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7048,7 +7007,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M25PE40", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7080,7 +7039,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M25PE80", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7112,7 +7071,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M25PE16", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7144,49 +7103,178 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", - .name = "M45PE10", + .vendor = "Micron/Numonyx/ST", + .name = "M25PX80", .bustype = BUS_SPI, .manufacture_id = ST_ID, - .model_id = ST_M45PE10, - .total_size = 128, + .model_id = ST_M25PX80, + .total_size = 1024, .page_size = 256, - .tested = TEST_UNTESTED, + /* OTP: 64B total; read 0x4B, write 0x42 */ + .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {256, 512} }, - .block_erase = spi_block_erase_db, + .eraseblocks = { { 4 * 1024, 256 } }, + .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 2} }, + .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {1024 * 1024, 1} }, + .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_welwip, - .unlock = NULL, /* #WP pin write-protects lower 64kB. */ - .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */ - .read = spi_chip_read, /* Fast read (0x0B) supported */ + .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ + .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ + .write = spi_chip_write_256, + .read = spi_chip_read, .voltage = {2700, 3600}, }, { - .vendor = "Numonyx", - .name = "M45PE20", + .vendor = "Micron/Numonyx/ST", + .name = "M25PX16", .bustype = BUS_SPI, .manufacture_id = ST_ID, - .model_id = ST_M45PE20, - .total_size = 256, + .model_id = ST_M25PX16, + .total_size = 2048, .page_size = 256, - .tested = TEST_UNTESTED, + /* OTP: 64B total; read 0x4B; write 0x42 */ + .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, - .block_erasers = { + .block_erasers = + { { - .eraseblocks = { {256, 1024} }, - .block_erase = spi_block_erase_db, + .eraseblocks = { { 4 * 1024, 512 } }, + .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 4} }, + .eraseblocks = { {64 * 1024, 32} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {2 * 1024 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ + .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "Micron/Numonyx/ST", + .name = "M25PX32", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25PX32, + .total_size = 4096, + .page_size = 256, + /* OTP: 64B total; read 0x4B; write 0x42 */ + .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, + .tested = TEST_OK_PRE, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 1024 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {64 * 1024, 64} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {4 * 1024 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ + .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ + .write = spi_chip_write_256, + .read = spi_chip_read, + .voltage = {2700, 3600}, + }, + + { + .vendor = "Micron/Numonyx/ST", + .name = "M25PX64", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M25PX64, + .total_size = 8192, + .page_size = 256, + /* OTP: 64B total; read 0x4B; write 0x42 */ + .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, + .tested = TEST_OK_PRE, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 2048 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {64 * 1024, 128} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {8 * 1024 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ + .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "Micron/Numonyx/ST", + .name = "M45PE10", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M45PE10, + .total_size = 128, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = { + { + .eraseblocks = { {256, 512} }, + .block_erase = spi_block_erase_db, + }, { + .eraseblocks = { {64 * 1024, 2} }, + .block_erase = spi_block_erase_d8, + } + }, + .printlock = spi_prettyprint_status_register_default_welwip, + .unlock = NULL, /* #WP pin write-protects lower 64kB. */ + .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */ + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, + }, + + { + .vendor = "Micron/Numonyx/ST", + .name = "M45PE20", + .bustype = BUS_SPI, + .manufacture_id = ST_ID, + .model_id = ST_M45PE20, + .total_size = 256, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = { + { + .eraseblocks = { {256, 1024} }, + .block_erase = spi_block_erase_db, + }, { + .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, } }, @@ -7198,7 +7286,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M45PE40", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7225,7 +7313,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M45PE80", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7252,7 +7340,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "M45PE16", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7279,7 +7367,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q016", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7316,7 +7404,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q032..1E", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7350,7 +7438,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q032..3E", .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7384,7 +7472,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7418,7 +7506,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7452,7 +7540,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7485,7 +7573,7 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", + .vendor = "Micron/Numonyx/ST", .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, .manufacture_id = ST_ID, @@ -7518,257 +7606,200 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Numonyx", - .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q256__1E, - .total_size = 32768, - .page_size = 256, - /* supports SFDP */ - /* OTP: 64B total; read 0x4B, write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_BAD_REW, - .probe = probe_spi_rdid, + .vendor = "MoselVitelic", + .name = "V29C51000B", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29C51000B, + .total_size = 64, + .page_size = 512, + .feature_bits = FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .block_erasers = { + .block_erasers = + { { - .eraseblocks = { {4 * 1024, 8192 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 512} }, - .block_erase = spi_block_erase_d8, + .eraseblocks = { {512, 128} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {32768 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } + .eraseblocks = { {64 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ - .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {1700, 2000}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, { - .vendor = "Numonyx", - .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q256__3E, - .total_size = 32768, - .page_size = 256, - /* supports SFDP */ - /* OTP: 64B total; read 0x4B, write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PROBE | TEST_BAD_REW, - .probe = probe_spi_rdid, + .vendor = "MoselVitelic", + .name = "V29C51000T", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29C51000T, + .total_size = 64, + .page_size = 512, + .feature_bits = FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .block_erasers = { + .block_erasers = + { { - .eraseblocks = { {4 * 1024, 8192 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 512} }, - .block_erase = spi_block_erase_d8, + .eraseblocks = { {512, 128} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {32768 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } + .eraseblocks = { {64 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ - .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {2700, 3600}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, { - .vendor = "Numonyx", - .name = "N25Q512..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q512__1E, - .total_size = 65536, - .page_size = 256, - /* supports SFDP */ - /* OTP: 64B total; read 0x4B, write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_BAD_REW, - .probe = probe_spi_rdid, + .vendor = "MoselVitelic", + .name = "V29C51400B", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29C51400B, + .total_size = 512, + .page_size = 1024, + .feature_bits = FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .block_erasers = { + .block_erasers = + { { - .eraseblocks = { {4 * 1024, 16384 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 1024 } }, - .block_erase = spi_block_erase_d8, + .eraseblocks = { {1024, 512} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {32 * 1024 * 1024, 2 } }, - .block_erase = spi_block_erase_c4, - }, { /* Some models have a bulk erase command too. */ - .eraseblocks = { {64 * 1024 * 1024, 1 } }, - .block_erase = spi_block_erase_c7, - } + .eraseblocks = { {512 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ - .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {1700, 2000}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, { - .vendor = "Numonyx", - .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */ - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q512__3E, - .total_size = 65536, - .page_size = 256, - /* supports SFDP */ - /* OTP: 64B total; read 0x4B, write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PROBE | TEST_BAD_REW, - .probe = probe_spi_rdid, + .vendor = "MoselVitelic", + .name = "V29C51400T", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29C51400T, + .total_size = 512, + .page_size = 1024, + .feature_bits = FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .block_erasers = { + .block_erasers = + { { - .eraseblocks = { {4 * 1024, 16384 } }, - .block_erase = spi_block_erase_20, + .eraseblocks = { {1024, 512} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {64 * 1024, 1024 } }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {32 * 1024 * 1024, 2 } }, - .block_erase = spi_block_erase_c4, - }, { /* Some models have a bulk erase command too. */ - .eraseblocks = { {64 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } + .eraseblocks = { {512 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ - .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {2700, 3600}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, { - .vendor = "Numonyx", - .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */ - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q00A__3E, - .total_size = 131072, - .page_size = 256, - /* supports SFDP */ - /* OTP: 64B total; read 0x4B, write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_BAD_REW, - .probe = probe_spi_rdid, + .vendor = "MoselVitelic", + .name = "V29LC51000", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29LC51000, + .total_size = 64, + .page_size = 512, + .feature_bits = FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, - .block_erasers = { + .block_erasers = + { { - .eraseblocks = { {4 * 1024, 32768 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 2048 } }, - .block_erase = spi_block_erase_d8, + .eraseblocks = { {512, 128} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {32 * 1024 * 1024, 4 } }, - .block_erase = spi_block_erase_c4, - } + .eraseblocks = { {64 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ - .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {2700, 3600}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, { - .vendor = "PMC", - .name = "Pm25LD256C", - .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LD256C, - .total_size = 32, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, + .vendor = "MoselVitelic", + .name = "V29LC51001", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29LC51001, + .total_size = 128, + .page_size = 512, + .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 8} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {4 * 1024, 8} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {32 * 1024, 1} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {32 * 1024, 1} }, - .block_erase = spi_block_erase_60, + .eraseblocks = { {512, 256} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {32 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } + .eraseblocks = { {128 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ - .voltage = {2700, 3600}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, + { - .vendor = "PMC", - .name = "Pm25LD512(C)", - .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LD512, - .total_size = 64, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .vendor = "MoselVitelic", + .name = "V29LC51002", + .bustype = BUS_PARALLEL, + .manufacture_id = SYNCMOS_MVC_ID, + .model_id = MVC_V29LC51002, + .total_size = 256, + .page_size = 512, + .feature_bits = FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 16} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {4 * 1024, 16} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {32 * 1024, 2} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {64 * 1024, 1} }, - .block_erase = spi_block_erase_60, + .eraseblocks = { {512, 512} }, + .block_erase = erase_sector_jedec, }, { - .eraseblocks = { {64 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } + .eraseblocks = { {256 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, }, - .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ - .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ - .voltage = {2300, 3600}, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, }, { - .vendor = "PMC", - .name = "Pm25LD010(C)", + .vendor = "Nantronics", + .name = "N25S10", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LD010, + .manufacture_id = NANTRONICS_ID_NOPREFIX, + .model_id = NANTRONICS_N25S10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, @@ -7785,6 +7816,9 @@ const struct flashchip flashchips[] = { .block_erase = spi_block_erase_d7, }, { .eraseblocks = { {32 * 1024, 4} }, + .block_erase = spi_block_erase_52, + }, { + .eraseblocks = { {64 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, @@ -7794,19 +7828,19 @@ const struct flashchip flashchips[] = { .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ + .printlock = spi_prettyprint_status_register_default_bp3, + .unlock = spi_disable_blockprotect_bp3_srwd, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ - .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */ + .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .voltage = {2700, 3600}, }, { - .vendor = "PMC", - .name = "Pm25LD020(C)", + .vendor = "Nantronics", + .name = "N25S20", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LD020, + .manufacture_id = NANTRONICS_ID_NOPREFIX, + .model_id = NANTRONICS_N25S20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, @@ -7821,6 +7855,9 @@ const struct flashchip flashchips[] = { }, { .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {32 * 1024, 8} }, + .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, @@ -7832,19 +7869,19 @@ const struct flashchip flashchips[] = { .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ + .printlock = spi_prettyprint_status_register_default_bp3, + .unlock = spi_disable_blockprotect_bp3_srwd, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ - .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */ + .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .voltage = {2700, 3600}, }, { - .vendor = "PMC", - .name = "Pm25LD040(C)", + .vendor = "Nantronics", + .name = "N25S40", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV040, + .manufacture_id = NANTRONICS_ID_NOPREFIX, + .model_id = NANTRONICS_N25S40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, @@ -7859,6 +7896,9 @@ const struct flashchip flashchips[] = { }, { .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {32 * 1024, 16} }, + .block_erase = spi_block_erase_52, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, @@ -7870,180 +7910,206 @@ const struct flashchip flashchips[] = { .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, + .printlock = spi_prettyprint_status_register_default_bp3, + .unlock = spi_disable_blockprotect_bp3_srwd, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ - .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */ + .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ + .voltage = {2700, 3600}, }, -{ - .vendor = "PMC", - .name = "Pm25LV512(A)", + { + .vendor = "Nantronics", + .name = "N25S80", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV512, - .total_size = 64, + .manufacture_id = NANTRONICS_ID_NOPREFIX, + .model_id = NANTRONICS_N25S80, + .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_res3, + .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 16} }, - .block_erase = spi_block_erase_d7, + .eraseblocks = { {4 * 1024, 256} }, + .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {32 * 1024, 2} }, + .eraseblocks = { {32 * 1024, 32} }, + .block_erase = spi_block_erase_52, + }, { + .eraseblocks = { {64 * 1024, 16} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {64 * 1024, 1} }, + .eraseblocks = { {1024 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {1024 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp1, - .unlock = spi_disable_blockprotect, + .printlock = spi_prettyprint_status_register_default_bp3, + .unlock = spi_disable_blockprotect_bp3_srwd, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ + .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ .voltage = {2700, 3600}, }, { - .vendor = "PMC", - .name = "Pm25LV010", + .vendor = "Nantronics", + .name = "N25S16", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV010, - .total_size = 128, + .manufacture_id = NANTRONICS_ID_NOPREFIX, + .model_id = NANTRONICS_N25S16, + .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_res3, + .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 32} }, - .block_erase = spi_block_erase_d7, + .eraseblocks = { {4 * 1024, 512} }, + .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {32 * 1024, 4} }, + .eraseblocks = { {64 * 1024, 32} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {128 * 1024, 1} }, + .eraseblocks = { {2048 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {2048 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp1, - .unlock = spi_disable_blockprotect, + .printlock = spi_prettyprint_status_register_default_bp3, + .unlock = spi_disable_blockprotect_bp3_srwd, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ + .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ .voltage = {2700, 3600}, }, { .vendor = "PMC", - .name = "Pm25LV010A", + .name = "Pm25LD256C", .bustype = BUS_SPI, .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV010, - .total_size = 128, + .model_id = PMC_PM25LD256C, + .total_size = 32, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, + .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 32} }, + .eraseblocks = { {4 * 1024, 8} }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {4 * 1024, 8} }, .block_erase = spi_block_erase_d7, }, { - .eraseblocks = { {32 * 1024, 4} }, + .eraseblocks = { {32 * 1024, 1} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {128 * 1024, 1} }, + .eraseblocks = { {32 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {32 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, - .printlock = spi_prettyprint_status_register_default_bp1, + .printlock = spi_prettyprint_status_register_default_bp2, .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ + .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ .voltage = {2700, 3600}, }, - { .vendor = "PMC", - .name = "Pm25LV020", + .name = "Pm25LD512(C)", .bustype = BUS_SPI, .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV020, - .total_size = 256, + .model_id = PMC_PM25LD512, + .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, + .tested = TEST_OK_PREW, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 64} }, + .eraseblocks = { {4 * 1024, 16} }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {4 * 1024, 16} }, .block_erase = spi_block_erase_d7, }, { - .eraseblocks = { {64 * 1024, 4} }, + .eraseblocks = { {32 * 1024, 2} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {256 * 1024, 1} }, + .eraseblocks = { {64 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {64 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, + .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, + .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ + .voltage = {2300, 3600}, }, { .vendor = "PMC", - .name = "Pm25LV040", + .name = "Pm25LD010(C)", .bustype = BUS_SPI, .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV040, - .total_size = 512, + .model_id = PMC_PM25LD010, + .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, + .tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { {4 * 1024, 128} }, + .eraseblocks = { {4 * 1024, 32} }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {4 * 1024, 32} }, .block_erase = spi_block_erase_d7, }, { - .eraseblocks = { {64 * 1024, 8} }, + .eraseblocks = { {32 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {512 * 1024, 1} }, + .eraseblocks = { {128 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {128 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, + .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, + .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ + .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */ }, { .vendor = "PMC", - .name = "Pm25LV080B", + .name = "Pm25LD020(C)", .bustype = BUS_SPI, .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV080B, - .total_size = 1024, + .model_id = PMC_PM25LD020, + .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, @@ -8052,36 +8118,36 @@ const struct flashchip flashchips[] = { .block_erasers = { { - .eraseblocks = { {4 * 1024, 256} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {4 * 1024, 256} }, + .eraseblocks = { {4 * 1024, 64} }, .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 16} }, + .eraseblocks = { {4 * 1024, 64} }, + .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {64 * 1024, 4} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {1024 * 1024, 1} }, + .eraseblocks = { {256 * 1024, 1} }, .block_erase = spi_block_erase_60, }, { - .eraseblocks = { {1024 * 1024, 1} }, + .eraseblocks = { {256 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, .printlock = spi_prettyprint_status_register_default_bp2, - .unlock = spi_disable_blockprotect, + .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, + .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ + .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */ }, { .vendor = "PMC", - .name = "Pm25LV016B", + .name = "Pm25LD040(C)", .bustype = BUS_SPI, .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV016B, - .total_size = 2048, + .model_id = PMC_PM25LV040, + .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, @@ -8090,122 +8156,358 @@ const struct flashchip flashchips[] = { .block_erasers = { { - .eraseblocks = { {4 * 1024, 512} }, - .block_erase = spi_block_erase_d7, - }, { - .eraseblocks = { {4 * 1024, 512} }, + .eraseblocks = { {4 * 1024, 128} }, .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 32} }, + .eraseblocks = { {4 * 1024, 128} }, + .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {64 * 1024, 8} }, .block_erase = spi_block_erase_d8, }, { - .eraseblocks = { {2 * 1024 * 1024, 1} }, + .eraseblocks = { {512 * 1024, 1} }, .block_erase = spi_block_erase_60, }, { - .eraseblocks = { {2 * 1024 * 1024, 1} }, + .eraseblocks = { {512 * 1024, 1} }, .block_erase = spi_block_erase_c7, } }, .printlock = spi_prettyprint_status_register_default_bp2, .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, + .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ + .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */ }, - { +{ .vendor = "PMC", - .name = "Pm29F002T", - .bustype = BUS_PARALLEL, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM29F002T, - .total_size = 256, - .page_size = 8 * 1024, - .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, - .tested = TEST_OK_PREW, - .probe = probe_jedec, - .probe_timing = TIMING_FIXME, + .name = "Pm25LV512(A)", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV512, + .total_size = 64, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_UNTESTED, + .probe = probe_spi_res3, + .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { - {128 * 1024, 1}, - {96 * 1024, 1}, - {8 * 1024, 2}, - {16 * 1024, 1}, - }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {4 * 1024, 16} }, + .block_erase = spi_block_erase_d7, }, { - .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {32 * 1024, 2} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {64 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp1, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, }, { .vendor = "PMC", - .name = "Pm29F002B", - .bustype = BUS_PARALLEL, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM29F002B, - .total_size = 256, - .page_size = 8 * 1024, - .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, + .name = "Pm25LV010", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV010, + .total_size = 128, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_jedec, - .probe_timing = TIMING_FIXME, + .probe = probe_spi_res3, + .probe_timing = TIMING_ZERO, .block_erasers = { { - .eraseblocks = { - {16 * 1024, 1}, - {8 * 1024, 2}, - {96 * 1024, 1}, - {128 * 1024, 1}, - }, - .block_erase = erase_sector_jedec, + .eraseblocks = { {4 * 1024, 32} }, + .block_erase = spi_block_erase_d7, }, { - .eraseblocks = { {256 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, - }, + .eraseblocks = { {32 * 1024, 4} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {128 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {4500, 5500}, + .printlock = spi_prettyprint_status_register_default_bp1, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, }, { .vendor = "PMC", - .name = "Pm39LV010", - .bustype = BUS_PARALLEL, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */ + .name = "Pm25LV010A", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV010, .total_size = 128, - .page_size = 4096, - .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_jedec, - .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, - .block_erase = erase_sector_jedec, + .block_erase = spi_block_erase_d7, }, { - .eraseblocks = { {64 * 1024, 2} }, - .block_erase = erase_block_jedec, + .eraseblocks = { {32 * 1024, 4} }, + .block_erase = spi_block_erase_d8, }, { .eraseblocks = { {128 * 1024, 1} }, - .block_erase = erase_chip_block_jedec, + .block_erase = spi_block_erase_c7, } }, - .write = write_jedec_1, - .read = read_memmapped, - .voltage = {2700, 3600}, - }, + .printlock = spi_prettyprint_status_register_default_bp1, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, + }, + + { + .vendor = "PMC", + .name = "Pm25LV020", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV020, + .total_size = 256, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { {4 * 1024, 64} }, + .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {64 * 1024, 4} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {256 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + .voltage = {2700, 3600}, + }, + + { + .vendor = "PMC", + .name = "Pm25LV040", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV040, + .total_size = 512, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_OK_PREW, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { {4 * 1024, 128} }, + .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {64 * 1024, 8} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {512 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, + }, + + { + .vendor = "PMC", + .name = "Pm25LV080B", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV080B, + .total_size = 1024, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { {4 * 1024, 256} }, + .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {4 * 1024, 256} }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {64 * 1024, 16} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {1024 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {1024 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, + }, + + { + .vendor = "PMC", + .name = "Pm25LV016B", + .bustype = BUS_SPI, + .manufacture_id = PMC_ID, + .model_id = PMC_PM25LV016B, + .total_size = 2048, + .page_size = 256, + .feature_bits = FEATURE_WRSR_WREN, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { {4 * 1024, 512} }, + .block_erase = spi_block_erase_d7, + }, { + .eraseblocks = { {4 * 1024, 512} }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { {64 * 1024, 32} }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { {2 * 1024 * 1024, 1} }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { {2 * 1024 * 1024, 1} }, + .block_erase = spi_block_erase_c7, + } + }, + .printlock = spi_prettyprint_status_register_default_bp2, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, + }, + + { + .vendor = "PMC", + .name = "Pm29F002T", + .bustype = BUS_PARALLEL, + .manufacture_id = PMC_ID_NOPREFIX, + .model_id = PMC_PM29F002T, + .total_size = 256, + .page_size = 8 * 1024, + .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, + .tested = TEST_OK_PREW, + .probe = probe_jedec, + .probe_timing = TIMING_FIXME, + .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_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, + }, + + { + .vendor = "PMC", + .name = "Pm29F002B", + .bustype = BUS_PARALLEL, + .manufacture_id = PMC_ID_NOPREFIX, + .model_id = PMC_PM29F002B, + .total_size = 256, + .page_size = 8 * 1024, + .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, + .tested = TEST_UNTESTED, + .probe = probe_jedec, + .probe_timing = TIMING_FIXME, + .block_erasers = + { + { + .eraseblocks = { + {16 * 1024, 1}, + {8 * 1024, 2}, + {96 * 1024, 1}, + {128 * 1024, 1}, + }, + .block_erase = erase_sector_jedec, + }, { + .eraseblocks = { {256 * 1024, 1} }, + .block_erase = erase_chip_block_jedec, + }, + }, + .write = write_jedec_1, + .read = read_memmapped, + .voltage = {4500, 5500}, + }, + + { + .vendor = "PMC", + .name = "Pm39LV010", + .bustype = BUS_PARALLEL, + .manufacture_id = PMC_ID_NOPREFIX, + .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */ + .total_size = 128, + .page_size = 4096, + .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, + .tested = TEST_OK_PREW, + .probe = probe_jedec, + .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ + .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_jedec_1, + .read = read_memmapped, + .voltage = {2700, 3600}, + }, { .vendor = "PMC", @@ -8864,86 +9166,16 @@ const struct flashchip flashchips[] = { }, { - .vendor = "Spansion", - .name = "S25FL256S......0", /* uniform 256kB sectors */ + .vendor = "SST", + .name = "SST25LF040A", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL256, - .total_size = 32768, + .manufacture_id = SST_ID, + .model_id = SST_SST25VF040_REMS, + .total_size = 512, .page_size = 256, - /* supports 4B addressing */ - /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PROBE | TEST_BAD_REW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = { - { - .eraseblocks = { {4 * 1024, 8192} }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {256 * 1024, 128} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { { 32768 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { { 32768 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */ - .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {2700, 3600}, - }, - - { - .vendor = "Spansion", - .name = "S25FL512S", - .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL512, - .total_size = 65536, - .page_size = 256, - /* supports 4B addressing */ - /* supports SFDP */ - /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PROBE | TEST_BAD_REW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = { - { - .eraseblocks = { {256 * 1024, 256} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { { 65536 * 1024, 1} }, - .block_erase = spi_block_erase_60, - }, { - .eraseblocks = { { 65536 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */ - .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */ - .write = spi_chip_write_256, /* Multi I/O supported */ - .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ - .voltage = {2700, 3600}, - }, - - { - .vendor = "SST", - .name = "SST25LF040A", - .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF040_REMS, - .total_size = 512, - .page_size = 256, - .feature_bits = FEATURE_WRSR_EWSR, - .tested = TEST_OK_PREW, - .probe = probe_spi_res2, + .feature_bits = FEATURE_WRSR_EWSR, + .tested = TEST_OK_PREW, + .probe = probe_spi_res2, .probe_timing = TIMING_ZERO, .block_erasers = { @@ -10215,517 +10447,6 @@ const struct flashchip flashchips[] = { .voltage = {3000, 3600}, }, - { - .vendor = "ST", - .name = "M25P05-A", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P05A, - .total_size = 64, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {32 * 1024, 2} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {64 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - /* The ST M25P05 is a bit of a problem. It has the same ID as the - * ST M25P05-A in RES mode, but supports only 128 byte writes instead - * of 256 byte writes. We rely heavily on the fact that probe_spi_res1 - * only is successful if RDID does not work. - */ - { - .vendor = "ST", - .name = "M25P05", - .bustype = BUS_SPI, - .manufacture_id = 0, /* Not used. */ - .model_id = ST_M25P05_RES, - .total_size = 64, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, - .probe = probe_spi_res1, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {32 * 1024, 2} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {64 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_1, /* 128 */ - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P10-A", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P10A, - .total_size = 128, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PRE, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {32 * 1024, 4} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {128 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - /* The ST M25P10 has the same problem as the M25P05. */ - { - .vendor = "ST", - .name = "M25P10", - .bustype = BUS_SPI, - .manufacture_id = 0, /* Not used. */ - .model_id = ST_M25P10_RES, - .total_size = 128, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, - .probe = probe_spi_res1, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {32 * 1024, 4} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {128 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_1, /* 128 */ - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", /* Numonyx */ - .name = "M25P20", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P20, - .total_size = 256, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 4} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {256 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp1, - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P20-old", - .bustype = BUS_SPI, - .manufacture_id = 0, /* Not used. */ - .model_id = ST_M25P20_RES, - .total_size = 256, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_res1, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 4} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {256 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp1, - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", /* Numonyx */ - .name = "M25P40", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P40, - .total_size = 512, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 8} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {512 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P40-old", - .bustype = BUS_SPI, - .manufacture_id = 0, /* Not used. */ - .model_id = ST_M25P40_RES, - .total_size = 512, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_UNTESTED, - .probe = probe_spi_res1, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 8} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {512 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - }, - - { - .vendor = "ST", - .name = "M25P80", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P80, - .total_size = 1024, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 16} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P16", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P16, - .total_size = 2048, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PR, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 32} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {2 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P32", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P32, - .total_size = 4096, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 64} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {4 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P64", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P64, - .total_size = 8192, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {64 * 1024, 128} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {8 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25P128", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25P128, - .total_size = 16384, - .page_size = 256, - .feature_bits = FEATURE_WRSR_WREN, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { {256 * 1024, 64} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {16 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */ - .unlock = spi_disable_blockprotect, - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25PX80", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PX80, - .total_size = 1024, - .page_size = 256, - /* OTP: 64B total; read 0x4B, write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = { - { - .eraseblocks = { { 4 * 1024, 256 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 16} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ - .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25PX16", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PX16, - .total_size = 2048, - .page_size = 256, - /* OTP: 64B total; read 0x4B; write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { { 4 * 1024, 512 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 32} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {2 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ - .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, - .read = spi_chip_read, - }, - - { - .vendor = "ST", - .name = "M25PX32", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PX32, - .total_size = 4096, - .page_size = 256, - /* OTP: 64B total; read 0x4B; write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PRE, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { { 4 * 1024, 1024 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 64} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {4 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ - .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, - .read = spi_chip_read, - .voltage = {2700, 3600}, - }, - - { - .vendor = "ST", - .name = "M25PX64", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PX64, - .total_size = 8192, - .page_size = 256, - /* OTP: 64B total; read 0x4B; write 0x42 */ - .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, - .tested = TEST_OK_PRE, - .probe = probe_spi_rdid, - .probe_timing = TIMING_ZERO, - .block_erasers = - { - { - .eraseblocks = { { 4 * 1024, 2048 } }, - .block_erase = spi_block_erase_20, - }, { - .eraseblocks = { {64 * 1024, 128} }, - .block_erase = spi_block_erase_d8, - }, { - .eraseblocks = { {8 * 1024 * 1024, 1} }, - .block_erase = spi_block_erase_c7, - } - }, - .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */ - .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ - .write = spi_chip_write_256, - .read = spi_chip_read, - }, - { .vendor = "ST", .name = "M29F002B", -- cgit v1.2.3