ftl: implemented ftl_mount() to seamlessly wrap flash devices
This commit is contained in:
parent
6f7fec2965
commit
b6c5d5bbda
2 changed files with 99 additions and 0 deletions
|
@ -35,3 +35,5 @@ int ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va);
|
|||
int ftl_trim(struct ftl_map *map, uint32_t va);
|
||||
uint32_t ftl_get_size(const struct ftl_map *map);
|
||||
uint32_t ftl_get_capacity(const struct ftl_map *map);
|
||||
|
||||
struct flash_dev *ftl_mount(struct flash_dev *raw_dev);
|
||||
|
|
97
source/ftl/dev.c
Normal file
97
source/ftl/dev.c
Normal file
|
@ -0,0 +1,97 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <flash.h>
|
||||
#include <ftl.h>
|
||||
|
||||
static size_t ftl_flash_get_size(struct flash_dev *dev);
|
||||
static size_t ftl_flash_get_capacity(struct flash_dev *dev);
|
||||
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 struct flash_ops ftl_flash_ops = {
|
||||
.get_size = ftl_flash_get_size,
|
||||
.get_capacity = ftl_flash_get_capacity,
|
||||
.read = ftl_flash_read,
|
||||
.write = ftl_flash_write,
|
||||
/* TODO: implement default function to perform a copy. */
|
||||
.copy = NULL,
|
||||
.erase = ftl_flash_erase,
|
||||
};
|
||||
|
||||
static size_t ftl_flash_get_size(struct flash_dev *dev)
|
||||
{
|
||||
struct ftl_map *map = dev->priv;
|
||||
|
||||
return ftl_get_size(map);
|
||||
}
|
||||
|
||||
static size_t ftl_flash_get_capacity(struct flash_dev *dev)
|
||||
{
|
||||
struct ftl_map *map = dev->priv;
|
||||
|
||||
return ftl_get_capacity(map);
|
||||
}
|
||||
|
||||
static int ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
|
||||
size_t len)
|
||||
{
|
||||
struct ftl_map *map = dev->priv;
|
||||
|
||||
return ftl_read(map, data, len, addr);
|
||||
}
|
||||
|
||||
static int ftl_flash_write(struct flash_dev *dev, uint32_t addr,
|
||||
const void *data, size_t len)
|
||||
{
|
||||
struct ftl_map *map = dev->priv;
|
||||
|
||||
/* TODO: support len */
|
||||
(void)len;
|
||||
|
||||
return ftl_write(map, addr, data);
|
||||
}
|
||||
|
||||
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr,
|
||||
size_t block_size)
|
||||
{
|
||||
struct ftl_map *map = dev->priv;
|
||||
|
||||
/* TODO */
|
||||
(void)block_size;
|
||||
|
||||
return ftl_trim(map, addr);
|
||||
}
|
||||
|
||||
struct flash_dev *ftl_mount(struct flash_dev *raw_dev)
|
||||
{
|
||||
struct flash_dev *dev;
|
||||
struct ftl_map *map;
|
||||
|
||||
if (!(dev = malloc(sizeof *dev)))
|
||||
return NULL;
|
||||
|
||||
if (!(map = malloc(sizeof *map)))
|
||||
goto err_free_dev;
|
||||
|
||||
if (ftl_init_map(map, raw_dev) < 0)
|
||||
goto err_free_map;
|
||||
|
||||
/* TODO: inspect return value? */
|
||||
ftl_resume_map(map);
|
||||
|
||||
dev->ops = &ftl_flash_ops;
|
||||
dev->priv = map;
|
||||
|
||||
return dev;
|
||||
|
||||
err_free_map:
|
||||
free(map);
|
||||
err_free_dev:
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
Loading…
Add table
Reference in a new issue