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