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

Loading…
Cancel
Save