diff --git a/include/flash.h b/include/flash.h index 8748068..2f45ce3 100644 --- a/include/flash.h +++ b/include/flash.h @@ -24,6 +24,8 @@ struct flash_dev { }; int default_flash_is_erased(struct flash_dev *dev, uint32_t addr); +size_t default_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, + size_t len); struct flash_dev *flash_probe(void); void flash_release(struct flash_dev *dev); diff --git a/source/core/flash.c b/source/core/flash.c index 47a6750..f86643f 100644 --- a/source/core/flash.c +++ b/source/core/flash.c @@ -29,6 +29,32 @@ int default_flash_is_erased(struct flash_dev *dev, uint32_t addr) return 1; } +size_t default_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, + size_t len) +{ + uint8_t data[32]; + size_t nbytes, ret = 0; + + while (len) { + nbytes = min(sizeof data, len); + + if (flash_read(dev, src, data, nbytes) == 0) + return -1; + + if (flash_write(dev, dst, data, nbytes) == 0) + return -1; + + dst += nbytes; + src += nbytes; + len -= nbytes; + ret += nbytes; + } + + return ret; +} + + + void flash_release(struct flash_dev *dev) { if (!dev)