2017-03-11 12:42:32 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <flash.h>
|
|
|
|
|
2017-05-19 17:16:01 +02:00
|
|
|
int default_flash_is_erased(struct flash_dev *dev, uint32_t addr)
|
|
|
|
{
|
|
|
|
uint8_t data[1 << dev->log2_block_size];
|
|
|
|
size_t i;
|
|
|
|
|
2017-05-29 18:52:20 +02:00
|
|
|
if (flash_read(dev, addr << dev->log2_block_size, data, sizeof(data)) == 0)
|
2017-05-19 17:16:01 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (i = 0; i < sizeof(data); ++i) {
|
|
|
|
if (data[i] != 0xff)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2017-05-19 17:26:00 +02:00
|
|
|
void flash_release(struct flash_dev *dev)
|
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return;
|
|
|
|
|
|
|
|
dev->ops->release(dev);
|
|
|
|
}
|
|
|
|
|
2017-04-07 19:35:51 +02:00
|
|
|
size_t flash_get_size(struct flash_dev *dev)
|
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return dev->ops->get_size(dev);
|
|
|
|
}
|
|
|
|
|
2017-05-19 15:09:25 +02:00
|
|
|
size_t flash_get_capacity(struct flash_dev *dev)
|
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return dev->ops->get_capacity(dev);
|
|
|
|
}
|
|
|
|
|
2017-05-19 18:20:50 +02:00
|
|
|
size_t flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len)
|
2017-03-11 12:42:32 +00:00
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return dev->ops->read(dev, addr, data, len);
|
|
|
|
}
|
|
|
|
|
2017-05-19 18:20:50 +02:00
|
|
|
size_t flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
|
2017-03-11 12:42:32 +00:00
|
|
|
size_t len)
|
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return dev->ops->write(dev, addr, data, len);
|
|
|
|
}
|
|
|
|
|
2017-05-15 16:07:13 +02:00
|
|
|
int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len)
|
2017-03-11 12:42:32 +00:00
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return -1;
|
|
|
|
|
2017-05-15 16:07:13 +02:00
|
|
|
return dev->ops->copy(dev, dst, src, len);
|
|
|
|
}
|
|
|
|
|
2017-05-19 17:16:01 +02:00
|
|
|
int flash_is_erased(struct flash_dev *dev, uint32_t addr, size_t len)
|
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
while (len--) {
|
|
|
|
if (!dev->ops->is_erased(dev, addr))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
++addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2017-05-19 17:04:45 +02:00
|
|
|
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len)
|
2017-05-15 16:07:13 +02:00
|
|
|
{
|
|
|
|
if (!dev)
|
|
|
|
return -1;
|
|
|
|
|
2017-05-19 17:04:45 +02:00
|
|
|
while (len--) {
|
|
|
|
if (dev->ops->erase(dev, addr) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
++addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2017-03-11 12:42:32 +00:00
|
|
|
}
|