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 <[email protected]>
Signed-off-by: Stefan Tauner <[email protected]>
---
 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


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to