flash: add flash_copy and improve flash_erase

tags/0.1.0
S.J.R. van Schaik 7 years ago
parent a36addf39b
commit bd326ad795
  1. 6
      include/flash.h
  2. 12
      source/core/flash.c
  3. 37
      source/drivers/sandbox_flash.c

@ -10,7 +10,8 @@ struct flash_ops {
int (* read)(struct flash_dev *dev, uint32_t addr, void *data, size_t len);
int (* write)(struct flash_dev *dev, uint32_t addr, const void *data,
size_t len);
int (* erase)(struct flash_dev *dev, uint32_t addr, size_t len);
int (* copy)(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len);
int (* erase)(struct flash_dev *dev, uint32_t addr, size_t block_size);
};
struct flash_dev {
@ -24,4 +25,5 @@ size_t flash_get_size(struct flash_dev *dev);
int flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len);
int flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
size_t len);
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len);
int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len);
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size);

@ -28,10 +28,18 @@ int flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
return dev->ops->write(dev, addr, data, len);
}
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len)
int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len)
{
if (!dev)
return -1;
return dev->ops->erase(dev, addr, len);
return dev->ops->copy(dev, dst, src, len);
}
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size)
{
if (!dev)
return -1;
return dev->ops->erase(dev, addr, block_size);
}

@ -6,6 +6,7 @@
#include <sys/mman.h>
#include <sys/stat.h>
#include <bitops.h>
#include <flash.h>
#include <macros.h>
@ -22,12 +23,15 @@ static int stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
size_t len);
static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
const void *data, size_t len);
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr, size_t len);
static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src,
size_t len);
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size);
static struct flash_ops stdio_flash_ops = {
.get_size = stdio_flash_get_size,
.read = stdio_flash_read,
.write = stdio_flash_write,
.copy = stdio_flash_copy,
.erase = stdio_flash_erase,
};
@ -72,15 +76,40 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
return 0;
}
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr,
static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src,
size_t len)
{
uint8_t data[64];
size_t nbytes;
while (len) {
nbytes = min(sizeof data, len);
if (stdio_flash_read(dev, src, data, nbytes) < 0)
return -1;
if (stdio_flash_write(dev, dst, data, nbytes) < 0)
return -1;
dst += nbytes;
src += nbytes;
len -= nbytes;
}
return 0;
}
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr,
size_t block_size)
{
struct stdio_flash_priv *priv = dev->priv;
size_t log2_block_size = ilog2(block_size);
if (!IS_ROUND(addr, 4 * KIB) || !IS_ROUND(len, 4 * KIB))
if (block_size != (UINT32_C(1) << log2_block_size))
return -1;
memset(priv->data + addr, 0xFF, len);
memset(priv->data + (addr << log2_block_size), 0xff,
(1 << log2_block_size));
return 0;
}

Loading…
Cancel
Save