i am trying to copy a binary image located on a data fat partition to an app partition to set the boot from the app partition.
My Idea is to allocate a buffer and read and write the image in loop. Unfortunately is the copied image invalid and i keep getting these log messages:
E (3024) esp_image: image at 0x110000 has invalid magic byte (nothing flashed here?)
E (3034) example_main: Failed to set boot partition to OTA_0: ESP_ERR_OTA_VALIDATE_FAILED
Here is the code:
Code: Untitled.c Select all
void copy_image_to_ota0() {
const esp_partition_t *storage_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, "storage");
if (!storage_partition) {
ESP_LOGE(TAG, "Storage partition not found");
return;
}
const esp_partition_t *ota_0_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_0, NULL);
if (!ota_0_partition) {
ESP_LOGE(TAG, "OTA_0 partition not found");
return;
}
if (storage_partition->size > ota_0_partition->size) {
ESP_LOGE(TAG, "Storage partition is larger than OTA_0 partition");
return;
}
ESP_LOGI(TAG, "Copying image from storage to OTA_0 partition");
const int BUFFER_SIZE = 4096;
void *buffer = malloc(BUFFER_SIZE);
if (!buffer) {
ESP_LOGE(TAG, "Failed to allocate memory for buffer");
return;
}
size_t offset = 0;
esp_err_t err;
while (offset < storage_partition->size) {
size_t bytes_to_copy = MIN(BUFFER_SIZE, storage_partition->size - offset);
err = esp_partition_read(storage_partition, offset, buffer, bytes_to_copy);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to read from storage partition at offset 0x%08x: %s", offset, esp_err_to_name(err));
free(buffer);
return;
}
err = esp_partition_write(ota_0_partition, offset, buffer, bytes_to_copy);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to write to OTA_0 partition at offset 0x%08x: %s", offset, esp_err_to_name(err));
free(buffer);
return;
}
ESP_LOGD(TAG, "Copied %d bytes from offset 0x%08x", bytes_to_copy, offset);
offset += bytes_to_copy;
}
ESP_LOGI(TAG, "Image copied successfully to OTA_0 partition");
free(buffer);
}