diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 6d77c9a..7f77223 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -31,10 +31,12 @@ list(APPEND srcs "utils/sb_aes.c") list(APPEND srcs "drivers/sertrf/sertrf.c") list(APPEND srcs "drivers/sertrf/device.c") list(APPEND srcs "drivers/sertrf/key.c") +list(APPEND srcs "drivers/sertrf/ota_u.c") list(APPEND srcs "drivers/sertrf/protocol/MSP.c") list(APPEND srcs "drivers/sertrf/protocol/p_protocol.c") list(APPEND srcs "drivers/sertrf/protocol/mavlink_control.c") + list(APPEND srcs "drivers/led_strip/led_strip.c") list(APPEND srcs "drivers/led_strip/led_strip_encoder.c") diff --git a/app/drivers/sertrf/ota_u.c b/app/drivers/sertrf/ota_u.c new file mode 100644 index 0000000..4d76b26 --- /dev/null +++ b/app/drivers/sertrf/ota_u.c @@ -0,0 +1,79 @@ +#include "ota_u.h" + +void switch_to_ota(const char *target_label) +{ + // 通过标签获取分区 + const esp_partition_t *target_partition = + esp_partition_find_first(ESP_PARTITION_TYPE_APP, + ESP_PARTITION_SUBTYPE_ANY, + target_label); + if (!target_partition) { + SYS_LOG_ERR("Partition '%s' not found!", target_label); + return; + } + + SYS_LOG_INF("Switching to %s at 0x%x", target_partition->label, target_partition->address); + + // 设置下次启动分区 + esp_err_t err = esp_ota_set_boot_partition(target_partition); + if (err != ESP_OK) { + SYS_LOG_ERR("Failed to set boot partition: %s", esp_err_to_name(err)); + return; + } + + SYS_LOG_INF( "Switch successful, rebooting..."); + esp_restart(); +} +// 获取ota信息 +void get_partition_status(ota_u_t* otau) +{ + // 获取当前运行分区 + otau->running = esp_ota_get_running_partition(); + if (!otau->running) { + SYS_LOG_ERR("Failed to get running partition"); + return; + } + //赋值ota分区 + if(strcmp(otau->running->label, OTA_TAG_0) == 0){ + otau->update = esp_partition_find_first(ESP_PARTITION_TYPE_APP, + ESP_PARTITION_SUBTYPE_ANY, OTA_TAG_1); + }else{ + otau->update = esp_partition_find_first(ESP_PARTITION_TYPE_APP, + ESP_PARTITION_SUBTYPE_ANY, OTA_TAG_0); + } + SYS_LOG_INF("Running partition: %s at 0x%x", otau->running->label, otau->running->address); +} +void otau_init(ota_u_t* otau) +{ + + if (esp_ota_begin(otau->update, OTA_SIZE_UNKNOWN, &otau->ota_handle) != ESP_OK) { + SYS_LOG_ERR("esp_ota_begin failed!"); + return; + } + SYS_LOG_INF("Starting OTA update..."); +} +uint8_t otau_write(ota_u_t* otau, void* data, uint32_t size) +{ + esp_err_t err = esp_ota_write(otau->ota_handle, data, size); + if (err != ESP_OK) { + SYS_LOG_ERR( "esp_ota_write failed! (%s)", esp_err_to_name(err)); + esp_ota_abort(otau->ota_handle); + return 1; + } + otau->total_size += size; + SYS_LOG_INF( "Received: %d bytes, Total: %d bytes", size, otau->total_size); + return 0; +} +uint8_t otau_end(ota_u_t* otau) +{ + if (esp_ota_end(otau->ota_handle) != ESP_OK) { + SYS_LOG_ERR("esp_ota_end failed!"); + return 1; + } + if (esp_ota_set_boot_partition(otau->update) != ESP_OK) { + SYS_LOG_ERR("esp_ota_set_boot_partition failed!"); + return 1; + } + SYS_LOG_INF("OTA update successful! Rebooting..."); + return 0; +} \ No newline at end of file diff --git a/app/drivers/sertrf/ota_u.h b/app/drivers/sertrf/ota_u.h new file mode 100644 index 0000000..9c9cfd6 --- /dev/null +++ b/app/drivers/sertrf/ota_u.h @@ -0,0 +1,40 @@ +#pragma once + +#include "esp_ota_ops.h" +#include "esp_system.h" +#include "esp_log.h" +#include "sys_log.h" + +#define OTA_TAG_0 "ota_0" +#define OTA_TAG_1 "ota_1" + +typedef struct +{ + const esp_partition_t *running; + const esp_partition_t *update; + esp_ota_handle_t ota_handle; + int total_size; +}ota_u_t; + +/** + * @brief OTA初始化 + * + * @param otau + */ +void otau_init(ota_u_t* otau); +/** + * @brief OTA写入 + * + * @param otau + * @param data + * @param size + * @return uint8_t + */ +uint8_t otau_write(ota_u_t* otau, void* data, uint32_t size); +/** + * @brief OTA结束 + * + * @param otau + * @return uint8_t + */ +uint8_t otau_end(ota_u_t* otau); diff --git a/app/drivers/sertrf/sertrf.h b/app/drivers/sertrf/sertrf.h index 6c2d71f..7266881 100644 --- a/app/drivers/sertrf/sertrf.h +++ b/app/drivers/sertrf/sertrf.h @@ -5,12 +5,15 @@ #include "key.h" #include "protocol/p_protocol.h" #include "protocol/kuyi_protl.h" +#include "ota_u.h" typedef struct { device_t device; os_thread_t embedded_thread; os_thread_t pc_thread; os_thread_t task_thread; + + ota_u_t otau; }sertrf_t; /** @@ -37,6 +40,11 @@ void sertrf_status(void); * @brief embedded thread */ void embedded_thread(void* arg); + +/** + * @brief pc thread +*/ +void pc_thread(void* arg); /** * @brief task thread */