X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fio%2Fkblock_ram.c;h=b936e90236d7b69f3c736fac2eca28ccc224c2f9;hb=6fffd0614f75137e8fed424c87835d4e7d478ef7;hp=a6dc008c5b0ef65f53f71cb6007b45188f8cc8d7;hpb=6539fb2d550505f48e8732e887adfe5a3469266c;p=bertos.git diff --git a/bertos/io/kblock_ram.c b/bertos/io/kblock_ram.c index a6dc008c..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" */ @@ -43,21 +48,21 @@ static int kblockram_load(KBlock *b, block_idx_t index) { KBlockRam *r = KBLOCKRAM_CAST(b); - memcpy(r->pagebuf, r->membuf + index * r->b.blk_size, r->b.blk_size); + memcpy(r->b.priv.buf, r->membuf + index * r->b.blk_size, r->b.blk_size); return 0; } static int kblockram_store(struct KBlock *b, block_idx_t index) { KBlockRam *r = KBLOCKRAM_CAST(b); - memcpy(r->membuf + index * r->b.blk_size, r->pagebuf, r->b.blk_size); + memcpy(r->membuf + index * r->b.blk_size, r->b.priv.buf, r->b.blk_size); return 0; } static size_t kblockram_readBuf(struct KBlock *b, void *buf, size_t offset, size_t size) { KBlockRam *r = KBLOCKRAM_CAST(b); - memcpy(buf, r->pagebuf + offset, size); + memcpy(buf, (uint8_t *)r->b.priv.buf + offset, size); return size; } @@ -71,13 +76,18 @@ static size_t kblockram_readDirect(struct KBlock *b, block_idx_t index, void *bu static size_t kblockram_writeBuf(struct KBlock *b, const void *buf, size_t offset, size_t size) { KBlockRam *r = KBLOCKRAM_CAST(b); - memcpy(r->pagebuf + offset, buf, size); + memcpy((uint8_t *)r->b.priv.buf + offset, buf, size); return size; } -static int kblockram_error(struct KBlock *b) +static size_t kblockram_writeDirect(struct KBlock *b, block_idx_t index, const void *buf, size_t offset, size_t size) { - return b->priv.flags; + KBlockRam *r = KBLOCKRAM_CAST(b); + ASSERT(buf); + ASSERT(index < b->blk_cnt); + + memcpy(r->membuf + index * r->b.blk_size + offset, buf, size); + return size; } static int kblockram_dummy(UNUSED_ARG(struct KBlock *,b)) @@ -85,20 +95,47 @@ static int kblockram_dummy(UNUSED_ARG(struct KBlock *,b)) return 0; } -static KBlockVTable kblockram_vt = +static const KBlockVTable kblockram_hwbuffered_vt = { .readDirect = kblockram_readDirect, + .readBuf = kblockram_readBuf, .writeBuf = kblockram_writeBuf, .load = kblockram_load, .store = kblockram_store, - .error = kblockram_error, - .clearerr = kblockram_dummy, + .error = kblockram_dummy, + .clearerr = (kblock_clearerr_t)kblockram_dummy, .close = kblockram_dummy, }; -void kblockram_init(KBlockRam *ram, void *buf, size_t size, size_t block_size) + +static const KBlockVTable kblockram_swbuffered_vt = +{ + .readDirect = kblockram_readDirect, + .writeDirect = kblockram_writeDirect, + + .readBuf = kblock_swReadBuf, + .writeBuf = kblock_swWriteBuf, + .load = kblock_swLoad, + .store = kblock_swStore, + + .error = kblockram_dummy, + .clearerr = (kblock_clearerr_t)kblockram_dummy, + .close = kblockram_dummy, +}; + +static const KBlockVTable kblockram_unbuffered_vt = +{ + .readDirect = kblockram_readDirect, + .writeDirect = kblockram_writeDirect, + + .error = kblockram_dummy, + .clearerr = (kblock_clearerr_t)kblockram_dummy, + .close = kblockram_dummy, +}; + +void kblockram_init(KBlockRam *ram, void *buf, size_t size, size_t block_size, bool buffered, bool hwbuffered) { ASSERT(buf); ASSERT(size); @@ -107,12 +144,28 @@ void kblockram_init(KBlockRam *ram, void *buf, size_t size, size_t block_size) memset(ram, 0, sizeof(*ram)); DB(ram->b.priv.type = KBT_KBLOCKRAM); - - // First page used as page buffer - ram->b.blk_cnt = (size / block_size) - 1; - ram->pagebuf = (uint8_t *)buf; - ram->membuf = (uint8_t *)buf + block_size; ram->b.blk_size = block_size; - ram->b.priv.vt = &kblockram_vt; - kblockram_load(&ram->b, 0); + ram->b.priv.flags |= KB_PARTIAL_WRITE; + + if (buffered) + { + ram->b.priv.flags |= KB_BUFFERED; + ram->b.blk_cnt = (size / block_size) - 1; + 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 + { + ram->b.blk_cnt = (size / block_size); + ram->membuf = (uint8_t *)buf; + ram->b.priv.vt = &kblockram_unbuffered_vt; + } }