示例#1
0
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
}
示例#2
0
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);
}
示例#3
0
文件: flash.c 项目: Abioy/orp
/* 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;
}