| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | #define MODULE "ota"#define DEBUG 1#include "common.h"#include "fw.h"#include <esp_ota_ops.h>#define BUFFER_SIZE	4096static int esp_err_to_fwupdate(int err){    switch (err) {    case ESP_OK:	return Z_OK;    case ESP_ERR_NO_MEM:	return Z_MEM_ERROR;    case ESP_ERR_NOT_FOUND:	return FWUPDATE_ERR_ESP_NO_PARTITION;    case ESP_ERR_INVALID_ARG:    case ESP_ERR_OTA_PARTITION_CONFLICT:    case ESP_ERR_OTA_SELECT_INFO_INVALID:    case ESP_ERR_OTA_ROLLBACK_INVALID_STATE:	return FWUPDATE_ERR_ESP_BAD_OTA;    case ESP_ERR_FLASH_OP_TIMEOUT:    case ESP_ERR_FLASH_OP_FAIL:	return FWUPDATE_ERR_ESP_FLASH_FAILED;    case ESP_ERR_OTA_VALIDATE_FAILED:	return FWUPDATE_ERR_ESP_BAD_DATA;    default:	return FWUPDATE_ERR_UNKNOWN;    }}int esp_update(read_func_t read_func, token_t token, size_t size){    const esp_partition_t *partition;    int err = ESP_FAIL;    esp_ota_handle_t handle;    bool ota_started = false;    int len;    char *buf = xmalloc_dma(BUFFER_SIZE);    partition = esp_ota_get_next_update_partition(NULL);    if (!partition) {	err = ESP_ERR_NOT_FOUND;	goto fail;    }    MSG("starting ESP OTA update, total %zu bytes\n", size);    err = esp_ota_begin(partition, size, &handle);    if (err)	goto fail;    ota_started = true;    size_t left = size;    while (left) {	size_t chunk = left;	if (chunk > BUFFER_SIZE)	    chunk = BUFFER_SIZE;	len = read_func(token, buf, chunk);	if (len <= 0)	    break;	left -= len;	MSG("writing %d bytes, %zu left\r", len, left);	err = esp_ota_write(handle, buf, len);	CMSG("\n");	if (err)	    goto fail;    }    if (left) {	MSG("short input data, aborting update\n");	err = ESP_ERR_OTA_VALIDATE_FAILED;	goto fail;    }    MSG("finalizing flash update\n");    err = esp_ota_end(handle);    if (err)	goto fail;    free(buf);    buf = NULL;    MSG("setting boot partition\n");    err = esp_ota_set_boot_partition(partition);fail:    err = esp_err_to_fwupdate(err);    if (err) {	MSG("failure: error %d\n", err);	if (ota_started)	    esp_ota_abort(handle);    }    if (buf)	free(buf);    return err;}
 |