esp_https_ota: Added support for esp_events

This commit is contained in:
Harshit Malpani
2022-11-02 11:05:19 +05:30
parent e6c57c0d14
commit 784089bf09
4 changed files with 95 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
idf_component_register(SRCS "src/esp_https_ota.c"
INCLUDE_DIRS "include"
REQUIRES esp_http_client bootloader_support esp_app_format
REQUIRES esp_http_client bootloader_support esp_app_format esp_event
PRIV_REQUIRES log app_update)
target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format")

View File

@@ -10,11 +10,28 @@
#include <bootloader_common.h>
#include "esp_app_desc.h"
#include <sdkconfig.h>
#include "esp_event.h"
#ifdef __cplusplus
extern "C" {
#endif
ESP_EVENT_DECLARE_BASE(ESP_HTTPS_OTA_EVENT);
/**
* @brief Events generated by OTA process
*/
typedef enum {
ESP_HTTPS_OTA_START,
ESP_HTTPS_OTA_CONNECTED,
ESP_HTTPS_OTA_GET_IMG_DESC,
ESP_HTTPS_OTA_VERIFY_CHIP_ID,
ESP_HTTPS_OTA_DECRYPT_CB,
ESP_HTTPS_OTA_WRITE_FLASH,
ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION,
ESP_HTTPS_OTA_FINISH,
ESP_HTTPS_OTA_ABORT,
} esp_https_ota_event_t;
typedef void *esp_https_ota_handle_t;
typedef esp_err_t(*http_client_init_cb_t)(esp_http_client_handle_t);

View File

@@ -13,6 +13,8 @@
#include <errno.h>
#include <sys/param.h>
ESP_EVENT_DEFINE_BASE(ESP_HTTPS_OTA_EVENT);
#define IMAGE_HEADER_SIZE (1024)
/* This is kept sufficiently large enough to cover image format headers
@@ -171,6 +173,10 @@ static void _http_cleanup(esp_http_client_handle_t client)
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
static esp_err_t esp_https_ota_decrypt_cb(esp_https_ota_t *handle, decrypt_cb_arg_t *args)
{
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_DECRYPT_CB, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
esp_err_t ret = handle->decrypt_cb(args, handle->decrypt_user_ctx);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Decrypt callback failed %d", ret);
@@ -202,6 +208,10 @@ static esp_err_t _ota_write(esp_https_ota_t *https_ota_handle, const void *buffe
ESP_LOGD(TAG, "Written image length %d", https_ota_handle->binary_file_len);
err = ESP_ERR_HTTPS_OTA_IN_PROGRESS;
}
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_WRITE_FLASH, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
esp_https_ota_decrypt_cb_free_buf((void *) buffer);
#endif
@@ -216,6 +226,10 @@ static bool is_server_verification_enabled(const esp_https_ota_config_t *ota_con
esp_err_t esp_https_ota_begin(const esp_https_ota_config_t *ota_config, esp_https_ota_handle_t *handle)
{
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_START, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
esp_err_t err;
if (handle == NULL || ota_config == NULL || ota_config->http_config == NULL) {
@@ -298,6 +312,10 @@ esp_err_t esp_https_ota_begin(const esp_https_ota_config_t *ota_config, esp_http
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to establish HTTP connection");
goto http_cleanup;
} else {
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_CONNECTED, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
}
if (!https_ota_handle->partial_http_download) {
@@ -382,6 +400,10 @@ static esp_err_t read_header(esp_https_ota_t *handle)
esp_err_t esp_https_ota_get_img_desc(esp_https_ota_handle_t https_ota_handle, esp_app_desc_t *new_app_info)
{
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_GET_IMG_DESC, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
// This API is not supported in case firmware image is encrypted in nature.
// It is recommended to retrieve image description through decryption callback in application layer.
@@ -414,6 +436,10 @@ esp_err_t esp_https_ota_get_img_desc(esp_https_ota_handle_t https_ota_handle, es
static esp_err_t esp_ota_verify_chip_id(const void *arg)
{
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_VERIFY_CHIP_ID, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
esp_image_header_t *data = (esp_image_header_t *)(arg);
if (data->chip_id != CONFIG_IDF_FIRMWARE_CHIP_ID) {
ESP_LOGE(TAG, "Mismatch chip id, expected %d, found %d", CONFIG_IDF_FIRMWARE_CHIP_ID, data->chip_id);
@@ -601,14 +627,26 @@ esp_err_t esp_https_ota_finish(esp_https_ota_handle_t https_ota_handle)
esp_err_t err = esp_ota_set_boot_partition(handle->update_partition);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_ota_set_boot_partition failed! err=0x%x", err);
} else {
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
}
}
free(handle);
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_FINISH, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
return err;
}
esp_err_t esp_https_ota_abort(esp_https_ota_handle_t https_ota_handle)
{
if (esp_event_post(ESP_HTTPS_OTA_EVENT, ESP_HTTPS_OTA_ABORT, NULL, 0, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Failed to post https_ota event");
}
esp_https_ota_t *handle = (esp_https_ota_t *)https_ota_handle;
if (handle == NULL) {
return ESP_ERR_INVALID_ARG;