improve API for flash_erase()

tags/0.1.0
S.J.R. van Schaik 7 years ago
parent b6c5d5bbda
commit e65110f084
  1. 6
      include/flash.h
  2. 11
      source/core/flash.c
  3. 15
      source/drivers/sandbox_flash.c
  4. 13
      source/ftl/dev.c
  5. 3
      source/ftl/gc.c

@ -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…
Cancel
Save