void FlashWrite(FLASHDATA * addr, ADDRESS offset, FLASHDATA data) { FLASH_OFFSET((addr),(offset)) = (data); StoreTraceCycle(OP_WRITE, addr, offset, (ADDRESS)((volatile FLASHDATA*)(addr) + (offset)), data); #ifdef PRINT_TIMESTAMP STORE_TIMESTAMP; #endif }
FLASHDATA FlashRead(FLASHDATA * addr, ADDRESS offset) { FLASHDATA data; data = FLASH_OFFSET((addr),(offset)); StoreTraceCycle(OP_READ, addr, offset, (ADDRESS)((volatile FLASHDATA*)(addr) + (offset)), data); #ifdef PRINT_TIMESTAMP STORE_TIMESTAMP; #endif return(data); }
/* Buffering memcpy into flash that satisfys the requirement that all * writes consist of in-order writes of complete pages only */ msel_status flash_writemem(void* dst, void* src, size_t sz) { size_t count = 0; if(dst < (void*)FLASH_ADDR_BASE || (dst+sz) >= (void*)FLASH_ADDR_MAX || sz > FLASH_PART_BYTES) return MSEL_EINVAL; while(sz-count > 0) { uint8_t* ptr = (uint8_t*)dst + count; size_t bank = FLASH_BANK(ptr); size_t page = FLASH_PAGE(ptr); size_t offset = FLASH_OFFSET(ptr); size_t tmpcnt; flash_read_page(bank,page); /* first iteration will page align */ if(offset > 0) tmpcnt = FLASH_PAGE_BYTES - offset; else tmpcnt = FLASH_PAGE_BYTES; /* Don't write past requested area */ if(tmpcnt > sz - count) tmpcnt = sz - count; /* Copy snippet into current buffered page */ msel_memcpy(flash_scratch_page+offset, (uint8_t*)src+count, tmpcnt); count += tmpcnt; /* dst+count should now be aligned if sz-count>0 */ flash_flush_page(bank, page); } return MSEL_OK; }