From cc570c92300692ce173ad22359f9a02f06f24eae Mon Sep 17 00:00:00 2001 From: batt Date: Fri, 25 Jun 2010 18:37:00 +0000 Subject: [PATCH] Add kblock over a ram buffer wrapper. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3951 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/io/kblock_ram.c | 121 +++++++++++++++++++++++++++++++++++++++++ bertos/io/kblock_ram.h | 56 +++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 bertos/io/kblock_ram.c create mode 100644 bertos/io/kblock_ram.h diff --git a/bertos/io/kblock_ram.c b/bertos/io/kblock_ram.c new file mode 100644 index 00000000..d5ffc907 --- /dev/null +++ b/bertos/io/kblock_ram.c @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief KBlock interface + */ + + +#include "kblock_ram.h" +#include + + +int kblockram_load(KBlock *b, block_idx_t index) +{ + KBlockRam *r = KBLOCKRAM_CAST(b); + memcpy(r->b.priv.pagebuf, r->membuf + index * r->b.blk_size, r->b.blk_size); + return 0; +} + +int kblockram_store(struct KBlock *b, block_idx_t index) +{ + KBlockRam *r = KBLOCKRAM_CAST(b); + memcpy(r->membuf + index * r->b.blk_size, r->b.priv.pagebuf, r->b.blk_size); + return 0; +} + +size_t kblockram_readBuf(struct KBlock *b, void *buf, size_t offset, size_t size) +{ + KBlockRam *r = KBLOCKRAM_CAST(b); + memcpy(buf, (uint8_t *)r->b.priv.pagebuf + offset, size); + return size; +} + +size_t kblockram_writeBuf(struct KBlock *b, const void *buf, size_t offset, size_t size) +{ + KBlockRam *r = KBLOCKRAM_CAST(b); + memcpy((uint8_t *)r->b.priv.pagebuf + offset, buf, size); + return size; +} + +void * kblockram_map(struct KBlock *b, size_t offset, UNUSED_ARG(size_t, size)) +{ + return (uint8_t *)b->priv.pagebuf + offset; +} + + +int kblockram_unmap(UNUSED_ARG(struct KBlock *, b), UNUSED_ARG(size_t, offset), UNUSED_ARG(size_t, size)) +{ + return 0; +} + +int kblockram_error(struct KBlock *b) +{ + return b->priv.flags; +} + +int kblockram_dummy(UNUSED_ARG(struct KBlock *,b)) +{ + return 0; +} + +static const KBlockVTable kblockram_vt = +{ + .readBuf = kblockram_readBuf, + .writeBuf = kblockram_writeBuf, + .load = kblockram_load, + .store = kblockram_store, + .map = kblockram_map, + .unmap = kblockram_unmap, + .error = kblockram_error, + .clearerr = kblockram_dummy, + .close = kblockram_dummy, +}; + +void kblockram_init(KBlockRam *ram, void *buf, size_t size, size_t block_size) +{ + ASSERT(buf); + ASSERT(size); + ASSERT(block_size); + + memset(ram, 0, sizeof(*ram)); + + // First page used as page buffer + ram->b.blk_cnt = (size / block_size) - 1; + ram->b.priv.pagebuf = buf; + ram->b.priv.pagebuf_size = block_size; + + ram->membuf = (uint8_t *)buf + block_size; + ram->b.blk_size = block_size; + ram->b.vt = &kblockram_vt; +} diff --git a/bertos/io/kblock_ram.h b/bertos/io/kblock_ram.h new file mode 100644 index 00000000..b003a601 --- /dev/null +++ b/bertos/io/kblock_ram.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief KBlock interface + */ + + +#include "kblock.h" + + +typedef struct KBlockRam +{ + KBlock b; + uint8_t *membuf; +} KBlockRam; + +#define KBT_KBLOCKRAM MAKE_ID('K', 'B', 'R', 'M') + + +INLINE KBlockRam *KBLOCKRAM_CAST(KBlock *b) +{ + ASSERT(b->priv.type == KBT_KBLOCKRAM); + return (KBlockRam *)b; +} + -- 2.25.1