/** * Write one page to flash * * \param addr Flash address in bytes * \param data Source data buffer * * \return true if success. */ bool mem_flash_page_write(void *addr, void *data) { uint32_t rc = FLASH_RC_OK; mem_flash_op_enter(); #if SAM4S || SAM4E || SAM4N /* The EWP command can only be used in 8 KBytes sector for SAM4S, SAM4E * and SAM4N, so an erase command is requried before write operation. */ rc = flash_write((uint32_t)addr, data, IFLASH_PAGE_SIZE, false); #else rc = flash_write((uint32_t)addr, data, IFLASH_PAGE_SIZE, true); #endif mem_flash_op_exit(); if (FLASH_RC_OK != rc) { return false; } return true; }
OSStatus internalFlashWrite(volatile uint32_t* flash_address, uint32_t* data ,uint32_t data_length) { platform_log_trace(); OSStatus err = kNoErr; //page write length IFLASH_PAGE_SIZE uint32_t rc ; mem_flash_op_enter(); #if SAMG55 rc = flash_write((*flash_address), data, data_length, false); #else rc = flash_write((*flash_address), data, data_length, true); #endif mem_flash_op_exit(); if (rc != FLASH_RC_OK) { platform_log("flash err: %d",rc); return kGeneralErr; } *flash_address += data_length; exit: return err; }
/** * Unlock flash region * * \param start Start physical address * \param end End physical address * * \return true if success */ bool mem_flash_unlock(void *start, void* end) { uint32_t rc; uint32_t start_addr = (uint32_t)start; uint32_t end_addr = (uint32_t)end; if (start_addr < IFLASH_ADDR) { start_addr = IFLASH_ADDR; } if (end_addr > IFLASH_END || end_addr == 0) { end_addr = IFLASH_END; } if (start_addr >= end_addr) { return false; } mem_flash_op_enter(); rc = flash_unlock(start_addr, end_addr, NULL, NULL); mem_flash_op_exit(); if (rc) { return false; } return true; }