sysparam: buffer writes.

If the source is in the flash then the write to the flash seems to just
write zeros, and since it is common for the key to be a constant
string, buffer all writes.
This commit is contained in:
ourairquality 2016-08-18 20:50:10 +10:00
parent 40dc3bf945
commit 77e584d28f

View file

@ -116,16 +116,18 @@ static struct {
/***************************** Internal routines *****************************/
static inline IRAM sysparam_status_t _do_write(uint32_t addr, const void *data, size_t data_size) {
CHECK_FLASH_OP(sdk_spi_flash_write(addr, (void*) data, data_size));
/* The buffer is needed in case the source is in the flash. */
static inline IRAM sysparam_status_t _do_write(uint32_t addr, const void *data, void *buffer, size_t data_size) {
memcpy(buffer, data, data_size);
CHECK_FLASH_OP(sdk_spi_flash_write(addr, buffer, data_size));
return SYSPARAM_OK;
}
static inline IRAM sysparam_status_t _do_verify(uint32_t addr, const void *data, void *buffer, size_t len) {
CHECK_FLASH_OP(sdk_spi_flash_read(addr, buffer, len));
if (memcmp(data, buffer, len)) {
if (memcmp(data, buffer, len))
return SYSPARAM_ERR_IO;
}
return SYSPARAM_OK;
}
@ -134,22 +136,20 @@ static IRAM sysparam_status_t _write_and_verify(uint32_t addr, const void *data,
int i;
size_t count;
sysparam_status_t status = SYSPARAM_OK;
uint8_t *verify_buf = malloc(VERIFY_BUF_SIZE);
uint8_t *buf = malloc(VERIFY_BUF_SIZE);
if (!verify_buf) return SYSPARAM_ERR_NOMEM;
do {
status = _do_write(addr, data, data_size);
if (status != SYSPARAM_OK) break;
if (!buf) return SYSPARAM_ERR_NOMEM;
for (i = 0; i < data_size; i += VERIFY_BUF_SIZE) {
count = min(data_size - i, VERIFY_BUF_SIZE);
status = _do_verify(addr + i, data + i, verify_buf, count);
status = _do_write(addr + i, data + i, buf, count);
if (status != SYSPARAM_OK) break;
status = _do_verify(addr + i, data + i, buf, count);
if (status != SYSPARAM_OK) {
debug(1, "Flash write (@ 0x%08x) verify failed!", addr);
break;
}
}
} while (false);
free(verify_buf);
free(buf);
return status;
}