flash: spi: perform both flash_read() and flash_write() in chunks of 32 bytes

tags/0.1.0
S.J.R. van Schaik 8 years ago
parent 7ab3a84fc4
commit fa49f634e4
  1. 45
      source/drivers/spi_flash.c

@ -94,34 +94,57 @@ static size_t spi_flash_get_size(struct flash_dev *dev)
static size_t 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) size_t len)
{ {
char cmd[4] = { SPI_FLASH_READ }; char cmd[4];
struct spi_dev *spi_dev = dev->priv; struct spi_dev *spi_dev = dev->priv;
size_t nbytes, ret = 0;
spi_flash_addr(cmd, addr); while (len) {
cmd[0] = SPI_FLASH_READ;
spi_flash_addr(cmd, addr);
spi_tx_rx(spi_dev, data, len, cmd, sizeof cmd); nbytes = min(len, 32);
return len; spi_tx_rx(spi_dev, data, len, cmd, sizeof cmd);
addr += nbytes;
data += nbytes;
len -= nbytes;
ret += nbytes;
}
return ret;
} }
static size_t 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) const void *data, size_t len)
{ {
char cmd[4 + len]; char cmd[4 + 32];
struct spi_dev *spi_dev = dev->priv; struct spi_dev *spi_dev = dev->priv;
size_t nbytes, ret = 0;
spi_flash_write_enable(dev); spi_flash_write_enable(dev);
cmd[0] = SPI_FLASH_PAGE_PROGRAM; while (len) {
spi_flash_addr(cmd, addr); spi_flash_wait(dev);
memcpy(cmd + 4, data, len);
spi_tx_rx(spi_dev, NULL, 0, cmd, sizeof cmd); cmd[0] = SPI_FLASH_PAGE_PROGRAM;
spi_flash_wait(dev); spi_flash_addr(cmd, addr);
nbytes = min(len, 32);
memmove(cmd + 4, data, nbytes);
spi_tx_rx(spi_dev, NULL, 0, cmd, sizeof cmd);
addr += nbytes;
data += nbytes;
len -= nbytes;
ret += nbytes;
}
spi_flash_wait(dev);
spi_flash_write_disable(dev); spi_flash_write_disable(dev);
return len; return ret;
} }
static int spi_flash_erase(struct flash_dev *dev, uint32_t addr) static int spi_flash_erase(struct flash_dev *dev, uint32_t addr)

Loading…
Cancel
Save