X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Farm%2Fdrv%2Fflash_lpc2.c;h=e1a3391bf7bbc39a1deec9a8728228f5af300854;hb=540b160dbedfdb12ce29f9b107be860ba22cd6cb;hp=a78ade27c8bfe111e560d10a4a165071d3cc37c4;hpb=f63c15a680d9ac10027fd76c0aa2530ab34a5aee;p=bertos.git diff --git a/bertos/cpu/arm/drv/flash_lpc2.c b/bertos/cpu/arm/drv/flash_lpc2.c index a78ade27..e1a3391b 100644 --- a/bertos/cpu/arm/drv/flash_lpc2.c +++ b/bertos/cpu/arm/drv/flash_lpc2.c @@ -90,6 +90,7 @@ typedef enum IapCommands struct FlashHardware { uint8_t status; + int flags; }; #define FLASH_PAGE_CNT FLASH_MEM_SIZE / FLASH_PAGE_SIZE_BYTES @@ -189,7 +190,7 @@ static size_t lpc2_flash_writeDirect(struct KBlock *blk, block_idx_t idx, const ASSERT(FLASH_PAGE_SIZE_BYTES == size); Flash *fls = FLASH_CAST(blk); - if (!(fls->blk.priv.flags & KB_WRITE_ONCE)) + if (!(fls->hw->flags & FLASH_WRITE_ONCE)) ASSERT(sector_size(idx) <= FLASH_PAGE_SIZE_BYTES); const uint8_t *buf = (const uint8_t *)_buf; @@ -213,7 +214,7 @@ static size_t lpc2_flash_writeDirect(struct KBlock *blk, block_idx_t idx, const if (res.status != CMD_SUCCESS) goto flash_error; - if ((fls->blk.priv.flags & KB_WRITE_ONCE) && + if ((fls->hw->flags & FLASH_WRITE_ONCE) && bitarray_isRangeFull(&lpc2_bitx, idx_sector, erase_group[sector])) { kputs("blocchi pieni\n"); @@ -222,11 +223,11 @@ static size_t lpc2_flash_writeDirect(struct KBlock *blk, block_idx_t idx, const } bool erase = false; - if ((fls->blk.priv.flags & KB_WRITE_ONCE) && + if ((fls->hw->flags & FLASH_WRITE_ONCE) && bitarray_isRangeEmpty(&lpc2_bitx, idx_sector, erase_group[sector])) erase = true; - if (!(fls->blk.priv.flags & KB_WRITE_ONCE)) + if (!(fls->hw->flags & FLASH_WRITE_ONCE)) erase = true; if (erase) @@ -248,7 +249,7 @@ static size_t lpc2_flash_writeDirect(struct KBlock *blk, block_idx_t idx, const if (res.status != CMD_SUCCESS) goto flash_error; - if (fls->blk.priv.flags & KB_WRITE_ONCE) + if (fls->hw->flags & FLASH_WRITE_ONCE) { if (bitarray_test(&lpc2_bitx, idx)) { @@ -275,6 +276,7 @@ static size_t lpc2_flash_writeDirect(struct KBlock *blk, block_idx_t idx, const return blk->blk_size; flash_error: + IRQ_RESTORE(flags); LOG_ERR("%ld\n", res.status); fls->hw->status |= FLASH_WR_ERR; return 0; @@ -329,12 +331,13 @@ static const KBlockVTable flash_lpc2_unbuffered_vt = static struct FlashHardware flash_lpc2_hw; static uint8_t flash_buf[FLASH_PAGE_SIZE_BYTES]; -static void common_init(Flash *fls) +static void common_init(Flash *fls, int flags) { memset(fls, 0, sizeof(*fls)); DB(fls->blk.priv.type = KBT_FLASH); fls->hw = &flash_lpc2_hw; + fls->hw->flags = flags; fls->blk.blk_size = FLASH_PAGE_SIZE_BYTES; fls->blk.blk_cnt = FLASH_MEM_SIZE / FLASH_PAGE_SIZE_BYTES; @@ -344,11 +347,12 @@ static void common_init(Flash *fls) void flash_hw_init(Flash *fls, int flags) { - common_init(fls); + common_init(fls, flags); fls->blk.priv.vt = &flash_lpc2_buffered_vt; - fls->blk.priv.flags |= KB_BUFFERED | KB_PARTIAL_WRITE | flags; + fls->blk.priv.flags |= KB_BUFFERED | KB_PARTIAL_WRITE; fls->blk.priv.buf = flash_buf; + /* Load the first block in the cache */ void *flash_start = 0x0; memcpy(fls->blk.priv.buf, flash_start, fls->blk.blk_size); @@ -356,7 +360,6 @@ void flash_hw_init(Flash *fls, int flags) void flash_hw_initUnbuffered(Flash *fls, int flags) { - common_init(fls); + common_init(fls, flags); fls->blk.priv.vt = &flash_lpc2_unbuffered_vt; - fls->blk.priv.flags |= flags; }