diff --git a/spi.c b/spi.c index a1d68e5..04c8c43 100644 --- a/spi.c +++ b/spi.c @@ -407,23 +407,53 @@ void spiWriteSr(struct ff_spi *spi, int sr, uint8_t val) { } struct spi_id spiId(struct ff_spi *spi) { - struct spi_id id; - memset(&id, 0xff, sizeof(id)); + return spi->id; +} + +static void spi_decode_id(struct ff_spi *spi) { + + spi->id.manufacturer = "unknown"; + spi->id.model = "unknown"; + spi->id.capacity = "unknown"; + + if (spi->id.manufacturer_id == 0xef) { + spi->id.manufacturer = "Winbond"; + if ((spi->id.memory_type == 0x70) + && (spi->id.memory_size == 0x18)) { + spi->id.model = "W25Q128JV"; + spi->id.capacity = "128 Mbit"; + } + } + + if (spi->id.manufacturer_id == 0x1f) { + spi->id.manufacturer = "Adesto"; + if ((spi->id.memory_type == 0x86) + && (spi->id.memory_size == 0x01)) { + spi->id.model = "AT25SF161"; + spi->id.capacity = "16 Mbit"; + } + } + + return; +} + +static void spi_get_id(struct ff_spi *spi) { + memset(&spi->id, 0xff, sizeof(spi->id)); spiBegin(spi); spiCommand(spi, 0x90); // Read manufacturer ID spiCommand(spi, 0x00); // Dummy byte 1 spiCommand(spi, 0x00); // Dummy byte 2 spiCommand(spi, 0x00); // Dummy byte 3 - id.manufacturer_id = spiCommandRx(spi); - id.device_id = spiCommandRx(spi); + spi->id.manufacturer_id = spiCommandRx(spi); + spi->id.device_id = spiCommandRx(spi); spiEnd(spi); spiBegin(spi); spiCommand(spi, 0x9f); // Read device id - id._manufacturer_id = spiCommandRx(spi); - id.memory_type = spiCommandRx(spi); - id.memory_size = spiCommandRx(spi); + spi->id._manufacturer_id = spiCommandRx(spi); + spi->id.memory_type = spiCommandRx(spi); + spi->id.memory_size = spiCommandRx(spi); spiEnd(spi); spiBegin(spi); @@ -431,7 +461,7 @@ struct spi_id spiId(struct ff_spi *spi) { spiCommand(spi, 0x00); // Dummy byte 1 spiCommand(spi, 0x00); // Dummy byte 2 spiCommand(spi, 0x00); // Dummy byte 3 - id.signature = spiCommandRx(spi); + spi->id.signature = spiCommandRx(spi); spiEnd(spi); spiBegin(spi); @@ -440,13 +470,14 @@ struct spi_id spiId(struct ff_spi *spi) { spiCommand(spi, 0x00); // Dummy byte 2 spiCommand(spi, 0x00); // Dummy byte 3 spiCommand(spi, 0x00); // Dummy byte 4 - id.serial[0] = spiCommandRx(spi); - id.serial[1] = spiCommandRx(spi); - id.serial[2] = spiCommandRx(spi); - id.serial[3] = spiCommandRx(spi); + spi->id.serial[0] = spiCommandRx(spi); + spi->id.serial[1] = spiCommandRx(spi); + spi->id.serial[2] = spiCommandRx(spi); + spi->id.serial[3] = spiCommandRx(spi); spiEnd(spi); - return id; + spi_decode_id(spi); + return; } int spiSetType(struct ff_spi *spi, enum spi_type type) { @@ -673,7 +704,7 @@ int spiInit(struct ff_spi *spi) { // Disable WP gpioWrite(spi->pins.wp, 1); - spi->id = spiId(spi); + spi_get_id(spi); if (spi->id.manufacturer_id == 0x1f) spi->quirks |= SQ_SR2_FROM_SR1; if (spi->id.manufacturer_id == 0xef) diff --git a/spi.h b/spi.h index a1a9d02..9e2d7b5 100644 --- a/spi.h +++ b/spi.h @@ -42,6 +42,9 @@ struct spi_id { uint8_t memory_size; // Result from 0x9f uint8_t signature; // Result from 0xab uint8_t serial[4]; // Result from 0x4b + const char *manufacturer; + const char *model; + const char *capacity; }; struct ff_spi; @@ -63,7 +66,9 @@ uint8_t spiReadSr(struct ff_spi *spi, int sr); void spiWriteSr(struct ff_spi *spi, int sr, uint8_t val); int spiSetType(struct ff_spi *spi, enum spi_type type); int spiRead(struct ff_spi *spi, uint32_t addr, uint8_t *data, unsigned int count); + struct spi_id spiId(struct ff_spi *spi); + //int spi_wait_for_not_busy(struct ff_spi *spi); int spiWrite(struct ff_spi *spi, uint32_t addr, const uint8_t *data, unsigned int count); uint8_t spiReset(struct ff_spi *spi);