parent
6f7fec2965
commit
b6c5d5bbda
@ -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…
Reference in new issue