Support generic 1-byte SPI RES matching (low match quality) and enable
read support by guessing the chip size from the ID.
Support generic 2-byte SPI RES matching (high match quality).
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006(a)gmx.net>
Signed-off-by: Stefan Tauner <stefan.tauner(a)student.tuwien.ac.at>
---
chipdrivers.h | 1 +
flashchips.c | 31 +++++++++++++++++++++++++++++
flashrom.c | 4 +++-
spi25.c | 61 +++++++++++++++++++++++++++++++++++++++++++++------------
4 files changed, 84 insertions(+), 13 deletions(-)
diff --git a/chipdrivers.h b/chipdrivers.h
index b43e16e..63c5d37 100644
--- a/chipdrivers.h
+++ b/chipdrivers.h
@@ -33,6 +33,7 @@ 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_automagic_res1(struct flashctx *flash);
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);
diff --git a/flashchips.c b/flashchips.c
index 8fe50bd..c175108 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -9662,6 +9662,24 @@ const struct flashchip flashchips[] = {
{
.vendor = "Generic",
+ .name = "unknown SPI chip (RES1)",
+ .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_automagic_res1,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {},
+ .unlock = spi_disable_blockprotect,
+ .write = NULL,
+ .read = spi_chip_read,
+ .voltage = {},
+ },
+
+ {
+ .vendor = "Generic",
.name = "unknown SPI chip (REMS)",
.bustype = BUS_SPI,
.manufacture_id = GENERIC_MANUF_ID,
@@ -9673,5 +9691,18 @@ const struct flashchip flashchips[] = {
.write = NULL,
},
+ {
+ .vendor = "Generic",
+ .name = "unknown SPI chip (RES2)",
+ .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_res2,
+ .write = NULL,
+ },
+
{ NULL }
};
diff --git a/flashrom.c b/flashrom.c
index fdc5412..148f969 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -1028,7 +1028,9 @@ int probe_flash(struct registered_programmer *pgm, int startchip, struct flashct
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))
+ if ((flash->chip->manufacture_id != GENERIC_MANUF_ID) &&
+ (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:
diff --git a/spi25.c b/spi25.c
index 914b821..7d9e948 100644
--- a/spi25.c
+++ b/spi25.c
@@ -232,6 +232,7 @@ int probe_spi_rems(struct flashctx *flash)
int probe_spi_res1(struct flashctx *flash)
{
+ const struct flashchip *chip = flash->chip;
static const unsigned char allff[] = {0xff, 0xff, 0xff};
static const unsigned char all00[] = {0x00, 0x00, 0x00};
unsigned char readarr[3];
@@ -265,18 +266,23 @@ int probe_spi_res1(struct flashctx *flash)
msg_cdbg("%s: id 0x%x\n", __func__, id2);
- if (id2 != flash->chip->model_id)
- return 0;
+ if (id2 == flash->chip->model_id) {
+ /* Print the status register to tell the user about possible write protection. */
+ spi_prettyprint_status_register(flash);
- /* Print the status register to tell the
- * user about possible write protection.
- */
- spi_prettyprint_status_register(flash);
- return 1;
+ return 1;
+ }
+
+ /* Test if there is any device ID. */
+ if (GENERIC_MANUF_ID == chip->manufacture_id && id2 == chip->model_id)
+ return 1;
+
+ return 0;
}
int probe_spi_res2(struct flashctx *flash)
{
+ const struct flashchip *chip = flash->chip;
unsigned char readarr[2];
uint32_t id1, id2;
@@ -289,13 +295,44 @@ int probe_spi_res2(struct flashctx *flash)
msg_cdbg("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2);
- if (id1 != flash->chip->manufacture_id || id2 != flash->chip->model_id)
+ if (id1 == chip->manufacture_id && id2 == chip->model_id) {
+ /* Print the status register to tell the
+ * user about possible write protection.
+ */
+ spi_prettyprint_status_register(flash);
+
+ 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 and if this is indeed a two-byte RES. */
+ if (GENERIC_MANUF_ID == chip->manufacture_id && id1 != 0xff && id1 != id2)
+ return 1;
+
+ return 0;
+}
+
+int probe_spi_automagic_res1(struct flashctx *flash)
+{
+ unsigned char readarr[1];
+ unsigned int total_size;
+ uint32_t id1;
+
+ if (spi_res(flash, readarr, 1))
return 0;
- /* Print the status register to tell the
- * user about possible write protection.
- */
- spi_prettyprint_status_register(flash);
+ id1 = readarr[0];
+ msg_cdbg("%s: id1 0x%02x\n", __func__, id1);
+ if (id1 < 0x10 || id1 > 0x17) {
+ msg_cdbg("RES ID out of bounds!\n");
+ return 0;
+ }
+ total_size = (2 << id1) / 1024;
+ flash->chip->total_size = total_size;
+ flash->chip->tested = TEST_OK_PR | TEST_BAD_ERASE | TEST_BAD_WRITE;
return 1;
}
--
Kind regards, Stefan Tauner