Пример #1
0
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);
}