Some important facts: - AT45 prober issues a 0xD7 opcode (without address) unconditionally. - No prober weights yet - any chip matched by a single prober is presented to the user.
Signed-off-by: Stefan Tauner stefan.tauner@alumni.tuwien.ac.at --- 82802ab.c | 49 +- Makefile | 2 +- at45db.c | 48 +- chipdrivers.h | 36 +- cli_classic.c | 132 ++- en29lv640b.c | 27 +- flash.h | 54 +- flashchips.c | 3624 +++++++++++++++++++++++++++++++++------------------------ flashchips.h | 888 +++++++------- flashrom.c | 374 ++++-- ichspi.c | 52 +- jedec.c | 122 +- m29f400bt.c | 23 +- opaque.c | 22 +- print.c | 13 +- print_wiki.c | 11 - programmer.c | 2 +- programmer.h | 5 +- sfdp.c | 109 +- spi25.c | 281 +---- stm50.c | 2 +- w29ee011.c | 37 +- 22 files changed, 3270 insertions(+), 2643 deletions(-)
diff --git a/82802ab.c b/82802ab.c index d249c3a..5b376ce 100644 --- a/82802ab.c +++ b/82802ab.c @@ -40,10 +40,9 @@ void print_status_82802ab(uint8_t status) msg_cdbg("%s", status & 0x2 ? "WP|TBL#|WP#,ABORT:" : "UNLOCK:"); }
-static int probe_82802ab(struct flashctx *flash, bool shifted) +static int probe_82802ab(struct flashctx *flash, struct probe_res *res, bool shifted) { chipaddr bios = flash->virtual_memory; - uint8_t id1, id2, flashcontent1, flashcontent2;
/* Reset to get a clean state */ chip_writeb(flash, 0xFF, bios); @@ -53,47 +52,37 @@ static int probe_82802ab(struct flashctx *flash, bool shifted) chip_writeb(flash, 0x90, bios); programmer_delay(10);
- id1 = chip_readb(flash, bios + (0x00 << shifted)); - id2 = chip_readb(flash, bios + (0x01 << shifted)); +#if (NUM_PROBE_BYTES < 2) +#error probe_82802ab requires NUM_PROBE_BYTES to be at least 2. +#endif + res->vals[0] = chip_readb(flash, bios + (0x00 << shifted)); + res->vals[1] = chip_readb(flash, bios + (0x01 << shifted));
/* Leave ID mode */ chip_writeb(flash, 0xFF, bios);
programmer_delay(10);
- msg_cdbg("%s: id1 0x%02x, id2 0x%02x", __func__, id1, id2); - - if (!oddparity(id1)) - msg_cdbg(", id1 parity violation"); - - /* - * Read the product ID location again. We should now see normal - * flash contents. - */ - flashcontent1 = chip_readb(flash, bios + (0x00 << shifted)); - flashcontent2 = chip_readb(flash, bios + (0x01 << shifted)); - - if (id1 == flashcontent1) - msg_cdbg(", id1 is normal flash content"); - if (id2 == flashcontent2) - msg_cdbg(", id2 is normal flash content"); - - msg_cdbg("\n"); - if (id1 != flash->chip->manufacture_id || id2 != flash->chip->model_id) + uint8_t cont[2]; + cont[0] = chip_readb(flash, bios + (0x00 << shifted)); + cont[1] = chip_readb(flash, bios + (0x01 << shifted)); + if (test_for_valid_ids(res->vals, cont, 2)) { + res->len = 2; + return 1; + } else { + res->len = 0; return 0; - - - return 1; + } }
-int probe_82802ab_shifted(struct flashctx *flash) +int probe_82802ab_shifted(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { - return probe_82802ab(flash, true); + return probe_82802ab(flash, res, true); }
-int probe_82802ab_unshifted(struct flashctx *flash) +int probe_82802ab_unshifted(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { - return probe_82802ab(flash, false); + return probe_82802ab(flash, res, false); }
/* FIXME: needs timeout */ diff --git a/Makefile b/Makefile index 7a48889..4500b5e 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ INSTALL = install DIFF = diff PREFIX ?= /usr/local MANDIR ?= $(PREFIX)/share/man -CFLAGS ?= -Os -Wall -Wshadow +CFLAGS ?= -Os -Wall -Wshadow -g EXPORTDIR ?= . AR ?= ar RANLIB ?= ranlib diff --git a/at45db.c b/at45db.c index 5396d7f..1150d3a 100644 --- a/at45db.c +++ b/at45db.c @@ -170,48 +170,26 @@ int spi_prettyprint_status_register_at45db(struct flashctx *flash) return 0; }
-/* Probe function for AT45DB* chips that support multiple page sizes. */ -int probe_spi_at45db(struct flashctx *flash) +/* Probe function for AT45DB* chips that support multiple page sizes. In order to tell which page size a chip + * has we need to read the status register and investigate bit #0. */ +int probe_spi_at45db(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) { - uint8_t status; - struct flashchip *chip = flash->chip; +#if (NUM_PROBE_BYTES < 1) +#error probe_spi_at45db requires NUM_PROBE_BYTES to be at least 1. +#endif
- if (!probe_spi_rdid(flash)) - return 0; + if (res_len == 0) + return -1;
- /* Some AT45DB* chips support two different page sizes each (e.g. 264 and 256 B). In order to tell which - * page size this chip has we need to read the status register. */ + uint8_t status; if (at45db_read_status_register(flash, &status) != 0) - return 0; - - /* We assume sane power-of-2 page sizes and adjust the chip attributes in case this is not the case. */ - if ((status & AT45DB_POWEROF2) == 0) { - chip->total_size = (chip->total_size / 32) * 33; - chip->page_size = (chip->page_size / 32) * 33; - - unsigned int i, j; - for (i = 0; i < NUM_ERASEFUNCTIONS; i++) { - struct block_eraser *eraser = &chip->block_erasers[i]; - for (j = 0; j < NUM_ERASEREGIONS; j++) { - eraser->eraseblocks[j].size = (eraser->eraseblocks[j].size / 32) * 33; - } - } - } + return -1;
- switch (chip->page_size) { - case 256: chip->gran = write_gran_256bytes; break; - case 264: chip->gran = write_gran_264bytes; break; - case 512: chip->gran = write_gran_512bytes; break; - case 528: chip->gran = write_gran_528bytes; break; - case 1024: chip->gran = write_gran_1024bytes; break; - case 1056: chip->gran = write_gran_1056bytes; break; - default: - msg_cerr("%s: unknown page size %d.\n", __func__, chip->page_size); + if (status == 0xFF || status == 0x00) return 0; - } - - msg_cdbg2("%s: total size %i kB, page size %i B\n", __func__, chip->total_size * 1024, chip->page_size);
+ res->vals[0] = status & AT45DB_POWEROF2; + res->len = 1; return 1; }
diff --git a/chipdrivers.h b/chipdrivers.h index 11a7191..668bd00 100644 --- a/chipdrivers.h +++ b/chipdrivers.h @@ -33,13 +33,10 @@ int spi_chip_write_256(struct flashctx *flash, const uint8_t *buf, unsigned int int spi_chip_read(struct flashctx *flash, uint8_t *buf, unsigned int start, int unsigned len);
/* spi25.c */ -int probe_spi_rdid(struct flashctx *flash); -int probe_spi_rdid4(struct flashctx *flash); -int probe_spi_rems(struct flashctx *flash); -int probe_spi_res1(struct flashctx *flash); -int probe_spi_res2(struct flashctx *flash); -int probe_spi_res3(struct flashctx *flash); -int probe_spi_at25f(struct flashctx *flash); +int probe_spi_rdid(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_spi_rems(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_spi_res(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_spi_at25f(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); int spi_write_enable(struct flashctx *flash); int spi_write_disable(struct flashctx *flash); int spi_block_erase_20(struct flashctx *flash, unsigned int addr, unsigned int blocklen); @@ -108,12 +105,12 @@ int probe_spi_sfdp(struct flashctx *flash);
/* opaque.c */ int probe_opaque(struct flashctx *flash); -int read_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); -int write_opaque(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); -int erase_opaque(struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen); + +/* flashrom.c */ +int probe_allsizes(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p);
/* at45db.c */ -int probe_spi_at45db(struct flashctx *flash); +int probe_spi_at45db(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p); int spi_prettyprint_status_register_at45db(struct flashctx *flash); int spi_disable_blockprotect_at45db(struct flashctx *flash); int spi_read_at45db(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); @@ -127,8 +124,8 @@ int spi_erase_at45cs_sector(struct flashctx *flash, unsigned int addr, unsigned
/* 82802ab.c */ uint8_t wait_82802ab(struct flashctx *flash); -int probe_82802ab_shifted(struct flashctx *flash); -int probe_82802ab_unshifted(struct flashctx *flash); +int probe_82802ab_shifted(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_82802ab_unshifted(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); int erase_block_82802ab(struct flashctx *flash, unsigned int page, unsigned int pagesize); int write_82802ab(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); void print_status_82802ab(uint8_t status); @@ -138,9 +135,14 @@ int unlock_lh28f008bjt(struct flashctx *flash);
/* jedec.c */ uint8_t oddparity(uint8_t val); +bool test_for_valid_ids(uint8_t *ids, uint8_t *content, unsigned int len); void toggle_ready_jedec(const struct flashctx *flash, chipaddr dst); void data_polling_jedec(const struct flashctx *flash, chipaddr dst, uint8_t data); -int probe_jedec(struct flashctx *flash); +int probe_jedec_longreset(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_jedec_shortreset_full(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_jedec_shortreset_full_384(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_jedec_shortreset_aaa(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); +int probe_jedec_shortreset_2aa(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); int write_jedec(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); int write_jedec_1(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); int erase_sector_jedec(struct flashctx *flash, unsigned int page, unsigned int pagesize); @@ -148,7 +150,7 @@ int erase_block_jedec(struct flashctx *flash, unsigned int page, unsigned int bl int erase_chip_block_jedec(struct flashctx *flash, unsigned int page, unsigned int blocksize);
/* m29f400bt.c */ -int probe_m29f400bt(struct flashctx *flash); +int probe_m29f400bt(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); int write_m29f400bt(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); void protect_m29f400bt(struct flashctx *flash, chipaddr bios);
@@ -190,7 +192,7 @@ int unlock_w39v080fa(struct flashctx *flash); int printlock_at49f(struct flashctx *flash);
/* w29ee011.c */ -int probe_w29ee011(struct flashctx *flash); +int probe_w29ee011(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2);
/* stm50.c */ int erase_sector_stm50(struct flashctx *flash, unsigned int block, unsigned int blocksize); @@ -198,7 +200,7 @@ int unlock_stm50_uniform(struct flashctx *flash); int unlock_stm50_nonuniform(struct flashctx *flash);
/* en29lv640b.c */ -int probe_en29lv640b(struct flashctx *flash); +int probe_en29lv640b(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2); int erase_block_shifted_jedec(struct flashctx *flash, unsigned int start, unsigned int len); int erase_chip_block_shifted_jedec(struct flashctx *flash, unsigned int start, unsigned int len); int write_en29lv640b(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); diff --git a/cli_classic.c b/cli_classic.c index db76fbc..9068dc7 100644 --- a/cli_classic.c +++ b/cli_classic.c @@ -158,13 +158,9 @@ static void check_chip_supported(const struct flashchip *chip)
int main(int argc, char *argv[]) { - /* Probe for up to three flash chips. */ - const struct flashchip *chip = NULL; - struct flashctx flashes[3] = {{0}}; - struct flashctx *fill_flash; const char *name; - int namelen, opt, i, j; - int startchip = -1, chipcount = 0, option_index = 0, force = 0; + int namelen, opt, i; + int option_index = 0, force = 0; #if CONFIG_PRINT_WIKI == 1 int list_supported_wiki = 0; #endif @@ -445,6 +441,7 @@ int main(int argc, char *argv[]) ret = 1; goto out; } + const struct flashchip *chip = NULL; /* Does a chip with the requested name exist in the flashchips array? */ if (chip_to_probe) { for (chip = flashchips; chip && chip->name; chip++) @@ -492,84 +489,91 @@ int main(int argc, char *argv[]) msg_pdbg("The following protocols are supported: %s.\n", tempstr); free(tempstr);
- for (j = 0; j < registered_programmer_count; j++) { - startchip = 0; - while (chipcount < ARRAY_SIZE(flashes)) { - startchip = probe_flash(®istered_programmers[j], startchip, &flashes[chipcount], 0); - if (startchip == -1) - break; - chipcount++; - startchip++; - } + /* Probe for up to three flash chips. */ + struct flashctx *flashes = NULL; + int chipcount = probe_flash(&flashes, NULL); + if (chipcount < 0) { + msg_cerr("Error: Probing for flash chips failed.\n"); + ret = 1; + goto out_free_flashes; }
- if (chipcount > 1) { - msg_cinfo("Multiple flash chip definitions match the detected chip(s): "%s"", - flashes[0].chip->name); - for (i = 1; i < chipcount; i++) - msg_cinfo(", "%s"", flashes[i].chip->name); - msg_cinfo("\nPlease specify which chip definition to use with the -c <chipname> option.\n"); - ret = 1; - goto out_shutdown; - } else if (!chipcount) { + struct flashctx *flash; + if (chipcount == 0) { msg_cinfo("No EEPROM/flash device found.\n"); if (!force || !chip_to_probe) { msg_cinfo("Note: flashrom can never write if the flash chip isn't found " "automatically.\n"); } if (force && read_it && chip_to_probe) { - struct registered_programmer *pgm; int compatible_programmers = 0; msg_cinfo("Force read (-f -r -c) requested, pretending the chip is there:\n"); - /* This loop just counts compatible controllers. */ + flash = malloc(sizeof(struct flashctx)); + if (flash == NULL) { + msg_cerr("Out of memory!\n"); + ret = 1; + goto out_free_flashes; + } + /* chip is still set from the chip_to_probe check earlier in this function. */ + flash->chip = chip; + unsigned int j; for (j = 0; j < registered_programmer_count; j++) { - pgm = ®istered_programmers[j]; - /* chip is still set from the chip_to_probe earlier in this function. */ - if (pgm->buses_supported & chip->bustype) + flash->pgm = ®istered_programmers[j]; + if (flash->pgm->buses_supported & chip->bustype) compatible_programmers++; } if (!compatible_programmers) { msg_cinfo("No compatible controller found for the requested flash chip.\n"); ret = 1; - goto out_shutdown; + goto out_free_flashes; } if (compatible_programmers > 1) msg_cinfo("More than one compatible controller found for the requested flash " "chip, using the first one.\n"); - for (j = 0; j < registered_programmer_count; j++) { - pgm = ®istered_programmers[j]; - startchip = probe_flash(pgm, 0, &flashes[0], 1); - if (startchip != -1) - break; - } - if (startchip == -1) { - // FIXME: This should never happen! Ask for a bug report? - msg_cinfo("Probing for flash chip '%s' failed.\n", chip_to_probe); - ret = 1; - goto out_shutdown; - } msg_cinfo("Please note that forced reads most likely contain garbage.\n"); - ret = read_flash_to_file(&flashes[0], filename); - free(flashes[0].chip); - goto out_shutdown; + ret = read_flash_to_file(flash, filename); + free(flash); + goto out_free_flashes; + } else { + ret = 1; + goto out_free_flashes; } - ret = 1; - goto out_shutdown; - } else if (!chip_to_probe) { - /* repeat for convenience when looking at foreign logs */ - tempstr = flashbuses_to_text(flashes[0].chip->bustype); - msg_gdbg("Found %s flash chip "%s" (%d kB, %s).\n", - flashes[0].chip->vendor, flashes[0].chip->name, flashes[0].chip->total_size, tempstr); - free(tempstr); - } + } else if (chipcount == 1) { + flash = &flashes[0]; + } else { + msg_cinfo("%d flash chip definitions match the genuine chip: ", chipcount);
- fill_flash = &flashes[0]; + msg_cinfo(""%s"", flashes[0].chip->name); + for (i = 1; i < chipcount; i++) + msg_cinfo(", "%s"", flashes[i].chip->name); + + msg_cinfo("\n"); + if (chip_to_probe == NULL) { + msg_cinfo("Please specify which chip definition to use with the " + "--chip/-c <chipname> option.\n"); + ret = 1; + goto out_free_flashes; + } + for (i = 0; i < chipcount; i++) { + if (strcmp(flashes[i].chip->name, chip_to_probe) == 0) { + flash = &flashes[i]; + msg_cinfo("Using %s as requested.\n", flash->chip->name); + break; + } + } + if (flash == NULL) { + msg_cerr("The chip supplied with the --chip/-c option was not detected automatically.\n" + "You can enforce using it with the --force/-f option.\n"); + ret = 1; + goto out_free_flashes; + } + }
- check_chip_supported(fill_flash->chip); + check_chip_supported(flash->chip);
- unsigned int limitexceeded = count_max_decode_exceedings(fill_flash); + unsigned int limitexceeded = count_max_decode_exceedings(flash); if (limitexceeded > 0 && !force) { - enum chipbustype commonbuses = fill_flash->pgm->buses_supported & fill_flash->chip->bustype; + enum chipbustype commonbuses = flash->pgm->buses_supported & flash->chip->bustype;
/* Sometimes chip and programmer have more than one bus in common, * and the limit is not exceeded on all buses. Tell the user. */ @@ -580,12 +584,12 @@ int main(int argc, char *argv[]) msg_cerr("This flash chip is too big for this programmer (--verbose/-V gives details).\n" "Use --force/-f to override at your own risk.\n"); ret = 1; - goto out_shutdown; + goto out_free_flashes; }
if (!(read_it | write_it | verify_it | erase_it)) { msg_ginfo("No operations were specified.\n"); - goto out_shutdown; + goto out_free_flashes; }
/* Always verify write operations unless -n is used. */ @@ -597,13 +601,15 @@ int main(int argc, char *argv[]) * Give the chip time to settle. */ programmer_delay(100000); - ret |= doit(fill_flash, force, filename, read_it, write_it, erase_it, verify_it); + ret |= doit(flash, force, filename, read_it, write_it, erase_it, verify_it);
+out_free_flashes: + free(flashes); out_shutdown: programmer_shutdown(); out: - for (i = 0; i < chipcount; i++) - free(flashes[i].chip); + //for (i = 0; i < chipcount; i++) + //free(flashes[i]->chip);
layout_cleanup(); free(filename); diff --git a/en29lv640b.c b/en29lv640b.c index a274f62..47da1a1 100644 --- a/en29lv640b.c +++ b/en29lv640b.c @@ -58,10 +58,9 @@ int write_en29lv640b(struct flashctx *flash, const uint8_t *src, unsigned int st return 0; }
-int probe_en29lv640b(struct flashctx *flash) +int probe_en29lv640b(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { chipaddr bios = flash->virtual_memory; - uint16_t id1, id2;
chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); @@ -69,21 +68,29 @@ int probe_en29lv640b(struct flashctx *flash)
programmer_delay(10);
- id1 = chip_readb(flash, bios + 0x200); - id1 |= (chip_readb(flash, bios) << 8); +#if (NUM_PROBE_BYTES < 3) +#error probe_en29lv640b requires NUM_PROBE_BYTES to be at least 3. +#endif + res->vals[0] = chip_readb(flash, bios + 0x200); + res->vals[1] = chip_readb(flash, bios);
- id2 = chip_readb(flash, bios + 0x02); + res->vals[2] = chip_readb(flash, bios + 0x02);
chip_writeb(flash, 0xF0, bios + 0xAAA); - programmer_delay(10);
- msg_cdbg("%s: id1 0x%04x, id2 0x%04x\n", __func__, id1, id2); + uint8_t cont[3]; + cont[0] = chip_readb(flash, bios + 0x200); + cont[1] = chip_readb(flash, bios); + cont[2] = chip_readb(flash, bios + 0x02);
- if (id1 == flash->chip->manufacture_id && id2 == flash->chip->model_id) + if (test_for_valid_ids(res->vals, cont, 3)) { + res->len = 3; return 1; - - return 0; + } else { + res->len = 0; + return 0; + } }
static int erase_chip_shifted_jedec(struct flashctx *flash) diff --git a/flash.h b/flash.h index d26d90b..ed0aeeb 100644 --- a/flash.h +++ b/flash.h @@ -53,6 +53,7 @@ typedef uint32_t chipsize_t; /* Able to store the number of bytes of any support #define PRIxCHIPADDR "06"PRIx32 #define PRIuCHIPSIZE PRIu32
+int shutdown_free(void *data); int register_shutdown(int (*function) (void *data), void *data); void *programmer_map_flash_region(const char *descr, uintptr_t phys_addr, size_t len); void programmer_unmap_flash_region(void *virt_addr, size_t len); @@ -140,8 +141,36 @@ enum test_state { #define TEST_BAD_PRE (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = NT } #define TEST_BAD_PREW (struct tested){ .probe = BAD, .read = BAD, .erase = BAD, .write = BAD }
+ +#define NUM_PROBES 3 +#define NUM_PROBE_BYTES 5 /* Values below 2 will break code. */ + struct flashctx; -typedef int (erasefunc_t)(struct flashctx *flash, unsigned int addr, unsigned int blocklen); +struct registered_programmer; /* programmer.h */ +struct probe; +struct probe_res; + +/* fixme */ +typedef int (probefunc_t)(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p); + +typedef struct probe_res { + uint8_t len; + uint8_t vals[NUM_PROBE_BYTES]; + probefunc_t *probe_func; + unsigned int chip_size; /* in kB */ +} probe_res; + +typedef struct probe { + probefunc_t *probe_func; + enum chipbustype bustype; + const char *mnemonic; + uint16_t size_min; + uint16_t size_max; + uint8_t size_step; +} probe; + +/* An erase function should try to erase one block of size 'len' at address 'addr' and return 0 on success. */ +typedef int (erasefunc_t)(struct flashctx *flash, unsigned int addr, unsigned int len);
struct flashchip { const char *vendor; @@ -149,14 +178,6 @@ struct flashchip {
enum chipbustype bustype;
- /* - * With 32bit manufacture_id and model_id we can cover IDs up to - * (including) the 4th bank of JEDEC JEP106W Standard Manufacturer's - * Identification code. - */ - uint32_t manufacture_id; - uint32_t model_id; - /* Total chip size in kilobytes */ unsigned int total_size; /* Chip page size in bytes */ @@ -171,7 +192,10 @@ struct flashchip { enum test_state write; } tested;
- int (*probe) (struct flashctx *flash); + struct prober { + probefunc_t *func; + struct probe_res res; + } probers[NUM_PROBES];
/* * Erase blocks and associated erase function. Any chip erase function @@ -185,9 +209,7 @@ struct flashchip { unsigned int size; /* Eraseblock size in bytes */ unsigned int count; /* Number of contiguous blocks with that size */ } eraseblocks[NUM_ERASEREGIONS]; - /* a block_erase function should try to erase one block of size - * 'blocklen' at address 'blockaddr' and return 0 on success. */ - int (*block_erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen); + erasefunc_t *block_erase; } block_erasers[NUM_ERASEFUNCTIONS];
int (*printlock) (struct flashctx *flash); @@ -202,7 +224,7 @@ struct flashchip { };
struct flashctx { - struct flashchip *chip; + const struct flashchip *chip; chipaddr virtual_memory; /* Some flash devices have an additional register space. */ chipaddr virtual_registers; @@ -241,7 +263,7 @@ extern const char flashrom_version[]; extern const char *chip_to_probe; int read_memmapped(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); int erase_flash(struct flashctx *flash); -int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *fill_flash, int force); +int probe_flash(struct flashctx **flashes, const struct registered_programmer *pgm); int read_flash_to_file(struct flashctx *flash, const char *filename); char *extract_param(const char *const *haystack, const char *needle, const char *delim); int verify_range(struct flashctx *flash, const uint8_t *cmpbuf, unsigned int start, unsigned int len); @@ -327,5 +349,7 @@ int spi_send_command(struct flashctx *flash, unsigned int writecnt, unsigned int int spi_send_multicommand(struct flashctx *flash, struct spi_command *cmds); uint32_t spi_get_valid_read_addr(struct flashctx *flash);
+/* programmer.c */ enum chipbustype get_buses_supported(void); + #endif /* !__FLASH_H__ */ diff --git a/flashchips.c b/flashchips.c index 6e6b3a8..18637f5 100644 --- a/flashchips.c +++ b/flashchips.c @@ -60,13 +60,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29F010A/B", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29F010B, /* Same as Am29F010A */ .total_size = 128, .page_size = 16 * 1024, - .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, + .feature_bits = FEATURE_ADDR_2AA, .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMIC_ID, AMD_AM29F010B } } }, /* Same as Am29F010A */ + }, .block_erasers = { { @@ -86,13 +87,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29F002(N)BB", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29F002BB, .total_size = 256, .page_size = 256, - .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA, + .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29F002BB } } }, + }, .block_erasers = { { @@ -117,13 +119,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29F002(N)BT", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29F002BT, .total_size = 256, .page_size = 256, - .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA, + .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29F002BT } } }, + }, .block_erasers = { { @@ -148,13 +151,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29F016D", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29F016D, - .total_size = 2 * 1024, + .total_size = 2048, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29F016D } } }, + }, .block_erasers = { { @@ -174,13 +178,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29F040B", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29F040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29F040B } } }, + }, .block_erasers = { { @@ -200,13 +205,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29F080B", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29F080B, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29F080B } } }, + }, .block_erasers = { { @@ -226,13 +232,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV001BB", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV001BB, .total_size = 128, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV001BB } } }, + }, .block_erasers = { { @@ -256,13 +263,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV001BT", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV001BT, .total_size = 128, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV001BT } } }, + }, .block_erasers = { { @@ -286,13 +294,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV002BB", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV002BB, .total_size = 256, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV002BB } } }, + }, .block_erasers = { { @@ -317,13 +326,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV002BT", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV002BT, .total_size = 256, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV002BT } } }, + }, .block_erasers = { { @@ -348,13 +358,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV004BB", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV004BB, .total_size = 512, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV004BB } } }, + }, .block_erasers = { { @@ -379,13 +390,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV004BT", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV004BT, .total_size = 512, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV004BT } } }, + }, .block_erasers = { { @@ -410,13 +422,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV008BB", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV008BB, .total_size = 1024, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV008BB } } }, + }, .block_erasers = { { @@ -441,13 +454,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV008BT", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV008BT, .total_size = 1024, .page_size = 64 * 1024, /* unused */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV008BT } } }, + }, .block_erasers = { { @@ -472,13 +486,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV040B", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV040B } } }, + }, .block_erasers = { { @@ -498,13 +513,14 @@ const struct flashchip flashchips[] = { .vendor = "AMD", .name = "Am29LV081B", .bustype = BUS_PARALLEL, - .manufacture_id = AMD_ID, - .model_id = AMD_AM29LV080B, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */ .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMD_ID, AMD_AM29LV080B } } }, + }, .block_erasers = { { @@ -524,13 +540,15 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L05PT", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L05PT, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L05PT } } }, + { probe_spi_res, { 1, { 0x05 } } }, + }, .block_erasers = { { @@ -557,13 +575,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L05PU", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L05PU, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L05PU } } }, + }, .block_erasers = { { @@ -590,13 +609,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L10PT", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L10PT, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L10PT } } }, + }, .block_erasers = { { @@ -624,13 +644,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L10PU", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L10PU, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L10PU } } }, + }, .block_erasers = { { @@ -658,13 +679,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L20PT", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L20PT, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L20PT } } }, + }, .block_erasers = { { @@ -692,13 +714,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L20PU", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L20PU, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L20PU } } }, + }, .block_erasers = { { @@ -731,13 +754,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L40PT", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L40PT, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PR, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L40PT } } }, + }, .block_erasers = { { @@ -765,13 +789,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L40PU", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L40PU, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PR, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L40PU } } }, + }, .block_erasers = { { @@ -799,13 +824,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L80P", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L80P, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PRE, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L80P } } }, + }, .block_erasers = { { @@ -833,13 +859,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L16PT", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L16PT, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L16PT } } }, + }, .block_erasers = { { @@ -870,13 +897,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L16PU", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = AMIC_A25L16PU, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PR, - .probe = probe_spi_rdid4, + .probers = + { + { probe_spi_rdid, { 4, { AMIC_ID, AMIC_A25L16PU } } }, + }, .block_erasers = { { @@ -907,13 +935,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L512", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L512, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L512 } } }, + }, .block_erasers = { { @@ -938,13 +967,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L010", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L010, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L010 } } }, + }, .block_erasers = { { @@ -969,13 +999,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L020", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L020, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L020 } } }, + }, .block_erasers = { { @@ -1000,13 +1031,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L040", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L040, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L040 } } }, + }, .block_erasers = { { @@ -1031,13 +1063,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L080", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L080, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L080 } } }, + }, .block_erasers = { { @@ -1062,13 +1095,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L016", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L016, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L016 } } }, + }, .block_erasers = { { @@ -1093,14 +1127,15 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25L032", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25L032, .total_size = 4096, .page_size = 256, /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25L032 } } }, + }, .block_erasers = { { @@ -1131,15 +1166,16 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25LQ16", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25LQ16, .total_size = 2048, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25LQ16 } } }, + }, .block_erasers = { { .eraseblocks = { { 4 * 1024, 512 } }, @@ -1169,15 +1205,16 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25LQ032/A25LQ32A", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25LQ032, .total_size = 4096, .page_size = 256, /* A25LQ32A supports SFDP */ /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25LQ032 } } }, + }, .block_erasers = { { @@ -1208,8 +1245,6 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A25LQ64", .bustype = BUS_SPI, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A25LQ032, .total_size = 8192, .page_size = 256, /* supports SFDP */ @@ -1217,7 +1252,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x35, disable 0xF5 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { AMIC_ID_NOPREFIX, AMIC_A25LQ032 } } }, + }, .block_erasers = { { @@ -1248,13 +1286,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A29002B", .bustype = BUS_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_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMIC_ID_NOPREFIX, AMIC_A29002B } } }, + }, .block_erasers = { { @@ -1279,13 +1318,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A29002T", .bustype = BUS_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_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMIC_ID_NOPREFIX, AMIC_A29002T } } }, + }, .block_erasers = { { @@ -1310,13 +1350,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A29040B", .bustype = BUS_PARALLEL, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A29040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { AMIC_ID_NOPREFIX, AMIC_A29040B } } }, + }, .block_erasers = { { @@ -1336,13 +1377,14 @@ const struct flashchip flashchips[] = { .vendor = "AMIC", .name = "A49LF040A", .bustype = BUS_LPC, - .manufacture_id = AMIC_ID_NOPREFIX, - .model_id = AMIC_A49LF040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { AMIC_ID_NOPREFIX, AMIC_A49LF040A } } }, + }, .block_erasers = { { @@ -1363,14 +1405,15 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF021", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF021, .total_size = 256, .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF021 } } }, + }, .block_erasers = { { @@ -1401,13 +1444,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF041A", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF041A, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF041A } } }, + }, .block_erasers = { { @@ -1438,13 +1482,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF081", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF081, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF081 } } }, + }, .block_erasers = { { @@ -1475,13 +1520,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF081A", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF081A, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF081A } } }, + }, .block_erasers = { { @@ -1512,13 +1558,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF161", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF161, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PROBE, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF161 } } }, + }, .block_erasers = { { @@ -1549,13 +1596,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF321", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF321, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF321 } } }, + }, .block_erasers = { { @@ -1586,14 +1634,15 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF321A", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF321A, .total_size = 4096, .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF321A } } }, + }, .block_erasers = { { @@ -1624,13 +1673,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DF641(A)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF641, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF641 } } }, + }, .block_erasers = { { @@ -1661,14 +1711,15 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DL081", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DF081, .total_size = 1024, .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DF081 } } }, + }, .block_erasers = { { @@ -1699,14 +1750,15 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DL161", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DL161, .total_size = 2048, .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DL161 } } }, + }, .block_erasers = { { @@ -1737,14 +1789,15 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25DQ161", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25DQ161, .total_size = 2048, .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25DQ161 } } }, + }, .block_erasers = { { @@ -1775,13 +1828,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25F512", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25F512, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_at25f, + .probers = + { + { probe_spi_at25f, { 3, { ATMEL_ID, ATMEL_AT25F512 } } }, + }, .block_erasers = { { @@ -1803,13 +1857,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25F512A", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25F512A, .total_size = 64, .page_size = 128, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_at25f, + .probers = + { + { probe_spi_at25f, { 3, { ATMEL_ID, ATMEL_AT25F512A } } }, + }, .block_erasers = { { @@ -1832,14 +1887,15 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25F512B", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25F512B, .total_size = 64, .page_size = 256, /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25F512B } } }, + }, .block_erasers = { { @@ -1875,13 +1931,14 @@ const struct flashchip flashchips[] = { * All other properties seem to be the same.*/ .name = "AT25F1024(A)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25F1024, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_at25f, + .probers = + { + { probe_spi_at25f, { 3, { ATMEL_ID, ATMEL_AT25F1024 } } }, + }, .block_erasers = { { @@ -1903,13 +1960,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25F2048", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25F2048, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_at25f, + .probers = + { + { probe_spi_at25f, { 3, { ATMEL_ID, ATMEL_AT25F2048 } } }, + }, .block_erasers = { { @@ -1931,13 +1989,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25F4096", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25F4096, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_at25f, + .probers = + { + { probe_spi_at25f, { 3, { ATMEL_ID, ATMEL_AT25F4096 } } }, + }, .block_erasers = { { @@ -1960,13 +2019,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25FS010", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25FS010, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25FS010 } } }, + }, .block_erasers = { { @@ -2000,13 +2060,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT25FS040", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT25FS040, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT25FS040 } } }, + }, .block_erasers = { { @@ -2037,13 +2098,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT26DF041", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT26DF041, .total_size = 512, .page_size = 256, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT26DF041 } } }, + }, .block_erasers = { { @@ -2068,13 +2130,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT26DF081A", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT26DF081A, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT26DF081A } } }, + }, .block_erasers = { { @@ -2105,13 +2168,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT26DF161", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT26DF161, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PR, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT26DF161 } } }, + }, .block_erasers = { { @@ -2142,13 +2206,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT26DF161A", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT26DF161A, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT26DF161A } } }, + }, .block_erasers = { { @@ -2180,13 +2245,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT26DF321", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT26DF321, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT26DF321 } } }, + }, .printlock = spi_prettyprint_status_register_at26df081a, .unlock = spi_disable_blockprotect, .write = spi_chip_write_256, @@ -2197,13 +2263,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT26F004", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT26F004, .total_size = 512, .page_size = 256, .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD }, .feature_bits = FEATURE_WRSR_WREN, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT26F004 } } }, + }, .block_erasers = { { @@ -2233,13 +2300,13 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT29C512", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT29C512, .total_size = 64, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 10 ms, Enter=Exec */ + .probers = + { + { probe_jedec_longreset, { 2, { ATMEL_ID, ATMEL_AT29C512 } } }, /* 10 ms, Enter=Exec */ + }, .block_erasers = { { @@ -2256,13 +2323,13 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT29C010A", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT29C010A, .total_size = 128, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, /* 10 ms, Enter=Exec */ + .probers = + { + { probe_jedec_longreset, { 2, { ATMEL_ID, ATMEL_AT29C010A } } }, /* 10 ms, Enter=Exec */ + }, .block_erasers = { { @@ -2279,13 +2346,13 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT29C020", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT29C020, .total_size = 256, .page_size = 256, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 10 ms */ + .probers = + { + { probe_jedec_longreset, { 2, { ATMEL_ID, ATMEL_AT29C020 } } }, /* 10 ms */ + }, .block_erasers = { { @@ -2302,13 +2369,13 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT29C040A", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT29C040A, .total_size = 512, .page_size = 256, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, /* 10 ms */ + .probers = + { + { probe_jedec_longreset, { 2, { ATMEL_ID, ATMEL_AT29C040A } } }, /* 10 ms */ + }, .block_erasers = { { @@ -2325,15 +2392,16 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT45CS1282", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45CS1282, .total_size = 16896 /* No power of two sizes */, .page_size = 1056 /* No power of two sizes */, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45CS1282 } } }, + }, .block_erasers = { { @@ -2354,24 +2422,26 @@ const struct flashchip flashchips[] = {
{ .vendor = "Atmel", - .name = "AT45DB011D", + .name = "AT45DB011D (power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB011D, - .total_size = 128 /* or 132, determined from status register */, - .page_size = 256 /* or 264, determined from status register */, + .total_size = 128, + .page_size = 256, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB011D } } }, + }, .block_erasers = { { .eraseblocks = { {256, 512} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 256, 512/8} }, + .eraseblocks = { {8 * 256, 64} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { @@ -2387,7 +2457,7 @@ const struct flashchip flashchips[] = { }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_256bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, @@ -2395,40 +2465,42 @@ const struct flashchip flashchips[] = {
{ .vendor = "Atmel", - .name = "AT45DB021D", + .name = "AT45DB011D (non-power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB021D, - .total_size = 256 /* or 264, determined from status register */, - .page_size = 256 /* or 264, determined from status register */, + .total_size = (128 / 32) * 33, + .page_size = (256 / 32) * 33, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB011D } } }, + }, .block_erasers = { { - .eraseblocks = { {256, 1024} }, + .eraseblocks = { {(256 / 32) * 33, 512} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 256, 1024/8} }, + .eraseblocks = { {(2048 / 32) * 33, 64} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { - {8 * 256, 1}, - {120 * 256, 1}, - {128 * 256, 7}, + {8 * (256 / 32) * 33, 1}, + {120 * (256 / 32) * 33, 1}, + {128 * (256 / 32) * 33, 3}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {256 * 1024, 1} }, + .eraseblocks = { {(128 / 32) * 33 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_264bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, @@ -2436,205 +2508,213 @@ const struct flashchip flashchips[] = {
{ .vendor = "Atmel", - .name = "AT45DB041D", + .name = "AT45DB021D (power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB041D, - .total_size = 512 /* or 528, determined from status register */, - .page_size = 256 /* or 264, determined from status register */, + .total_size = 256, + .page_size = 256, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, - .tested = TEST_OK_PREW, - .probe = probe_spi_at45db, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB021D } } }, + }, .block_erasers = { { - .eraseblocks = { {256, 2048} }, + .eraseblocks = { {256, 1024} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 256, 2048/8} }, + .eraseblocks = { {8 * 256, 1024/8} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { {8 * 256, 1}, - {248 * 256, 1}, - {256 * 256, 7}, + {120 * 256, 1}, + {128 * 256, 7}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {512 * 1024, 1} }, + .eraseblocks = { {256 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_256bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + .voltage = {2700, 3600}, },
{ .vendor = "Atmel", - .name = "AT45DB081D", + .name = "AT45DB021D (non-power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB081D, - .total_size = 1024 /* or 1056, determined from status register */, - .page_size = 256 /* or 264, determined from status register */, + .total_size = (256 / 32) * 33, + .page_size = (256 / 32) * 33, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB021D } } }, + }, .block_erasers = { { - .eraseblocks = { {256, 4096} }, + .eraseblocks = { {(256 / 32) * 33, 1024} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 256, 4096/8} }, + .eraseblocks = { {8 * (256 / 32) * 33, 1024/8} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { - {8 * 256, 1}, - {248 * 256, 1}, - {256 * 256, 15}, + {8 * (256 / 32) * 33, 1}, + {120 * (256 / 32) * 33, 1}, + {128 * (256 / 32) * 33, 7}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {1024 * 1024, 1} }, + .eraseblocks = { {(256 / 32) * 33 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_264bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ - .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + .voltage = {2700, 3600}, },
{ .vendor = "Atmel", - .name = "AT45DB161D", + .name = "AT45DB041D (power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB161D, - .total_size = 2048 /* or 2112, determined from status register */, - .page_size = 512 /* or 528, determined from status register */, + .total_size = 512, + .page_size = 256, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB041D } } }, + }, .block_erasers = { { - .eraseblocks = { {512, 4096} }, + .eraseblocks = { {256, 2048} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 512, 4096/8} }, + .eraseblocks = { {8 * 256, 2048/8} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { - {8 * 512, 1}, - {248 * 512, 1}, - {256 * 512, 15}, + {8 * 256, 1}, + {248 * 256, 1}, + {256 * 256, 7}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {2048 * 1024, 1} }, + .eraseblocks = { {512 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_256bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ }, - { .vendor = "Atmel", - .name = "AT45DB321C", + .name = "AT45DB041D (non-power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB321C, - .total_size = 4224 /* No power of two sizes */, - .page_size = 528 /* No power of two sizes */, + .total_size = (512 / 32) * 33, + .page_size = (256 / 32) * 33, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ - /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, - .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .tested = TEST_OK_PREW, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB041D, 0x00 } } }, + }, .block_erasers = { { - .eraseblocks = { {528, 8192} }, + .eraseblocks = { {(256 / 32) * 33, 2048} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 528, 8192/8} }, + .eraseblocks = { {8 * (256 / 32) * 33, 2048/8} }, .block_erase = spi_erase_at45db_block, - }, /* Although the datasheets describes sectors (which can be write protected) - * there seems to be no erase functions for them. - { + }, { .eraseblocks = { - {8 * 528, 1}, - {120 * 528, 1}, - {128 * 528, 63}, + {8 * (256 / 32) * 33, 1}, + {248 * (256 / 32) * 33, 1}, + {256 * (256 / 32) * 33, 7}, }, .block_erase = spi_erase_at45db_sector - }, */ { - .eraseblocks = { {4224 * 1024, 1} }, + }, { + .eraseblocks = { {(512 / 32) * 33 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, - .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */ - .gran = write_gran_528bytes, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_264bytes, .write = spi_write_at45db, - .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */ - .voltage = {2700, 3600}, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ },
{ .vendor = "Atmel", - .name = "AT45DB321D", + .name = "AT45DB081D (power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB321D, - .total_size = 4096 /* or 4224, determined from status register */, - .page_size = 512 /* or 528, determined from status register */, + .total_size = 1024, + .page_size = 256, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB081D } } }, + }, .block_erasers = { { - .eraseblocks = { {512, 8192} }, + .eraseblocks = { {256, 4096} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 512, 8192/8} }, + .eraseblocks = { {8 * 256, 4096/8} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { - {8 * 512, 1}, - {120 * 512, 1}, - {128 * 512, 63}, + {8 * 256, 1}, + {248 * 256, 1}, + {256 * 256, 15}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {4096 * 1024, 1} }, + .eraseblocks = { {1024 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_256bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ @@ -2642,81 +2722,428 @@ const struct flashchip flashchips[] = {
{ .vendor = "Atmel", - .name = "AT45DB321E", + .name = "AT45DB081D (non-power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB321C, - .total_size = 4096 /* or 4224, determined from status register */, - .page_size = 512 /* or 528, determined from status register */, + .total_size = (1024 / 32) * 33, + .page_size = (256 / 32) * 33, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB081D } } }, + }, .block_erasers = { { - .eraseblocks = { {512, 8192} }, + .eraseblocks = { {(256 / 32) * 33, 4096} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 512, 8192/8} }, + .eraseblocks = { {8 * (256 / 32) * 33, 4096/8} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { - {8 * 512, 1}, - {120 * 512, 1}, - {128 * 512, 63}, + {8 * (256 / 32) * 33, 1}, + {248 * (256 / 32) * 33, 1}, + {256 * (256 / 32) * 33, 15}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {4096 * 1024, 1} }, + .eraseblocks = { {(1024 / 32) * 33 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_264bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB161D (power-of-two)", + .bustype = BUS_SPI, + .total_size = 2048, + .page_size = 512, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_OK_PREW, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB161D } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {512, 4096} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * 512, 4096/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * 512, 1}, + {248 * 512, 1}, + {256 * 512, 15}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {2048 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_512bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB161D (non-power-of-two)", + .bustype = BUS_SPI, + .total_size = (2048 / 32) * 33, + .page_size = (512 / 32) * 33, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_OK_PREW, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB161D } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {(512 / 32) * 33, 4096} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * (512 / 32) * 33, 4096/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * (512 / 32) * 33, 1}, + {248 * (512 / 32) * 33, 1}, + {256 * (512 / 32) * 33, 15}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {(2048 / 32) * 33 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_528bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB321C", + .bustype = BUS_SPI, + .total_size = 4224 /* No power of two sizes */, + .page_size = 528 /* No power of two sizes */, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ + .feature_bits = FEATURE_OTP, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB321C } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {528, 8192} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * 528, 8192/8} }, + .block_erase = spi_erase_at45db_block, + }, /* Although the datasheets describes sectors (which can be write protected) + * there seems to be no erase functions for them. + { + .eraseblocks = { + {8 * 528, 1}, + {120 * 528, 1}, + {128 * 528, 63}, + }, + .block_erase = spi_erase_at45db_sector + }, */ { + .eraseblocks = { {4224 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */ + .gran = write_gran_528bytes, + .write = spi_write_at45db, + .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */ + .voltage = {2700, 3600}, + }, + + { + .vendor = "Atmel", + .name = "AT45DB321D (power-of-two)", + .bustype = BUS_SPI, + .total_size = 4096, + .page_size = 512, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB321D } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {512, 8192} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * 512, 8192/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * 512, 1}, + {120 * 512, 1}, + {128 * 512, 63}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {4096 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_512bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB321D (non-power-of-two)", + .bustype = BUS_SPI, + .total_size = (4096 / 32) * 33, + .page_size = (512 / 32) * 33, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB321D } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {(512 / 32) * 33, 8192} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * (512 / 32) * 33, 8192/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * (512 / 32) * 33, 1}, + {120 * (512 / 32) * 33, 1}, + {128 * (512 / 32) * 33, 63}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {(4096 / 32) * 33 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_512bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB321E (power-of-two)", + .bustype = BUS_SPI, + .total_size = 4096, + .page_size = 512, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB321C } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {512, 8192} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * 512, 8192/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * 512, 1}, + {120 * 512, 1}, + {128 * 512, 63}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {4096 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */ - /* granularity will be set by the probing function. */ + .gran = write_gran_512bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB321E (non-power-of-two)", + .bustype = BUS_SPI, + .total_size = (4096 / 32) * 33, + .page_size = (512 / 32) * 33, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB321C } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {(512 / 32) * 33, 8192} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * (512 / 32) * 33, 8192/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * (512 / 32) * 33, 1}, + {120 * (512 / 32) * 33, 1}, + {128 * (512 / 32) * 33, 63}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {(4096 / 32) * 33 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */ + .gran = write_gran_528bytes, + .write = spi_write_at45db, + .read = spi_read_at45db, /* Fast read (0x0B) supported */ + .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */ + }, + + { + .vendor = "Atmel", + .name = "AT45DB642D (power-of-two)", + .bustype = BUS_SPI, + .total_size = 8192, + .page_size = 1024, + /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ + /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ + .feature_bits = FEATURE_OTP, + .tested = TEST_UNTESTED, + .probers = + { + { probe_spi_at45db, { 1, { 0x01 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB642D } } }, + }, + .block_erasers = + { + { + .eraseblocks = { {1024, 8192} }, + .block_erase = spi_erase_at45db_page, + }, { + .eraseblocks = { {8 * 1024, 8192/8} }, + .block_erase = spi_erase_at45db_block, + }, { + .eraseblocks = { + {8 * 1024, 1}, + {248 * 1024, 1}, + {256 * 1024, 31}, + }, + .block_erase = spi_erase_at45db_sector + }, { + .eraseblocks = { {8192 * 1024, 1} }, + .block_erase = spi_erase_at45db_chip, + } + }, + .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ + .printlock = spi_prettyprint_status_register_at45db, + .gran = write_gran_1024bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ - .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */ + .voltage = {2700, 3600}, }, - { .vendor = "Atmel", - .name = "AT45DB642D", + .name = "AT45DB642D (non-power-of-two)", .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT45DB642D, - .total_size = 8192 /* or 8448, determined from status register */, - .page_size = 1024 /* or 1056, determined from status register */, + .total_size = (8192 / 32) * 33, + .page_size = (1024 / 32) * 33, /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ .feature_bits = FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_at45db, + .probers = + { + { probe_spi_at45db, { 1, { 0x00 } } }, + { probe_spi_rdid, { 3, { ATMEL_ID, ATMEL_AT45DB642D } } }, + }, .block_erasers = { { - .eraseblocks = { {1024, 8192} }, + .eraseblocks = { {(1024 / 32) * 33, 8192} }, .block_erase = spi_erase_at45db_page, }, { - .eraseblocks = { {8 * 1024, 8192/8} }, + .eraseblocks = { {8 * (1024 / 32) * 33, 8192/8} }, .block_erase = spi_erase_at45db_block, }, { .eraseblocks = { - {8 * 1024, 1}, - {248 * 1024, 1}, - {256 * 1024, 31}, + {8 * (1024 / 32) * 33, 1}, + {248 * (1024 / 32) * 33, 1}, + {256 * (1024 / 32) * 33, 31}, }, .block_erase = spi_erase_at45db_sector }, { - .eraseblocks = { {8192 * 1024, 1} }, + .eraseblocks = { {(8192 / 32) * 33 * 1024, 1} }, .block_erase = spi_erase_at45db_chip, } }, .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ .printlock = spi_prettyprint_status_register_at45db, - /* granularity will be set by the probing function. */ + .gran = write_gran_1056bytes, .write = spi_write_at45db, .read = spi_read_at45db, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, @@ -2726,13 +3153,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49BV512", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49BV512, .total_size = 64, .page_size = 64, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49BV512 } } }, + }, .block_erasers = { { @@ -2749,13 +3177,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49F002(N)", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F002N, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F002N } } }, + }, .block_erasers = { { @@ -2780,13 +3209,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49F002(N)T", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F002NT, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F002NT } } }, + }, .block_erasers = { { @@ -2811,13 +3241,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49(H)F010", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F010, .total_size = 128, .page_size = 0, /* unused */ .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F010 } } }, + }, .block_erasers = { { @@ -2835,13 +3266,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49F020", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F020, .total_size = 256, .page_size = 0, /* unused */ .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F020 } } }, + }, .block_erasers = { { @@ -2865,13 +3297,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49F040", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F040, .total_size = 512, .page_size = 0, /* unused */ .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F040 } } }, + }, .block_erasers = { { @@ -2895,13 +3328,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49F080", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F080, .total_size = 1024, .page_size = 0, /* unused */ .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F080 } } }, + }, .block_erasers = { { @@ -2926,13 +3360,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49F080T", .bustype = BUS_PARALLEL, - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49F080T, .total_size = 1024, .page_size = 0, /* unused */ .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ATMEL_ID, ATMEL_AT49F080T } } }, + }, .block_erasers = { { @@ -2956,13 +3391,14 @@ const struct flashchip flashchips[] = { .vendor = "Atmel", .name = "AT49LH002", .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ - .manufacture_id = ATMEL_ID, - .model_id = ATMEL_AT49LH002, .total_size = 256, .page_size = 0, /* unused */ .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */ .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, /* TODO: 0xff cmd not documented? */ + .probers = + { + { probe_82802ab_unshifted, { 3, { ATMEL_ID, ATMEL_AT49LH002 } } }, /* TODO: 0xff cmd not documented? */ + }, .block_erasers = { { @@ -2991,13 +3427,14 @@ const struct flashchip flashchips[] = { .vendor = "Catalyst", .name = "CAT28F512", .bustype = BUS_PARALLEL, - .manufacture_id = CATALYST_ID, - .model_id = CATALYST_CAT28F512, .total_size = 64, .page_size = 0, /* unused */ .feature_bits = 0, .tested = TEST_OK_PR, - .probe = probe_jedec, /* FIXME! */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { CATALYST_ID, CATALYST_CAT28F512 } } }, /* FIXME! */ + }, .block_erasers = { { @@ -3014,13 +3451,14 @@ const struct flashchip flashchips[] = { .vendor = "Bright", .name = "BM29F040", .bustype = BUS_PARALLEL, - .manufacture_id = BRIGHT_ID, - .model_id = BRIGHT_BM29F040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { BRIGHT_ID, BRIGHT_BM29F040 } } }, + }, .block_erasers = { { @@ -3040,13 +3478,14 @@ const struct flashchip flashchips[] = { .vendor = "ESMT", .name = "F49B002UA", .bustype = BUS_PARALLEL, - .manufacture_id = ESMT_ID, - .model_id = ESMT_F49B002UA, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { ESMT_ID, ESMT_F49B002UA } } }, + }, .block_erasers = { { @@ -3071,13 +3510,14 @@ const struct flashchip flashchips[] = { .vendor = "ESMT", .name = "F25L008A", .bustype = BUS_SPI, - .manufacture_id = ESMT_ID, - .model_id = ESMT_F25L008A, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ESMT_ID, ESMT_F25L008A } } }, + }, .block_erasers = { { @@ -3105,13 +3545,14 @@ const struct flashchip flashchips[] = { .vendor = "ESMT", .name = "F25L32PA", .bustype = BUS_SPI, - .manufacture_id = ESMT_ID, - .model_id = ESMT_F25L32PA, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ESMT_ID, ESMT_F25L32PA } } }, + }, .block_erasers = { { @@ -3139,13 +3580,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B05", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B05, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B05 } } }, + }, .block_erasers = { { @@ -3172,13 +3614,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B05T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B05, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B05 } } }, + }, .block_erasers = { { @@ -3205,13 +3648,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B10", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B10 } } }, + }, .block_erasers = { { @@ -3238,13 +3682,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B10T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B10 } } }, + }, .block_erasers = { { @@ -3271,13 +3716,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B20", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B20 } } }, + }, .block_erasers = { { @@ -3305,13 +3751,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B20T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B20 } } }, + }, .block_erasers = { { @@ -3339,13 +3786,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B40", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B40 } } }, + }, .block_erasers = { { @@ -3373,13 +3821,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B40T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B40 } } }, + }, .block_erasers = { { @@ -3407,13 +3856,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B80", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B80 } } }, + }, .block_erasers = { { @@ -3441,13 +3891,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B80T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B80 } } }, + }, .block_erasers = { { @@ -3475,13 +3926,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B16", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B16 } } }, + }, .block_erasers = { { @@ -3509,13 +3961,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B16T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B16 } } }, + }, .block_erasers = { { @@ -3543,13 +3996,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B32", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B32, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B32 } } }, + }, .block_erasers = { { @@ -3577,13 +4031,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B32T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B32, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B32 } } }, + }, .block_erasers = { { @@ -3611,13 +4066,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B64", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B64, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B64 } } }, + }, .block_erasers = { { @@ -3645,13 +4101,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25B64T", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25B64, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25B64 } } }, + }, .block_erasers = { { @@ -3679,13 +4136,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F05", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F05, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F05 } } }, + }, .block_erasers = { { @@ -3716,13 +4174,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F10", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F10 } } }, + }, .block_erasers = { { @@ -3753,13 +4212,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F20", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F20 } } }, + }, .block_erasers = { { @@ -3790,13 +4250,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F40", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PROBE, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F40 } } }, + }, .block_erasers = { { @@ -3824,13 +4285,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F80", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F80 } } }, + }, .block_erasers = { { @@ -3858,13 +4320,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F16", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F16 } } }, + }, .block_erasers = { { @@ -3892,13 +4355,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F32", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F32, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F32 } } }, + }, .block_erasers = { { @@ -3926,13 +4390,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25F64", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25F64, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25F64 } } }, + }, .block_erasers = { { @@ -3960,14 +4425,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25Q40", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25Q40, .total_size = 512, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25Q40 } } }, + }, .block_erasers = { { @@ -3995,14 +4461,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25Q80(A)", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25Q80, .total_size = 1024, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25Q80 } } }, + }, .block_erasers = { { @@ -4032,14 +4499,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25Q16", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25Q16, .total_size = 2048, .page_size = 256, /* OTP: D16 512B/Q16 128B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25Q16 } } }, + }, .block_erasers = { { @@ -4071,14 +4539,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25Q32(A/B)", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25Q32, .total_size = 4096, .page_size = 256, /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25Q32 } } }, + }, .block_erasers = { { @@ -4106,14 +4575,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25Q64", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25Q64, .total_size = 8192, .page_size = 256, /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25Q64 } } }, + }, .block_erasers = { { @@ -4141,14 +4611,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25Q128", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25Q128, .total_size = 16384, .page_size = 256, /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25Q128 } } }, + }, .block_erasers = { { @@ -4175,8 +4646,6 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25QH16", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25QH16, .total_size = 2048, .page_size = 256, /* supports SFDP */ @@ -4184,7 +4653,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_OK_PR, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25QH16 } } }, + }, .block_erasers = { { @@ -4212,8 +4684,6 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25QH32", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25QH32, .total_size = 4096, .page_size = 256, /* supports SFDP */ @@ -4221,7 +4691,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25QH32 } } }, + }, .block_erasers = { { @@ -4249,8 +4722,6 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25QH64", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25QH64, .total_size = 8192, .page_size = 256, /* supports SFDP */ @@ -4258,7 +4729,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_OK_PR, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25QH64 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 2048} }, @@ -4285,8 +4759,6 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25QH128", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25QH128, .total_size = 16384, .page_size = 256, /* supports SFDP */ @@ -4294,7 +4766,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25QH128 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 4096} }, @@ -4321,14 +4796,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S10", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S10, .total_size = 128, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S10 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, @@ -4355,14 +4831,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S20", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S20, .total_size = 256, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S20 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, @@ -4389,14 +4866,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S40", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S40, .total_size = 512, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S40 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, @@ -4423,14 +4901,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S80", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S80, .total_size = 1024, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S80 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, @@ -4457,14 +4936,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S16", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S16, .total_size = 2048, .page_size = 256, /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S16 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, @@ -4494,14 +4974,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S32", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S32, .total_size = 4096, .page_size = 256, /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S32 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, @@ -4531,14 +5012,15 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN25S64", .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = EON_EN25S64, .total_size = 8192, .page_size = 256, /* OTP: 512B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { EON_ID_NOPREFIX, EON_EN25S64 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 2048} }, @@ -4565,13 +5047,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN29F010", .bustype = BUS_PARALLEL, - .manufacture_id = EON_ID, - .model_id = EON_EN29F010, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { EON_ID, EON_EN29F010 } } }, + }, .block_erasers = { { @@ -4592,13 +5075,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN29F002(A)(N)B", .bustype = BUS_PARALLEL, - .manufacture_id = EON_ID, - .model_id = EON_EN29F002B, .total_size = 256, .page_size = 256, - .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, + .feature_bits = FEATURE_ADDR_AAA, .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_aaa, { 4, { EON_ID, EON_EN29F002B } } }, + }, .block_erasers = { { @@ -4623,13 +5107,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN29F002(A)(N)T", .bustype = BUS_PARALLEL, - .manufacture_id = EON_ID, - .model_id = EON_EN29F002T, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_aaa, { 2, { EON_ID, EON_EN29F002T } } }, + }, .block_erasers = { { @@ -4654,13 +5139,14 @@ const struct flashchip flashchips[] = { .vendor = "Eon", .name = "EN29LV640B", .bustype = BUS_PARALLEL, - .manufacture_id = EON_ID, - .model_id = EON_EN29LV640B, .total_size = 8192, .page_size = 8192, .feature_bits = 0, .tested = TEST_OK_PREW, - .probe = probe_en29lv640b, + .probers = + { + { probe_en29lv640b, { 3, { EON_ID, EON_EN29LV640B } } }, + }, .block_erasers = { { @@ -4683,13 +5169,14 @@ const struct flashchip flashchips[] = { .vendor = "Fujitsu", .name = "MBM29F004BC", .bustype = BUS_PARALLEL, - .manufacture_id = FUJITSU_ID, - .model_id = FUJITSU_MBM29F004BC, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { FUJITSU_ID, FUJITSU_MBM29F004BC } } }, + }, .block_erasers = { { @@ -4714,13 +5201,14 @@ const struct flashchip flashchips[] = { .vendor = "Fujitsu", .name = "MBM29F004TC", .bustype = BUS_PARALLEL, - .manufacture_id = FUJITSU_ID, - .model_id = FUJITSU_MBM29F004TC, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { FUJITSU_ID, FUJITSU_MBM29F004TC } } }, + }, .block_erasers = { { @@ -4746,12 +5234,13 @@ const struct flashchip flashchips[] = { .vendor = "Fujitsu", .name = "MBM29F400BC", .bustype = BUS_PARALLEL, - .manufacture_id = FUJITSU_ID, - .model_id = FUJITSU_MBM29F400BC, .total_size = 512, .page_size = 64 * 1024, .tested = TEST_UNTESTED, - .probe = probe_m29f400bt, + .probers = + { + { probe_m29f400bt, { 3, { FUJITSU_ID, FUJITSU_MBM29F400BC } } }, + }, .block_erasers = { { @@ -4776,12 +5265,13 @@ const struct flashchip flashchips[] = { .vendor = "Fujitsu", .name = "MBM29F400TC", .bustype = BUS_PARALLEL, - .manufacture_id = FUJITSU_ID, - .model_id = FUJITSU_MBM29F400TC, .total_size = 512, .page_size = 64 * 1024, .tested = TEST_UNTESTED, - .probe = probe_m29f400bt, + .probers = + { + { probe_m29f400bt, { 3, { FUJITSU_ID, FUJITSU_MBM29F400TC } } }, + }, .block_erasers = { { @@ -4806,12 +5296,13 @@ const struct flashchip flashchips[] = { .vendor = "Fujitsu", .name = "MBM29LV160BE", .bustype = BUS_PARALLEL, - .manufacture_id = FUJITSU_ID, - .model_id = FUJITSU_MBM29LV160BE, - .total_size = 2 * 1024, + .total_size = 2048, .page_size = 0, .tested = TEST_UNTESTED, - .probe = probe_m29f400bt, + .probers = + { + { probe_m29f400bt, { 3, { FUJITSU_ID, FUJITSU_MBM29LV160BE } } }, + }, .block_erasers = { { @@ -4836,12 +5327,13 @@ const struct flashchip flashchips[] = { .vendor = "Fujitsu", .name = "MBM29LV160TE", .bustype = BUS_PARALLEL, - .manufacture_id = FUJITSU_ID, - .model_id = FUJITSU_MBM29LV160TE, - .total_size = 2 * 1024, + .total_size = 2048, .page_size = 0, .tested = TEST_UNTESTED, - .probe = probe_m29f400bt, + .probers = + { + { probe_m29f400bt, { 3, { FUJITSU_ID, FUJITSU_MBM29LV160TE } } }, + }, .block_erasers = { { @@ -4866,14 +5358,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25LQ32", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25LQ32, .total_size = 4096, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25LQ32 } } }, + }, .block_erasers = { { @@ -4904,13 +5397,14 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q512", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q512, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q512 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 16} }, @@ -4937,13 +5431,14 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q10", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q10 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, @@ -4973,13 +5468,14 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q20(B)", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q20 } } }, + }, .block_erasers = { { @@ -5010,13 +5506,14 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q40(B)", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q40 } } }, + }, .block_erasers = { { @@ -5047,14 +5544,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q80(B)", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q80, .total_size = 1024, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q80 } } }, + }, .block_erasers = { { @@ -5085,14 +5583,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q16(B)", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q16, .total_size = 2048, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q16 } } }, + }, .block_erasers = { { @@ -5123,14 +5622,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q32(B)", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q32, .total_size = 4096, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q32 } } }, + }, .block_erasers = { { @@ -5161,14 +5661,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q64(B)", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q64, .total_size = 8192, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q64 } } }, + }, .block_erasers = { { @@ -5199,14 +5700,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25Q128B", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25Q128, .total_size = 16384, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25Q128 } } }, + }, .block_erasers = { { @@ -5237,14 +5739,15 @@ const struct flashchip flashchips[] = { .vendor = "GigaDevice", .name = "GD25T80", .bustype = BUS_SPI, - .manufacture_id = GIGADEVICE_ID, - .model_id = GIGADEVICE_GD25T80, .total_size = 1024, .page_size = 256, /* OTP: 256B total; enter 0x3A */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { GIGADEVICE_ID, GIGADEVICE_GD25T80 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, @@ -5274,13 +5777,14 @@ const struct flashchip flashchips[] = { .vendor = "Hyundai", .name = "HY29F002T", .bustype = BUS_PARALLEL, - .manufacture_id = HYUNDAI_ID, - .model_id = HYUNDAI_HY29F002T, .total_size = 256, .page_size = 256 * 1024, .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */ .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { HYUNDAI_ID, HYUNDAI_HY29F002T } } }, + }, .block_erasers = { { @@ -5305,13 +5809,14 @@ const struct flashchip flashchips[] = { .vendor = "Hyundai", .name = "HY29F002B", .bustype = BUS_PARALLEL, - .manufacture_id = HYUNDAI_ID, - .model_id = HYUNDAI_HY29F002B, .total_size = 256, .page_size = 256 * 1024, .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */ .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { HYUNDAI_ID, HYUNDAI_HY29F002B } } }, + }, .block_erasers = { { @@ -5336,13 +5841,14 @@ const struct flashchip flashchips[] = { .vendor = "Hyundai", .name = "HY29F040A", .bustype = BUS_PARALLEL, - .manufacture_id = HYUNDAI_ID, - .model_id = HYUNDAI_HY29F040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { HYUNDAI_ID, HYUNDAI_HY29F040A } } }, + }, .block_erasers = { { @@ -5362,14 +5868,15 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "25F160S33B8", .bustype = BUS_SPI, - .manufacture_id = INTEL_ID, - .model_id = INTEL_25F160S33B8, .total_size = 2048, .page_size = 256, /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { INTEL_ID, INTEL_25F160S33B8 } } }, + }, .block_erasers = { { @@ -5378,7 +5885,7 @@ const struct flashchip flashchips[] = { * have no effect on the memory contents, but sets a flag in the SR. .eraseblocks = { {8 * 1024, 8}, - {64 * 1024, 31} // inaccessible + {64 * 1024, 31} inaccessible }, .block_erase = spi_block_erase_40, }, { */ @@ -5400,14 +5907,15 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "25F160S33T8", .bustype = BUS_SPI, - .manufacture_id = INTEL_ID, - .model_id = INTEL_25F160S33T8, .total_size = 2048, .page_size = 256, /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { INTEL_ID, INTEL_25F160S33T8 } } }, + }, .block_erasers = { { @@ -5415,7 +5923,7 @@ const struct flashchip flashchips[] = { * opcode 0x40. Trying to access an address outside these 8 8kB blocks does * have no effect on the memory contents, but sets a flag in the SR. .eraseblocks = { - {64 * 1024, 31}, // inaccessible + {64 * 1024, 31}, inaccessible {8 * 1024, 8} }, .block_erase = spi_block_erase_40, @@ -5438,14 +5946,15 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "25F320S33B8", .bustype = BUS_SPI, - .manufacture_id = INTEL_ID, - .model_id = INTEL_25F320S33B8, .total_size = 4096, .page_size = 256, /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { INTEL_ID, INTEL_25F320S33B8 } } }, + }, .block_erasers = { { @@ -5454,7 +5963,7 @@ const struct flashchip flashchips[] = { * have no effect on the memory contents, but sets a flag in the SR. .eraseblocks = { {8 * 1024, 8}, - {64 * 1024, 63} // inaccessible + {64 * 1024, 63} inaccessible }, .block_erase = spi_block_erase_40, }, { */ @@ -5476,14 +5985,15 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "25F320S33T8", .bustype = BUS_SPI, - .manufacture_id = INTEL_ID, - .model_id = INTEL_25F320S33T8, .total_size = 4096, .page_size = 256, /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { INTEL_ID, INTEL_25F320S33T8 } } }, + }, .block_erasers = { { @@ -5491,7 +6001,7 @@ const struct flashchip flashchips[] = { * opcode 0x40. Trying to access an address outside these 8 8kB blocks does * have no effect on the memory contents, but sets a flag in the SR. .eraseblocks = { - {64 * 1024, 63}, // inaccessible + {64 * 1024, 63}, inaccessible {8 * 1024, 8} }, .block_erase = spi_block_erase_40, @@ -5514,14 +6024,15 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "25F640S33B8", .bustype = BUS_SPI, - .manufacture_id = INTEL_ID, - .model_id = INTEL_25F640S33B8, .total_size = 8192, .page_size = 256, /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { INTEL_ID, INTEL_25F640S33B8 } } }, + }, .block_erasers = { { @@ -5530,7 +6041,7 @@ const struct flashchip flashchips[] = { * have no effect on the memory contents, but sets a flag in the SR. .eraseblocks = { {8 * 1024, 8}, - {64 * 1024, 127} // inaccessible + {64 * 1024, 127} inaccessible }, .block_erase = spi_block_erase_40, }, { */ @@ -5552,14 +6063,15 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "25F640S33T8", .bustype = BUS_SPI, - .manufacture_id = INTEL_ID, - .model_id = INTEL_25F640S33T8, .total_size = 8192, .page_size = 256, /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { INTEL_ID, INTEL_25F640S33T8 } } }, + }, .block_erasers = { { @@ -5567,7 +6079,7 @@ const struct flashchip flashchips[] = { * opcode 0x40. Trying to access an address outside these 8 8kB blocks does * have no effect on the memory contents, but sets a flag in the SR. .eraseblocks = { - {64 * 1024, 127}, // inaccessible + {64 * 1024, 127}, inaccessible {8 * 1024, 8} }, .block_erase = spi_block_erase_40, @@ -5590,12 +6102,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F001BN/BX-B", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F001B, .total_size = 128, .page_size = 128 * 1024, /* 8k + 2x4k + 112k */ .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { INTEL_ID, INTEL_28F001B } } }, + }, .block_erasers = { { @@ -5616,12 +6129,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F001BN/BX-T", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F001T, .total_size = 128, .page_size = 128 * 1024, /* 112k + 2x4k + 8k */ .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { INTEL_ID, INTEL_28F001T } } }, + }, .block_erasers = { { @@ -5642,12 +6156,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F002BC/BL/BV/BX-T", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F002T, .total_size = 256, .page_size = 256 * 1024, .tested = TEST_OK_PRE, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { INTEL_ID, INTEL_28F002T } } }, + }, .block_erasers = { { @@ -5668,12 +6183,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F008S3/S5/SC", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F004S3, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { INTEL_ID, INTEL_28F004S3 } } }, + }, .block_erasers = { { @@ -5690,12 +6206,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F004B5/BE/BV/BX-B", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F004B, .total_size = 512, .page_size = 128 * 1024, /* maximal block size */ .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { INTEL_ID, INTEL_28F004B } } }, + }, .block_erasers = { { @@ -5716,12 +6233,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F004B5/BE/BV/BX-T", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F004T, .total_size = 512, .page_size = 128 * 1024, /* maximal block size */ .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { INTEL_ID, INTEL_28F004T } } }, + }, .block_erasers = { { @@ -5742,12 +6260,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F400BV/BX/CE/CV-B", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F400B, .total_size = 512, .page_size = 128 * 1024, /* maximal block size */ .tested = TEST_UNTESTED, - .probe = probe_82802ab_shifted, + .probers = + { + { probe_82802ab_shifted, { 3, { INTEL_ID, INTEL_28F400B } } }, + }, .block_erasers = { { @@ -5768,12 +6287,13 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "28F400BV/BX/CE/CV-T", .bustype = BUS_PARALLEL, - .manufacture_id = INTEL_ID, - .model_id = INTEL_28F400T, .total_size = 512, .page_size = 128 * 1024, /* maximal block size */ .tested = TEST_UNTESTED, - .probe = probe_82802ab_shifted, + .probers = + { + { probe_82802ab_shifted, { 3, { INTEL_ID, INTEL_28F400T } } }, + }, .block_erasers = { { @@ -5794,13 +6314,14 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "82802AB", .bustype = BUS_FWH, - .manufacture_id = INTEL_ID, - .model_id = INTEL_82802AB, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PREW, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { INTEL_ID, INTEL_82802AB } } }, + }, .block_erasers = { { @@ -5818,13 +6339,14 @@ const struct flashchip flashchips[] = { .vendor = "Intel", .name = "82802AC", .bustype = BUS_FWH, - .manufacture_id = INTEL_ID, - .model_id = INTEL_82802AC, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PR, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { INTEL_ID, INTEL_82802AC } } }, + }, .block_erasers = { { @@ -5842,12 +6364,13 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX23L3254", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX23L3254, .total_size = 4096, .page_size = 256, .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA}, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX23L3254 } } }, + }, .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */ .read = spi_chip_read, /* Fast read (0x0B) supported */ .voltage = {3000, 3600}, @@ -5857,14 +6380,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L512(E)/MX25V512(C)", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L512, .total_size = 64, .page_size = 256, /* MX25L512E supports SFDP */ .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L512 } } }, + }, .block_erasers = { { @@ -5895,14 +6419,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L1005(C)/MX25L1006E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L1005, .total_size = 128, .page_size = 256, /* MX25L1006E supports SFDP */ .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L1005 } } }, + }, .block_erasers = { { @@ -5930,13 +6455,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L2005(C)", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L2005, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L2005 } } }, + }, .block_erasers = { { @@ -5967,13 +6493,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L4005(A/C)", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L4005, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L4005 } } }, + }, .block_erasers = { { @@ -6004,13 +6531,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L8005/MX25V8005", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L8005, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L8005 } } }, + }, .block_erasers = { { @@ -6041,13 +6569,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L1605", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L1605, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L1605 } } }, + }, .block_erasers = { { @@ -6075,14 +6604,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L1605A/MX25L1606E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L1605, .total_size = 2048, .page_size = 256, /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L1605 } } }, + }, .block_erasers = { { @@ -6113,13 +6643,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L1605D/MX25L1608D/MX25L1673E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L1605, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L1605 } } }, + }, .block_erasers = { { @@ -6147,14 +6678,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L1635D", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L1635D, .total_size = 2048, .page_size = 256, /* OTP: 64B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L1635D } } }, + }, .block_erasers = { { @@ -6182,14 +6714,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L1635E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L1635E, .total_size = 2048, .page_size = 256, /* OTP: 64B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L1635E } } }, + }, .block_erasers = { { @@ -6217,13 +6750,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L3205(A)", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L3205, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L3205 } } }, + }, .block_erasers = { { @@ -6251,14 +6785,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L3205D/MX25L3208D", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L3205, .total_size = 4096, .page_size = 256, /* OTP: 64B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L3205 } } }, + }, .block_erasers = { { @@ -6286,14 +6821,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L3206E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L3205, .total_size = 4096, .page_size = 256, /* OTP: 64B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L3205 } } }, + }, .block_erasers = { { @@ -6324,14 +6860,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L3273E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L3205, .total_size = 4096, .page_size = 256, /* OTP: 64B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L3205 } } }, + }, .block_erasers = { { @@ -6362,14 +6899,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L3235D", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L3235D, .total_size = 4096, .page_size = 256, /* OTP: 256B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L3235D } } }, + }, .block_erasers = { { @@ -6397,14 +6935,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L6405(D)", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L6405, .total_size = 8192, .page_size = 256, /* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L6405 } } }, + }, .block_erasers = { { @@ -6432,14 +6971,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L6406E/MX25L6436E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L6405, .total_size = 8192, .page_size = 256, /* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L6405 } } }, + }, .block_erasers = { { @@ -6467,15 +7007,16 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L6445E/MX25L6473E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L6405, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* OTP: 512B total; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L6405 } } }, + }, .block_erasers = { { @@ -6506,14 +7047,15 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25L12805(D)", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25L12805, .total_size = 16384, .page_size = 256, /* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25L12805 } } }, + }, .block_erasers = { { @@ -6541,15 +7083,16 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25U1635E", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25U1635E, .total_size = 2048, .page_size = 256, /* OTP: 512B total; enter 0xB1, exit 0xC1 */ /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25U1635E } } }, + }, .block_erasers = { { @@ -6581,8 +7124,6 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25U3235E/F", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25U3235E, .total_size = 4096, .page_size = 256, /* F model supports SFDP */ @@ -6590,7 +7131,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25U3235E } } }, + }, .block_erasers = { { @@ -6622,8 +7166,6 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX25U6435E/F", .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX25U6435E, .total_size = 8192, .page_size = 256, /* F model supports SFDP */ @@ -6631,7 +7173,10 @@ const struct flashchip flashchips[] = { /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { MACRONIX_ID, MACRONIX_MX25U6435E } } }, + }, .block_erasers = { { @@ -6663,13 +7208,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX29F001B", .bustype = BUS_PARALLEL, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX29F001B, .total_size = 128, .page_size = 32 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { MACRONIX_ID, MACRONIX_MX29F001B } } }, + }, .block_erasers = { { @@ -6695,13 +7241,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX29F001T", .bustype = BUS_PARALLEL, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX29F001T, .total_size = 128, .page_size = 32 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { MACRONIX_ID, MACRONIX_MX29F001T } } }, + }, .block_erasers = { { @@ -6727,13 +7274,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX29F002(N)B", .bustype = BUS_PARALLEL, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX29F002B, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { MACRONIX_ID, MACRONIX_MX29F002B } } }, + }, .block_erasers = { { @@ -6758,13 +7306,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX29F002(N)T", .bustype = BUS_PARALLEL, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX29F002T, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { MACRONIX_ID, MACRONIX_MX29F002T } } }, + }, .block_erasers = { { @@ -6789,13 +7338,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX29F040", .bustype = BUS_PARALLEL, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX29F040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { MACRONIX_ID, MACRONIX_MX29F040 } } }, + }, .block_erasers = { { @@ -6815,13 +7365,14 @@ const struct flashchip flashchips[] = { .vendor = "Macronix", .name = "MX29LV040", .bustype = BUS_PARALLEL, - .manufacture_id = MACRONIX_ID, - .model_id = MACRONIX_MX29LV040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { MACRONIX_ID, MACRONIX_MX29LV040 } } }, + }, .block_erasers = { { @@ -6841,13 +7392,15 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25P05A } } }, + { probe_spi_res, { 1, { ST_M25P05A_RES } } }, + }, .block_erasers = { { @@ -6874,13 +7427,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_res, { 1, { ST_M25P05_RES } } }, + }, .block_erasers = { { @@ -6902,13 +7456,15 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, {ST_ID, ST_M25P10A } } }, + { probe_spi_res, { 1, { ST_M25P10_RES } } }, + }, .block_erasers = { { @@ -6931,13 +7487,14 @@ const struct flashchip flashchips[] = { .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_spi_res1, + .probers = + { + { probe_spi_res, { 1, { ST_M25P10_RES } } }, + }, .block_erasers = { { @@ -6959,13 +7516,15 @@ const struct flashchip flashchips[] = { .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_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, {ST_ID, ST_M25P20 } } }, + { probe_spi_res, { 1, {ST_ID, ST_M25P20_RES } } }, + }, .block_erasers = { { @@ -6987,13 +7546,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_res, { 1, {ST_ID, ST_M25P20 } } }, + }, .block_erasers = { { @@ -7015,13 +7575,15 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, {ST_ID, ST_M25P40 } } }, + { probe_spi_res, { 1, {ST_ID, ST_M25P40_RES } } }, + }, .block_erasers = { { @@ -7043,13 +7605,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_res, { 1, { ST_M25P40_RES } } }, + }, .block_erasers = { { @@ -7070,13 +7633,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25P80 } } }, + }, .block_erasers = { { @@ -7098,13 +7662,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25P16 } } }, + }, .block_erasers = { { @@ -7126,13 +7691,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25P32 } } }, + }, .block_erasers = { { @@ -7154,13 +7720,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25P64 } } }, + }, .block_erasers = { { @@ -7182,13 +7749,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25P128 } } }, + }, .block_erasers = { { @@ -7210,13 +7778,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M25PE10", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PE10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PE10 } } }, + }, .block_erasers = { { @@ -7241,13 +7810,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M25PE20", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PE20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PE20 } } }, + }, .block_erasers = { { @@ -7272,13 +7842,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M25PE40", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PE40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PE40 } } }, + }, .block_erasers = { { @@ -7303,13 +7874,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M25PE80", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PE80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PE80 } } }, + }, .block_erasers = { { @@ -7334,13 +7906,14 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M25PE16", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M25PE16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PE16 } } }, + }, .block_erasers = { { @@ -7365,14 +7938,15 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PX80 } } }, + }, .block_erasers = { { .eraseblocks = { { 4 * 1024, 256 } }, @@ -7396,14 +7970,15 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PX16 } } }, + }, .block_erasers = { { @@ -7428,14 +8003,15 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PX32 } } }, + }, .block_erasers = { { @@ -7460,14 +8036,15 @@ const struct flashchip flashchips[] = { .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_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M25PX64 } } }, + }, .block_erasers = { { @@ -7492,12 +8069,13 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M45PE10 } } }, + }, .block_erasers = { { .eraseblocks = { {256, 512} }, @@ -7518,12 +8096,13 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M45PE20 } } }, + }, .block_erasers = { { .eraseblocks = { {256, 1024} }, @@ -7544,12 +8123,13 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M45PE40", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M45PE40, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M45PE40 } } }, + }, .block_erasers = { { .eraseblocks = { {256, 2048} }, @@ -7570,12 +8150,13 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M45PE80", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M45PE80, .total_size = 1024, .page_size = 256, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M45PE80 } } }, + }, .block_erasers = { { .eraseblocks = { {256, 4096} }, @@ -7596,12 +8177,13 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "M45PE16", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_M45PE16, .total_size = 2048, .page_size = 256, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_M45PE16 } } }, + }, .block_erasers = { { .eraseblocks = { {256, 8192} }, @@ -7622,15 +8204,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q016", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q016__1E, .total_size = 2048, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q016__1E } } }, + }, .block_erasers = { { @@ -7658,15 +8241,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q032..1E", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q032__1E, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q032__1E } } }, + }, .block_erasers = { { @@ -7691,15 +8275,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q032..3E", .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q032__3E, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q032__3E } } }, + }, .block_erasers = { { @@ -7724,15 +8309,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q064__1E, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q064__1E } } }, + }, .block_erasers = { { @@ -7757,15 +8343,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q064__3E, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q064__3E } } }, + }, .block_erasers = { { @@ -7790,15 +8377,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q128__1E, .total_size = 16384, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q128__1E } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 4096 } }, @@ -7822,15 +8410,16 @@ const struct flashchip flashchips[] = { .vendor = "Micron/Numonyx/ST", .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = ST_N25Q128__3E, .total_size = 16384, .page_size = 256, /* supports SFDP */ /* OTP: 64B total; read 0x4B, write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { ST_ID, ST_N25Q128__3E } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 4096 } }, @@ -7854,13 +8443,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29C51000B } } }, + }, .block_erasers = { { @@ -7880,13 +8470,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29C51000T } } }, + }, .block_erasers = { { @@ -7906,13 +8497,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29C51400B } } }, + }, .block_erasers = { { @@ -7932,13 +8524,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29C51400T } } }, + }, .block_erasers = { { @@ -7958,13 +8551,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29LC51000 } } }, + }, .block_erasers = { { @@ -7984,13 +8578,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29LC51001 } } }, + }, .block_erasers = { { @@ -8010,13 +8605,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, MVC_V29LC51002 } } }, + }, .block_erasers = { { @@ -8036,13 +8632,14 @@ const struct flashchip flashchips[] = { .vendor = "Nantronics", .name = "N25S10", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S10 } } }, + }, .block_erasers = { { @@ -8076,13 +8673,14 @@ const struct flashchip flashchips[] = { .vendor = "Nantronics", .name = "N25S20", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S20 } } }, + }, .block_erasers = { { @@ -8116,13 +8714,14 @@ const struct flashchip flashchips[] = { .vendor = "Nantronics", .name = "N25S40", .bustype = BUS_SPI, - .manufacture_id = NANTRONICS_ID_NOPREFIX, - .model_id = NANTRONICS_N25S40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S40 } } }, + }, .block_erasers = { { @@ -8156,13 +8755,14 @@ const struct flashchip flashchips[] = { .vendor = "Nantronics", .name = "N25S80", .bustype = BUS_SPI, - .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_rdid, + .probers = + { + { probe_spi_rdid, { 3, { NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S80 } } }, + }, .block_erasers = { { @@ -8193,13 +8793,14 @@ const struct flashchip flashchips[] = { .vendor = "Nantronics", .name = "N25S16", .bustype = BUS_SPI, - .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_rdid, + .probers = + { + { probe_spi_rdid, { 3, { NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S16 } } }, + }, .block_erasers = { { @@ -8227,13 +8828,14 @@ const struct flashchip flashchips[] = { .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, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LD256C } } }, + }, .block_erasers = { { @@ -8263,13 +8865,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LD512 } } }, + }, .block_erasers = { { @@ -8300,13 +8903,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm25LD010(C)", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LD010, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LD010 } } }, + }, .block_erasers = { { @@ -8337,13 +8941,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm25LD020(C)", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LD020, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LD020 } } }, + }, .block_erasers = { { @@ -8374,13 +8979,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm25LD040(C)", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV040, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LV040 } } }, + }, .block_erasers = { { @@ -8411,13 +9017,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm25LV512(A)", .bustype = BUS_SPI, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM25LV512, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */ + .probers = + { + { probe_spi_res, { 2, { PMC_ID_NOPREFIX, PMC_PM25LV512 } } }, /* The continuation code is transferred as the 3rd byte m( */ + }, .block_erasers = { { @@ -8442,13 +9049,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm25LV010", .bustype = BUS_SPI, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM25LV010, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */ + .probers = + { + { probe_spi_res, { 2, { PMC_ID_NOPREFIX, PMC_PM25LV010 } } }, /* The continuation code is transferred as the 3rd byte m( */ + }, .block_erasers = { { @@ -8473,13 +9081,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm25LV010A", .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = PMC_PM25LV010, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LV010 } } }, + }, .block_erasers = { { @@ -8504,13 +9113,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LV020 } } }, + }, .block_erasers = { { @@ -8535,13 +9145,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LV040 } } }, + }, .block_erasers = { { @@ -8566,13 +9177,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LV080B } } }, + }, .block_erasers = { { @@ -8603,13 +9215,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_rdid, { 3, { PMC_ID, PMC_PM25LV016B } } }, + }, .block_erasers = { { @@ -8640,13 +9253,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { PMC_ID_NOPREFIX, PMC_PM29F002T } } }, + }, .block_erasers = { { @@ -8671,13 +9285,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { PMC_ID_NOPREFIX, PMC_PM29F002B } } }, + }, .block_erasers = { { @@ -8702,13 +9317,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { PMC_ID_NOPREFIX, PMC_PM39F010 } } }, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */ + }, .block_erasers = { { @@ -8731,13 +9347,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm39LV020", .bustype = BUS_PARALLEL, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM39LV020, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { PMC_ID_NOPREFIX, PMC_PM39LV020 } } }, + }, .block_erasers = { { @@ -8760,13 +9377,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm39LV040", .bustype = BUS_PARALLEL, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM39LV040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { PMC_ID_NOPREFIX, PMC_PM39LV040 } } }, + }, .block_erasers = { { @@ -8789,13 +9407,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm39LV512", .bustype = BUS_PARALLEL, - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM39LV512, .total_size = 64, .page_size = 4096, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { PMC_ID_NOPREFIX, PMC_PM39LV512 } } }, + }, .block_erasers = { { @@ -8818,13 +9437,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm49FL002", .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM49FL002, .total_size = 256, .page_size = 16 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { PMC_ID_NOPREFIX, PMC_PM49FL002 } } }, + }, .block_erasers = { { @@ -8848,13 +9468,14 @@ const struct flashchip flashchips[] = { .vendor = "PMC", .name = "Pm49FL004", .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ - .manufacture_id = PMC_ID_NOPREFIX, - .model_id = PMC_PM49FL004, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { PMC_ID_NOPREFIX, PMC_PM49FL004 } } }, + }, .block_erasers = { { @@ -8878,13 +9499,14 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW106", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW106, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SANYO_ID, SANYO_LE25FW106 } } }, + }, .block_erasers = { { .eraseblocks = { {2 * 1024, 64} }, @@ -8908,13 +9530,14 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW406A", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW406A, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SANYO_ID, SANYO_LE25FW406A } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, @@ -8938,13 +9561,14 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FU406B", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FU406B, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SANYO_ID, SANYO_LE25FU406B } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, @@ -8968,12 +9592,13 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW203A", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW203A, .total_size = 256, .page_size = 256, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SANYO_ID, SANYO_LE25FW203A } } }, + }, .block_erasers = { { @@ -8998,12 +9623,13 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW403A", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW403A, .total_size = 512, .page_size = 256, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SANYO_ID, SANYO_LE25FW403A } } }, + }, .block_erasers = { { .eraseblocks = { {256, 2 * 1024} }, @@ -9027,13 +9653,14 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW418A", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW418A, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SANYO_ID, SANYO_LE25FW418A } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, @@ -9057,13 +9684,14 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW806", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW806, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SANYO_ID, SANYO_LE25FW806 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, @@ -9090,13 +9718,14 @@ const struct flashchip flashchips[] = { .vendor = "Sanyo", .name = "LE25FW808", .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = SANYO_LE25FW808, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SANYO_ID, SANYO_LE25FW808 } } }, + }, .block_erasers = { { .eraseblocks = { {8 * 1024, 128} }, @@ -9120,12 +9749,13 @@ const struct flashchip flashchips[] = { .vendor = "Sharp", .name = "LH28F008BJT-BTLZ1", .bustype = BUS_PARALLEL, - .manufacture_id = SHARP_ID, - .model_id = SHARP_LH28F008BJ__PB, .total_size = 1024, .page_size = 64 * 1024, .tested = TEST_OK_PREW, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SHARP_ID, SHARP_LH28F008BJ__PB } } }, + }, .block_erasers = { { @@ -9149,13 +9779,14 @@ const struct flashchip flashchips[] = { .vendor = "Sharp", .name = "LHF00L04", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = SHARP_ID, - .model_id = SHARP_LHF00L04, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SHARP_ID, SHARP_LHF00L04 } } }, + }, .block_erasers = { { @@ -9181,13 +9812,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL004A", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL004A, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL004A } } }, + }, .block_erasers = { { @@ -9209,13 +9841,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL008A", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL008A, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PRE, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL008A } } }, + }, .block_erasers = { { @@ -9237,13 +9870,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL016A", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL016A, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PR, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL016A } } }, + }, .block_erasers = { { @@ -9265,13 +9899,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL032A/P", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL032A, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL032A } } }, + }, .block_erasers = { { @@ -9293,13 +9928,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL064A/P", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL064A, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL064A } } }, + }, .block_erasers = { { @@ -9321,13 +9957,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL204K", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL204, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL204 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, @@ -9354,13 +9991,14 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL208K", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL208, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL208 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 256} }, @@ -9387,14 +10025,15 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL116K/S25FL216K", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL216, .total_size = 2048, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL216 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 512} }, @@ -9421,14 +10060,15 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL132K", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL132K, .total_size = 4096, .page_size = 256, /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL132K } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 1024} }, @@ -9455,14 +10095,15 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL164K", .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL164K, .total_size = 8192, .page_size = 256, /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL164K } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 2048} }, @@ -9489,15 +10130,16 @@ const struct flashchip flashchips[] = { .vendor = "Spansion", .name = "S25FL128S......0", /* uniform 256kB sectors */ .bustype = BUS_SPI, - .manufacture_id = SPANSION_ID, - .model_id = SPANSION_S25FL128, .total_size = 16384, .page_size = 256, /* supports 4B addressing */ /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SPANSION_ID, SPANSION_S25FL128 } } }, + }, .block_erasers = { { .eraseblocks = { {4 * 1024, 4096} }, @@ -9524,13 +10166,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25LF020A", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF020_REMS, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rems, + .probers = + { + { probe_spi_rems, { 2, { SST_ID, SST_SST25VF020_REMS } } }, + }, .block_erasers = { { @@ -9555,13 +10198,14 @@ const struct flashchip flashchips[] = { .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, + .probers = + { + { probe_spi_res, { 2, { SST_ID, SST_SST25VF040_REMS } } }, + }, .block_erasers = { { @@ -9586,13 +10230,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25LF080(A)", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF080_REMS, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_UNTESTED, - .probe = probe_spi_res2, + .probers = + { + { probe_spi_res, { 2, { SST_ID, SST_SST25VF080_REMS } } }, + }, .block_erasers = { { @@ -9617,13 +10262,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF512A", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF512A_REMS, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rems, + .probers = + { + { probe_spi_rems, { 3, { SST_ID, SST_SST25VF512A_REMS } } }, + }, .block_erasers = { { @@ -9654,13 +10300,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF010", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF010_REMS, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rems, + .probers = + { + { probe_spi_rems, { 3, { SST_ID, SST_SST25VF010_REMS } } }, + }, .block_erasers = { { @@ -9691,13 +10338,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF020", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF020_REMS, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_UNTESTED, - .probe = probe_spi_rems, + .probers = + { + { probe_spi_rems, { 3, { SST_ID, SST_SST25VF020_REMS } } }, + }, .block_erasers = { { @@ -9722,13 +10370,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF020B", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF020B, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25VF020B } } }, + }, .block_erasers = { { @@ -9759,13 +10408,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF040", .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_PR, - .probe = probe_spi_rems, + .probers = + { + { probe_spi_rems, { 3, { SST_ID, SST_SST25VF040_REMS } } }, + }, .block_erasers = { { @@ -9790,13 +10440,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF040B", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF040B, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25VF040B } } }, + }, .block_erasers = { { @@ -9827,13 +10478,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF040B.REMS", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF040B_REMS, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rems, + .probers = + { + { probe_spi_rems, { 3, { SST_ID, SST_SST25VF040B_REMS } } }, + }, .block_erasers = { { @@ -9864,13 +10516,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF080B", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF080B, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25VF080B } } }, + }, .block_erasers = { { @@ -9901,13 +10554,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF016B", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF016B, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25VF016B } } }, + }, .block_erasers = { { @@ -9938,13 +10592,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF032B", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF032B, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25VF032B } } }, + }, .block_erasers = { { @@ -9975,13 +10630,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25VF064C", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25VF064C, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_EWSR, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25VF064C } } }, + }, .block_erasers = { { @@ -10012,13 +10668,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25WF512", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25WF512, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25WF512 } } }, + }, .block_erasers = { { @@ -10046,13 +10703,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25WF010", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25WF010, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25WF010 } } }, + }, .block_erasers = { { @@ -10080,13 +10738,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25WF020", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25WF020, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25WF020 } } }, + }, .block_erasers = { { @@ -10117,13 +10776,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25WF040", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25WF040, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25WF040 } } }, + }, .block_erasers = { { @@ -10154,13 +10814,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST25WF080", .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = SST_SST25WF080, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_EITHER, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { SST_ID, SST_SST25WF080 } } }, + }, .block_erasers = { { @@ -10191,13 +10852,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST28SF040A", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST28SF040, .total_size = 512, .page_size = 256, .feature_bits = 0, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SST_ID, SST_SST28SF040 } } }, + }, .block_erasers = { { @@ -10218,13 +10880,13 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST29EE010", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST29EE010, .total_size = 128, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_longreset, { 3, { SST_ID, SST_SST29EE010 } } }, + }, .block_erasers = { { @@ -10241,13 +10903,13 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST29LE010", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST29LE010, .total_size = 128, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_longreset, { 3, { SST_ID, SST_SST29LE010 } } }, + }, .block_erasers = { { @@ -10264,13 +10926,13 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST29EE020A", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST29EE020A, .total_size = 256, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_longreset, { 3, { SST_ID, SST_SST29EE020A } } }, + }, .block_erasers = { { @@ -10287,13 +10949,13 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST29LE020", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST29LE020, .total_size = 256, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_longreset, { 3, { SST_ID, SST_SST29LE020 } } }, + }, .block_erasers = { { @@ -10310,13 +10972,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39SF512", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39SF512, .total_size = 64, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39SF512 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10336,13 +10999,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39SF010A", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39SF010, .total_size = 128, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39SF010 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10362,13 +11026,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39SF020A", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39SF020, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39SF020 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10388,13 +11053,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39SF040", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39SF040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39SF040 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10414,13 +11080,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39VF512", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39VF512, .total_size = 64, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39VF512 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10440,13 +11107,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39VF010", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39VF010, .total_size = 128, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39VF010 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10466,13 +11134,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39VF020", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39VF020, .total_size = 256, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39VF020 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10492,13 +11161,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39VF040", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39VF040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39VF040 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10518,13 +11188,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST39VF080", .bustype = BUS_PARALLEL, - .manufacture_id = SST_ID, - .model_id = SST_SST39VF080, .total_size = 1024, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST39VF080 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10547,13 +11218,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF002A/B", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = SST_ID, - .model_id = SST_SST49LF002A, .total_size = 256, .page_size = 16 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF002A } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10578,13 +11250,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF003A/B", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = SST_ID, - .model_id = SST_SST49LF003A, .total_size = 384, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF003A } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10612,13 +11285,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF004A/B", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = SST_ID, - .model_id = SST_SST49LF004A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF004A } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10643,13 +11317,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF004C", .bustype = BUS_FWH, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF004C, .total_size = 512, .page_size = 4 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SST_ID, SST_SST49LF004C } } }, + }, .block_erasers = { { @@ -10675,13 +11350,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF008A", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = SST_ID, - .model_id = SST_SST49LF008A, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF008A } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10706,13 +11382,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF008C", .bustype = BUS_FWH, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF008C, .total_size = 1024, .page_size = 4 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SST_ID, SST_SST49LF008C } } }, + }, .block_erasers = { { @@ -10738,13 +11415,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF016C", .bustype = BUS_FWH, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF016C, .total_size = 2048, .page_size = 4 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PREW, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SST_ID, SST_SST49LF016C } } }, + }, .block_erasers = { { @@ -10770,13 +11448,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF020", .bustype = BUS_LPC, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF020, .total_size = 256, .page_size = 16 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF020 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10799,13 +11478,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF020A", .bustype = BUS_LPC, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF020A, .total_size = 256, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PRE, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF020A } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10828,13 +11508,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF040", .bustype = BUS_LPC, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF040, .total_size = 512, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF040 } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10857,13 +11538,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF040B", .bustype = BUS_LPC, /* A/A Mux */ - .manufacture_id = SST_ID, - .model_id = SST_SST49LF040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* 150 ns */ + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF040B } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10887,13 +11569,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF080A", .bustype = BUS_LPC, /* A/A Mux */ - .manufacture_id = SST_ID, - .model_id = SST_SST49LF080A, .total_size = 1024, .page_size = 4096, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SST_ID, SST_SST49LF080A } } }, + }, .block_erasers = { { @@ -10916,13 +11599,14 @@ const struct flashchip flashchips[] = { .vendor = "SST", .name = "SST49LF160C", .bustype = BUS_LPC, - .manufacture_id = SST_ID, - .model_id = SST_SST49LF160C, .total_size = 2048, .page_size = 4 * 1024, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PRE, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { SST_ID, SST_SST49LF160C } } }, + }, .block_erasers = { { @@ -10948,13 +11632,13 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29F002B", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29F002B, .total_size = 256, .page_size = 64 * 1024, - .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_aaa, { 2, { ST_ID, ST_M29F002B } } }, /* 150 ns */ + }, .block_erasers = { { @@ -10979,13 +11663,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29F002T/NT", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29F002T, .total_size = 256, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_aaa, { 2, { ST_ID, ST_M29F002T } } }, + }, .block_erasers = { { @@ -11010,13 +11695,13 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29F040B", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29F040B, .total_size = 512, .page_size = 64 * 1024, - .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { ST_ID, ST_M29F040B } } }, + }, .block_erasers = { { @@ -11037,12 +11722,13 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29F400BB", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29F400BB, .total_size = 512, .page_size = 64 * 1024, .tested = TEST_UNTESTED, - .probe = probe_m29f400bt, + .probers = + { + { probe_m29f400bt, { 3, { ST_ID, ST_M29F400BB } } }, + }, .block_erasers = { { @@ -11062,17 +11748,19 @@ const struct flashchip flashchips[] = { .read = read_memmapped, .voltage = {4500, 5500}, }, + { /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ .vendor = "ST", .name = "M29F400BT", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29F400BT, .total_size = 512, .page_size = 64 * 1024, .tested = TEST_UNTESTED, - .probe = probe_m29f400bt, + .probers = + { + { probe_m29f400bt, { 2, { ST_ID, ST_M29F400BT } } }, + }, .block_erasers = { { @@ -11097,13 +11785,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29W010B", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29W010B, .total_size = 128, .page_size = 16 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { ST_ID, ST_M29W010B } } }, + }, .block_erasers = { { @@ -11123,13 +11812,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29W040B", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29W040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { ST_ID, ST_M29W040B } } }, + }, .block_erasers = { { @@ -11149,13 +11839,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M29W512B", .bustype = BUS_PARALLEL, - .manufacture_id = ST_ID, - .model_id = ST_M29W512B, .total_size = 64, .page_size = 64 * 1024, .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { ST_ID, ST_M29W512B } } }, + }, .block_erasers = { { @@ -11172,13 +11863,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FLW040A", .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FLW040A, .total_size = 512, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FLW040A } } }, + }, .block_erasers = { { @@ -11204,13 +11896,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FLW040B", .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FLW040B, .total_size = 512, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FLW040B } } }, + }, .block_erasers = { { @@ -11236,13 +11929,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FLW080A", .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FLW080A, .total_size = 1024, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PRE, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FLW080A } } }, + }, .block_erasers = { { @@ -11268,13 +11962,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FLW080B", .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FLW080B, .total_size = 1024, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FLW080B } } }, + }, .block_erasers = { { @@ -11300,13 +11995,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FW002", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FW002, .total_size = 256, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FW002 } } }, + }, .block_erasers = { { @@ -11329,13 +12025,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FW016", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FW016, .total_size = 2048, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FW016 } } }, + }, .block_erasers = { { @@ -11353,13 +12050,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FW040", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FW040, .total_size = 512, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PR, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FW040 } } }, + }, .block_erasers = { { @@ -11377,13 +12075,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50FW080", .bustype = BUS_FWH, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50FW080, .total_size = 1024, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_OK_PREW, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50FW080 } } }, + }, .block_erasers = { { @@ -11401,13 +12100,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50LPW080", .bustype = BUS_LPC, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50LPW080, .total_size = 1024, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50LPW080 } } }, + }, .block_erasers = { { @@ -11425,13 +12125,14 @@ const struct flashchip flashchips[] = { .vendor = "ST", .name = "M50LPW116", .bustype = BUS_LPC, /* A/A Mux */ - .manufacture_id = ST_ID, - .model_id = ST_M50LPW116, .total_size = 2048, .page_size = 0, .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, - .probe = probe_82802ab_unshifted, + .probers = + { + { probe_82802ab_unshifted, { 3, { ST_ID, ST_M50LPW116 } } }, + }, .block_erasers = { { @@ -11455,13 +12156,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{F,S,V}29C51001B", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C51001B, .total_size = 128, .page_size = 512, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C51001B } } }, + }, .block_erasers = { { @@ -11481,13 +12183,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{F,S,V}29C51001T", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C51001T, .total_size = 128, .page_size = 512, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C51001T } } }, + }, .block_erasers = { { @@ -11507,13 +12210,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{F,S,V}29C51002B", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C51002B, .total_size = 256, .page_size = 512, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C51002B } } }, + }, .block_erasers = { { @@ -11532,13 +12236,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{F,S,V}29C51002T", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C51002T, .total_size = 256, .page_size = 512, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C51002T } } }, + }, .block_erasers = { { @@ -11557,13 +12262,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{F,S,V}29C51004B", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C51004B, .total_size = 512, .page_size = 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C51004B } } }, + }, .block_erasers = { { @@ -11583,13 +12289,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{F,S,V}29C51004T", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C51004T, .total_size = 512, .page_size = 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C51004T } } }, + }, .block_erasers = { { @@ -11609,13 +12316,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{S,V}29C31004B", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C31004B, .total_size = 512, .page_size = 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C31004B } } }, + }, .block_erasers = { { @@ -11635,13 +12343,14 @@ const struct flashchip flashchips[] = { .vendor = "SyncMOS/MoselVitelic", .name = "{S,V}29C31004T", .bustype = BUS_PARALLEL, - .manufacture_id = SYNCMOS_MVC_ID, - .model_id = SM_MVC_29C31004T, .total_size = 512, .page_size = 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { SYNCMOS_MVC_ID, SM_MVC_29C31004T } } }, + }, .block_erasers = { { @@ -11661,13 +12370,14 @@ const struct flashchip flashchips[] = { .vendor = "TI", .name = "TMS29F002RB", .bustype = BUS_PARALLEL, - .manufacture_id = TI_OLD_ID, - .model_id = TI_TMS29F002RB, .total_size = 256, .page_size = 16384, /* Non-uniform sectors */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { TI_OLD_ID, TI_TMS29F002RB } } }, + }, .block_erasers = { { @@ -11692,13 +12402,14 @@ const struct flashchip flashchips[] = { .vendor = "TI", .name = "TMS29F002RT", .bustype = BUS_PARALLEL, - .manufacture_id = TI_OLD_ID, - .model_id = TI_TMS29F002RT, .total_size = 256, .page_size = 16384, /* Non-uniform sectors */ .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_2aa, { 2, { TI_OLD_ID, TI_TMS29F002RT } } }, + }, .block_erasers = { { @@ -11723,15 +12434,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q80.V", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q80_V, .total_size = 1024, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q80_V } } }, + }, .block_erasers = { { @@ -11762,15 +12474,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q16.V", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q16_V, .total_size = 2048, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q16_V } } }, + }, .block_erasers = { { @@ -11801,15 +12514,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q32.V", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q32_V, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q32_V } } }, + }, .block_erasers = { { @@ -11840,15 +12554,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q64.V", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q64_V, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q64_V } } }, + }, .block_erasers = { { @@ -11879,15 +12594,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q128.V", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q128_V, .total_size = 16384, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q128_V } } }, + }, .block_erasers = { { @@ -11918,14 +12634,15 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q20.W", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q20_W, .total_size = 256, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q20_W } } }, + }, .block_erasers = { { @@ -11956,14 +12673,15 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q40.W", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q40_W, .total_size = 512, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q40_W } } }, + }, .block_erasers = { { @@ -11994,14 +12712,15 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q80.W", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q80_W, .total_size = 1024, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q80_W } } }, + }, .block_erasers = { { @@ -12032,15 +12751,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q16.W", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q16_W, .total_size = 2048, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q16_W } } }, + }, .block_erasers = { { @@ -12071,15 +12791,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q32.W", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q32_W, .total_size = 4096, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q32_W } } }, + }, .block_erasers = { { @@ -12110,15 +12831,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25Q64.W", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25Q64_W, .total_size = 8192, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25Q64_W } } }, + }, .block_erasers = { { @@ -12149,13 +12871,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X10", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X10 } } }, + }, .block_erasers = { { @@ -12180,13 +12903,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X20", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X20 } } }, + }, .block_erasers = { { @@ -12211,13 +12935,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X40", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X40 } } }, + }, .block_erasers = { { @@ -12242,13 +12967,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X80", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X80 } } }, + }, .block_erasers = { { @@ -12273,13 +12999,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X16", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X16 } } }, + { probe_spi_res, { 2, { WINBOND_NEX_ID, 0x14 } } }, + { probe_spi_rems, { 2, { WINBOND_NEX_ID, 0x14 } } }, + }, .block_erasers = { { @@ -12310,13 +13039,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X32", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X32, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X32 } } }, + { probe_spi_res, { 2, { WINBOND_NEX_ID, 0x15 } } }, + { probe_spi_rems, { 2, { WINBOND_NEX_ID, 0x15 } } }, + }, .block_erasers = { { @@ -12347,13 +13079,16 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W25X64", .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = WINBOND_NEX_W25X64, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PROBE, - .probe = probe_spi_rdid, + .probers = + { + { probe_spi_rdid, { 3, { WINBOND_NEX_ID, WINBOND_NEX_W25X64 } } }, + { probe_spi_res, { 2, { WINBOND_NEX_ID, 0x16 } } }, + { probe_spi_rems, { 2, { WINBOND_NEX_ID, 0x16 } } }, + }, .block_erasers = { { @@ -12384,12 +13119,13 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W29C010, .total_size = 128, .page_size = 128, .tested = TEST_OK_PREW, - .probe = probe_w29ee011, + .probers = + { + { probe_w29ee011, { 2, { WINBOND_ID, WINBOND_W29C010 } } }, + }, .block_erasers = { { @@ -12405,13 +13141,13 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W29C010(M)/W29C011A/W29EE011/W29EE012", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W29C010, .total_size = 128, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, /* used datasheet for the W29C011A */ + .probers = + { + { probe_jedec_longreset, { 3, { WINBOND_ID, WINBOND_W29C010 } } }, /* used datasheet for the W29C011A */ + }, .block_erasers = { { @@ -12427,13 +13163,13 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W29C020(C)/W29C022", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W29C020, .total_size = 256, .page_size = 128, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_longreset, { 3, { WINBOND_ID, WINBOND_W29C020 } } }, + }, .block_erasers = { { @@ -12450,13 +13186,13 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W29C040/P", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W29C040, .total_size = 512, .page_size = 256, - .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_longreset, { 3, { WINBOND_ID, WINBOND_W29C040 } } }, + }, .block_erasers = { { @@ -12473,13 +13209,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39F010", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39F010, .total_size = 128, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39F010 } } }, + }, .block_erasers = { { @@ -12500,13 +13237,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39L010", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39L010, .total_size = 128, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39L010 } } }, + }, .block_erasers = { { @@ -12527,13 +13265,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39L020", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39L020, .total_size = 256, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39L020 } } }, + }, .block_erasers = { { @@ -12557,13 +13296,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39L040", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39L040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PR, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39L040 } } }, + }, .block_erasers = { { @@ -12587,13 +13327,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V040A", .bustype = BUS_LPC, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V040A } } }, + }, .block_erasers = { { @@ -12614,13 +13355,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V040B", .bustype = BUS_LPC, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V040B } } }, + }, .block_erasers = { { @@ -12641,13 +13383,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V040C", .bustype = BUS_LPC, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V040C, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V040C } } }, + }, .block_erasers = { { @@ -12668,13 +13411,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V040FA", .bustype = BUS_FWH, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V040FA, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V040FA } } }, + }, .block_erasers = { { @@ -12699,13 +13443,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V040FB", .bustype = BUS_FWH, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V040B } } }, + }, .block_erasers = { { @@ -12727,13 +13472,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V040FC", .bustype = BUS_FWH, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V040C, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V040C } } }, + }, .block_erasers = { { @@ -12754,13 +13500,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V080A", .bustype = BUS_LPC, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V080A, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V080A } } }, + }, .block_erasers = { { @@ -12781,13 +13528,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W49F002U/N", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W49F002U, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W49F002U } } }, + }, .block_erasers = { { @@ -12812,13 +13560,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W49F020", .bustype = BUS_PARALLEL, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W49F020, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PROBE, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W49F020 } } }, + }, .block_erasers = { { @@ -12835,13 +13584,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W49V002A", .bustype = BUS_LPC, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W49V002A, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W49V002A } } }, + }, .block_erasers = { { @@ -12866,13 +13616,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W49V002FA", .bustype = BUS_FWH, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W49V002FA, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W49V002FA } } }, + }, .block_erasers = { { @@ -12897,13 +13648,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V080FA", .bustype = BUS_FWH, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V080FA, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V080FA } } }, + }, .block_erasers = { { @@ -12925,13 +13677,14 @@ const struct flashchip flashchips[] = { .vendor = "Winbond", .name = "W39V080FA (dual mode)", .bustype = BUS_FWH, - .manufacture_id = WINBOND_ID, - .model_id = WINBOND_W39V080FA_DM, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, - .probe = probe_jedec, + .probers = + { + { probe_jedec_shortreset_full, { 2, { WINBOND_ID, WINBOND_W39V080FA_DM } } }, + }, .block_erasers = { { @@ -12947,203 +13700,6 @@ const struct flashchip flashchips[] = { .read = read_memmapped, .voltage = {3000, 3600}, /* Also has 12V fast program */ }, - - { - .vendor = "Unknown", - .name = "SFDP-capable chip", - .bustype = BUS_SPI, - .manufacture_id = GENERIC_MANUF_ID, - .model_id = SFDP_DEVICE_ID, - /* We present our own "report this" text hence we do not - * want the default "This flash part has status UNTESTED..." - * text to be printed. */ - .tested = TEST_OK_PREW, - .probe = probe_spi_sfdp, - .unlock = spi_disable_blockprotect, /* is this safe? */ - .read = spi_chip_read, - /* FIXME: some vendor extensions define this */ - .voltage = {0}, - /* Everything below will be set by the probing function. */ - .write = NULL, - .total_size = 0, - .page_size = 0, - .feature_bits = 0, - .block_erasers = {}, - }, - - { - .vendor = "Programmer", - .name = "Opaque flash chip", - .bustype = BUS_PROG, - .manufacture_id = PROGMANUF_ID, - .model_id = PROGDEV_ID, - .total_size = 0, - .page_size = 256, - /* probe is assumed to work, rest will be filled in by probe */ - .tested = TEST_OK_PROBE, - .probe = probe_opaque, - /* eraseblock sizes will be set by the probing function */ - .block_erasers = - { - { - .block_erase = erase_opaque, - } - }, - .write = write_opaque, - .read = read_opaque, - }, - - { - .vendor = "AMIC", - .name = "unknown AMIC SPI chip", - .bustype = BUS_SPI, - .manufacture_id = AMIC_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid4, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "Atmel", - .name = "unknown Atmel SPI chip", - .bustype = BUS_SPI, - .manufacture_id = ATMEL_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "Eon", - .name = "unknown Eon SPI chip", - .bustype = BUS_SPI, - .manufacture_id = EON_ID_NOPREFIX, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "Macronix", - .name = "unknown Macronix SPI chip", - .bustype = BUS_SPI, - .manufacture_id = MACRONIX_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "PMC", - .name = "unknown PMC SPI chip", - .bustype = BUS_SPI, - .manufacture_id = PMC_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "SST", - .name = "unknown SST SPI chip", - .bustype = BUS_SPI, - .manufacture_id = SST_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "ST", - .name = "unknown ST SPI chip", - .bustype = BUS_SPI, - .manufacture_id = ST_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "Sanyo", - .name = "unknown Sanyo SPI chip", - .bustype = BUS_SPI, - .manufacture_id = SANYO_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "Winbond", - .name = "unknown Winbond (ex Nexcom) SPI chip", - .bustype = BUS_SPI, - .manufacture_id = WINBOND_NEX_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - .read = NULL, - }, - - { - .vendor = "Generic", - .name = "unknown SPI chip (RDID)", - .bustype = BUS_SPI, - .manufacture_id = GENERIC_MANUF_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rdid, - .write = NULL, - }, - - { - .vendor = "Generic", - .name = "unknown SPI chip (REMS)", - .bustype = BUS_SPI, - .manufacture_id = GENERIC_MANUF_ID, - .model_id = GENERIC_DEVICE_ID, - .total_size = 0, - .page_size = 256, - .tested = TEST_BAD_PREW, - .probe = probe_spi_rems, - .write = NULL, - },
{0} }; diff --git a/flashchips.h b/flashchips.h index fb17981..5be232c 100644 --- a/flashchips.h +++ b/flashchips.h @@ -34,13 +34,7 @@ * SPI parts have 16-bit device IDs if they support RDID. */
-#define GENERIC_MANUF_ID 0xFFFF /* Check if there is a vendor ID */ -#define GENERIC_DEVICE_ID 0xFFFF /* Only match the vendor ID */ -#define SFDP_DEVICE_ID 0xFFFE -#define PROGMANUF_ID 0xFFFE /* dummy ID for opaque chips behind a programmer */ -#define PROGDEV_ID 0x01 /* dummy ID for opaque chips behind a programmer */ - -#define ALLIANCE_ID 0x52 /* Alliance Semiconductor */ +#define ALLIANCE_ID 0x52 /* Alliance Semiconductor */ #define ALLIANCE_AS29F002B 0x34 #define ALLIANCE_AS29F002T 0xB0 #define ALLIANCE_AS29F010 0x04 @@ -54,17 +48,17 @@ #define ALLIANCE_AS29LV800B 0x5B #define ALLIANCE_AS29LV800T 0xDA
-#define AMD_ID 0x01 /* AMD */ +#define AMD_ID 0x01 /* AMD */ #define AMD_AM29DL400BT 0x0C #define AMD_AM29DL400BB 0x0F #define AMD_AM29DL800BT 0x4A #define AMD_AM29DL800BB 0xCB -#define AMD_AM29F002BB 0x34 /* Same as Am29F002NBB */ -#define AMD_AM29F002BT 0xB0 /* Same as Am29F002NBT */ +#define AMD_AM29F002BB 0x34 /* Same as Am29F002NBB */ +#define AMD_AM29F002BT 0xB0 /* Same as Am29F002NBT */ #define AMD_AM29F004BB 0x7B #define AMD_AM29F004BT 0x77 #define AMD_AM29F016D 0xAD -#define AMD_AM29F010B 0x20 /* Same as Am29F010A */ +#define AMD_AM29F010B 0x20 /* Same as Am29F010A */ #define AMD_AM29F040B 0xA4 #define AMD_AM29F080B 0xD5 #define AMD_AM29F200BB 0x57 @@ -82,143 +76,144 @@ #define AMD_AM29LV008BB 0x37 #define AMD_AM29LV008BT 0x3E #define AMD_AM29LV040B 0x4F -#define AMD_AM29LV080B 0x38 /* Same as Am29LV081B */ +#define AMD_AM29LV080B 0x38 /* Same as Am29LV081B */ #define AMD_AM29LV200BB 0xBF #define AMD_AM29LV200BT 0x3B -#define AMD_AM29LV800BB 0x5B /* Same as Am29LV800DB */ +#define AMD_AM29LV800BB 0x5B /* Same as Am29LV800DB */ #define AMD_AM29LV400BT 0xB9 #define AMD_AM29LV400BB 0xBA -#define AMD_AM29LV800BT 0xDA /* Same as Am29LV800DT */ - -#define AMIC_ID 0x7F37 /* AMIC */ -#define AMIC_ID_NOPREFIX 0x37 /* AMIC */ -#define AMIC_A25L05PT 0x2020 -#define AMIC_A25L05PU 0x2010 -#define AMIC_A25L10PT 0x2021 -#define AMIC_A25L10PU 0x2011 -#define AMIC_A25L20PT 0x2022 -#define AMIC_A25L20PU 0x2012 -#define AMIC_A25L40PT 0x2013 /* Datasheet says T and U have - same device ID. Confirmed by - hardware testing. */ -#define AMIC_A25L40PU 0x2013 -#define AMIC_A25L80P 0x2014 /* Seems that no A25L80PT exists */ -#define AMIC_A25L16PT 0x2025 -#define AMIC_A25L16PU 0x2015 -#define AMIC_A25L512 0x3010 -#define AMIC_A25L010 0x3011 -#define AMIC_A25L020 0x3012 -#define AMIC_A25L040 0x3013 -#define AMIC_A25L080 0x3014 -#define AMIC_A25L016 0x3015 -#define AMIC_A25L032 0x3016 -#define AMIC_A25LQ16 0x4015 -#define AMIC_A25LQ032 0x4016 /* Same as A25LQ32A, but the latter supports SFDP */ -#define AMIC_A25LQ64 0x4017 +#define AMD_AM29LV800BT 0xDA /* Same as Am29LV800DT */ + +#define AMIC_ID 0x7F, 0x37 /* AMIC */ +#define AMIC_ID_NOPREFIX 0x37 /* AMIC, without prefix */ +#define AMIC_A25L05PT 0x20, 0x20 +#define AMIC_A25L05PU 0x20, 0x10 +#define AMIC_A25L10PT 0x20, 0x21 +#define AMIC_A25L10PU 0x20, 0x11 +#define AMIC_A25L20PT 0x20, 0x22 +#define AMIC_A25L20PU 0x20, 0x12 +#define AMIC_A25L40PT 0x20, 0x13 /* Datasheet says T and U have same device ID. Confirmed by + * hardware testing. */ +#define AMIC_A25L40PU 0x20, 0x13 +#define AMIC_A25L80P 0x20, 0x14 /* Seems that no A25L80PT exists */ +#define AMIC_A25L16PT 0x20, 0x25 +#define AMIC_A25L16PU 0x20, 0x15 +#define AMIC_A25L512 0x30, 0x10 +#define AMIC_A25L010 0x30, 0x11 +#define AMIC_A25L020 0x30, 0x12 +#define AMIC_A25L040 0x30, 0x13 +#define AMIC_A25L080 0x30, 0x14 +#define AMIC_A25L016 0x30, 0x15 +#define AMIC_A25L032 0x30, 0x16 +#define AMIC_A25LQ16 0x40, 0x15 +#define AMIC_A25LQ032 0x40, 0x16 /* Same as A25LQ32A, but the latter supports SFDP */ +#define AMIC_A25LQ64 0x40, 0x17 #define AMIC_A29002B 0x0d -#define AMIC_A29002T 0x8C /* Same as A290021T */ +#define AMIC_A29002T 0x8C /* Same as A290021T */ #define AMIC_A29040B 0x86 -#define AMIC_A29400T 0xB0 /* Same as 294001T */ -#define AMIC_A29400U 0x31 /* Same as A294001U */ +#define AMIC_A29400T 0xB0 /* Same as 294001T */ +#define AMIC_A29400U 0x31 /* Same as A294001U */ #define AMIC_A29800T 0x0E #define AMIC_A29800U 0x8F -#define AMIC_A29L004T 0x34 /* Same as A29L400T */ -#define AMIC_A29L004U 0xB5 /* Same as A29L400U */ -#define AMIC_A29L008T 0x1A /* Same as A29L800T */ -#define AMIC_A29L008U 0x9B /* Same as A29L800U */ +#define AMIC_A29L004T 0x34 /* Same as A29L400T */ +#define AMIC_A29L004U 0xB5 /* Same as A29L400U */ +#define AMIC_A29L008T 0x1A /* Same as A29L800T */ +#define AMIC_A29L008U 0x9B /* Same as A29L800U */ #define AMIC_A29L040 0x92 #define AMIC_A49LF040A 0x9d
-#define ATMEL_ID 0x1F /* Atmel (now used by Adesto) */ -#define ATMEL_AT25DF021 0x4300 -#define ATMEL_AT25DF041A 0x4401 -#define ATMEL_AT25DF081 0x4502 /* EDI 0x00. AT25DL081 has same ID + EDI 0x0100 */ -#define ATMEL_AT25DF081A 0x4501 /* Yes, 81A has a lower number than 81 */ -#define ATMEL_AT25DF161 0x4602 -#define ATMEL_AT25DF321 0x4700 /* Same as 26DF321 */ -#define ATMEL_AT25DF321A 0x4701 -#define ATMEL_AT25DF641 0x4800 -#define ATMEL_AT25DL161 0x4603 /* EDI 0x0100 */ -#define ATMEL_AT25DQ161 0x8600 /* EDI 0x0100 */ -#define ATMEL_AT25DQ321 0x8700 /* EDI 0x0100 */ -#define ATMEL_AT25F512 0x60 /* Needs AT25F_RDID. ID from PCN and actual HW. Seems to be a relabeled AT25F1024. */ -#define ATMEL_AT25F512A 0x65 /* Needs AT25F_RDID */ -#define ATMEL_AT25F512B 0x6500 -#define ATMEL_AT25F1024 0x60 /* Needs AT25F_RDID */ -#define ATMEL_AT25F2048 0x63 /* Needs AT25F_RDID */ -#define ATMEL_AT25F4096 0x64 /* Needs AT25F_RDID */ -#define ATMEL_AT25FS010 0x6601 -#define ATMEL_AT25FS040 0x6604 -#define ATMEL_AT26DF041 0x4400 -#define ATMEL_AT26DF081 0x4500 /* guessed, no datasheet available */ -#define ATMEL_AT26DF081A 0x4501 -#define ATMEL_AT26DF161 0x4600 -#define ATMEL_AT26DF161A 0x4601 -#define ATMEL_AT26DF321 0x4700 /* Same as 25DF321 */ -#define ATMEL_AT26F004 0x0400 +#define ATMEL_ID 0x1F /* Atmel (now used by Adesto) */ +#define ATMEL_AT25DF021 0x43, 0x00 +#define ATMEL_AT25DF041A 0x44, 0x01 +#define ATMEL_AT25DF081 0x45, 0x02 /* EDI 0x00. AT25DL081 has same ID + EDI 0x01, 0x00, */ +#define ATMEL_AT25DF081A 0x45, 0x01 /* Yes, 81A has a lower number than 81 */ +#define ATMEL_AT25DF161 0x46, 0x02 +#define ATMEL_AT25DF321 0x47, 0x00 /* Same as 26DF321 */ +#define ATMEL_AT25DF321A 0x47, 0x01 +#define ATMEL_AT25DF641 0x48, 0x00 +#define ATMEL_AT25DL161 0x46, 0x03 /* EDI 0x01, 0x00, */ +#define ATMEL_AT25DQ161 0x86, 0x00 /* EDI 0x01, 0x00, */ +#define ATMEL_AT25DQ321 0x87, 0x00 /* EDI 0x01, 0x00, */ +#define ATMEL_AT25F512 0x60 /* Needs AT25F_RDID. ID from PCN and actual HW. Seems to be a + * relabeled AT25F1024. */ +#define ATMEL_AT25F512A 0x65 /* Needs AT25F_RDID */ +#define ATMEL_AT25F512B 0x65, 0x00 +#define ATMEL_AT25F1024 0x60 /* Needs AT25F_RDID */ +#define ATMEL_AT25F2048 0x63 /* Needs AT25F_RDID */ +#define ATMEL_AT25F4096 0x64 /* Needs AT25F_RDID */ +#define ATMEL_AT25FS010 0x66, 0x01 +#define ATMEL_AT25FS040 0x66, 0x04 +#define ATMEL_AT26DF041 0x44, 0x00 +#define ATMEL_AT26DF081 0x45, 0x00 /* guessed, no datasheet available */ +#define ATMEL_AT26DF081A 0x45, 0x01 +#define ATMEL_AT26DF161 0x46, 0x00 +#define ATMEL_AT26DF161A 0x46, 0x01 +#define ATMEL_AT26DF321 0x47, 0x00 /* Same as 25DF321 */ +#define ATMEL_AT26F004 0x04, 0x00 #define ATMEL_AT29C040A 0xA4 #define ATMEL_AT29C010A 0xD5 #define ATMEL_AT29C020 0xDA #define ATMEL_AT29C512 0x5D #define ATMEL_AT45BR3214B /* No ID available */ -#define ATMEL_AT45CS1282 0x2920 +#define ATMEL_AT45CS1282 0x29, 0x20 #define ATMEL_AT45D011 /* No ID available */ #define ATMEL_AT45D021A /* No ID available */ #define ATMEL_AT45D041A /* No ID available */ #define ATMEL_AT45D081A /* No ID available */ #define ATMEL_AT45D161 /* No ID available */ #define ATMEL_AT45DB011 /* No ID (opcode) available for AT45DB011, AT45DB011B */ -#define ATMEL_AT45DB011D 0x2200 +#define ATMEL_AT45DB011D 0x22, 0x00 #define ATMEL_AT45DB021 /* No ID (opcode) available for AT45DB021, AT45DB021A, AT45DB021B */ -#define ATMEL_AT45DB021D 0x2300 -#define ATMEL_AT45DB021E /* same as above but with EDI 0x0100 */ +#define ATMEL_AT45DB021D 0x23, 0x00 +#define ATMEL_AT45DB021E /* same as above but with EDI 0x01, 0x00, */ #define ATMEL_AT45DB041 /* No ID (opcode) available for AT45DB041, AT45DB041A, AT45DB041B */ -#define ATMEL_AT45DB041D 0x2400 -#define ATMEL_AT45DB041E /* same as above but with EDI 0x0100 */ +#define ATMEL_AT45DB041D 0x24, 0x00 +#define ATMEL_AT45DB041E /* same as above but with EDI 0x01, 0x00, */ #define ATMEL_AT45DB081 /* No ID (opcode) available for AT45DB081, AT45DB081A, AT45DB081B */ -#define ATMEL_AT45DB081D 0x2500 -#define ATMEL_AT45DB081E /* same as above but with EDI 0x0100 */ +#define ATMEL_AT45DB081D 0x25, 0x00 +#define ATMEL_AT45DB081E /* same as above but with EDI 0x01, 0x00, */ #define ATMEL_AT45DB161 /* No ID (opcode) available for AT45DB161, AT45DB161B */ -#define ATMEL_AT45DB161D 0x2600 -#define ATMEL_AT45DB161E /* same as above but with EDI 0x0100 */ +#define ATMEL_AT45DB161D 0x26, 0x00 +#define ATMEL_AT45DB161E /* same as above but with EDI 0x01, 0x00, */ #define ATMEL_AT45DB321 /* No ID (opcode) available for AT45DB321, AT45DB321B */ -#define ATMEL_AT45DB321C 0x2700 -#define ATMEL_AT45DB321E /* same as above but with EDI 0x0100 */ -#define ATMEL_AT45DB321D 0x2701 /* Buggy data sheet */ +#define ATMEL_AT45DB321C 0x27, 0x00 +#define ATMEL_AT45DB321E /* same as above but with EDI 0x01, 0x00, */ +#define ATMEL_AT45DB321D 0x27, 0x01 /* Buggy data sheet */ #define ATMEL_AT45DB642 /* No ID (opcode) available for AT45DB642 */ -#define ATMEL_AT45DB642D 0x2800 +#define ATMEL_AT45DB642D 0x28, 0x00 #define ATMEL_AT49BV512 0x03 -#define ATMEL_AT49F002N 0x07 /* for AT49F002(N) */ +#define ATMEL_AT49F002N 0x07 /* for AT49F002(N) */ #define ATMEL_AT49LH002 0xE9 -#define ATMEL_AT49F002NT 0x08 /* for AT49F002(N)T */ -#define ATMEL_AT49F010 0x17 /* Same as AT49HF010 */ +#define ATMEL_AT49F002NT 0x08 /* for AT49F002(N)T */ +#define ATMEL_AT49F010 0x17 /* Same as AT49HF010 */ #define ATMEL_AT49F020 0x0B #define ATMEL_AT49F040 0x13 #define ATMEL_AT49F080 0x23 #define ATMEL_AT49F080T 0x27
/* Bright Microelectronics has the same manufacturer ID as Hyundai... */ -#define BRIGHT_ID 0xAD /* Bright Microelectronics */ +#define BRIGHT_ID 0xAD /* Bright Microelectronics */ #define BRIGHT_BM29F040 0x40 #define BRIGHT_BM29F400B 0xAB #define BRIGHT_BM29F400T 0xAD
-#define CATALYST_ID 0x31 /* Catalyst */ +#define CATALYST_ID 0x31 /* Catalyst */ #define CATALYST_CAT28F512 0xB8
-#define ESMT_ID 0x8C /* Elite Semiconductor Memory Technology (ESMT) / EFST Elite Flash Storage */ -#define ESMT_F25L008A 0x2014 -#define ESMT_F25L32PA 0x2016 -#define ESMT_F25D08QA 0x2534 -#define ESMT_F25L16QA2S 0x4015 -#define ESMT_F25L32QA 0x4016 -#define ESMT_F25L32QA2S 0x4116 -#define ESMT_F25L64QA 0x4117 -#define ESMT_F25L128QA 0x4118 +#define ESMT_ID 0x8C /* Elite Semiconductor Memory Technology (ESMT) / + * EFST Elite Flash Storage */ +#define ESMT_F25L008A 0x20, 0x14 +#define ESMT_F25L32PA 0x20, 0x16 +#define ESMT_F25D08QA 0x25, 0x34 +#define ESMT_F25L16QA2S 0x40, 0x15 +#define ESMT_F25L32QA 0x40, 0x16 +#define ESMT_F25L32QA2S 0x41, 0x16 +#define ESMT_F25L64QA 0x41, 0x17 +#define ESMT_F25L128QA 0x41, 0x18 #define ESMT_F49B002UA 0x00
/* - * EN25 chips are SPI, first byte of device ID is memory type, + * EN25 chips are SPI, first byte of device ID is memory type * second byte of device ID is log(bitsize)-9. * Vendor and device ID of EN29 series are both prefixed with 0x7F, which * is the continuation code for IDs in bank 2. @@ -226,85 +221,85 @@ * a collision with Mitsubishi. Mitsubishi once manufactured flash chips. * Let's hope they are not manufacturing SPI flash chips as well. */ -#define EON_ID 0x7F1C /* EON Silicon Devices */ -#define EON_ID_NOPREFIX 0x1C /* EON, missing 0x7F prefix */ -#define EON_EN25B05 0x2010 /* Same as P05, 2^19 kbit or 2^16 kByte */ +#define EON_ID 0x7F, 0x1C /* EON Silicon Devices */ +#define EON_ID_NOPREFIX 0x1C /* EON, without prefix */ +#define EON_EN25B05 0x20, 0x10 /* Same as P05, 2^19 kbit or 2^16 kByte */ #define EON_EN25B05T 0x25 #define EON_EN25B05B 0x95 -#define EON_EN25B10 0x2011 /* Same as P10 */ +#define EON_EN25B10 0x20, 0x11 /* Same as P10 */ #define EON_EN25B10T 0x40 #define EON_EN25B10B 0x30 -#define EON_EN25B20 0x2012 /* Same as P20 */ +#define EON_EN25B20 0x20, 0x12 /* Same as P20 */ #define EON_EN25B20T 0x41 #define EON_EN25B20B 0x31 -#define EON_EN25B40 0x2013 /* Same as P40 */ +#define EON_EN25B40 0x20, 0x13 /* Same as P40 */ #define EON_EN25B40T 0x42 #define EON_EN25B40B 0x32 -#define EON_EN25B80 0x2014 /* Same as P80 */ +#define EON_EN25B80 0x20, 0x14 /* Same as P80 */ #define EON_EN25B80T 0x43 #define EON_EN25B80B 0x33 -#define EON_EN25B16 0x2015 /* Same as P16 */ +#define EON_EN25B16 0x20, 0x15 /* Same as P16 */ #define EON_EN25B16T 0x44 #define EON_EN25B16B 0x34 -#define EON_EN25B32 0x2016 /* Same as P32 */ +#define EON_EN25B32 0x20, 0x16 /* Same as P32 */ #define EON_EN25B32T 0x45 #define EON_EN25B32B 0x35 -#define EON_EN25B64 0x2017 /* Same as P64 */ +#define EON_EN25B64 0x20, 0x17 /* Same as P64 */ #define EON_EN25B64T 0x46 #define EON_EN25B64B 0x36 -#define EON_EN25F05 0x3110 -#define EON_EN25F10 0x3111 -#define EON_EN25F20 0x3112 -#define EON_EN25F40 0x3113 -#define EON_EN25F80 0x3114 -#define EON_EN25F16 0x3115 -#define EON_EN25F32 0x3116 -#define EON_EN25F64 0x3117 /* guessed */ -#define EON_EN25Q40 0x3013 -#define EON_EN25Q80 0x3014 -#define EON_EN25Q16 0x3015 /* Same as EN25D16 */ -#define EON_EN25Q32 0x3016 /* Same as EN25Q32A and EN25Q32B */ -#define EON_EN25Q64 0x3017 -#define EON_EN25Q128 0x3018 -#define EON_EN25QH16 0x7015 -#define EON_EN25QH32 0x7016 -#define EON_EN25QH64 0x7017 -#define EON_EN25QH128 0x7018 -#define EON_EN25QH256 0x7019 -#define EON_EN25S10 0x3811 -#define EON_EN25S20 0x3812 -#define EON_EN25S40 0x3813 -#define EON_EN25S80 0x3814 -#define EON_EN25S16 0x3815 -#define EON_EN25S32 0x3816 -#define EON_EN25S64 0x3817 -#define EON_EN25T80 0x5114 -#define EON_EN25T16 0x5115 -#define EON_EN29F512 0x7F21 +#define EON_EN25F05 0x31, 0x10 +#define EON_EN25F10 0x31, 0x11 +#define EON_EN25F20 0x31, 0x12 +#define EON_EN25F40 0x31, 0x13 +#define EON_EN25F80 0x31, 0x14 +#define EON_EN25F16 0x31, 0x15 +#define EON_EN25F32 0x31, 0x16 +#define EON_EN25F64 0x31, 0x17 /* guessed */ +#define EON_EN25Q40 0x30, 0x13 +#define EON_EN25Q80 0x30, 0x14 +#define EON_EN25Q16 0x30, 0x15 /* Same as EN25D16 */ +#define EON_EN25Q32 0x30, 0x16 /* Same as EN25Q32A and EN25Q32B */ +#define EON_EN25Q64 0x30, 0x17 +#define EON_EN25Q128 0x30, 0x18 +#define EON_EN25QH16 0x70, 0x15 +#define EON_EN25QH32 0x70, 0x16 +#define EON_EN25QH64 0x70, 0x17 +#define EON_EN25QH128 0x70, 0x18 +#define EON_EN25QH256 0x70, 0x19 +#define EON_EN25S10 0x38, 0x11 +#define EON_EN25S20 0x38, 0x12 +#define EON_EN25S40 0x38, 0x13 +#define EON_EN25S80 0x38, 0x14 +#define EON_EN25S16 0x38, 0x15 +#define EON_EN25S32 0x38, 0x16 +#define EON_EN25S64 0x38, 0x17 +#define EON_EN25T80 0x51, 0x14 +#define EON_EN25T16 0x51, 0x15 +#define EON_EN29F512 0x7F, 0x21 #define EON_EN29F010 0x20 -#define EON_EN29F040A 0x7F04 -#define EON_EN29LV010 0x7F6E -#define EON_EN29LV040A 0x7F4F /* EN29LV040(A) */ +#define EON_EN29F040A 0x7F, 0x04 +#define EON_EN29LV010 0x7F, 0x6E +#define EON_EN29LV040A 0x7F, 0x4F /* EN29LV040(A) */ #define EON_EN29LV640B 0xCB -#define EON_EN29F002T 0x7F92 /* Same as EN29F002A */ -#define EON_EN29F002B 0x7F97 /* Same as EN29F002AN */ - -#define EXCEL_ID 0x7F7F7F7F4A /* Excel Semiconductor Inc. (ESI) resides in bank 5 */ -#define EXCEL_ID_NOPREFIX 0x4A /* ESI, missing 0x7F prefix */ -#define EXCEL_ES25P40 0x2013 -#define EXCEL_ES25P80 0x2014 -#define EXCEL_ES25P16 0x2015 - -#define FIDELIX_ID 0xF8 /* Fidelix */ -#define FIDELIX_FM25M16 0x4215 -#define FIDELIX_FM25M32 0x4216 -#define FIDELIX_FM25M64 0x4217 -#define FIDELIX_FM25Q08 0x3214 -#define FIDELIX_FM25Q16 0x3215 /* Same as FM25S16 (which is apparently single I/O only) */ -#define FIDELIX_FM25Q32 0x3216 -#define FIDELIX_FM25Q64 0x3217 - -#define FUJITSU_ID 0x04 /* Fujitsu */ +#define EON_EN29F002T 0x7F, 0x92 /* Same as EN29F002A */ +#define EON_EN29F002B 0x7F, 0x97 /* Same as EN29F002AN */ + +#define EXCEL_ID 0x7F, 0x7F, 0x7F, 0x7F, 0x4A /* Excel Semiconductor Inc. (ESI), in bank 5 */ +#define EXCEL_ID_NOPREFIX 0x4A /* ESI, without prefix */ +#define EXCEL_ES25P40 0x20, 0x13 +#define EXCEL_ES25P80 0x20, 0x14 +#define EXCEL_ES25P16 0x20, 0x15 + +#define FIDELIX_ID 0xF8 /* Fidelix */ +#define FIDELIX_FM25M16 0x42, 0x15 +#define FIDELIX_FM25M32 0x42, 0x16 +#define FIDELIX_FM25M64 0x42, 0x17 +#define FIDELIX_FM25Q08 0x32, 0x14 +#define FIDELIX_FM25Q16 0x32, 0x15 /* Same as FM25S16 (which is apparently single I/O only) */ +#define FIDELIX_FM25Q32 0x32, 0x16 +#define FIDELIX_FM25Q64 0x32, 0x17 + +#define FUJITSU_ID 0x04 /* Fujitsu */ #define FUJITSU_MBM29DL400BC 0x0F #define FUJITSU_MBM29DL400TC 0x0C #define FUJITSU_MBM29DL800BA 0xCB @@ -332,173 +327,173 @@ #define FUJITSU_MBM29LV200TC 0x3B #define FUJITSU_MBM29LV400BC 0xBA #define FUJITSU_MBM29LV400TC 0xB9 -#define FUJITSU_MBM29LV800BA 0x5B /* Same as MBM29LV800BE */ -#define FUJITSU_MBM29LV800TA 0xDA /* Same as MBM29LV800TE */ -#define FUJITSU_MBM29LV160BE 0x49 /* 16 b mode 0x2249 */ -#define FUJITSU_MBM29LV160TE 0xC4 /* 16 b mode 0x22C4 */ - -#define GIGADEVICE_ID 0xC8 /* GigaDevice */ -#define GIGADEVICE_GD25T80 0x3114 -#define GIGADEVICE_GD25Q512 0x4010 -#define GIGADEVICE_GD25Q10 0x4011 -#define GIGADEVICE_GD25Q20 0x4012 /* Same as GD25QB */ -#define GIGADEVICE_GD25Q40 0x4013 /* Same as GD25QB */ -#define GIGADEVICE_GD25Q80 0x4014 /* Same as GD25Q80B (which has OTP) */ -#define GIGADEVICE_GD25Q16 0x4015 /* Same as GD25Q16B (which has OTP) */ -#define GIGADEVICE_GD25Q32 0x4016 /* Same as GD25Q32B */ -#define GIGADEVICE_GD25Q64 0x4017 /* Same as GD25Q64B */ -#define GIGADEVICE_GD25Q128 0x4018 /* GD25Q128B only? */ -#define GIGADEVICE_GD25LQ40 0x6013 -#define GIGADEVICE_GD25LQ80 0x6014 -#define GIGADEVICE_GD25LQ16 0x6015 -#define GIGADEVICE_GD25LQ32 0x6016 -#define GIGADEVICE_GD25LQ64 0x6017 /* Same as GD25LQ64B (which is faster) */ -#define GIGADEVICE_GD25LQ128 0x6018 - -#define HYUNDAI_ID 0xAD /* Hyundai */ -#define HYUNDAI_HY29F400T 0x23 /* Same as HY29F400AT */ -#define HYUNDAI_HY29F800B 0x58 /* Same as HY29F800AB */ +#define FUJITSU_MBM29LV800BA 0x5B /* Same as MBM29LV800BE */ +#define FUJITSU_MBM29LV800TA 0xDA /* Same as MBM29LV800TE */ +#define FUJITSU_MBM29LV160BE 0x49 /* 16 b mode 0x22, 0x49, */ +#define FUJITSU_MBM29LV160TE 0xC4 /* 16 b mode 0x22, 0xC4, */ + +#define GIGADEVICE_ID 0xC8 /* GigaDevice */ +#define GIGADEVICE_GD25T80 0x31, 0x14 +#define GIGADEVICE_GD25Q512 0x40, 0x10 +#define GIGADEVICE_GD25Q10 0x40, 0x11 +#define GIGADEVICE_GD25Q20 0x40, 0x12 /* Same as GD25QB */ +#define GIGADEVICE_GD25Q40 0x40, 0x13 /* Same as GD25QB */ +#define GIGADEVICE_GD25Q80 0x40, 0x14 /* Same as GD25Q80B (which has OTP) */ +#define GIGADEVICE_GD25Q16 0x40, 0x15 /* Same as GD25Q16B (which has OTP) */ +#define GIGADEVICE_GD25Q32 0x40, 0x16 /* Same as GD25Q32B */ +#define GIGADEVICE_GD25Q64 0x40, 0x17 /* Same as GD25Q64B */ +#define GIGADEVICE_GD25Q128 0x40, 0x18 /* GD25Q128B only? */ +#define GIGADEVICE_GD25LQ40 0x60, 0x13 +#define GIGADEVICE_GD25LQ80 0x60, 0x14 +#define GIGADEVICE_GD25LQ16 0x60, 0x15 +#define GIGADEVICE_GD25LQ32 0x60, 0x16 +#define GIGADEVICE_GD25LQ64 0x60, 0x17 /* Same as GD25LQ64B (which is faster) */ +#define GIGADEVICE_GD25LQ128 0x60, 0x18 + +#define HYUNDAI_ID 0xAD /* Hyundai */ +#define HYUNDAI_HY29F400T 0x23 /* Same as HY29F400AT */ +#define HYUNDAI_HY29F800B 0x58 /* Same as HY29F800AB */ #define HYUNDAI_HY29LV800B 0x5B #define HYUNDAI_HY29F040A 0xA4 -#define HYUNDAI_HY29F400B 0xAB /* Same as HY29F400AB */ +#define HYUNDAI_HY29F400B 0xAB /* Same as HY29F400AB */ #define HYUNDAI_HY29F002B 0x34 #define HYUNDAI_HY29F002T 0xB0 #define HYUNDAI_HY29LV400T 0xB9 #define HYUNDAI_HY29LV400B 0xBA #define HYUNDAI_HY29F080 0xD5 -#define HYUNDAI_HY29F800T 0xD6 /* Same as HY29F800AT */ +#define HYUNDAI_HY29F800T 0xD6 /* Same as HY29F800AT */ #define HYUNDAI_HY29LV800T 0xDA
-#define IMT_ID 0x7F1F /* Integrated Memory Technologies */ +#define IMT_ID 0x7F, 0x1F /* Integrated Memory Technologies */ #define IMT_IM29F004B 0xAE #define IMT_IM29F004T 0xAF
-#define INTEL_ID 0x89 /* Intel */ +#define INTEL_ID 0x89 /* Intel */ #define INTEL_28F320J5 0x14 #define INTEL_28F640J5 0x15 #define INTEL_28F320J3 0x16 #define INTEL_28F640J3 0x17 #define INTEL_28F128J3 0x18 #define INTEL_28F256J3 0x1D -#define INTEL_28F400T 0x70 /* 28F400BV/BX/CE/CV-T */ -#define INTEL_28F400B 0x71 /* 28F400BV/BX/CE/CV-B */ -#define INTEL_28F200T 0x74 /* 28F200BL/BV/BX/CV-T */ -#define INTEL_28F200B 0x75 /* 28F200BL/BV/BX/CV-B */ -#define INTEL_28F004T 0x78 /* 28F004B5/BE/BV/BX-T */ -#define INTEL_28F004B 0x79 /* 28F004B5/BE/BV/BX-B */ -#define INTEL_28F002T 0x7C /* 28F002BC/BL/BV/BX-T */ -#define INTEL_28F002B 0x7D /* 28F002BL/BV/BX-B */ -#define INTEL_28F001T 0x94 /* 28F001BN/BX-T */ -#define INTEL_28F001B 0x95 /* 28F001BN/BX-B */ -#define INTEL_28F008T 0x98 /* 28F008BE/BV-T */ -#define INTEL_28F008B 0x99 /* 28F008BE/BV-B */ -#define INTEL_28F800T 0x9C /* 28F800B5/BV/CE/CV-T */ -#define INTEL_28F800B 0x9D /* 28F800B5/BV/CE/CV-B */ -#define INTEL_28F016SV 0xA0 /* 28F016SA/SV */ +#define INTEL_28F400T 0x70 /* 28F400BV/BX/CE/CV-T */ +#define INTEL_28F400B 0x71 /* 28F400BV/BX/CE/CV-B */ +#define INTEL_28F200T 0x74 /* 28F200BL/BV/BX/CV-T */ +#define INTEL_28F200B 0x75 /* 28F200BL/BV/BX/CV-B */ +#define INTEL_28F004T 0x78 /* 28F004B5/BE/BV/BX-T */ +#define INTEL_28F004B 0x79 /* 28F004B5/BE/BV/BX-B */ +#define INTEL_28F002T 0x7C /* 28F002BC/BL/BV/BX-T */ +#define INTEL_28F002B 0x7D /* 28F002BL/BV/BX-B */ +#define INTEL_28F001T 0x94 /* 28F001BN/BX-T */ +#define INTEL_28F001B 0x95 /* 28F001BN/BX-B */ +#define INTEL_28F008T 0x98 /* 28F008BE/BV-T */ +#define INTEL_28F008B 0x99 /* 28F008BE/BV-B */ +#define INTEL_28F800T 0x9C /* 28F800B5/BV/CE/CV-T */ +#define INTEL_28F800B 0x9D /* 28F800B5/BV/CE/CV-B */ +#define INTEL_28F016SV 0xA0 /* 28F016SA/SV */ #define INTEL_28F008SA 0xA2 -#define INTEL_28F008S3 0xA6 /* 28F008S3/S5/SC */ -#define INTEL_28F004S3 0xA7 /* 28F008S3/S5/SC */ +#define INTEL_28F008S3 0xA6 /* 28F008S3/S5/SC */ +#define INTEL_28F004S3 0xA7 /* 28F008S3/S5/SC */ #define INTEL_28F016XS 0xA8 -#define INTEL_28F016S3 0xAA /* 28F016S3/S5/SC */ +#define INTEL_28F016S3 0xAA /* 28F016S3/S5/SC */ #define INTEL_82802AC 0xAC #define INTEL_82802AB 0xAD #define INTEL_28F010 0xB4 #define INTEL_28F512 0xB8 #define INTEL_28F256A 0xB9 #define INTEL_28F020 0xBD -#define INTEL_28F016B3T 0xD0 /* 28F016B3-T */ -#define INTEL_28F016B3B 0xD1 /* 28F016B3-B */ -#define INTEL_28F008B3T 0xD2 /* 28F008B3-T */ -#define INTEL_28F008B3B 0xD3 /* 28F008B3-B */ -#define INTEL_28F004B3T 0xD4 /* 28F004B3-T */ -#define INTEL_28F004B3B 0xD5 /* 28F004B3-B */ -#define INTEL_25F160S33B8 0x8911 /* Same as 25F016S33B8 */ -#define INTEL_25F320S33B8 0x8912 -#define INTEL_25F640S33B8 0x8913 -#define INTEL_25F160S33T8 0x8915 /* Same as 25F016S33T8 */ -#define INTEL_25F320S33T8 0x8916 -#define INTEL_25F640S33T8 0x8917 - -#define SHARP_LH28F008SA 0xA2 /* Sharp chip, Intel Vendor ID */ -#define SHARP_LH28F008SC 0xA6 /* Sharp chip, Intel Vendor ID */ - -#define ISSI_ID 0xD5 /* ISSI Integrated Silicon Solutions */ - -#define MACRONIX_ID 0xC2 /* Macronix (MX) */ +#define INTEL_28F016B3T 0xD0 /* 28F016B3-T */ +#define INTEL_28F016B3B 0xD1 /* 28F016B3-B */ +#define INTEL_28F008B3T 0xD2 /* 28F008B3-T */ +#define INTEL_28F008B3B 0xD3 /* 28F008B3-B */ +#define INTEL_28F004B3T 0xD4 /* 28F004B3-T */ +#define INTEL_28F004B3B 0xD5 /* 28F004B3-B */ +#define INTEL_25F160S33B8 0x89, 0x11 /* Same as 25F016S33B8 */ +#define INTEL_25F320S33B8 0x89, 0x12 +#define INTEL_25F640S33B8 0x89, 0x13 +#define INTEL_25F160S33T8 0x89, 0x15 /* Same as 25F016S33T8 */ +#define INTEL_25F320S33T8 0x89, 0x16 +#define INTEL_25F640S33T8 0x89, 0x17 + +#define SHARP_LH28F008SA 0xA2 /* Sharp chip, Intel Vendor ID */ +#define SHARP_LH28F008SC 0xA6 /* Sharp chip, Intel Vendor ID */ + +#define ISSI_ID 0xD5 /* ISSI Integrated Silicon Solutions */ + +#define MACRONIX_ID 0xC2 /* Macronix (MX) */ /* Mask ROMs */ -#define MACRONIX_MX23L3254 0x0516 -/* MX25 chips are SPI, first byte of device ID is memory type, +#define MACRONIX_MX23L3254 0x05, 0x16 +/* MX25 chips are SPI, first byte of device ID is memory type * second byte of device ID is log(bitsize)-9. * Generalplus SPI chips seem to be compatible with Macronix * and use the same set of IDs. */ -#define MACRONIX_MX25L512 0x2010 /* Same as MX25L512E, MX25V512, MX25V512C */ -#define MACRONIX_MX25L1005 0x2011 /* Same as MX25L1005C, MX25L1006E */ -#define MACRONIX_MX25L2005 0x2012 /* Same as MX25L2005C */ -#define MACRONIX_MX25L4005 0x2013 /* Same as MX25L4005A, MX25L4005C */ -#define MACRONIX_MX25L8005 0x2014 /* Same as MX25V8005; FIXME: MX25L8073E (4k 0x20) */ -#define MACRONIX_MX25L1605 0x2015 /* MX25L1605 (64k 0x20); MX25L1605A/MX25L1606E (4k 0x20, 64k 0x52); MX25L1605D/MX25L1608D/MX25L1673E (4k 0x20) */ -#define MACRONIX_MX25L3205 0x2016 /* MX25L3205, MX25L3205A (64k 0x20); MX25L3205D/MX25L3208D (4k 0x20); MX25L3206E (4k 0x20, 64k 0x52); MX25L3273E (4k 0x20, 32k 0x52) */ -#define MACRONIX_MX25L6405 0x2017 /* MX25L6405, MX25L6405D (64k 0x20); MX25L6406E/MX25L6436E (4k 0x20); MX25L6445E/MX25L6473E (4k 0x20, 32k 0x52) */ -#define MACRONIX_MX25L12805 0x2018 /* Same as MX25L12805D, MX25L12835F, MX25L12845E (the latter two support completely new ID commands) */ -#define MACRONIX_MX25L25635F 0x2019 /* Same as MX25L25639F, but the latter seems to not support REMS */ -#define MACRONIX_MX25L1635D 0x2415 -#define MACRONIX_MX25L1635E 0x2515 /* MX25L1635{E} */ -#define MACRONIX_MX25U1635E 0x2535 -#define MACRONIX_MX25U3235E 0x2536 /* Same as MX25U6435F */ -#define MACRONIX_MX25U6435E 0x2537 /* Same as MX25U6435F */ -#define MACRONIX_MX25U12835E 0x2538 /* Same as MX25U12835F */ -#define MACRONIX_MX25U25635F 0x2539 -#define MACRONIX_MX25L3235D 0x5E16 /* MX25L3225D/MX25L3235D/MX25L3237D */ +#define MACRONIX_MX25L512 0x20, 0x10 /* Same as MX25L512E, MX25V512, MX25V512C */ +#define MACRONIX_MX25L1005 0x20, 0x11 /* Same as MX25L1005C, MX25L1006E */ +#define MACRONIX_MX25L2005 0x20, 0x12 /* Same as MX25L2005C */ +#define MACRONIX_MX25L4005 0x20, 0x13 /* Same as MX25L4005A, MX25L4005C */ +#define MACRONIX_MX25L8005 0x20, 0x14 /* Same as MX25V8005; FIXME: MX25L8073E (4k 0x20) */ +#define MACRONIX_MX25L1605 0x20, 0x15 /* MX25L1605 (64k 0x20); MX25L1605A/MX25L1606E (4k 0x20, 64k 0x52); MX25L1605D/MX25L1608D/MX25L1673E (4k 0x20) */ +#define MACRONIX_MX25L3205 0x20, 0x16 /* MX25L3205, MX25L3205A (64k 0x20); MX25L3205D/MX25L3208D (4k 0x20); MX25L3206E (4k 0x20, 64k 0x52); MX25L3273E (4k 0x20, 32k 0x52) */ +#define MACRONIX_MX25L6405 0x20, 0x17 /* MX25L6405, MX25L6405D (64k 0x20); MX25L6406E/MX25L6436E (4k 0x20); MX25L6445E/MX25L6473E (4k 0x20, 32k 0x52) */ +#define MACRONIX_MX25L12805 0x20, 0x18 /* Same as MX25L12805D, MX25L12835F, MX25L12845E (the latter two support completely new ID commands) */ +#define MACRONIX_MX25L25635F 0x20, 0x19 /* Same as MX25L25639F, but the latter seems to not support REMS */ +#define MACRONIX_MX25L1635D 0x24, 0x15 +#define MACRONIX_MX25L1635E 0x25, 0x15 /* MX25L1635{E} */ +#define MACRONIX_MX25U1635E 0x25, 0x35 +#define MACRONIX_MX25U3235E 0x25, 0x36 /* Same as MX25U6435F */ +#define MACRONIX_MX25U6435E 0x25, 0x37 /* Same as MX25U6435F */ +#define MACRONIX_MX25U12835E 0x25, 0x38 /* Same as MX25U12835F */ +#define MACRONIX_MX25U25635F 0x25, 0x39 +#define MACRONIX_MX25L3235D 0x5E, 0x16 /* MX25L3225D/MX25L3235D/MX25L3237D */
#define MACRONIX_MX29F001B 0x19 #define MACRONIX_MX29F001T 0x18 -#define MACRONIX_MX29F002B 0x34 /* Same as MX29F002NB; N has reset pin n/c. */ -#define MACRONIX_MX29F002T 0xB0 /* Same as MX29F002NT; N has reset pin n/c. */ +#define MACRONIX_MX29F002B 0x34 /* Same as MX29F002NB; N has reset pin n/c. */ +#define MACRONIX_MX29F002T 0xB0 /* Same as MX29F002NT; N has reset pin n/c. */ #define MACRONIX_MX29F004B 0x46 #define MACRONIX_MX29F004T 0x45 -#define MACRONIX_MX29F022T 0x36 /* Same as MX29F022NT */ -#define MACRONIX_MX29F040 0xA4 /* Same as MX29F040C */ +#define MACRONIX_MX29F022T 0x36 /* Same as MX29F022NT */ +#define MACRONIX_MX29F040 0xA4 /* Same as MX29F040C */ #define MACRONIX_MX29F080 0xD5 -#define MACRONIX_MX29F200B 0x57 /* Same as MX29F200CB */ -#define MACRONIX_MX29F200T 0x51 /* Same as MX29F200CT */ -#define MACRONIX_MX29F400B 0xAB /* Same as MX29F400CB */ -#define MACRONIX_MX29F400T 0x23 /* Same as MX29F400CT */ +#define MACRONIX_MX29F200B 0x57 /* Same as MX29F200CB */ +#define MACRONIX_MX29F200T 0x51 /* Same as MX29F200CT */ +#define MACRONIX_MX29F400B 0xAB /* Same as MX29F400CB */ +#define MACRONIX_MX29F400T 0x23 /* Same as MX29F400CT */ #define MACRONIX_MX29F800B 0x58 #define MACRONIX_MX29F800T 0xD6 #define MACRONIX_MX29LV002CB 0x5A #define MACRONIX_MX29LV002CT 0x59 -#define MACRONIX_MX29LV004B 0xB6 /* Same as MX29LV004CB */ -#define MACRONIX_MX29LV004T 0xB5 /* Same as MX29LV004CT */ -#define MACRONIX_MX29LV008B 0x37 /* Same as MX29LV008CB */ -#define MACRONIX_MX29LV008T 0x3E /* Same as MX29LV008CT */ -#define MACRONIX_MX29LV040 0x4F /* Same as MX29LV040C */ +#define MACRONIX_MX29LV004B 0xB6 /* Same as MX29LV004CB */ +#define MACRONIX_MX29LV004T 0xB5 /* Same as MX29LV004CT */ +#define MACRONIX_MX29LV008B 0x37 /* Same as MX29LV008CB */ +#define MACRONIX_MX29LV008T 0x3E /* Same as MX29LV008CT */ +#define MACRONIX_MX29LV040 0x4F /* Same as MX29LV040C */ #define MACRONIX_MX29LV081 0x38 #define MACRONIX_MX29LV128DB 0x7A #define MACRONIX_MX29LV128DT 0x7E -#define MACRONIX_MX29LV160DB 0x49 /* Same as MX29LV161DB/MX29LV160CB */ -#define MACRONIX_MX29LV160DT 0xC4 /* Same as MX29LV161DT/MX29LV160CT */ -#define MACRONIX_MX29LV320DB 0xA8 /* Same as MX29LV321DB */ -#define MACRONIX_MX29LV320DT 0xA7 /* Same as MX29LV321DT */ -#define MACRONIX_MX29LV400B 0xBA /* Same as MX29LV400CB */ -#define MACRONIX_MX29LV400T 0xB9 /* Same as MX29LV400CT */ -#define MACRONIX_MX29LV640DB 0xCB /* Same as MX29LV640EB */ -#define MACRONIX_MX29LV640DT 0xC9 /* Same as MX29LV640ET */ -#define MACRONIX_MX29LV800B 0x5B /* Same as MX29LV800CB */ -#define MACRONIX_MX29LV800T 0xDA /* Same as MX29LV800CT */ +#define MACRONIX_MX29LV160DB 0x49 /* Same as MX29LV161DB/MX29LV160CB */ +#define MACRONIX_MX29LV160DT 0xC4 /* Same as MX29LV161DT/MX29LV160CT */ +#define MACRONIX_MX29LV320DB 0xA8 /* Same as MX29LV321DB */ +#define MACRONIX_MX29LV320DT 0xA7 /* Same as MX29LV321DT */ +#define MACRONIX_MX29LV400B 0xBA /* Same as MX29LV400CB */ +#define MACRONIX_MX29LV400T 0xB9 /* Same as MX29LV400CT */ +#define MACRONIX_MX29LV640DB 0xCB /* Same as MX29LV640EB */ +#define MACRONIX_MX29LV640DT 0xC9 /* Same as MX29LV640ET */ +#define MACRONIX_MX29LV800B 0x5B /* Same as MX29LV800CB */ +#define MACRONIX_MX29LV800T 0xDA /* Same as MX29LV800CT */ #define MACRONIX_MX29SL402CB 0xF1 #define MACRONIX_MX29SL402CT 0x70 -#define MACRONIX_MX29SL800CB 0x6B /* Same as MX29SL802CB */ -#define MACRONIX_MX29SL800CT 0xEA /* Same as MX29SL802CT */ +#define MACRONIX_MX29SL800CB 0x6B /* Same as MX29SL802CB */ +#define MACRONIX_MX29SL800CT 0xEA /* Same as MX29SL802CT */
/* Nantronics Semiconductors is listed in JEP106AJ in bank 7, so it should have 6 continuation codes in front * of the manufacturer ID of 0xD5. http://www.nantronicssemi.com */ -#define NANTRONICS_ID 0x7F7F7F7F7F7FD5 /* Nantronics */ -#define NANTRONICS_ID_NOPREFIX 0xD5 /* Nantronics, missing prefix */ -#define NANTRONICS_N25S10 0x3011 -#define NANTRONICS_N25S20 0x3012 -#define NANTRONICS_N25S40 0x3013 -#define NANTRONICS_N25S80 0x3014 -#define NANTRONICS_N25S16 0x3015 +#define NANTRONICS_ID 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xD5 /* Nantronics */ +#define NANTRONICS_ID_NOPREFIX 0xD5 /* Nantronics, missing prefix */ +#define NANTRONICS_N25S10 0x30, 0x11 +#define NANTRONICS_N25S20 0x30, 0x12 +#define NANTRONICS_N25S40 0x30, 0x13 +#define NANTRONICS_N25S80 0x30, 0x14 +#define NANTRONICS_N25S16 0x30, 0x15
/* * Programmable Micro Corp is listed in JEP106W in bank 2, so it should @@ -506,102 +501,102 @@ * Apparently this name is owned by "Chingis Technology Corporation" http://www.chingistek.com which is now a * subsidiary of ISSI. They continue to use the PMC manufacturer ID nevertheless. */ -#define PMC_ID 0x7F9D /* PMC */ -#define PMC_ID_NOPREFIX 0x9D /* PMC, missing 0x7F prefix */ +#define PMC_ID 0x7F, 0x9D /* PMC */ +#define PMC_ID_NOPREFIX 0x9D /* PMC, missing 0x7F prefix */ #define PMC_PM25LD256C 0x2F -#define PMC_PM25LD512 0x20 /* Same as Pm25LD512C, but the latter has more locking options. */ -#define PMC_PM25LD010 0x21 /* Same as Pm25LD010C, but the latter has more locking options. */ -#define PMC_PM25LD020 0x22 /* Same as Pm25LD020C, but the latter has more locking options. */ -#define PMC_PM25LV512 0x7B /* Same as Pm25LV512A */ -#define PMC_PM25LV010 0x7C /* Same as Pm25LV010A, but the former does not support RDID but RES3 only. */ +#define PMC_PM25LD512 0x20 /* Same as Pm25LD512C, but the latter has more locking options. */ +#define PMC_PM25LD010 0x21 /* Same as Pm25LD010C, but the latter has more locking options. */ +#define PMC_PM25LD020 0x22 /* Same as Pm25LD020C, but the latter has more locking options. */ +#define PMC_PM25LV512 0x7B /* Same as Pm25LV512A */ +#define PMC_PM25LV010 0x7C /* Same as Pm25LV010A, but the former does not support RDID but RES3 only. */ #define PMC_PM25LV020 0x7D -#define PMC_PM25LV040 0x7E /* Same as PM25LD040(C), but the latter supports more features. */ +#define PMC_PM25LV040 0x7E /* Same as PM25LD040(C), but the latter supports more features. */ #define PMC_PM25LV080B 0x13 #define PMC_PM25LV016B 0x14 #define PMC_PM29F002T 0x1D #define PMC_PM29F002B 0x2D -#define PMC_PM39LV512 0x1B /* Same as IS39LV512 */ -#define PMC_PM39F010 0x1C /* Same as Pm39LV010, IS39LV010 */ +#define PMC_PM39LV512 0x1B /* Same as IS39LV512 */ +#define PMC_PM39F010 0x1C /* Same as Pm39LV010, IS39LV010 */ #define PMC_PM39LV020 0x3D -#define PMC_PM39LV040 0x3E /* Same as IS39LV040 */ +#define PMC_PM39LV040 0x3E /* Same as IS39LV040 */ #define PMC_PM39F020 0x4D #define PMC_PM39F040 0x4E #define PMC_PM49FL002 0x6D #define PMC_PM49FL004 0x6E
/* - * The Sanyo chip found so far uses SPI, first byte is manufacture code, - * second byte is the device code, + * The Sanyo chip found so far uses SPI, first byte is manufacture code + * second byte is the device code * third byte is a dummy byte. */ -#define SANYO_ID 0x62 /* Sanyo */ -#define SANYO_LE25FW203A 0x1600 -#define SANYO_LE25FW403A 0x1100 +#define SANYO_ID 0x62 /* Sanyo */ +#define SANYO_LE25FW203A 0x16, 0x00 +#define SANYO_LE25FW403A 0x11, 0x00 #define SANYO_LE25FW106 0x15 -#define SANYO_LE25FW406 0x07 /* RES2 */ -#define SANYO_LE25FW418A 0x10 /* RES2 and some weird 1 byte RDID variant */ -#define SANYO_LE25FW406A 0x1A /* RES2, no datasheet */ -#define SANYO_LE25FU406B 0x1E /* LE25FW418A without HD_READ mode option variant */ -#define SANYO_LE25FW806 0x26 /* RES2 and some weird 1 byte RDID variant */ -#define SANYO_LE25FW808 0x20 /* RES2 and some weird 1 byte RDID variant */ - -#define SHARP_ID 0xB0 /* Sharp */ +#define SANYO_LE25FW406 0x07 /* RES2 */ +#define SANYO_LE25FW418A 0x10 /* RES2 and some weird 1 byte RDID variant */ +#define SANYO_LE25FW406A 0x1A /* RES2, no datasheet */ +#define SANYO_LE25FU406B 0x1E /* LE25FW418A without HD_READ mode option variant */ +#define SANYO_LE25FW806 0x26 /* RES2 and some weird 1 byte RDID variant */ +#define SANYO_LE25FW808 0x20 /* RES2 and some weird 1 byte RDID variant */ + +#define SHARP_ID 0xB0 /* Sharp */ #define SHARP_LH28F008BJ__PT 0xEC #define SHARP_LH28F008BJ__PB 0xED #define SHARP_LH28F800BV__BTL 0x4B #define SHARP_LH28F800BV__BV 0x4D #define SHARP_LH28F800BV__TV 0x4C -#define SHARP_LHF00L02 0xC9 /* Same as LHF00L06/LHF00L07 */ -#define SHARP_LHF00L04 0xCF /* Same as LHF00L03/LHF00L05 */ +#define SHARP_LHF00L02 0xC9 /* Same as LHF00L06/LHF00L07 */ +#define SHARP_LHF00L04 0xCF /* Same as LHF00L03/LHF00L05 */
/* * Spansion was previously a joint venture of AMD and Fujitsu. * S25 chips are SPI. The first device ID byte is memory type and * the second device ID byte is memory capacity. */ -#define SPANSION_ID 0x01 /* Spansion, same ID as AMD */ -#define SPANSION_S25FL004A 0x0212 -#define SPANSION_S25FL008A 0x0213 -#define SPANSION_S25FL016A 0x0214 -#define SPANSION_S25FL032A 0x0215 /* Same as S25FL032P, but the latter supports EDI and CFI */ -#define SPANSION_S25FL064A 0x0216 /* Same as S25FL064P, but the latter supports EDI and CFI */ -#define SPANSION_S25FL128 0x2018 -#define SPANSION_S25FL256 0x0219 -#define SPANSION_S25FL512 0x0220 -#define SPANSION_S25FL204 0x4013 -#define SPANSION_S25FL208 0x4014 -#define SPANSION_S25FL216 0x4015 /* Same as S25FL216K, but the latter supports OTP, 3 status regs, quad I/O, SFDP etc. */ -#define SPANSION_S25FL132K 0x4016 -#define SPANSION_S25FL164K 0x4017 +#define SPANSION_ID 0x01 /* Spansion, same ID as AMD */ +#define SPANSION_S25FL004A 0x02, 0x12 +#define SPANSION_S25FL008A 0x02, 0x13 +#define SPANSION_S25FL016A 0x02, 0x14 +#define SPANSION_S25FL032A 0x02, 0x15 /* Same as S25FL032P, but the latter supports EDI and CFI */ +#define SPANSION_S25FL064A 0x02, 0x16 /* Same as S25FL064P, but the latter supports EDI and CFI */ +#define SPANSION_S25FL128 0x20, 0x18 +#define SPANSION_S25FL256 0x02, 0x19 +#define SPANSION_S25FL512 0x02, 0x20 +#define SPANSION_S25FL204 0x40, 0x13 +#define SPANSION_S25FL208 0x40, 0x14 +#define SPANSION_S25FL216 0x40, 0x15 /* Same as S25FL216K, but the latter supports OTP, 3 status regs, quad I/O, SFDP etc. */ +#define SPANSION_S25FL132K 0x40, 0x16 +#define SPANSION_S25FL164K 0x40, 0x17
/* * SST25 chips are SPI, first byte of device ID is memory type, second * byte of device ID is related to log(bitsize) at least for some chips. */ -#define SST_ID 0xBF /* SST */ -#define SST_SST25LF020_REMS 0x43 /* REMS or RES opcode */ -#define SST_SST25WF512 0x2501 -#define SST_SST25WF010 0x2502 -#define SST_SST25WF020 0x2503 -#define SST_SST25WF040 0x2504 -#define SST_SST25WF080 0x2505 -#define SST_SST25VF512A_REMS 0x48 /* REMS or RES opcode */ -#define SST_SST25VF010_REMS 0x49 /* REMS or RES opcode */ -#define SST_SST25VF020_REMS 0x43 /* REMS or RES opcode, same as SST25LF020A */ -#define SST_SST25VF020B 0x258C -#define SST_SST25VF040_REMS 0x44 /* REMS or RES opcode, same as SST25LF040A */ -#define SST_SST25VF040B 0x258D -#define SST_SST25VF040B_REMS 0x8D /* REMS or RES opcode */ -#define SST_SST25VF080_REMS 0x80 /* REMS or RES opcode, same as SST25LF080A */ -#define SST_SST25VF080B 0x258E -#define SST_SST25VF080B_REMS 0x8E /* REMS or RES opcode */ -#define SST_SST25VF016B 0x2541 -#define SST_SST25VF032B 0x254A -#define SST_SST25VF032B_REMS 0x4A /* REMS or RES opcode */ -#define SST_SST25VF064C 0x254B -#define SST_SST26VF016 0x2601 -#define SST_SST26VF032 0x2602 -#define SST_SST26VF064B 0x2643 +#define SST_ID 0xBF /* SST */ +#define SST_SST25LF020_REMS 0x43 /* REMS or RES opcode */ +#define SST_SST25WF512 0x25, 0x01 +#define SST_SST25WF010 0x25, 0x02 +#define SST_SST25WF020 0x25, 0x03 +#define SST_SST25WF040 0x25, 0x04 +#define SST_SST25WF080 0x25, 0x05 +#define SST_SST25VF512A_REMS 0x48 /* REMS or RES opcode */ +#define SST_SST25VF010_REMS 0x49 /* REMS or RES opcode */ +#define SST_SST25VF020_REMS 0x43 /* REMS or RES opcode, same as SST25LF020A */ +#define SST_SST25VF020B 0x25, 0x8C +#define SST_SST25VF040_REMS 0x44 /* REMS or RES opcode, same as SST25LF040A */ +#define SST_SST25VF040B 0x25, 0x8D +#define SST_SST25VF040B_REMS 0x8D /* REMS or RES opcode */ +#define SST_SST25VF080_REMS 0x80 /* REMS or RES opcode, same as SST25LF080A */ +#define SST_SST25VF080B 0x25, 0x8E +#define SST_SST25VF080B_REMS 0x8E /* REMS or RES opcode */ +#define SST_SST25VF016B 0x25, 0x41 +#define SST_SST25VF032B 0x25, 0x4A +#define SST_SST25VF032B_REMS 0x4A /* REMS or RES opcode */ +#define SST_SST25VF064C 0x25, 0x4B +#define SST_SST26VF016 0x26, 0x01 +#define SST_SST26VF032 0x26, 0x02 +#define SST_SST26VF064B 0x26, 0x43 #define SST_SST27SF512 0xA4 #define SST_SST27SF010 0xA5 #define SST_SST27SF020 0xA6 @@ -610,22 +605,22 @@ #define SST_SST28SF040 0x04 #define SST_SST29EE512 0x5D #define SST_SST29EE010 0x07 -#define SST_SST29LE010 0x08 /* Same as SST29VE010 */ -#define SST_SST29EE020A 0x10 /* Same as SST29EE020 */ -#define SST_SST29LE020 0x12 /* Same as SST29VE020 */ +#define SST_SST29LE010 0x08 /* Same as SST29VE010 */ +#define SST_SST29EE020A 0x10 /* Same as SST29EE020 */ +#define SST_SST29LE020 0x12 /* Same as SST29VE020 */ #define SST_SST29SF020 0x24 #define SST_SST29VF020 0x25 #define SST_SST29SF040 0x13 #define SST_SST29VF040 0x14 #define SST_SST39SF512 0xB4 #define SST_SST39SF010 0xB5 -#define SST_SST39SF020 0xB6 /* Same as 39SF020A */ +#define SST_SST39SF020 0xB6 /* Same as 39SF020A */ #define SST_SST39SF040 0xB7 #define SST_SST39VF512 0xD4 #define SST_SST39VF010 0xD5 -#define SST_SST39VF020 0xD6 /* Same as 39LF020 */ -#define SST_SST39VF040 0xD7 /* Same as 39LF040 */ -#define SST_SST39VF080 0xD8 /* Same as 39LF080/39VF080/39VF088 */ +#define SST_SST39VF020 0xD6 /* Same as 39LF020 */ +#define SST_SST39VF040 0xD7 /* Same as 39LF040 */ +#define SST_SST39VF080 0xD8 /* Same as 39LF080/39VF080/39VF088 */ #define SST_SST49LF040B 0x50 #define SST_SST49LF040 0x51 #define SST_SST49LF020 0x61 @@ -634,7 +629,7 @@ #define SST_SST49LF080A 0x5B #define SST_SST49LF002A 0x57 #define SST_SST49LF003A 0x1B -#define SST_SST49LF004A 0x60 /* Same as 49LF004B */ +#define SST_SST49LF004A 0x60 /* Same as 49LF004B */ #define SST_SST49LF008A 0x5A #define SST_SST49LF004C 0x54 #define SST_SST49LF008C 0x59 @@ -645,34 +640,35 @@ * ST25P chips are SPI, first byte of device ID is memory type, second * byte of device ID is related to log(bitsize) at least for some chips. */ -#define ST_ID 0x20 /* ST / SGS/Thomson / Numonyx (later acquired by Micron) */ -#define ST_M25P05A 0x2010 -#define ST_M25P05_RES 0x10 /* Same code as M25P10. */ -#define ST_M25P10A 0x2011 -#define ST_M25P10_RES 0x10 /* Same code as M25P05. */ -#define ST_M25P20 0x2012 +#define ST_ID 0x20 /* ST / SGS/Thomson / Numonyx (later acquired by Micron) */ +#define ST_M25P05A 0x20, 0x10 +#define ST_M25P05A_RES 0x05 +#define ST_M25P05_RES 0x10 /* Same code as M25P10. */ +#define ST_M25P10A 0x20, 0x11 +#define ST_M25P10_RES 0x10 /* Same code as M25P05. */ +#define ST_M25P20 0x20, 0x12, 0x10 #define ST_M25P20_RES 0x11 -#define ST_M25P40 0x2013 +#define ST_M25P40 0x20, 0x13, 0x10 #define ST_M25P40_RES 0x12 -#define ST_M25P80 0x2014 -#define ST_M25P16 0x2015 -#define ST_M25P32 0x2016 -#define ST_M25P64 0x2017 -#define ST_M25P128 0x2018 -#define ST_M45PE10 0x4011 -#define ST_M45PE20 0x4012 -#define ST_M45PE40 0x4013 -#define ST_M45PE80 0x4014 -#define ST_M45PE16 0x4015 -#define ST_M25PX80 0x7114 -#define ST_M25PX16 0x7115 -#define ST_M25PX32 0x7116 -#define ST_M25PX64 0x7117 -#define ST_M25PE10 0x8011 -#define ST_M25PE20 0x8012 -#define ST_M25PE40 0x8013 -#define ST_M25PE80 0x8014 -#define ST_M25PE16 0x8015 +#define ST_M25P80 0x20, 0x14, 0x10 +#define ST_M25P16 0x20, 0x15 +#define ST_M25P32 0x20, 0x16 +#define ST_M25P64 0x20, 0x17 +#define ST_M25P128 0x20, 0x18 +#define ST_M45PE10 0x40, 0x11 +#define ST_M45PE20 0x40, 0x12 +#define ST_M45PE40 0x40, 0x13 +#define ST_M45PE80 0x40, 0x14 +#define ST_M45PE16 0x40, 0x15 +#define ST_M25PX80 0x71, 0x14 +#define ST_M25PX16 0x71, 0x15 +#define ST_M25PX32 0x71, 0x16 +#define ST_M25PX64 0x71, 0x17 +#define ST_M25PE10 0x80, 0x11 +#define ST_M25PE20 0x80, 0x12 +#define ST_M25PE40 0x80, 0x13 +#define ST_M25PE80 0x80, 0x14 +#define ST_M25PE16 0x80, 0x15 #define ST_M50FLW040A 0x08 #define ST_M50FLW040B 0x28 #define ST_M50FLW080A 0x80 @@ -683,33 +679,33 @@ #define ST_M50FW016 0x2E #define ST_M50LPW080 0x2F #define ST_M50LPW116 0x30 -#define ST_M29F002B 0x34 /* Same as M29F002BB */ -#define ST_M29F002T 0xB0 /* Same as M29F002BT/M29F002NT/M29F002BNT */ -#define ST_M29F040B 0xE2 /* Same as M29F040 */ +#define ST_M29F002B 0x34 /* Same as M29F002BB */ +#define ST_M29F002T 0xB0 /* Same as M29F002BT/M29F002NT/M29F002BNT */ +#define ST_M29F040B 0xE2 /* Same as M29F040 */ #define ST_M29F080 0xF1 #define ST_M29F200BT 0xD3 #define ST_M29F200BB 0xD4 -#define ST_M29F400BT 0xD5 /* Same as M29F400T */ -#define ST_M29F400BB 0xD6 /* Same as M29F400B */ +#define ST_M29F400BT 0xD5 /* Same as M29F400T */ +#define ST_M29F400BB 0xD6 /* Same as M29F400B */ #define ST_M29F800DB 0x58 #define ST_M29F800DT 0xEC #define ST_M29W010B 0x23 #define ST_M29W040B 0xE3 #define ST_M29W512B 0x27 -#define ST_N25Q016__1E 0xBB15 /* N25Q016, 1.8V, (uniform sectors expected) */ -#define ST_N25Q032__3E 0xBA16 /* N25Q032, 3.0V, (uniform sectors expected) */ -#define ST_N25Q032__1E 0xBB16 /* N25Q032, 1.8V, (uniform sectors expected) */ -#define ST_N25Q064__3E 0xBA17 /* N25Q064, 3.0V, (uniform sectors expected) */ -#define ST_N25Q064__1E 0xBB17 /* N25Q064, 1.8V, (uniform sectors expected) */ -#define ST_N25Q128__3E 0xBA18 /* N25Q128, 3.0V, (uniform sectors expected) */ -#define ST_N25Q128__1E 0xBB18 /* N25Q128, 1.8V, (uniform sectors expected) */ -#define ST_N25Q256__3E 0xBA19 /* N25Q256, 3.0V, (uniform sectors expected) */ -#define ST_N25Q256__1E 0xBB19 /* N25Q256, 1.8V, (uniform sectors expected) */ -#define ST_N25Q512__3E 0xBA20 /* N25Q512, 3.0V, (uniform sectors expected) */ -#define ST_N25Q512__1E 0xBB20 /* N25Q512, 1.8V, (uniform sectors expected) */ -#define ST_N25Q00A__3E 0xBA21 /* N25Q00A, 3.0V, (uniform sectors expected) */ - -#define SYNCMOS_MVC_ID 0x40 /* SyncMOS (SM) and Mosel Vitelic Corporation (MVC) */ +#define ST_N25Q016__1E 0xBB, 0x15 /* N25Q016, 1.8V, (uniform sectors expected) */ +#define ST_N25Q032__3E 0xBA, 0x16 /* N25Q032, 3.0V, (uniform sectors expected) */ +#define ST_N25Q032__1E 0xBB, 0x16 /* N25Q032, 1.8V, (uniform sectors expected) */ +#define ST_N25Q064__3E 0xBA, 0x17 /* N25Q064, 3.0V, (uniform sectors expected) */ +#define ST_N25Q064__1E 0xBB, 0x17 /* N25Q064, 1.8V, (uniform sectors expected) */ +#define ST_N25Q128__3E 0xBA, 0x18 /* N25Q128, 3.0V, (uniform sectors expected) */ +#define ST_N25Q128__1E 0xBB, 0x18 /* N25Q128, 1.8V, (uniform sectors expected) */ +#define ST_N25Q256__3E 0xBA, 0x19 /* N25Q256, 3.0V, (uniform sectors expected) */ +#define ST_N25Q256__1E 0xBB, 0x19 /* N25Q256, 1.8V, (uniform sectors expected) */ +#define ST_N25Q512__3E 0xBA, 0x20 /* N25Q512, 3.0V, (uniform sectors expected) */ +#define ST_N25Q512__1E 0xBB, 0x20 /* N25Q512, 1.8V, (uniform sectors expected) */ +#define ST_N25Q00A__3E 0xBA, 0x21 /* N25Q00A, 3.0V, (uniform sectors expected) */ + +#define SYNCMOS_MVC_ID 0x40 /* SyncMOS (SM) and Mosel Vitelic Corporation (MVC) */ #define MVC_V29C51000T 0x00 #define MVC_V29C51400T 0x13 #define MVC_V29LC51000 0x20 @@ -717,17 +713,17 @@ #define MVC_V29LC51002 0x82 #define MVC_V29C51000B 0xA0 #define MVC_V29C51400B 0xB3 -#define SM_MVC_29C51001T 0x01 /* Identical chips: {F,S,V}29C51001T */ -#define SM_MVC_29C51002T 0x02 /* Identical chips: {F,S,V}29C51002T */ -#define SM_MVC_29C51004T 0x03 /* Identical chips: {F,S,V}29C51004T */ -#define SM_MVC_29C31004T 0x63 /* Identical chips: {S,V}29C31004T */ -#define SM_MVC_29C31004B 0x73 /* Identical chips: {S,V}29C31004B */ -#define SM_MVC_29C51001B 0xA1 /* Identical chips: {F,S,V}29C51001B */ -#define SM_MVC_29C51002B 0xA2 /* Identical chips: {F,S,V}29C51002B */ -#define SM_MVC_29C51004B 0xA3 /* Identical chips: {F,S,V}29C51004B */ - -#define TI_ID 0x97 /* Texas Instruments */ -#define TI_OLD_ID 0x01 /* TI chips from last century */ +#define SM_MVC_29C51001T 0x01 /* Identical chips: {F,S,V}29C51001T */ +#define SM_MVC_29C51002T 0x02 /* Identical chips: {F,S,V}29C51002T */ +#define SM_MVC_29C51004T 0x03 /* Identical chips: {F,S,V}29C51004T */ +#define SM_MVC_29C31004T 0x63 /* Identical chips: {S,V}29C31004T */ +#define SM_MVC_29C31004B 0x73 /* Identical chips: {S,V}29C31004B */ +#define SM_MVC_29C51001B 0xA1 /* Identical chips: {F,S,V}29C51001B */ +#define SM_MVC_29C51002B 0xA2 /* Identical chips: {F,S,V}29C51002B */ +#define SM_MVC_29C51004B 0xA3 /* Identical chips: {F,S,V}29C51004B */ + +#define TI_ID 0x97 /* Texas Instruments */ +#define TI_OLD_ID 0x01 /* TI chips from last century */ #define TI_TMS29F002RT 0xB0 #define TI_TMS29F002RB 0x34
@@ -735,44 +731,44 @@ * W25X chips are SPI, first byte of device ID is memory type, second * byte of device ID is related to log(bitsize). */ -#define WINBOND_NEX_ID 0xEF /* Winbond (ex Nexcom) serial flashes */ -#define WINBOND_NEX_W25X10 0x3011 -#define WINBOND_NEX_W25X20 0x3012 -#define WINBOND_NEX_W25X40 0x3013 -#define WINBOND_NEX_W25X80 0x3014 -#define WINBOND_NEX_W25X16 0x3015 -#define WINBOND_NEX_W25X32 0x3016 -#define WINBOND_NEX_W25X64 0x3017 -#define WINBOND_NEX_W25Q40_V 0x4013 /* W25Q40BV; W25Q40BL (2.3-3.6V) */ -#define WINBOND_NEX_W25Q80_V 0x4014 /* W25Q80BV */ -#define WINBOND_NEX_W25Q16_V 0x4015 /* W25Q16CV; W25Q16DV */ -#define WINBOND_NEX_W25Q32_V 0x4016 /* W25Q32BV; W25Q32FV in SPI mode (default) */ -#define WINBOND_NEX_W25Q64_V 0x4017 /* W25Q64BV, W25Q64CV; W25Q64FV in SPI mode (default) */ -#define WINBOND_NEX_W25Q128_V 0x4018 /* W25Q128BV; W25Q128FV in SPI mode (default) */ -#define WINBOND_NEX_W25Q256_V 0x4019 /* W25Q256FV */ -#define WINBOND_NEX_W25Q20_W 0x5012 /* W25Q20BW */ -#define WINBOND_NEX_W25Q40_W 0x5013 /* W25Q40BW */ -#define WINBOND_NEX_W25Q80_W 0x5014 /* W25Q80BW */ -#define WINBOND_NEX_W25Q16_W 0x6015 /* W25Q16DW */ -#define WINBOND_NEX_W25Q32_W 0x6016 /* W25Q32DW; W25Q32FV in QPI mode */ -#define WINBOND_NEX_W25Q64_W 0x6017 /* W25Q64DW; W25Q64FV in QPI mode */ -#define WINBOND_NEX_W25Q128_W 0x6018 /* (No W version known) W25Q128FV in QPI mode */ - -#define WINBOND_ID 0xDA /* Winbond */ +#define WINBOND_NEX_ID 0xEF /* Winbond (ex Nexcom) serial flashes */ +#define WINBOND_NEX_W25X10 0x30, 0x11 +#define WINBOND_NEX_W25X20 0x30, 0x12 +#define WINBOND_NEX_W25X40 0x30, 0x13 +#define WINBOND_NEX_W25X80 0x30, 0x14 +#define WINBOND_NEX_W25X16 0x30, 0x15 +#define WINBOND_NEX_W25X32 0x30, 0x16 +#define WINBOND_NEX_W25X64 0x30, 0x17 +#define WINBOND_NEX_W25Q40_V 0x40, 0x13 /* W25Q40BV; W25Q40BL (2.3-3.6V) */ +#define WINBOND_NEX_W25Q80_V 0x40, 0x14 /* W25Q80BV */ +#define WINBOND_NEX_W25Q16_V 0x40, 0x15 /* W25Q16CV; W25Q16DV */ +#define WINBOND_NEX_W25Q32_V 0x40, 0x16 /* W25Q32BV; W25Q32FV in SPI mode (default) */ +#define WINBOND_NEX_W25Q64_V 0x40, 0x17 /* W25Q64BV, W25Q64CV; W25Q64FV in SPI mode (default) */ +#define WINBOND_NEX_W25Q128_V 0x40, 0x18 /* W25Q128BV; W25Q128FV in SPI mode (default) */ +#define WINBOND_NEX_W25Q256_V 0x40, 0x19 /* W25Q256FV */ +#define WINBOND_NEX_W25Q20_W 0x50, 0x12 /* W25Q20BW */ +#define WINBOND_NEX_W25Q40_W 0x50, 0x13 /* W25Q40BW */ +#define WINBOND_NEX_W25Q80_W 0x50, 0x14 /* W25Q80BW */ +#define WINBOND_NEX_W25Q16_W 0x60, 0x15 /* W25Q16DW */ +#define WINBOND_NEX_W25Q32_W 0x60, 0x16 /* W25Q32DW; W25Q32FV in QPI mode */ +#define WINBOND_NEX_W25Q64_W 0x60, 0x17 /* W25Q64DW; W25Q64FV in QPI mode */ +#define WINBOND_NEX_W25Q128_W 0x60, 0x18 /* (No W version known) W25Q128FV in QPI mode */ + +#define WINBOND_ID 0xDA /* Winbond */ #define WINBOND_W19B160BB 0x49 #define WINBOND_W19B160BT 0xC4 -#define WINBOND_W19B320SB 0x2A /* Same as W19L320SB */ -#define WINBOND_W19B320ST 0xBA /* Same as W19L320ST */ +#define WINBOND_W19B320SB 0x2A /* Same as W19L320SB */ +#define WINBOND_W19B320ST 0xBA /* Same as W19L320ST */ #define WINBOND_W19B322MB 0x92 #define WINBOND_W19B322MT 0x10 #define WINBOND_W19B323MB 0x94 #define WINBOND_W19B323MT 0x13 #define WINBOND_W19B324MB 0x97 #define WINBOND_W19B324MT 0x16 -#define WINBOND_W29C010 0xC1 /* Same as W29C010M, W29C011A, W29EE011, W29EE012, and ASD AE29F1008 */ -#define WINBOND_W29C020 0x45 /* Same as W29C020C, W29C022 and ASD AE29F2008 */ -#define WINBOND_W29C040 0x46 /* Same as W29C040P */ -#define WINBOND_W29C512A 0xC8 /* Same as W29EE512 */ +#define WINBOND_W29C010 0xC1 /* Same as W29C010M, W29C011A, W29EE011, W29EE012, and ASD AE29F1008 */ +#define WINBOND_W29C020 0x45 /* Same as W29C020C, W29C022 and ASD AE29F2008 */ +#define WINBOND_W29C040 0x46 /* Same as W29C040P */ +#define WINBOND_W29C512A 0xC8 /* Same as W29EE512 */ #define WINBOND_W39F010 0xA1 #define WINBOND_W39L010 0x31 #define WINBOND_W39L020 0xB5 @@ -781,13 +777,13 @@ #define WINBOND_W39L512 0x38 #define WINBOND_W39V040A 0x3D #define WINBOND_W39V040FA 0x34 -#define WINBOND_W39V040B 0x54 /* Same as W39V040FB */ -#define WINBOND_W39V040C 0x50 /* Same as W39V040FC */ +#define WINBOND_W39V040B 0x54 /* Same as W39V040FB */ +#define WINBOND_W39V040C 0x50 /* Same as W39V040FC */ #define WINBOND_W39V080A 0xD0 #define WINBOND_W39V080FA 0xD3 -#define WINBOND_W39V080FA_DM 0x93 /* W39V080FA dual mode */ -#define WINBOND_W49F002 0x25 /* Same as W49F002B */ -#define WINBOND_W49F002U 0x0B /* Same as W49F002N and ASD AE49F2008 */ +#define WINBOND_W39V080FA_DM 0x93 /* W39V080FA dual mode */ +#define WINBOND_W49F002 0x25 /* Same as W49F002B */ +#define WINBOND_W49F002U 0x0B /* Same as W49F002N and ASD AE49F2008 */ #define WINBOND_W49F020 0x8C #define WINBOND_W49V002A 0xB0 #define WINBOND_W49V002FA 0x32 diff --git a/flashrom.c b/flashrom.c index e613768..e7c5781 100644 --- a/flashrom.c +++ b/flashrom.c @@ -36,7 +36,7 @@ #include <sys/utsname.h> #endif #include "flash.h" -#include "flashchips.h" +#include "chipdrivers.h" #include "programmer.h" #include "hwaccess.h"
@@ -364,6 +364,12 @@ static bool all_skipped = true;
static int check_block_eraser(const struct flashctx *flash, int k, int log);
+int shutdown_free(void *data) +{ + free(data); + return 0; +} + /* Register a function to be executed on programmer shutdown. * The advantage over atexit() is that you can supply a void pointer which will * be used as parameter to the registered function upon programmer shutdown. @@ -1085,107 +1091,302 @@ int map_flash(struct flashctx *flash) return 0; }
-int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *flash, int force) +static probe probes[] = { + { &probe_spi_rdid, BUS_SPI, "RDID"}, + { &probe_spi_res, BUS_SPI, "RES"}, + { &probe_spi_rems, BUS_SPI, "REMS"}, + { &probe_spi_at25f, BUS_SPI, "AT25F"}, + { &probe_spi_at45db, BUS_SPI, "AT45DB"}, + { &probe_jedec_longreset, BUS_PARALLEL, "JEDEC long", 64, 512, 1}, + { &probe_jedec_shortreset_full, BUS_PARALLEL | BUS_LPC | BUS_FWH, "JEDEC short full", 64, 1024, 1}, + { &probe_jedec_shortreset_full_384, BUS_FWH, "JEDEC short full 384k", 384, 384}, // workaround for SST49LF003A/B + { &probe_jedec_shortreset_aaa, BUS_PARALLEL, "JEDEC short AAA", 256, 256}, + { &probe_jedec_shortreset_2aa, BUS_PARALLEL, "JEDEC short 2AA", 64, 2048, 1}, + { &probe_82802ab_unshifted, BUS_PARALLEL | BUS_LPC | BUS_FWH, "82802AB", 256, 2048, 1}, + { &probe_82802ab_shifted, BUS_PARALLEL | BUS_LPC | BUS_FWH, "82802AB shifted", 256, 2048, 1}, + { &probe_w29ee011, BUS_PARALLEL , "W29EE011", 128, 128}, + { &probe_en29lv640b, BUS_PARALLEL , "EN29LV640B", 8192, 8192}, + { &probe_m29f400bt, BUS_PARALLEL , "M29F400BT", 512, 2048, 2}, +}; + +int probe_allsizes(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) { - const struct flashchip *chip; - uint32_t size; - enum chipbustype buses_common; - char *tmp; + uint16_t size_min = p->size_min; + uint16_t size_max = p->size_max; + uint16_t size_step = p->size_step; + if (res_len == 0 || size_min == 0) + return -1;
- for (chip = flashchips + startchip; chip && chip->name; chip++) { - if (chip_to_probe && strcmp(chip->name, chip_to_probe) != 0) - continue; - buses_common = pgm->buses_supported & chip->bustype; - if (!buses_common) + if (size_step == 0) { + size_step = 1; + msg_cspew("%s: setting step size to 1.\n", __func__); + } + + if (size_min > size_max) { + size_max = size_min; + msg_cspew("%s: setting max size to min size.\n", __func__); + } + + /* Probe for chips of multiple sizes with one function (pointer) */ + int res_cnt = 0; + unsigned int s; + for (s = size_min; s <= size_max; s <<= size_step) { + void *addr = programmer_map_flash_region("probe_allsizes", 0xffffffff - s * 1024 + 1, s * 1024); + if (addr == ERROR_PTR) { + msg_cwarn("%s: Could not map physical memory to probe for size %d kB.", __func__, s); continue; - msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size); - if (!chip->probe && !force) { - msg_gdbg("failed! flashrom has no probe function for this flash chip.\n"); + } + flash->virtual_memory = (chipaddr)addr; + msg_cdbg("size %d... ", s); + int ret = p->probe_func(flash, res, res_len - res_cnt, p); + programmer_unmap_flash_region((void *)flash->virtual_memory, s * 1024); + if (ret >= 1) { + msg_cspew("%s: size %d returned %d result(s).\n", __func__, s, ret); + res->chip_size = s; + res += ret; + res_cnt += ret; + res_len -= ret; + } else if (ret <= 0) + res->len = 0; + if (res_len == 0) { + msg_cdbg("%s: Maximum number of results reached after probing for size %d kB. ", + __func__, s); + break; + } + } + return res_cnt; +} + +/* Probe for regular chips on a single programmer. */ +static unsigned int probe_flash_int(struct flashctx **flashes, unsigned int flashes_len, struct registered_programmer *pgm) +{ + unsigned int matches_prog = 0; + /* First, obtain results of all possible probe functions on this programmer. */ + probe_res results[30] = {{0}}; //fixme + unsigned int results_cnt = 0; + unsigned int valid_results = 0; + unsigned int p_cnt; + for (p_cnt = 0; p_cnt < ARRAY_SIZE(probes); p_cnt++) { + if (results_cnt == ARRAY_SIZE(results)) { + msg_cwarn("%s: Maximum number of results (%ld) reached after %d probers. ", + __func__, ARRAY_SIZE(results), p_cnt); + break; + } + probe *p = &probes[p_cnt]; + probe_res *res = &results[results_cnt]; + if ((p->bustype & pgm->buses_supported) == 0) continue; + msg_gdbg("Probing with %s... ", p->mnemonic); + struct flashctx ctx = {.pgm = pgm}; + int ret; + if (p->size_min != 0 || p->size_max != 0 || p->size_step != 0) { + ret = probe_allsizes(&ctx, res, ARRAY_SIZE(results) - results_cnt, p); + } else { + ret = p->probe_func(&ctx, res, ARRAY_SIZE(results) - results_cnt, p); } + msg_gdbg("done: %d.\n", ret); + + res->probe_func = p->probe_func; + if (ret > 0) { + unsigned int i, j; + for (i = 0; i < ret; i++) { + bool valid = false; + for (j = 0; j < res->len; j++) { + msg_cdbg(" 0x%02x", res->vals[j]); + /* All zeros or all ones is most probably not a valid result, but any + * byte containing something else makes the response valid. */ + if (res->vals[j] != 0x00 && res->vals[j] != 0xFF) { + valid = true; + } + } + if (valid) + valid_results++; + else + msg_cdbg(" Invalid result.");
- /* Start filling in the dynamic data. */ - flash->chip = calloc(1, sizeof(struct flashchip)); - if (!flash->chip) { - msg_gerr("Out of memory!\n"); - exit(1); + if (res->len > 0) + msg_cdbg("\n"); + + res++; + } + results_cnt += ret; } - memcpy(flash->chip, chip, sizeof(struct flashchip)); - flash->pgm = pgm; + }
- if (map_flash(flash) != 0) - return -1; + if (valid_results == 0) { + char *busses = flashbuses_to_text(pgm->buses_supported); + msg_cdbg("No valid probing results received for %s.\n", busses); + free(busses); + return 0; + }
- size = chip->total_size * 1024; - /* We handle a forced match like a real match, we just avoid probing. Note that probe_flash() - * is only called with force=1 after normal probing failed. - */ - if (force) - break; + /* Try to find matching chips. For each chip in the flashchips array, compare its stored probers + * with the results obtained above. */ + const struct flashchip *chip; + for (chip = flashchips; chip->name; chip++) { + if ((chip->bustype & pgm->buses_supported) == 0) + continue; + msg_cdbg2("Matching %s... ", chip->name); + bool mismatch = false; // set if any received result does not match the saved values + bool match = false; // set if at least one result matches + unsigned int want_cnt; + for (want_cnt = 0; want_cnt < ARRAY_SIZE(chip->probers); want_cnt++) { + const struct prober *want = &chip->probers[want_cnt]; + if (want->func == NULL) + break; /* If there is a prober w/o a func we are done for this chip. */ + + msg_cspew("\nComaring ID #%d: ", want_cnt); + + /* Look for the matching probe function and compare its result to the chip. */ + for (p_cnt = 0; p_cnt < ARRAY_SIZE(probes); p_cnt++) { + probe *p = &probes[p_cnt]; + if (want->func != p->probe_func) { + msg_cspew("want->func != p->probe_func, "); + continue; // look further for the current probe function + }
- if (flash->chip->probe(flash) != 1) - goto notfound; + probe_res *res = NULL; + unsigned int i; + for (i = 0; i < results_cnt; i++) { + if (results[i].probe_func == want->func && + (results[i].chip_size == 0 || + results[i].chip_size == chip->total_size)) { + res = &results[i]; + // there should only be 1 result for any size, use first found + break; + } + } + if (res == NULL || res->len == 0) { + msg_cspew("no result for probe #%d, ", p_cnt); + break; // right function but there is no result -> next function + }
- /* If this is the first chip found, accept it. - * If this is not the first chip found, accept it only if it is - * a non-generic match. SFDP and CFI are generic matches. - * startchip==0 means this call to probe_flash() is the first - * one for this programmer interface and thus no other chip has - * been found on this interface. - */ - if (startchip == 0 && flash->chip->model_id == SFDP_DEVICE_ID) { - msg_cinfo("===\n" - "SFDP has autodetected a flash chip which is " - "not natively supported by flashrom yet.\n"); - if (count_usable_erasers(flash) == 0) - msg_cinfo("The standard operations read and " - "verify should work, but to support " - "erase, write and all other " - "possible features"); - else - msg_cinfo("All standard operations (read, " - "verify, erase and write) should " - "work, but to support all possible " - "features"); - - msg_cinfo(" we need to add them manually.\n" - "You can help us by mailing us the output of the following command to " - "flashrom@flashrom.org:\n" - "'flashrom -VV [plus the -p/--programmer parameter]'\n" - "Thanks for your help!\n" - "===\n"); + msg_cspew("comparing %d bytes of probe #%d... ", + min(res->len, want->res.len), p_cnt); + + bool seen_vendor = false; + for (i = 0; i < min(res->len, want->res.len); i++) { + if (!seen_vendor && res->vals[i] != 0x7F && res->vals[i] != 0x00 && + res->vals[i] != 0xFF) { + seen_vendor = true; + if (!oddparity(res->vals[i])) + msg_cdbg("%s byte %d parity violation.\n", + p->mnemonic, i); + } + if (res->vals[i] != want->res.vals[i]) { + msg_cspew("byte #%d unexpected (0x%02x != 0x%02x), ", + i, res->vals[i], want->res.vals[i]); + mismatch = true; + goto chip_done; // a single mismatch is enough to abort + } + } + msg_cspew("all match. "); + match = true; // remember that at least one prober has matched + break; // skip to next prober + } + } +chip_done: + msg_cdbg2("%s does%s match.\n", chip->name, match && !mismatch ? "" : " not"); + if (match && !mismatch) { + char *busses = flashbuses_to_text(chip->bustype); + msg_cinfo("Found %s flash chip "%s" (%d kB, %s).\n", + chip->vendor, chip->name, chip->total_size, busses); + free(busses); + struct flashctx *tmp = realloc(*flashes, sizeof(struct flashctx) * (flashes_len + 1)); + if (tmp == NULL) { + msg_gerr("Out of memory!\n"); + free(*flashes); + *flashes = NULL; + return -1; + } + tmp[flashes_len].pgm = pgm; + tmp[flashes_len].chip = chip; + if (chip->printlock != NULL) + chip->printlock(&tmp[flashes_len]); + *flashes = tmp; + flashes_len++; + matches_prog++; } - - /* First flash chip detected on this bus. */ - if (startchip == 0) - break; - /* Not the first flash chip detected on this bus, but not a generic match either. */ - if ((flash->chip->model_id != GENERIC_DEVICE_ID) && (flash->chip->model_id != SFDP_DEVICE_ID)) - break; - /* Not the first flash chip detected on this bus, and it's just a generic match. Ignore it. */ -notfound: - unmap_flash(flash); - free(flash->chip); - flash->chip = NULL; } + return matches_prog; +}
- if (!flash->chip) - return -1; +int probe_flash(struct flashctx **flashes, const struct registered_programmer *prog) +{ + unsigned int matches_total = 0; + unsigned int pgm_cnt; + for (pgm_cnt = 0; pgm_cnt < registered_programmer_count; pgm_cnt++) { + struct registered_programmer *pgm = ®istered_programmers[pgm_cnt]; + int matches_prog = probe_flash_int(flashes, matches_total, pgm); + if (matches_prog < 0) { + msg_cerr("%s: probe_flash_int for programmer #%d returned an error, aborting.", + __func__, pgm_cnt); + free(*flashes); + return -1; + }
- tmp = flashbuses_to_text(flash->chip->bustype); - msg_cinfo("%s %s flash chip "%s" (%d kB, %s).\n", force ? "Assuming" : "Found", - flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp); - free(tmp); + matches_total += matches_prog;
- /* Flash registers will not be mapped if the chip was forced. Lock info - * may be stored in registers, so avoid lock info printing. - */ - if (!force) - if (flash->chip->printlock) - flash->chip->printlock(flash); + if (pgm->buses_supported & BUS_SPI) { + /* Try to detect SFDP only if there are no specific matches for this programmer. */ + if (matches_prog == 0) { + struct flashctx *tmp = realloc(*flashes, sizeof(struct flashctx) * (matches_total + 1)); + if (tmp == NULL) { + msg_gerr("Out of memory!\n"); + free(*flashes); + return -1; + } + *flashes = tmp; + flashes[matches_total]->pgm = pgm; + if (probe_spi_sfdp(flashes[matches_total]) == 1) { + msg_cinfo("===\n" + "SFDP has autodetected a flash chip which is " + "not natively supported by flashrom yet.\n"); + if (count_usable_erasers(flashes[matches_total]) == 0) + msg_cinfo("The standard operations read and " + "verify should work, but to support " + "erase, write and all other " + "possible features"); + else + msg_cinfo("All standard operations (read, " + "verify, erase and write) should " + "work, but to support all possible " + "features"); + + msg_cinfo(" we need to add them manually.\n" + "You can help us by mailing us the output of the following " + "command to flashrom@flashrom.org:\n" + "'flashrom -VV [plus the -p/--programmer parameters]'\n" + "Thanks for your help!\n" + "===\n"); + matches_total++; + } + } + } + }
- /* Return position of matching chip. */ - return chip - flashchips; + /* Similar to SFDP above but here we check that there were no matches whatsoever at the very end of + * probing so that everything else gets precedence. */ + if (matches_total == 0) { + for (pgm_cnt = 0; pgm_cnt < registered_programmer_count; pgm_cnt++) { + struct registered_programmer *pgm = ®istered_programmers[pgm_cnt]; + if (pgm->buses_supported & BUS_PROG) { + struct flashctx *tmp = realloc(*flashes, sizeof(struct flashctx) * (matches_total + 1)); + if (tmp == NULL) { + msg_gerr("Out of memory!\n"); + free(*flashes); + return -1; + } + *flashes = tmp; + flashes[matches_total]->pgm = pgm; + if (pgm->opaque.probe(flashes[matches_total]) == 0) { + matches_total++; + } + } + } + } + + return matches_total; }
int read_buf_from_file(unsigned char *buf, unsigned long size, @@ -1888,6 +2089,9 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, return 1; }
+ if (map_flash(flash) != 0) + return 1; + /* Given the existence of read locks, we want to unlock for read, * erase and write. */ diff --git a/ichspi.c b/ichspi.c index 190ad5a..c56f336 100644 --- a/ichspi.c +++ b/ichspi.c @@ -204,6 +204,7 @@ typedef struct _OPCODES {
static OPCODES *curopcodes = NULL;
+ /* HW access functions */ static uint32_t REGREAD32(int X) { @@ -1187,36 +1188,58 @@ static int ich_hwseq_wait_for_cycle_complete(unsigned int timeout, return 0; }
+static int ich_hwseq_read(struct flashctx *flash, uint8_t *buf, unsigned int addr, unsigned int len); +static int ich_hwseq_block_erase(struct flashctx *flash, unsigned int addr, unsigned int len); +static int ich_hwseq_write(struct flashctx *flash, const uint8_t *buf, unsigned int addr, unsigned int len); static int ich_hwseq_probe(struct flashctx *flash) { uint32_t total_size, boundary; uint32_t erase_size_low, size_low, erase_size_high, size_high; - struct block_eraser *eraser;
total_size = hwseq_data.size_comp0 + hwseq_data.size_comp1; - msg_cdbg("Found %d attached SPI flash chip", + msg_cdbg("Hardware sequencing has found %d attached SPI flash chip", (hwseq_data.size_comp1 != 0) ? 2 : 1); if (hwseq_data.size_comp1 != 0) msg_cdbg("s with a combined"); else msg_cdbg(" with a"); msg_cdbg(" density of %d kB.\n", total_size / 1024); - flash->chip->total_size = total_size / 1024;
- eraser = &(flash->chip->block_erasers[0]); + struct flashchip *hwseq_chip = calloc(1, sizeof(struct flashchip)); + if (hwseq_chip == NULL) { + msg_gerr("Out of memory!\n"); + return -1; + } + if (register_shutdown(shutdown_free, (void *)hwseq_chip) != 0) { + msg_gerr("%s: Could not reqister shutdown function!\n", __func__); + free(hwseq_chip); + return -1; + } + + hwseq_chip->vendor = "Intel"; + hwseq_chip->name = "Flash chip(s) behind hardware sequencing"; + hwseq_chip->bustype = BUS_PROG; + hwseq_chip->page_size = 256; + hwseq_chip->tested = TEST_OK_PREW; + hwseq_chip->block_erasers[0].block_erase = ich_hwseq_block_erase; + hwseq_chip->write = ich_hwseq_write; + hwseq_chip->read = ich_hwseq_read; + hwseq_chip->total_size = total_size / 1024; + + struct block_eraser *eraser = &(hwseq_chip->block_erasers[0]); boundary = (REGREAD32(ICH9_REG_FPB) & FPB_FPBA) << 12; size_high = total_size - boundary; erase_size_high = ich_hwseq_get_erase_block_size(boundary);
if (boundary == 0) { - msg_cdbg("There is only one partition containing the whole " + msg_cdbg2("There is only one partition containing the whole " "address space (0x%06x - 0x%06x).\n", 0, size_high-1); eraser->eraseblocks[0].size = erase_size_high; eraser->eraseblocks[0].count = size_high / erase_size_high; - msg_cdbg("There are %d erase blocks with %d B each.\n", + msg_cdbg2("There are %d erase blocks with %d B each.\n", size_high / erase_size_high, erase_size_high); } else { - msg_cdbg("The flash address space (0x%06x - 0x%06x) is divided " + msg_cdbg2("The flash address space (0x%06x - 0x%06x) is divided " "at address 0x%06x in two partitions.\n", 0, total_size-1, boundary); size_low = total_size - size_high; @@ -1224,20 +1247,20 @@ static int ich_hwseq_probe(struct flashctx *flash)
eraser->eraseblocks[0].size = erase_size_low; eraser->eraseblocks[0].count = size_low / erase_size_low; - msg_cdbg("The first partition ranges from 0x%06x to 0x%06x.\n", + msg_cdbg2("The first partition ranges from 0x%06x to 0x%06x.\n", 0, size_low-1); - msg_cdbg("In that range are %d erase blocks with %d B each.\n", + msg_cdbg2("In that range are %d erase blocks with %d B each.\n", size_low / erase_size_low, erase_size_low);
eraser->eraseblocks[1].size = erase_size_high; eraser->eraseblocks[1].count = size_high / erase_size_high; - msg_cdbg("The second partition ranges from 0x%06x to 0x%06x.\n", + msg_cdbg2("The second partition ranges from 0x%06x to 0x%06x.\n", boundary, total_size-1); - msg_cdbg("In that range are %d erase blocks with %d B each.\n", + msg_cdbg2("In that range are %d erase blocks with %d B each.\n", size_high / erase_size_high, erase_size_high); } - flash->chip->tested = TEST_OK_PREW; - return 1; + flash->chip = hwseq_chip; + return 0; }
static int ich_hwseq_block_erase(struct flashctx *flash, unsigned int addr, @@ -1547,9 +1570,6 @@ static const struct opaque_programmer opaque_programmer_ich_hwseq = { .max_data_read = 64, .max_data_write = 64, .probe = ich_hwseq_probe, - .read = ich_hwseq_read, - .write = ich_hwseq_write, - .erase = ich_hwseq_block_erase, };
int ich_init_spi(struct pci_dev *dev, void *spibar, enum ich_chipset ich_gen) diff --git a/jedec.c b/jedec.c index d8c3242..dbf3fd7 100644 --- a/jedec.c +++ b/jedec.c @@ -38,6 +38,30 @@ uint8_t oddparity(uint8_t val) return (val ^ (val >> 1)) & 0x1; }
+/* Looks for values in a different from all zeroes and all ones. If b is non-null test_for_valid_ids + * additionally compares bytes in a and b respectively. Can be be used on values read before and after exiting + * ID mode: Unequal values indicate with high certainty that the write commands enabling and disabling ID mode + * were received and understood by the chip. */ +bool test_for_valid_ids(uint8_t *a, uint8_t *b, unsigned int len) +{ + unsigned int i; + bool equal = true; + bool valid = false; + for (i = 0; i < len; i++) { + if (b != NULL) { + if (a[i] != b[i]) + equal = false; + else + msg_cspew("Byte #%d is equal (0x%02x).\n", i, a[i]); + } + if (a[i] != 0x00 && a[i] != 0xFF) + valid = true; + } + if (b != NULL && equal && valid) + msg_cdbg("IDs are equal to normal flash content."); + return valid; +} + static void toggle_ready_jedec_common(const struct flashctx *flash, chipaddr dst, unsigned int delay) { unsigned int i = 0; @@ -120,15 +144,10 @@ static void start_program_jedec_common(const struct flashctx *flash, unsigned in chip_writeb(flash, 0xA0, bios + (0x5555 & mask)); }
-int probe_jedec(struct flashctx *flash) +static int probe_jedec(struct flashctx *flash, struct probe_res *res, unsigned int mask, bool long_reset) { unsigned int delay = 10000; chipaddr bios = flash->virtual_memory; - const struct flashchip *chip = flash->chip; - const unsigned int mask = getaddrmask(flash->chip); - uint8_t id1, id2; - uint32_t largeid1, largeid2; - uint32_t flashcontent1, flashcontent2;
/* Earlier probes might have been too fast for the chip to enter ID * mode completely. Allow the chip to finish this before seeing a @@ -137,7 +156,7 @@ int probe_jedec(struct flashctx *flash) if (delay) programmer_delay(delay); /* Reset chip to a clean slate */ - if ((chip->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET) + if (long_reset) { chip_writeb(flash, 0xAA, bios + (0x5555 & mask)); if (delay) @@ -161,26 +180,25 @@ int probe_jedec(struct flashctx *flash) if (delay) programmer_delay(delay);
- /* Read product ID */ - id1 = chip_readb(flash, bios); - id2 = chip_readb(flash, bios + 0x01); - largeid1 = id1; - largeid2 = id2; - - /* Check if it is a continuation ID, this should be a while loop. */ - if (id1 == 0x7F) { - largeid1 <<= 8; - id1 = chip_readb(flash, bios + 0x100); - largeid1 |= id1; +#if (NUM_PROBE_BYTES < 4) +#error probe_jedec requires NUM_PROBE_BYTES to be at least 4. +#endif + unsigned int idx = 0; + /* Read manufacturer ID */ + res->vals[idx++] = chip_readb(flash, bios); + /* Check if it is a continuation ID, this (and the one below) should be a while loop. */ + if (res->vals[idx] == 0x7F) { + res->vals[idx++] = chip_readb(flash, bios + 0x100); } - if (id2 == 0x7F) { - largeid2 <<= 8; - id2 = chip_readb(flash, bios + 0x101); - largeid2 |= id2; + + /* Read model ID */ + res->vals[idx++] = chip_readb(flash, bios + 0x01); + if (res->vals[idx] == 0x7F) { + res->vals[idx++] = chip_readb(flash, bios + 0x101); }
/* Issue JEDEC Product ID Exit command */ - if ((chip->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET) + if (long_reset) { chip_writeb(flash, 0xAA, bios + (0x5555 & mask)); if (delay) @@ -193,36 +211,56 @@ int probe_jedec(struct flashctx *flash) if (delay) programmer_delay(delay);
- msg_cdbg("%s: id1 0x%02x, id2 0x%02x", __func__, largeid1, largeid2); - if (!oddparity(id1)) - msg_cdbg(", id1 parity violation"); - + uint8_t cont[idx]; + unsigned cont_idx = 0; /* Read the product ID location again. We should now see normal flash contents. */ - flashcontent1 = chip_readb(flash, bios); - flashcontent2 = chip_readb(flash, bios + 0x01); + cont[cont_idx] = chip_readb(flash, bios);
/* Check if it is a continuation ID, this should be a while loop. */ - if (flashcontent1 == 0x7F) { - flashcontent1 <<= 8; - flashcontent1 |= chip_readb(flash, bios + 0x100); + if (cont[cont_idx++] == 0x7F) { + cont[cont_idx++] = chip_readb(flash, bios + 0x100); } - if (flashcontent2 == 0x7F) { - flashcontent2 <<= 8; - flashcontent2 |= chip_readb(flash, bios + 0x101); + cont[cont_idx] = chip_readb(flash, bios + 0x01); + if (cont[cont_idx++] == 0x7F) { + cont[cont_idx++] = chip_readb(flash, bios + 0x101); }
- if (largeid1 == flashcontent1) - msg_cdbg(", id1 is normal flash content"); - if (largeid2 == flashcontent2) - msg_cdbg(", id2 is normal flash content"); - - msg_cdbg("\n"); - if (largeid1 != chip->manufacture_id || largeid2 != chip->model_id) + if (test_for_valid_ids(res->vals, cont, idx)) { + res->len = idx; + return 1; + } else { + res->len = 0; return 0; + }
return 1; }
+int probe_jedec_longreset(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) +{ + return probe_jedec(flash, res, MASK_FULL, true); +} + +int probe_jedec_shortreset_full(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) +{ + return probe_jedec(flash, res, MASK_FULL, false); +} + +int probe_jedec_shortreset_full_384(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) +{ + return probe_jedec(flash, res, MASK_FULL, false); +} + +int probe_jedec_shortreset_2aa(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) +{ + return probe_jedec(flash, res, MASK_2AA, false); +} + +int probe_jedec_shortreset_aaa(struct flashctx *flash, struct probe_res *res, unsigned int res_len, const struct probe *p) +{ + return probe_jedec(flash, res, MASK_AAA, false); +} + static int erase_sector_jedec_common(struct flashctx *flash, unsigned int page, unsigned int pagesize, unsigned int mask) { diff --git a/m29f400bt.c b/m29f400bt.c index 399a7e0..0a13076 100644 --- a/m29f400bt.c +++ b/m29f400bt.c @@ -55,10 +55,9 @@ int write_m29f400bt(struct flashctx *flash, const uint8_t *src, unsigned int sta return 0; }
-int probe_m29f400bt(struct flashctx *flash) +int probe_m29f400bt(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { chipaddr bios = flash->virtual_memory; - uint8_t id1, id2;
chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); @@ -66,11 +65,14 @@ int probe_m29f400bt(struct flashctx *flash)
programmer_delay(10);
- id1 = chip_readb(flash, bios); +#if (NUM_PROBE_BYTES < 2) +#error probe_m29f400bt requires NUM_PROBE_BYTES to be at least 2. +#endif + res->vals[0] = chip_readb(flash, bios); /* The data sheet says id2 is at (bios + 0x01) and id2 listed in * flash.h does not match. It should be possible to use JEDEC probe. */ - id2 = chip_readb(flash, bios + 0x02); + res->vals[1] = chip_readb(flash, bios + 0x02);
chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); @@ -78,10 +80,15 @@ int probe_m29f400bt(struct flashctx *flash)
programmer_delay(10);
- msg_cdbg("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2); + uint8_t cont[2]; + cont[0] = chip_readb(flash, bios); + cont[1] = chip_readb(flash, bios + 0x02);
- if (id1 == flash->chip->manufacture_id && id2 == flash->chip->model_id) + if (test_for_valid_ids(res->vals, cont, 2)) { + res->len = 2; return 1; - - return 0; + } else { + res->len = 0; + return 0; + } } diff --git a/opaque.c b/opaque.c index c63919f..3a9866c 100644 --- a/opaque.c +++ b/opaque.c @@ -30,31 +30,11 @@ #include "chipdrivers.h" #include "programmer.h"
-int probe_opaque(struct flashctx *flash) -{ - return flash->pgm->opaque.probe(flash); -} - -int read_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len) -{ - return flash->pgm->opaque.read(flash, buf, start, len); -} - -int write_opaque(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len) -{ - return flash->pgm->opaque.write(flash, buf, start, len); -} - -int erase_opaque(struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen) -{ - return flash->pgm->opaque.erase(flash, blockaddr, blocklen); -} - int register_opaque_programmer(const struct opaque_programmer *pgm) { struct registered_programmer rpgm;
- if (!pgm->probe || !pgm->read || !pgm->write || !pgm->erase) { + if (!pgm->probe) { msg_perr("%s called with incomplete programmer definition. " "Please report a bug at flashrom@flashrom.org\n", __func__); diff --git a/print.c b/print.c index efd834d..22d1d64 100644 --- a/print.c +++ b/print.c @@ -109,11 +109,6 @@ static int print_supported_chips(void)
/* calculate maximum column widths and by iterating over all chips */ for (chip = flashchips; chip->name != NULL; chip++) { - /* Ignore generic entries. */ - if (!strncmp(chip->vendor, "Unknown", 7) || - !strncmp(chip->vendor, "Programmer", 10) || - !strncmp(chip->name, "unknown", 7)) - continue; chipcount++;
/* Find maximum vendor length (respecting line splitting). */ @@ -195,15 +190,9 @@ static int print_supported_chips(void) msg_ginfo(" "); msg_gdbg("range [V]"); msg_ginfo("\n\n"); - msg_ginfo("(P = PROBE, R = READ, E = ERASE, W = WRITE)\n\n"); + msg_ginfo("(P = PROBE, R = READ, E = ERASE, W = WRITE, - = N/A)\n\n");
for (chip = flashchips; chip->name != NULL; chip++) { - /* Don't print generic entries. */ - if (!strncmp(chip->vendor, "Unknown", 7) || - !strncmp(chip->vendor, "Programmer", 10) || - !strncmp(chip->name, "unknown", 7)) - continue; - /* support for multiline vendor names: * - make a copy of the original vendor name * - use strok to put the first token in tmpven diff --git a/print_wiki.c b/print_wiki.c index 2936dbf..8c64a80 100644 --- a/print_wiki.c +++ b/print_wiki.c @@ -292,11 +292,6 @@ static void print_supported_chips_wiki(int cols) int i = 0, c = 1, chipcount = 0;
for (f = flashchips; f->name != NULL; f++) { - /* Don't count generic entries. */ - if (!strncmp(f->vendor, "Unknown", 7) || - !strncmp(f->vendor, "Programmer", 10) || - !strncmp(f->name, "unknown", 7)) - continue; chipcount++; }
@@ -308,12 +303,6 @@ static void print_supported_chips_wiki(int cols) "{| border="0" valign="top"\n", chipcount);
for (f = flashchips; f->name != NULL; f++) { - /* Don't print generic entries. */ - if (!strncmp(f->vendor, "Unknown", 7) || - !strncmp(f->vendor, "Programmer", 10) || - !strncmp(f->name, "unknown", 7)) - continue; - if ((i % lines_per_col) == 0) printf("%s%s", th_start, chip_th);
diff --git a/programmer.c b/programmer.c index 1874929..f677891 100644 --- a/programmer.c +++ b/programmer.c @@ -119,7 +119,7 @@ struct registered_programmer registered_programmers[PROGRAMMERS_MAX]; int registered_programmer_count = 0;
/* This function copies the struct registered_programmer parameter. */ -int register_programmer(struct registered_programmer *pgm) +int register_programmer(const struct registered_programmer *pgm) { if (registered_programmer_count >= PROGRAMMERS_MAX) { msg_perr("Tried to register more than %i programmer " diff --git a/programmer.h b/programmer.h index 9b0227e..9ab7698 100644 --- a/programmer.h +++ b/programmer.h @@ -629,9 +629,6 @@ struct opaque_programmer { int max_data_write; /* Specific functions for this programmer */ int (*probe) (struct flashctx *flash); - int (*read) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); - int (*write) (struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len); - int (*erase) (struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen); const void *data; }; int register_opaque_programmer(const struct opaque_programmer *pgm); @@ -669,7 +666,7 @@ struct registered_programmer { }; extern struct registered_programmer registered_programmers[]; extern int registered_programmer_count; -int register_programmer(struct registered_programmer *pgm); +int register_programmer(const struct registered_programmer *pgm);
/* serprog.c */ #if CONFIG_SERPROG == 1 diff --git a/sfdp.c b/sfdp.c index bc69dd0..488115d 100644 --- a/sfdp.c +++ b/sfdp.c @@ -256,51 +256,30 @@ static int sfdp_fill_flash(struct flashchip *chip, uint8_t *buf, uint16_t len) }
done: + chip->vendor = "Unknown"; + chip->name = "SFDP-capable chip"; + chip->bustype = BUS_SPI; + /* We present our own "report this" text hence we do not + * want the default "This flash part has status UNTESTED..." + * text to be printed. */ + chip->tested = TEST_OK_PREW; + chip->unlock = spi_disable_blockprotect; /* is this safe? */ + chip->read = spi_chip_read; + /* FIXME: some vendor extensions define voltage ranges too. */ + msg_cdbg("done.\n"); return 0; }
-int probe_spi_sfdp(struct flashctx *flash) +static int sfdp_parse_headers(struct flashctx *flash, struct flashchip *sfdp_chip, uint8_t nph) { - int ret = 0; - uint8_t buf[8]; uint32_t tmp32; - uint8_t nph; /* need to limit the table loop by comparing i to uint8_t nph hence: */ uint16_t i; struct sfdp_tbl_hdr *hdrs; uint8_t *hbuf; uint8_t *tbuf; - - if (spi_sfdp_read_sfdp(flash, 0x00, buf, 4)) { - msg_cdbg("Receiving SFDP signature failed.\n"); - return 0; - } - tmp32 = buf[0]; - tmp32 |= ((unsigned int)buf[1]) << 8; - tmp32 |= ((unsigned int)buf[2]) << 16; - tmp32 |= ((unsigned int)buf[3]) << 24; - - if (tmp32 != 0x50444653) { - msg_cdbg2("Signature = 0x%08x (should be 0x50444653)\n", tmp32); - msg_cdbg("No SFDP signature found.\n"); - return 0; - } - - if (spi_sfdp_read_sfdp(flash, 0x04, buf, 3)) { - msg_cdbg("Receiving SFDP revision and number of parameter " - "headers (NPH) failed. "); - return 0; - } - msg_cdbg2("SFDP revision = %d.%d\n", buf[1], buf[0]); - if (buf[1] != 0x01) { - msg_cdbg("The chip supports an unknown version of SFDP. " - "Aborting SFDP probe!\n"); - return 0; - } - nph = buf[2]; - msg_cdbg2("SFDP number of parameter headers is %d (NPH = %d).\n", - nph + 1, nph); + int ret = 1;
/* Fetch all parameter headers, even if we don't use them all (yet). */ hbuf = malloc((nph + 1) * 8); @@ -381,8 +360,8 @@ int probe_spi_sfdp(struct flashctx *flash) msg_cdbg("Length of the mandatory JEDEC SFDP " "parameter table is wrong (%d B), " "skipping it.\n", len); - } else if (sfdp_fill_flash(flash->chip, tbuf, len) == 0) - ret = 1; + } else + ret = sfdp_fill_flash(sfdp_chip, tbuf, len); } free(tbuf); } @@ -390,5 +369,63 @@ int probe_spi_sfdp(struct flashctx *flash) cleanup_hdrs: free(hdrs); free(hbuf); + + return ret; +} + +int probe_spi_sfdp(struct flashctx *flash) +{ + int ret = -1; + uint8_t buf[8]; + uint32_t tmp32; + + msg_cdbg("Looking for a SFDP-compatible chip... "); + if (spi_sfdp_read_sfdp(flash, 0x00, buf, 4)) { + msg_cdbg("Receiving SFDP signature failed.\n"); + return -1; + } + tmp32 = buf[0]; + tmp32 |= ((unsigned int)buf[1]) << 8; + tmp32 |= ((unsigned int)buf[2]) << 16; + tmp32 |= ((unsigned int)buf[3]) << 24; + + if (tmp32 != 0x50444653) { + msg_cdbg2("Signature = 0x%08x (should be 0x50444653)\n", tmp32); + msg_cdbg("No SFDP signature found.\n"); + return 0; + } + + if (spi_sfdp_read_sfdp(flash, 0x04, buf, 3)) { + msg_cdbg("Receiving SFDP revision and number of parameter " + "headers (NPH) failed. "); + return -1; + } + msg_cdbg2("SFDP revision = %d.%d\n", buf[1], buf[0]); + if (buf[1] != 0x01) { + msg_cdbg("The chip supports an unknown version of SFDP. " + "Aborting SFDP probe!\n"); + return 0; + } + msg_cdbg2("SFDP number of parameter headers is %d (NPH = %d).\n", + buf[2] + 1, buf[2]); + + struct flashchip *sfdp_chip = calloc(1, sizeof(struct flashchip)); + if (sfdp_chip == NULL) { + msg_gerr("Out of memory!\n"); + return -1; + } + + ret = sfdp_parse_headers(flash, sfdp_chip, buf[2]); + + if (ret == 0) { + if (register_shutdown(shutdown_free, (void *)sfdp_chip) != 0) { + msg_gerr("%s: Could not reqister shutdown function!\n", __func__); + free(sfdp_chip); + return -1; + } + flash->chip = sfdp_chip; + } else + free(sfdp_chip); + return ret; } diff --git a/spi25.c b/spi25.c index 9763c80..38846f9 100644 --- a/spi25.c +++ b/spi25.c @@ -29,68 +29,40 @@ #include "programmer.h" #include "spi.h"
-static int spi_rdid(struct flashctx *flash, unsigned char *readarr, int bytes) +static int spi_rdid(struct flashctx *flash, unsigned char *readarr, unsigned int bytes) { - static const unsigned char cmd[JEDEC_RDID_OUTSIZE] = { JEDEC_RDID }; - int ret; - int i; - - ret = spi_send_command(flash, sizeof(cmd), bytes, cmd, readarr); - if (ret) - return ret; - msg_cspew("RDID returned"); - for (i = 0; i < bytes; i++) - msg_cspew(" 0x%02x", readarr[i]); - msg_cspew(". "); - return 0; + static const unsigned char cmd[] = { JEDEC_RDID }; + if (spi_send_command(flash, sizeof(cmd), bytes, cmd, readarr) != 0) + return -1; + return test_for_valid_ids(readarr, NULL, bytes) ? 1 : 0; }
-static int spi_rems(struct flashctx *flash, unsigned char *readarr) +static int probe_spi_res_rems(struct flashctx *flash, struct probe_res *res, uint8_t opcode) { - unsigned char cmd[JEDEC_REMS_OUTSIZE] = { JEDEC_REMS, 0, 0, 0 }; - uint32_t readaddr; - int ret; - - ret = spi_send_command(flash, sizeof(cmd), JEDEC_REMS_INSIZE, cmd, - readarr); + unsigned char cmd[] = { opcode, 0, 0, 0 }; /* opcode + address */ + res->len = ARRAY_SIZE(res->vals); // fill up to maximum if possible + int ret = spi_send_command(flash, sizeof(cmd), res->len, cmd, res->vals); if (ret == SPI_INVALID_ADDRESS) { /* Find the lowest even address allowed for reads. */ - readaddr = (spi_get_valid_read_addr(flash) + 1) & ~1; + uint32_t readaddr = (spi_get_valid_read_addr(flash) + 1) & ~1; cmd[1] = (readaddr >> 16) & 0xff, cmd[2] = (readaddr >> 8) & 0xff, cmd[3] = (readaddr >> 0) & 0xff, - ret = spi_send_command(flash, sizeof(cmd), JEDEC_REMS_INSIZE, - cmd, readarr); + ret = spi_send_command(flash, sizeof(cmd), res->len, cmd, res->vals); } - if (ret) - return ret; - msg_cspew("REMS returned 0x%02x 0x%02x. ", readarr[0], readarr[1]); - return 0; + if (ret != 0) + return -1; + return test_for_valid_ids(res->vals, NULL, res->len) ? 1 : 0; }
-static int spi_res(struct flashctx *flash, unsigned char *readarr, int bytes) +int probe_spi_rems(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { - unsigned char cmd[JEDEC_RES_OUTSIZE] = { JEDEC_RES, 0, 0, 0 }; - uint32_t readaddr; - int ret; - int i; + return probe_spi_res_rems(flash, res, JEDEC_REMS); +}
- ret = spi_send_command(flash, sizeof(cmd), bytes, cmd, readarr); - if (ret == SPI_INVALID_ADDRESS) { - /* Find the lowest even address allowed for reads. */ - readaddr = (spi_get_valid_read_addr(flash) + 1) & ~1; - cmd[1] = (readaddr >> 16) & 0xff, - cmd[2] = (readaddr >> 8) & 0xff, - cmd[3] = (readaddr >> 0) & 0xff, - ret = spi_send_command(flash, sizeof(cmd), bytes, cmd, readarr); - } - if (ret) - return ret; - msg_cspew("RES returned"); - for (i = 0; i < bytes; i++) - msg_cspew(" 0x%02x", readarr[i]); - msg_cspew(". "); - return 0; +int probe_spi_res(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) +{ + return probe_spi_res_rems(flash, res, JEDEC_RES); }
int spi_write_enable(struct flashctx *flash) @@ -115,210 +87,37 @@ int spi_write_disable(struct flashctx *flash) return spi_send_command(flash, sizeof(cmd), 0, cmd, NULL); }
-static int probe_spi_rdid_generic(struct flashctx *flash, int bytes) +int probe_spi_rdid(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { - const struct flashchip *chip = flash->chip; - unsigned char readarr[4]; - uint32_t id1; - uint32_t id2; - - if (spi_rdid(flash, readarr, bytes)) { - return 0; - } - - if (!oddparity(readarr[0])) - msg_cdbg("RDID byte 0 parity violation. "); - - /* Check if this is a continuation vendor ID. - * FIXME: Handle continuation device IDs. - */ - if (readarr[0] == 0x7f) { - if (!oddparity(readarr[1])) - msg_cdbg("RDID byte 1 parity violation. "); - id1 = (readarr[0] << 8) | readarr[1]; - id2 = readarr[2]; - if (bytes > 3) { - id2 <<= 8; - id2 |= readarr[3]; - } - } else { - id1 = readarr[0]; - id2 = (readarr[1] << 8) | readarr[2]; - } - - msg_cdbg("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2); - - if (id1 == chip->manufacture_id && id2 == chip->model_id) - return 1; - - /* Test if this is a pure vendor match. */ - if (id1 == chip->manufacture_id && GENERIC_DEVICE_ID == chip->model_id) - return 1; - - /* Test if there is any vendor ID. */ - if (GENERIC_MANUF_ID == chip->manufacture_id && id1 != 0xff) - return 1; - - return 0; -} - -int probe_spi_rdid(struct flashctx *flash) -{ - return probe_spi_rdid_generic(flash, 3); -} - -int probe_spi_rdid4(struct flashctx *flash) -{ - /* Some SPI controllers do not support commands with writecnt=1 and - * readcnt=4. - */ - switch (flash->pgm->spi.type) { + res->len = ARRAY_SIZE(res->vals); // fill up to maximum if possible + /* Some SPI controllers do not support commands with writecnt=1 and readcnt=4. */ + if (res->len != 3) { // FIXME + switch (flash->pgm->spi.type) { #if CONFIG_INTERNAL == 1 #if defined(__i386__) || defined(__x86_64__) - case SPI_CONTROLLER_IT87XX: - case SPI_CONTROLLER_WBSIO: - msg_cinfo("4 byte RDID not supported on this SPI controller\n"); - return 0; - break; + case SPI_CONTROLLER_IT87XX: + case SPI_CONTROLLER_WBSIO: + msg_cinfo("4 byte RDID not supported on this SPI controller\n"); + return -1; + break; #endif #endif - default: - return probe_spi_rdid_generic(flash, 4); - } - - return 0; -} - -int probe_spi_rems(struct flashctx *flash) -{ - const struct flashchip *chip = flash->chip; - unsigned char readarr[JEDEC_REMS_INSIZE]; - uint32_t id1, id2; - - if (spi_rems(flash, readarr)) { - return 0; - } - - id1 = readarr[0]; - id2 = readarr[1]; - - msg_cdbg("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2); - - if (id1 == chip->manufacture_id && id2 == chip->model_id) - return 1; - - /* Test if this is a pure vendor match. */ - if (id1 == chip->manufacture_id && GENERIC_DEVICE_ID == chip->model_id) - return 1; - - /* Test if there is any vendor ID. */ - if (GENERIC_MANUF_ID == chip->manufacture_id && id1 != 0xff) - return 1; - - return 0; -} - -int probe_spi_res1(struct flashctx *flash) -{ - static const unsigned char allff[] = {0xff, 0xff, 0xff}; - static const unsigned char all00[] = {0x00, 0x00, 0x00}; - unsigned char readarr[3]; - uint32_t id2; - - /* We only want one-byte RES if RDID and REMS are unusable. */ - - /* Check if RDID is usable and does not return 0xff 0xff 0xff or - * 0x00 0x00 0x00. In that case, RES is pointless. - */ - if (!spi_rdid(flash, readarr, 3) && memcmp(readarr, allff, 3) && - memcmp(readarr, all00, 3)) { - msg_cdbg("Ignoring RES in favour of RDID.\n"); - return 0; - } - /* Check if REMS is usable and does not return 0xff 0xff or - * 0x00 0x00. In that case, RES is pointless. - */ - if (!spi_rems(flash, readarr) && - memcmp(readarr, allff, JEDEC_REMS_INSIZE) && - memcmp(readarr, all00, JEDEC_REMS_INSIZE)) { - msg_cdbg("Ignoring RES in favour of REMS.\n"); - return 0; - } - - if (spi_res(flash, readarr, 1)) { - return 0; - } - - id2 = readarr[0]; - - msg_cdbg("%s: id 0x%x\n", __func__, id2); - - if (id2 != flash->chip->model_id) - return 0; - - return 1; -} - -int probe_spi_res2(struct flashctx *flash) -{ - unsigned char readarr[2]; - uint32_t id1, id2; - - if (spi_res(flash, readarr, 2)) { - return 0; - } - - id1 = readarr[0]; - id2 = readarr[1]; - - msg_cdbg("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2); - - if (id1 != flash->chip->manufacture_id || id2 != flash->chip->model_id) - return 0; - - return 1; -} - -int probe_spi_res3(struct flashctx *flash) -{ - unsigned char readarr[3]; - uint32_t id1, id2; - - if (spi_res(flash, readarr, 3)) { - return 0; + default: + ;//return probe_spi_rdid_generic(flash, 4); + } }
- id1 = (readarr[0] << 8) | readarr[1]; - id2 = readarr[2]; - - msg_cdbg("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2); - - if (id1 != flash->chip->manufacture_id || id2 != flash->chip->model_id) - return 0; - - return 1; + return spi_rdid(flash, res->vals, res->len); }
/* Only used for some Atmel chips. */ -int probe_spi_at25f(struct flashctx *flash) +int probe_spi_at25f(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { - static const unsigned char cmd[AT25F_RDID_OUTSIZE] = { AT25F_RDID }; - unsigned char readarr[AT25F_RDID_INSIZE]; - uint32_t id1; - uint32_t id2; - - if (spi_send_command(flash, sizeof(cmd), sizeof(readarr), cmd, readarr)) - return 0; - - id1 = readarr[0]; - id2 = readarr[1]; - - msg_cdbg("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2); - - if (id1 == flash->chip->manufacture_id && id2 == flash->chip->model_id) - return 1; - - return 0; + static const uint8_t cmd[AT25F_RDID_OUTSIZE] = { AT25F_RDID }; + res->len = AT25F_RDID_INSIZE; + if (spi_send_command(flash, sizeof(cmd), res->len, cmd, res->vals) != 0) + return -1; + return test_for_valid_ids(res->vals, NULL, res->len) ? 1 : 0; }
int spi_chip_erase_60(struct flashctx *flash) diff --git a/stm50.c b/stm50.c index edcfdd2..168a4a2 100644 --- a/stm50.c +++ b/stm50.c @@ -53,7 +53,7 @@ static int stm50_unlock_address(struct flashctx *flash, int offset) int unlock_stm50_nonuniform(struct flashctx *flash) { int i; - struct eraseblock *eraseblocks = flash->chip->block_erasers[0].eraseblocks; + const struct eraseblock *eraseblocks = flash->chip->block_erasers[0].eraseblocks; unsigned int done = 0; for (i = 0; i < NUM_ERASEREGIONS && eraseblocks[i].count != 0; i++) { unsigned int block_size = eraseblocks[i].size; diff --git a/w29ee011.c b/w29ee011.c index 4df4687..1dbbb35 100644 --- a/w29ee011.c +++ b/w29ee011.c @@ -20,23 +20,22 @@
#include <string.h> #include "flash.h" +#include "chipdrivers.h"
/* According to the Winbond W29EE011, W29EE012, W29C010M, W29C011A * datasheets this is the only valid probe function for those chips. */ -int probe_w29ee011(struct flashctx *flash) +int probe_w29ee011(struct flashctx *flash, struct probe_res *res, unsigned int ignored, const struct probe *ignored2) { - chipaddr bios = flash->virtual_memory; - uint8_t id1, id2; - - if (!chip_to_probe || strcmp(chip_to_probe, flash->chip->name)) { - msg_cdbg("Old Winbond W29* probe method disabled because " - "the probing sequence puts the AMIC A49LF040A in " - "a funky state. Use 'flashrom -c %s' if you " - "have a board with such a chip.\n", flash->chip->name); + static const char *w29ee011 = "W29C010(M)/W29C011A/W29EE011/W29EE012-old"; + if (!chip_to_probe || (strcmp(chip_to_probe, w29ee011) != 0)) { + msg_cdbg("Old Winbond W29* probe method disabled because the probing sequence puts the\n" + "AMIC A49LF040A in a funky state. Use 'flashrom -c "%s"' if you have a board\n" + "with such a chip.\n", w29ee011); return 0; }
+ chipaddr bios = flash->virtual_memory; /* Issue JEDEC Product ID Entry command */ chip_writeb(flash, 0xAA, bios + 0x5555); programmer_delay(10); @@ -51,9 +50,12 @@ int probe_w29ee011(struct flashctx *flash) chip_writeb(flash, 0x60, bios + 0x5555); programmer_delay(10);
+#if (NUM_PROBE_BYTES < 2) +#error probe_w29ee011 requires NUM_PROBE_BYTES to be at least 2. +#endif /* Read product ID */ - id1 = chip_readb(flash, bios); - id2 = chip_readb(flash, bios + 0x01); + res->vals[0] = chip_readb(flash, bios); + res->vals[1] = chip_readb(flash, bios + 0x01);
/* Issue JEDEC Product ID Exit command */ chip_writeb(flash, 0xAA, bios + 0x5555); @@ -63,10 +65,17 @@ int probe_w29ee011(struct flashctx *flash) chip_writeb(flash, 0xF0, bios + 0x5555); programmer_delay(10);
- msg_cdbg("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2); + uint8_t cont[2]; + cont[0] = chip_readb(flash, bios); + cont[1] = chip_readb(flash, bios + 0x01);
- if (id1 == flash->chip->manufacture_id && id2 == flash->chip->model_id) + if (test_for_valid_ids(res->vals, cont, 2)) { + res->len = 2; return 1; + } else { + res->len = 0; + return 0; + }
- return 0; + return 1; }