From 92b3c1108be5d1522e729e9a18e0eb40653489e9 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Sat, 11 Mar 2017 12:42:32 +0000 Subject: [PATCH] flash: implement flash driver model --- Makefile | 2 ++ include/flash.h | 20 ++++++++++++++++++++ source/core/flash.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 include/flash.h create mode 100644 source/core/flash.c diff --git a/Makefile b/Makefile index 823d6a7..f4bebc5 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,8 @@ obj-y += source/shell.o obj-y += source/spi_flash.o obj-y += source/usart.o +obj-y += source/core/flash.o + obj = $(addprefix $(BUILD)/, $(obj-y)) # Include the dependencies. diff --git a/include/flash.h b/include/flash.h new file mode 100644 index 0000000..cb5c348 --- /dev/null +++ b/include/flash.h @@ -0,0 +1,20 @@ +#pragma once + +struct flash_dev; + +struct flash_ops { + int (* read)(struct flash_dev *dev, uint32_t addr, void *data, size_t len); + int (* write)(struct flash_dev *dev, uint32_t addr, const void *data, + size_t len); + int (* erase)(struct flash_dev *dev, uint32_t addr, size_t len); +}; + +struct flash_dev { + struct flash_ops *ops; + void *priv; +}; + +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_erase(struct flash_dev *dev, uint32_t addr, size_t len); diff --git a/source/core/flash.c b/source/core/flash.c new file mode 100644 index 0000000..959923a --- /dev/null +++ b/source/core/flash.c @@ -0,0 +1,29 @@ +#include +#include + +#include + +int flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len) +{ + if (!dev) + return -1; + + return dev->ops->read(dev, addr, data, len); +} + +int flash_write(struct flash_dev *dev, uint32_t addr, const void *data, + size_t len) +{ + if (!dev) + return -1; + + return dev->ops->write(dev, addr, data, len); +} + +int flash_erase(struct flash_dev *dev, uint32_t addr, size_t len) +{ + if (!dev) + return -1; + + return dev->ops->erase(dev, addr, len); +}