From cd67577f355e06fda2d608e15fb7e97c64d6d399 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Fri, 23 Jun 2017 16:09:56 +0200 Subject: [PATCH] flash: implement flash_write0() to write a sequence of zeroes --- include/flash.h | 1 + source/core/flash.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/flash.h b/include/flash.h index d677046..58b4c40 100644 --- a/include/flash.h +++ b/include/flash.h @@ -34,6 +34,7 @@ size_t flash_get_capacity(struct flash_dev *dev); size_t flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len); size_t flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len); +size_t flash_write0(struct flash_dev *dev, uint32_t addr, size_t len); size_t flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len); int flash_is_erased(struct flash_dev *dev, uint32_t addr, size_t len); int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len); diff --git a/source/core/flash.c b/source/core/flash.c index bc6e3a0..97b5159 100644 --- a/source/core/flash.c +++ b/source/core/flash.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -96,6 +97,27 @@ size_t flash_write(struct flash_dev *dev, uint32_t addr, const void *data, return dev->ops->write(dev, addr, data, len); } +size_t flash_write0(struct flash_dev *dev, uint32_t addr, size_t len) +{ + uint8_t data[32]; + size_t nbytes, ret = 0; + + memset(data, 0, 32); + + while (len) { + nbytes = min(sizeof data, len); + + if (flash_write(dev, addr, data, nbytes) == 0) + return -1; + + addr += nbytes; + len -= nbytes; + ret += nbytes; + } + + return ret; +} + size_t flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len) { if (!dev)