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 (* 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,
|
int (* write)(struct flash_dev *dev, uint32_t addr, const void *data,
|
||||||
size_t len);
|
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 {
|
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_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,
|
int flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
|
||||||
size_t len);
|
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);
|
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)
|
if (!dev)
|
||||||
return -1;
|
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/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <bitops.h>
|
||||||
#include <flash.h>
|
#include <flash.h>
|
||||||
#include <macros.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);
|
size_t len);
|
||||||
static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
|
static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
|
||||||
const void *data, size_t len);
|
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 = {
|
static struct flash_ops stdio_flash_ops = {
|
||||||
.get_size = stdio_flash_get_size,
|
.get_size = stdio_flash_get_size,
|
||||||
.read = stdio_flash_read,
|
.read = stdio_flash_read,
|
||||||
.write = stdio_flash_write,
|
.write = stdio_flash_write,
|
||||||
|
.copy = stdio_flash_copy,
|
||||||
.erase = stdio_flash_erase,
|
.erase = stdio_flash_erase,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,15 +76,40 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
|
||||||
return 0;
|
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)
|
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;
|
return -1;
|
||||||
|
|
||||||
memset(priv->data + addr, 0xFF, len);
|
memset(priv->data + (addr << log2_block_size), 0xff,
|
||||||
|
(1 << log2_block_size));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue