7#include <esp_ota_ops.h>
8#include <esp_task_wdt.h>
9#include <spi_flash_mmap.h>
14std::unique_ptr<ota::OTABackend>
make_ota_backend() {
return make_unique<ota::IDFOTABackend>(); }
17#ifdef USE_OTA_ROLLBACK
21 esp_ota_mark_app_valid_cancel_rollback();
24 this->partition_ = esp_ota_get_next_update_partition(
nullptr);
25 if (this->partition_ ==
nullptr) {
29#if CONFIG_ESP_TASK_WDT_TIMEOUT_S < 15
31 esp_task_wdt_config_t wdtc;
32 wdtc.idle_core_mask = 0;
33#if CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0
34 wdtc.idle_core_mask |= (1 << 0);
36#if CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1
37 wdtc.idle_core_mask |= (1 << 1);
39 wdtc.timeout_ms = 15000;
40 wdtc.trigger_panic =
false;
41 esp_task_wdt_reconfigure(&wdtc);
44 esp_err_t err = esp_ota_begin(this->partition_, image_size, &this->update_handle_);
46#if CONFIG_ESP_TASK_WDT_TIMEOUT_S < 15
48 wdtc.timeout_ms = CONFIG_ESP_TASK_WDT_TIMEOUT_S * 1000;
49 esp_task_wdt_reconfigure(&wdtc);
53 esp_ota_abort(this->update_handle_);
54 this->update_handle_ = 0;
55 if (err == ESP_ERR_INVALID_SIZE) {
57 }
else if (err == ESP_ERR_FLASH_OP_TIMEOUT || err == ESP_ERR_FLASH_OP_FAIL) {
67 memcpy(this->expected_bin_md5_, expected_md5, 32);
68 this->md5_set_ =
true;
72 esp_err_t err = esp_ota_write(this->update_handle_, data,
len);
75 if (err == ESP_ERR_OTA_VALIDATE_FAILED) {
77 }
else if (err == ESP_ERR_FLASH_OP_TIMEOUT || err == ESP_ERR_FLASH_OP_FAIL) {
88 if (!this->md5_.
equals_hex(this->expected_bin_md5_)) {
93 esp_err_t err = esp_ota_end(this->update_handle_);
94 this->update_handle_ = 0;
96 err = esp_ota_set_boot_partition(this->partition_);
101 if (err == ESP_ERR_OTA_VALIDATE_FAILED) {
104 if (err == ESP_ERR_FLASH_OP_TIMEOUT || err == ESP_ERR_FLASH_OP_FAIL) {
111 esp_ota_abort(this->update_handle_);
112 this->update_handle_ = 0;
bool equals_hex(const char *expected)
Compare the hash against a provided hex-encoded hash.
void calculate() override
Compute the digest, based on the provided data.
void add(const uint8_t *data, size_t len) override
Add bytes of data for the digest.
void init() override
Initialize a new MD5 digest computation.
OTAResponseTypes write(uint8_t *data, size_t len) override
void set_update_md5(const char *md5) override
OTAResponseTypes end() override
OTAResponseTypes begin(size_t image_size) override
std::unique_ptr< ota::OTABackend > make_ota_backend()
@ OTA_RESPONSE_ERROR_MD5_MISMATCH
@ OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE
@ OTA_RESPONSE_ERROR_WRITING_FLASH
@ OTA_RESPONSE_ERROR_UPDATE_END
@ OTA_RESPONSE_ERROR_UNKNOWN
@ OTA_RESPONSE_ERROR_NO_UPDATE_PARTITION
@ OTA_RESPONSE_ERROR_MAGIC
Providing packet encoding functions for exchanging data with a remote host.