improve API for flash_erase()
This commit is contained in:
parent
b6c5d5bbda
commit
e65110f084
5 changed files with 26 additions and 22 deletions
|
@ -12,12 +12,14 @@ struct flash_ops {
|
|||
int (* write)(struct flash_dev *dev, uint32_t addr, const void *data,
|
||||
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);
|
||||
int (* erase)(struct flash_dev *dev, uint32_t addr);
|
||||
};
|
||||
|
||||
struct flash_dev {
|
||||
struct flash_ops *ops;
|
||||
void *priv;
|
||||
uint8_t log2_page_size;
|
||||
uint8_t log2_block_size;
|
||||
};
|
||||
|
||||
struct flash_dev *flash_probe(void);
|
||||
|
@ -28,4 +30,4 @@ 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,
|
||||
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);
|
||||
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len);
|
||||
|
|
|
@ -44,10 +44,17 @@ int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len)
|
|||
return dev->ops->copy(dev, dst, src, len);
|
||||
}
|
||||
|
||||
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size)
|
||||
int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len)
|
||||
{
|
||||
if (!dev)
|
||||
return -1;
|
||||
|
||||
return dev->ops->erase(dev, addr, block_size);
|
||||
while (len--) {
|
||||
if (dev->ops->erase(dev, addr) < 0)
|
||||
return -1;
|
||||
|
||||
++addr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ static int 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);
|
||||
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr, size_t block_size);
|
||||
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr);
|
||||
|
||||
static struct flash_ops stdio_flash_ops = {
|
||||
.get_size = stdio_flash_get_size,
|
||||
|
@ -99,17 +99,12 @@ static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr,
|
||||
size_t block_size)
|
||||
static int stdio_flash_erase(struct flash_dev *dev, uint32_t addr)
|
||||
{
|
||||
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;
|
||||
|
||||
memset(priv->data + (addr << log2_block_size), 0xff,
|
||||
(1 << log2_block_size));
|
||||
memset(priv->data + (addr << dev->log2_block_size), 0xff,
|
||||
1 << dev->log2_block_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -140,6 +135,8 @@ struct flash_dev *flash_probe(void)
|
|||
|
||||
dev->priv = priv;
|
||||
dev->ops = &stdio_flash_ops;
|
||||
dev->log2_page_size = ilog2(1);
|
||||
dev->log2_block_size = ilog2(4 * KIB);
|
||||
|
||||
return dev;
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <bitops.h>
|
||||
#include <flash.h>
|
||||
#include <ftl.h>
|
||||
#include <macros.h>
|
||||
|
||||
static size_t ftl_flash_get_size(struct flash_dev *dev);
|
||||
static size_t ftl_flash_get_capacity(struct flash_dev *dev);
|
||||
|
@ -10,8 +12,7 @@ static int ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
|
|||
size_t len);
|
||||
static int ftl_flash_write(struct flash_dev *dev, uint32_t addr,
|
||||
const void *data, size_t len);
|
||||
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr,
|
||||
size_t block_size);
|
||||
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr);
|
||||
|
||||
static struct flash_ops ftl_flash_ops = {
|
||||
.get_size = ftl_flash_get_size,
|
||||
|
@ -56,14 +57,10 @@ static int ftl_flash_write(struct flash_dev *dev, uint32_t addr,
|
|||
return ftl_write(map, addr, data);
|
||||
}
|
||||
|
||||
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr,
|
||||
size_t block_size)
|
||||
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr)
|
||||
{
|
||||
struct ftl_map *map = dev->priv;
|
||||
|
||||
/* TODO */
|
||||
(void)block_size;
|
||||
|
||||
return ftl_trim(map, addr);
|
||||
}
|
||||
|
||||
|
@ -86,6 +83,8 @@ struct flash_dev *ftl_mount(struct flash_dev *raw_dev)
|
|||
|
||||
dev->ops = &ftl_flash_ops;
|
||||
dev->priv = map;
|
||||
dev->log2_page_size = ilog2(4 * KIB);
|
||||
dev->log2_block_size = ilog2(4 * KIB);
|
||||
|
||||
return dev;
|
||||
|
||||
|
|
|
@ -125,6 +125,5 @@ int prepare_head(struct ftl_map *map)
|
|||
if (free_tail(map) < 0)
|
||||
return -1;
|
||||
|
||||
return flash_erase(map->dev, map->head >> log2_pages_per_block,
|
||||
map->log2_block_size);
|
||||
return flash_erase(map->dev, map->head, 1 << log2_pages_per_block);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue