X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fio%2Fkblock_ram.c;h=b936e90236d7b69f3c736fac2eca28ccc224c2f9;hb=470f5cb37d5adce8fa5efd0092b2885528d7fb32;hp=3af08b80626b2f930b0d4dca7bf232e680c6000f;hpb=2bc2b05bc4ee047d9287d97f504ae737507b5d5b;p=bertos.git diff --git a/bertos/io/kblock_ram.c b/bertos/io/kblock_ram.c index 3af08b80..b936e902 100644 --- a/bertos/io/kblock_ram.c +++ b/bertos/io/kblock_ram.c @@ -32,7 +32,12 @@ * * \author Francesco Sacchi * - * \brief KBlock interface + * \brief KBlock interface on RAM memory + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "kfile_ram" + * $WIZ$ module_depends = "kblock" */ @@ -75,24 +80,14 @@ static size_t kblockram_writeBuf(struct KBlock *b, const void *buf, size_t offse return size; } -static int kblockram_writeBlock(struct KBlock *b, block_idx_t index, const void *buf) -{ - KBlockRam *r = KBLOCKRAM_CAST(b); - ASSERT(buf); - ASSERT(index < b->blk_cnt); - - memcpy(r->membuf + index * r->b.blk_size, buf, r->b.blk_size); - return 0; -} - -static int kblockram_readBlock(struct KBlock *b, block_idx_t index, void *buf) +static size_t kblockram_writeDirect(struct KBlock *b, block_idx_t index, const void *buf, size_t offset, size_t size) { KBlockRam *r = KBLOCKRAM_CAST(b); ASSERT(buf); ASSERT(index < b->blk_cnt); - memcpy(buf, r->membuf + index * r->b.blk_size, r->b.blk_size); - return 0; + memcpy(r->membuf + index * r->b.blk_size + offset, buf, size); + return size; } static int kblockram_dummy(UNUSED_ARG(struct KBlock *,b)) @@ -103,43 +98,40 @@ static int kblockram_dummy(UNUSED_ARG(struct KBlock *,b)) static const KBlockVTable kblockram_hwbuffered_vt = { .readDirect = kblockram_readDirect, + .readBuf = kblockram_readBuf, .writeBuf = kblockram_writeBuf, .load = kblockram_load, .store = kblockram_store, - - .readBlock = kblock_swReadBlock, - .writeBlock = kblock_swWriteBlock, .error = kblockram_dummy, - .clearerr = kblockram_dummy, + .clearerr = (kblock_clearerr_t)kblockram_dummy, .close = kblockram_dummy, }; static const KBlockVTable kblockram_swbuffered_vt = { - .readDirect = kblock_swReadDirect, + .readDirect = kblockram_readDirect, + .writeDirect = kblockram_writeDirect, + .readBuf = kblock_swReadBuf, .writeBuf = kblock_swWriteBuf, .load = kblock_swLoad, .store = kblock_swStore, - - .readBlock = kblockram_readBlock, - .writeBlock = kblockram_writeBlock, .error = kblockram_dummy, - .clearerr = kblockram_dummy, + .clearerr = (kblock_clearerr_t)kblockram_dummy, .close = kblockram_dummy, }; static const KBlockVTable kblockram_unbuffered_vt = { - .readBlock = kblockram_readBlock, - .writeBlock = kblockram_writeBlock, + .readDirect = kblockram_readDirect, + .writeDirect = kblockram_writeDirect, .error = kblockram_dummy, - .clearerr = kblockram_dummy, + .clearerr = (kblock_clearerr_t)kblockram_dummy, .close = kblockram_dummy, }; @@ -153,7 +145,8 @@ void kblockram_init(KBlockRam *ram, void *buf, size_t size, size_t block_size, b DB(ram->b.priv.type = KBT_KBLOCKRAM); ram->b.blk_size = block_size; - + ram->b.priv.flags |= KB_PARTIAL_WRITE; + if (buffered) { ram->b.priv.flags |= KB_BUFFERED; @@ -161,12 +154,12 @@ void kblockram_init(KBlockRam *ram, void *buf, size_t size, size_t block_size, b ram->b.priv.buf = buf; // First page used as page buffer ram->membuf = (uint8_t *)buf + block_size; - + if (hwbuffered) ram->b.priv.vt = &kblockram_hwbuffered_vt; else ram->b.priv.vt = &kblockram_swbuffered_vt; - + kblockram_load(&ram->b, 0); } else