From b6c5d5bbda17011bf046b14c9d112091e0fefe8d Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Fri, 19 May 2017 16:21:11 +0200 Subject: [PATCH] ftl: implemented ftl_mount() to seamlessly wrap flash devices --- include/ftl.h | 2 ++ source/ftl/dev.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 source/ftl/dev.c diff --git a/include/ftl.h b/include/ftl.h index c03d68e..c231790 100644 --- a/include/ftl.h +++ b/include/ftl.h @@ -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); diff --git a/source/ftl/dev.c b/source/ftl/dev.c new file mode 100644 index 0000000..1d9f571 --- /dev/null +++ b/source/ftl/dev.c @@ -0,0 +1,97 @@ +#include +#include + +#include +#include + +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; +}