From e20e9e13e0ee4bafb964be5eb8fabd45ea12f806 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Wed, 14 Jun 2017 14:13:23 +0200 Subject: [PATCH] spi: flash: update code --- source/drivers/spi_flash.c | 64 +++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/source/drivers/spi_flash.c b/source/drivers/spi_flash.c index 1837d5a..2e100ab 100644 --- a/source/drivers/spi_flash.c +++ b/source/drivers/spi_flash.c @@ -9,13 +9,15 @@ #include static size_t spi_flash_get_size(struct flash_dev *dev); -static int spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, +static size_t spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len); -static int spi_flash_write(struct flash_dev *dev, uint32_t addr, +static size_t spi_flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len); -static int spi_flash_erase(struct flash_dev *dev, uint32_t addr, size_t len); +static int spi_flash_erase(struct flash_dev *dev, uint32_t addr); +static void spi_flash_release(struct flash_dev *dev); -static struct flash_ops spi_flash_ops ={ +static struct flash_ops spi_flash_ops = { + .release = spi_flash_release, .get_size = spi_flash_get_size, .read = spi_flash_read, .write = spi_flash_write, @@ -49,7 +51,7 @@ static void spi_flash_write_disable(struct flash_dev *dev) spi_set_cs_level(spi_dev, 1); } -static int spi_flash_get_jedec_id(struct flash_dev *dev, uint8_t *jedec_id, +static size_t spi_flash_get_jedec_id(struct flash_dev *dev, uint8_t *jedec_id, size_t len) { uint8_t cmd[5] = { SPI_FLASH_JEDEC_ID, 0, 0, 0, 0 }; @@ -62,7 +64,7 @@ static int spi_flash_get_jedec_id(struct flash_dev *dev, uint8_t *jedec_id, memcpy(jedec_id, buf + 1, min(4, len)); - return 0; + return len; } static size_t spi_flash_get_size(struct flash_dev *dev) @@ -76,7 +78,7 @@ static size_t spi_flash_get_size(struct flash_dev *dev) return SPI_FLASH_SIZE(jedec_id[2]); } -static int spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, +static size_t spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len) { char cmd[4] = { SPI_FLASH_READ }; @@ -89,10 +91,10 @@ static int spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, spi_tx_rx(spi_dev, data, NULL, len); spi_set_cs_level(spi_dev, 1); - return 0; + return len; } -static int spi_flash_write(struct flash_dev *dev, uint32_t addr, +static size_t spi_flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len) { char cmd[4] = { SPI_FLASH_PAGE_PROGRAM }; @@ -108,45 +110,25 @@ static int spi_flash_write(struct flash_dev *dev, uint32_t addr, spi_flash_write_disable(dev); - return 0; + return len; } -static int spi_flash_erase(struct flash_dev *dev, uint32_t addr, size_t len) +static int spi_flash_erase(struct flash_dev *dev, uint32_t addr) { char cmd[4]; struct spi_dev *spi_dev = dev->priv; - size_t size = 0; spi_flash_write_enable(dev); - addr = ROUND_UP(addr, 4 * KIB); - - for (; len; addr += size, len -= size) { - if (IS_ROUND(addr, 64 * KIB) && IS_ROUND(len, 64 * KIB)) - size = 64 * KIB; - else if (IS_ROUND(addr, 32 * KIB) && IS_ROUND(len, 32 * KIB)) - size = 32 * KIB; - else if (IS_ROUND(addr, 4 * KIB) && IS_ROUND(len, 4 * KIB)) - size = 4 * KIB; - else - size = 0; - - switch (size) { - case 64 * KIB: cmd[0] = SPI_FLASH_ERASE_64K; break; - case 32 * KIB: cmd[0] = SPI_FLASH_ERASE_32K; break; - case 4 * KIB: cmd[0] = SPI_FLASH_ERASE_4K; break; - default: goto err_disable_write; - }; - - printf("addr: %lx; size: %u\n", addr, size); - spi_flash_addr(cmd, addr); - - spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); - spi_set_cs_level(spi_dev, 1); - } - -err_disable_write: + + cmd[0] = SPI_FLASH_ERASE_4K; + spi_flash_addr(cmd, addr << dev->log2_block_size); + + spi_set_cs_level(spi_dev, 0); + spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); + spi_set_cs_level(spi_dev, 1); + spi_flash_write_disable(dev); + return 0; } @@ -169,7 +151,7 @@ err_free_dev: return NULL; } -void flash_release(struct flash_dev *dev) +static void spi_flash_release(struct flash_dev *dev) { if (!dev) return;