flash: detect flash size

tags/0.1.0
S.J.R. van Schaik 8 years ago
parent 13ea9ce49d
commit bff4845c32
  1. 55
      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:

Loading…
Cancel
Save