diff options
-rw-r--r-- | flash.h | 1 | ||||
-rw-r--r-- | spi.c | 41 | ||||
-rw-r--r-- | spi.h | 5 |
3 files changed, 47 insertions, 0 deletions
@@ -449,6 +449,7 @@ extern char *lb_part, *lb_vendor; /* spi.c */ int probe_spi_rdid(struct flashchip *flash); int probe_spi_rdid4(struct flashchip *flash); +int probe_spi_rems(struct flashchip *flash); int probe_spi_res(struct flashchip *flash); int spi_command(unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr); @@ -61,6 +61,16 @@ static int spi_rdid(unsigned char *readarr, int bytes) return 0; } +static int spi_rems(unsigned char *readarr) +{ + const unsigned char cmd[JEDEC_REMS_OUTSIZE] = { JEDEC_REMS, 0, 0, 0 }; + + if (spi_command(sizeof(cmd), JEDEC_REMS_INSIZE, cmd, readarr)) + return 1; + printf_debug("REMS returned %02x %02x.\n", readarr[0], readarr[1]); + return 0; +} + static int spi_res(unsigned char *readarr) { const unsigned char cmd[JEDEC_RES_OUTSIZE] = { JEDEC_RES, 0, 0, 0 }; @@ -155,6 +165,37 @@ int probe_spi_rdid4(struct flashchip *flash) return 0; } +int probe_spi_rems(struct flashchip *flash) +{ + unsigned char readarr[JEDEC_REMS_INSIZE]; + uint32_t manuf_id, model_id; + + if (spi_rems(readarr)) + return 0; + + manuf_id = readarr[0]; + model_id = readarr[1]; + + printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, manuf_id, + model_id); + + if (manuf_id == flash->manufacture_id && model_id == flash->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 (manuf_id == flash->manufacture_id && + GENERIC_DEVICE_ID == flash->model_id) + return 1; + + return 0; +} + int probe_spi_res(struct flashchip *flash) { unsigned char readarr[3]; @@ -29,6 +29,11 @@ #define JEDEC_RDID_OUTSIZE 0x01 #define JEDEC_RDID_INSIZE 0x03 +/* Read Electronic Manufacturer Signature */ +#define JEDEC_REMS 0x90 +#define JEDEC_REMS_OUTSIZE 0x04 +#define JEDEC_REMS_INSIZE 0x02 + /* Read Electronic Signature */ #define JEDEC_RES 0xab #define JEDEC_RES_OUTSIZE 0x04 |