[ESP] ota 固件升级

cpp 复制代码
/*********************************
 *  esp32 OTA 固件升级
 *  输入参数:
 *      ota_buf:固件数据
 *      data_len:固件长度
 *  返回:
 *      0:升级成功 ,其他错误代码
 *********************************/
int esp_ota_update_process(uint8_t *ota_buf, uint32_t data_len)
{
    esp_err_t err = ESP_OK;
    esp_ota_handle_t update_handle = 0;
    const esp_partition_t *update_partition = NULL;
    update_partition = esp_ota_get_next_update_partition(NULL);
    printf("ota update_partition address = 0x%p \n", update_partition->address);
    uint32_t tick_record = esp_log_timestamp();
    err = esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN, &update_handle);
    if (err != ESP_OK)
    {
        printf("error:esp_ota_begin failed.code=%x.\n", err);
        return 1;
    }
    printf("esp_ota_begin,length=%ld bytes,take = %ld ms.\n", data_len, esp_log_timestamp() - tick_record);
    // 这个步骤可以分包处理,(本方法用了整包写入的方式).
    err = esp_ota_write(update_handle, ota_buf, data_len); // firmware_bin writing to ESP32 chip
    if (err != ESP_OK)
    {
        printf("error:ota_write,code=%d.\n", err);
        return 2;
    }

    // 调用此函数前,需要关闭看门狗
    err = esp_ota_end(update_handle);
    printf("esp_ota_end,ret=%d\n", err);
    if (err != ESP_OK)
    {
        printf("error:at esp_ota_end,code=%d.\n", err);
    }
    err = esp_ota_set_boot_partition(update_partition);
    printf("Reboot system, code=%d\n", err);
    esp_restart();
    return 0;
}

常用辅助ota测试的函数:(将需要ota的固件内置到esp32然后通过文件加载再通过ota函数升级)

cpp 复制代码
char* load_file_pt(const char* file_name)
{
    FILE *fp = fopen(file_name, "rb");
    if (fp == NULL)
    {
        printf("file [%s] open fail.\n", file_name);
        return NULL;
    }
    fseek(fp, 0L, SEEK_END);
    long file_len = ftell(fp);
    printf("file[%s],length = %ld bytes.\n",file_name,file_len);

    char *ota_file_data = (char *)malloc(file_len);
    if (ota_file_data == NULL)
    {
        printf("error:no mem to malloc!\n");
        fclose(fp);
        return NULL;
    }
    memset(ota_file_data, 0,file_len);
    rewind(fp);
    fread(ota_file_data, 1, file_len, fp);
    fclose(fp);

    return ota_file_data;
}
cpp 复制代码
/****************************************
* spi flash file system [for esp32]
******************************************/
void spiffs_init(void)
{
    esp_vfs_spiffs_conf_t conf = {
      .base_path = "/spiffs",
      .partition_label = NULL,
      .max_files = 5,
      .format_if_mount_failed = false
    };
    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    if (ret != ESP_OK) {
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "Failed to mount or format filesystem");
        } else if (ret == ESP_ERR_NOT_FOUND) {
            ESP_LOGE(TAG, "Failed to find SPIFFS partition");
        } else {
            ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
        }
        return;
    }
    size_t total = 0, used = 0;
    ret = esp_spiffs_info(NULL, &total, &used);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));
    } else {
        ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);
    }
}
相关推荐
Java程序员威哥17 小时前
云原生Java应用优化实战:资源限制+JVM参数调优,容器启动快50%
java·开发语言·jvm·python·docker·云原生
多多*17 小时前
程序设计工作室1月21日内部训练赛
java·开发语言·网络·jvm·tcp/ip
Engineer邓祥浩17 小时前
设计模式学习(15) 23-13 模版方法模式
java·学习·设计模式
茶本无香17 小时前
设计模式之四:建造者模式(Builder Pattern)详解
java·设计模式·建造者模式
毕设源码-赖学姐17 小时前
【开题答辩全过程】以 高校素拓分管理系统的设计与开发为例,包含答辩的问题和答案
java·eclipse
0思必得017 小时前
[Web自动化] Selenium浏览器对象属性
前端·python·selenium·自动化·web自动化
济61717 小时前
linux 系统移植(第九期)----Linux 内核顶层 Makefile- make xxx_defconfig 过程-- Ubuntu20.04
linux·运维·服务器
计算机学姐17 小时前
基于SpringBoot的社区互助系统
java·spring boot·后端·mysql·spring·信息可视化·推荐算法
宴之敖者、17 小时前
Linux——yum和vim
linux·运维·服务器
小二·17 小时前
Python Web 开发进阶实战:边缘智能网关 —— 在 Flask + Vue 中构建轻量级 IoT 边缘计算平台
前端·python·flask