diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2008-05-15 03:19:49 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2008-05-15 03:19:49 +0000 |
commit | ff1ceb1159bcef924ee389d64d31125abdde8a4f (patch) | |
tree | 68c1d560242821885e66578bca46a1e6c68eb36c /spi.c | |
parent | 26e1c32672336769d7cf68a3e33960f1e4e93741 (diff) | |
download | flashrom-ff1ceb1159bcef924ee389d64d31125abdde8a4f.zip flashrom-ff1ceb1159bcef924ee389d64d31125abdde8a4f.tar.gz |
Add support for the JEDEC RES (Read Electronic Signature and Resume from Powerdown) SPI command to flashrom to identify older SPI chips which
Can't handle JEDEC RDID. Since RES gives a one-byte identifier which is shared
among many different vendors and even different sizes, we want to match RES
as a last resort if RDID returns 0xff 0xff 0xff. This is a heavily reworked
version of a patch by Fredrik Tolf, which was
Corresponding to flashrom svn r235 and coreboot v2 svn r3320.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Signed-off-by: Fredrik Tolf <fredrik@dolda2000.com>
Acked-by: Peter Stuge <peter@stuge.se>
Diffstat (limited to 'spi.c')
-rw-r--r-- | spi.c | 41 |
1 files changed, 40 insertions, 1 deletions
@@ -49,6 +49,16 @@ static int spi_rdid(unsigned char *readarr) return 0; } +static int spi_res(unsigned char *readarr) +{ + const unsigned char cmd[JEDEC_RES_OUTSIZE] = {JEDEC_RES, 0, 0, 0}; + + if (spi_command(JEDEC_RES_OUTSIZE, JEDEC_RES_INSIZE, cmd, readarr)) + return 1; + printf_debug("RES returned %02x.\n", readarr[0]); + return 0; +} + void spi_write_enable() { const unsigned char cmd[JEDEC_WREN_OUTSIZE] = {JEDEC_WREN}; @@ -65,7 +75,7 @@ void spi_write_disable() spi_command(JEDEC_WRDI_OUTSIZE, JEDEC_WRDI_INSIZE, cmd, NULL); } -int probe_spi(struct flashchip *flash) +int probe_spi_rdid(struct flashchip *flash) { unsigned char readarr[3]; uint32_t manuf_id; @@ -102,6 +112,35 @@ int probe_spi(struct flashchip *flash) return 0; } +int probe_spi_res(struct flashchip *flash) +{ + unsigned char readarr[3]; + uint32_t model_id; + if (!spi_rdid(readarr)) { + /* Check if RDID returns 0xff 0xff 0xff, then we use RES. */ + if ((readarr[0] != 0xff) || (readarr[1] != 0xff) || + (readarr[2] != 0xff)) + return 0; + } else { + /* We couldn't issue RDID, it's pointless to try RES. */ + return 0; + } + if (!spi_res(readarr)) { + model_id = readarr[0]; + printf_debug("%s: id 0x%x\n", __FUNCTION__, model_id); + if (model_id == flash->model_id) { + /* Print the status register to tell the + * user about possible write protection. + */ + spi_prettyprint_status_register(flash); + + return 1; + } + } + + return 0; +} + uint8_t spi_read_status_register() { const unsigned char cmd[JEDEC_RDSR_OUTSIZE] = {JEDEC_RDSR}; |