Beispiel #1
0
/**
 * 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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
/**
 * 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;
}