flash: add flash_copy and improve flash_erase
This commit is contained in:
parent
a36addf39b
commit
bd326ad795
3 changed files with 48 additions and 9 deletions
|
@ -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)
|
||||
{
|
||||
struct stdio_flash_priv *priv = dev->priv;
|
||||
uint8_t data[64];
|
||||
size_t nbytes;
|
||||
|
||||
if (!IS_ROUND(addr, 4 * KIB) || !IS_ROUND(len, 4 * KIB))
|
||||
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 (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…
Add table
Reference in a new issue