diff --git a/source/drivers/spi_flash.c b/source/drivers/spi_flash.c index 64a20dd..36a9e7b 100644 --- a/source/drivers/spi_flash.c +++ b/source/drivers/spi_flash.c @@ -120,6 +120,59 @@ err_disable_write: return 0; } +static char *size_to_str(size_t size) +{ + char *s; + int ret; + + if (size == 0) { + ret = asprintf(&s, "0"); +#if defined(TIB) + } else if (size % TIB == 0) { + ret = asprintf(&s, "%u TiB", size / TIB); +#endif + } else if (size % GIB == 0) { + ret = asprintf(&s, "%u GiB", size / GIB); + } else if (size % MIB == 0) { + ret = asprintf(&s, "%u MiB", size / MIB); + } else if (size % KIB == 0) { + ret = asprintf(&s, "%u KiB", size / KIB); + } else { + ret = asprintf(&s, "%u B", size); + } + + if (ret < 0) + return NULL; + + return s; +} + +static int flash_detect(struct flash_dev *dev) +{ + char cmd[1] = { SPI_FLASH_JEDEC_ID }; + uint8_t data[4]; + struct spi_dev *spi_dev = dev->priv; + char *s; + size_t size; + + spi_set_cs_level(spi_dev, 0); + spi_tx_rx(spi_dev, data, cmd, sizeof cmd); + spi_tx_rx(spi_dev, data, NULL, sizeof data); + spi_set_cs_level(spi_dev, 1); + + printf("JEDEC ID: %02x%02x%02x%02x\n", + data[0], data[1], data[2], data[3]); + + size = SPI_FLASH_SIZE(data[2]); + s = size_to_str(size); + + printf("Capacity: %u blocks (%s)\n", + size / (4 * KIB), s); + free(s); + + return 0; +} + struct flash_dev *flash_probe(void) { struct flash_dev *dev; @@ -132,6 +185,8 @@ struct flash_dev *flash_probe(void) dev->ops = &spi_flash_ops; + flash_detect(dev); + return dev; err_free_dev: