|
|
|
@ -19,9 +19,9 @@ struct stdio_flash_priv { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static size_t stdio_flash_get_size(struct flash_dev *dev); |
|
|
|
|
static int stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data, |
|
|
|
|
static size_t 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, |
|
|
|
|
static size_t stdio_flash_write(struct flash_dev *dev, uint32_t addr, |
|
|
|
|
const void *data, size_t len); |
|
|
|
|
static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, |
|
|
|
|
size_t len); |
|
|
|
@ -45,20 +45,23 @@ static size_t stdio_flash_get_size(struct flash_dev *dev) |
|
|
|
|
return priv->size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data, |
|
|
|
|
static size_t stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data, |
|
|
|
|
size_t len) |
|
|
|
|
{ |
|
|
|
|
struct stdio_flash_priv *priv = dev->priv; |
|
|
|
|
|
|
|
|
|
if (addr > priv->size || len > priv->size - addr) |
|
|
|
|
return -1; |
|
|
|
|
addr = min(addr, priv->size); |
|
|
|
|
len = min(len, priv->size - addr); |
|
|
|
|
|
|
|
|
|
if (!len) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
memcpy(data, priv->data + addr, len); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
return len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int stdio_flash_write(struct flash_dev *dev, uint32_t addr, |
|
|
|
|
static size_t stdio_flash_write(struct flash_dev *dev, uint32_t addr, |
|
|
|
|
const void *data, size_t len) |
|
|
|
|
{ |
|
|
|
|
struct stdio_flash_priv *priv = dev->priv; |
|
|
|
@ -66,8 +69,11 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr, |
|
|
|
|
char *dst; |
|
|
|
|
size_t i; |
|
|
|
|
|
|
|
|
|
if (addr > priv->size || len > priv->size - addr) |
|
|
|
|
return -1; |
|
|
|
|
addr = min(addr, priv->size); |
|
|
|
|
len = min(len, priv->size - addr); |
|
|
|
|
|
|
|
|
|
if (!len) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
src = data; |
|
|
|
|
dst = priv->data + addr; |
|
|
|
@ -76,7 +82,7 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr, |
|
|
|
|
dst[i] &= src[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
return len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, |
|
|
|
@ -88,10 +94,10 @@ static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, |
|
|
|
|
while (len) { |
|
|
|
|
nbytes = min(sizeof data, len); |
|
|
|
|
|
|
|
|
|
if (stdio_flash_read(dev, src, data, nbytes) < 0) |
|
|
|
|
if (stdio_flash_read(dev, src, data, nbytes) == 0) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
if (stdio_flash_write(dev, dst, data, nbytes) < 0) |
|
|
|
|
if (stdio_flash_write(dev, dst, data, nbytes) == 0) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
dst += nbytes; |
|
|
|
|