summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--flash.h1
-rw-r--r--jedec.c13
-rw-r--r--spi.c4
3 files changed, 17 insertions, 1 deletions
diff --git a/flash.h b/flash.h
index 67f49c6..37d7dc0 100644
--- a/flash.h
+++ b/flash.h
@@ -396,6 +396,7 @@ int it8716f_spi_chip_write(struct flashchip *flash, uint8_t *buf);
void it8716f_spi_page_program(int block, uint8_t *buf, uint8_t *bios);
/* jedec.c */
+uint8_t oddparity(uint8_t val);
void toggle_ready_jedec(volatile uint8_t *dst);
void data_polling_jedec(volatile uint8_t *dst, uint8_t data);
void unprotect_jedec(volatile uint8_t *bios);
diff --git a/jedec.c b/jedec.c
index 9588751..e818294 100644
--- a/jedec.c
+++ b/jedec.c
@@ -27,6 +27,14 @@
#define MAX_REFLASH_TRIES 0x10
+/* Check one byte for odd parity */
+uint8_t oddparity(uint8_t val)
+{
+ val = (val ^ (val >> 4)) & 0xf;
+ val = (val ^ (val >> 2)) & 0x3;
+ return (val ^ (val >> 1)) & 0x1;
+}
+
void toggle_ready_jedec(volatile uint8_t *dst)
{
unsigned int i = 0;
@@ -123,7 +131,10 @@ int probe_jedec(struct flashchip *flash)
*(volatile uint8_t *)(bios + 0x5555) = 0xF0;
myusec_delay(40);
- printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, largeid1, largeid2);
+ printf_debug("%s: id1 0x%x, id2 0x%x", __FUNCTION__, largeid1, largeid2);
+ if (!oddparity(id1))
+ printf_debug(", id1 parity violation");
+ printf_debug("\n");
if (largeid1 == flash->manufacture_id && largeid2 == flash->model_id)
return 1;
diff --git a/spi.c b/spi.c
index 5cfc052..786d555 100644
--- a/spi.c
+++ b/spi.c
@@ -71,8 +71,12 @@ int probe_spi(struct flashchip *flash)
uint32_t manuf_id;
uint32_t model_id;
if (!spi_rdid(readarr)) {
+ if (!oddparity(readarr[0]))
+ printf_debug("RDID byte 0 parity violation.\n");
/* Check if this is a continuation vendor ID */
if (readarr[0] == 0x7f) {
+ if (!oddparity(readarr[1]))
+ printf_debug("RDID byte 1 parity violation.\n");
manuf_id = (readarr[0] << 8) | readarr[1];
model_id = readarr[2];
} else {
OpenPOWER on IntegriCloud