| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | 
							- #define MODULE "ota"
 
- #define DEBUG 1
 
- #include "common.h"
 
- #include "fw.h"
 
- #include <esp_ota_ops.h>
 
- #define BUFFER_SIZE	4096
 
- static 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;
 
- }
 
 
  |