irom static app_action_t flash_write_verify(const string_t *src, string_t *dst) { char *verify_buffer = string_to_ptr(dst); char *write_buffer = string_to_ptr(&buffer_4k); int write_buffer_length = string_length(&buffer_4k); if(string_size(dst) < 0x1000) { string_format(dst, "OTA: string verify buffer too small: %d\n", string_size(dst)); return(app_action_error); } if(ota_state == state_write) { spi_flash_read(flash_sector * 0x1000, (void *)verify_buffer, write_buffer_length); if(ets_memcmp(write_buffer, verify_buffer, write_buffer_length)) { spi_flash_erase_sector(flash_sector); spi_flash_write(flash_sector * 0x1000, (void *)write_buffer, write_buffer_length); written++; } else skipped++; } spi_flash_read(flash_sector * 0x1000, (void *)verify_buffer, write_buffer_length); MD5Update(&md5, verify_buffer, write_buffer_length); if(ets_memcmp(write_buffer, verify_buffer, write_buffer_length)) { string_copy(dst, "OTA: verify mismatch\n"); return(app_action_error); } flash_sector++; received += write_buffer_length; string_clear(&buffer_4k); string_clear(dst); return(app_action_normal); }
int memcmp(const void *s1, const void *s2, size_t n) { return ets_memcmp(s1, s2, n); }