/*****************************************************************************
|
* @file OTAUpgrade.h
|
* @brief 4G OTA固件升级模块 - 通过HTTP下载加密固件、解密并校验
|
* @author AI Assistant
|
* @date 2025-12-20
|
*
|
* @details 功能说明:
|
* 1. 通过4G模块HTTP下载加密固件到Flash加密区
|
* 2. 支持断点续传(使用HTTPClient Range功能)
|
* 3. 下载完成后调用AES-256-CBC解密算法解密固件
|
* 4. 解密后进行校验和验证确保固件完整性
|
*
|
* Flash分区:
|
* - 加密固件区: 0x08100000 - 0x0813FFFF (256KB, Bank2 Sector0-1)
|
* - 解密固件区: 0x08140000 - 0x0817FFFF (256KB, Bank2 Sector2-3)
|
*****************************************************************************/
|
|
#ifndef __OTA_UPGRADE_H__
|
#define __OTA_UPGRADE_H__
|
|
#include "HIDO_TypeDef.h"
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
/*****************************************************************************
|
* Flash分区地址定义
|
*****************************************************************************/
|
// 加密固件存储区(Bank2 Sector0-1)
|
#define OTA_ENCRYPTED_FLASH_ADDR 0x08100000U
|
#define OTA_ENCRYPTED_FLASH_SIZE (256 * 1024) // 256KB
|
|
// 解密固件存储区(Bank2 Sector2-3)
|
#define OTA_DECRYPTED_FLASH_ADDR 0x08140000U
|
#define OTA_DECRYPTED_FLASH_SIZE (256 * 1024) // 256KB
|
|
/*****************************************************************************
|
* OTA升级状态定义
|
*****************************************************************************/
|
typedef enum {
|
OTA_STATE_IDLE = 0, // 空闲状态
|
OTA_STATE_DOWNLOADING, // 正在下载加密固件
|
OTA_STATE_DOWNLOAD_COMPLETE, // 下载完成
|
OTA_STATE_DOWNLOAD_FAILED, // 下载失败
|
OTA_STATE_DECRYPTING, // 正在解密
|
OTA_STATE_DECRYPT_COMPLETE, // 解密完成
|
OTA_STATE_DECRYPT_FAILED, // 解密失败
|
OTA_STATE_VERIFYING, // 正在校验
|
OTA_STATE_VERIFY_SUCCESS, // 校验成功
|
OTA_STATE_VERIFY_FAILED, // 校验失败
|
} E_OTAState;
|
|
/*****************************************************************************
|
* OTA升级错误码
|
*****************************************************************************/
|
typedef enum {
|
OTA_ERR_NONE = 0, // 无错误
|
OTA_ERR_BUSY, // OTA正忙
|
OTA_ERR_INVALID_PARAM, // 无效参数
|
OTA_ERR_NO_NETWORK, // 网络未就绪
|
OTA_ERR_HTTP_FAILED, // HTTP请求失败
|
OTA_ERR_FLASH_ERASE_FAILED, // Flash擦除失败
|
OTA_ERR_FLASH_WRITE_FAILED, // Flash写入失败
|
OTA_ERR_FILE_TOO_LARGE, // 文件超过256KB
|
OTA_ERR_DECRYPT_FAILED, // 解密失败
|
OTA_ERR_CHECKSUM_MISMATCH, // 校验和不匹配
|
} E_OTAError;
|
|
/*****************************************************************************
|
* OTA升级信息结构体
|
*****************************************************************************/
|
typedef struct {
|
E_OTAState eState; // 当前状态
|
E_OTAError eLastError; // 最后错误码
|
HIDO_UINT32 u32TotalSize; // 固件总大小(字节)
|
HIDO_UINT32 u32DownloadedSize; // 已下载大小(字节)
|
HIDO_UINT32 u32DecryptedSize; // 已解密大小(字节)
|
HIDO_UINT8 u8Progress; // 进度百分比 (0-100)
|
HIDO_CHAR acETag[64]; // HTTP ETag,用于断点续传验证
|
} ST_OTAInfo;
|
|
/*****************************************************************************
|
* 对外接口函数
|
*****************************************************************************/
|
|
/**
|
* @brief 初始化OTA升级模块
|
* @return HIDO_OK: 成功, HIDO_ERR: 失败
|
*/
|
HIDO_INT32 OTA_Init(HIDO_VOID);
|
|
/**
|
* @brief 启动OTA固件下载
|
* @param _pcUrl: 固件下载URL(例如: "http://123.57.87.125:7001/hfs/STM32H743.Bin")
|
* @return HIDO_OK: 启动成功, 其他: 错误码
|
* @note 下载将自动写入加密固件区,支持断点续传
|
*/
|
HIDO_INT32 OTA_StartDownload(const HIDO_CHAR *_pcUrl);
|
|
/**
|
* @brief 启动固件解密
|
* @return HIDO_OK: 启动成功, 其他: 错误码
|
* @note 从加密区读取数据,使用AES-256-CBC解密后写入解密区
|
*/
|
HIDO_INT32 OTA_StartDecrypt(HIDO_VOID);
|
|
/**
|
* @brief 启动固件校验
|
* @return HIDO_OK: 校验成功, 其他: 错误码
|
* @note 读取固件末尾4字节校验和,计算并对比验证
|
*/
|
HIDO_INT32 OTA_VerifyFirmware(HIDO_VOID);
|
|
/**
|
* @brief 获取OTA升级信息
|
* @param _pstInfo: 返回的信息结构体指针
|
* @return HIDO_OK: 成功, HIDO_ERR: 失败
|
*/
|
HIDO_INT32 OTA_GetInfo(ST_OTAInfo *_pstInfo);
|
|
/**
|
* @brief 获取当前OTA状态
|
* @return 当前状态枚举值
|
*/
|
E_OTAState OTA_GetState(HIDO_VOID);
|
|
/**
|
* @brief 获取下载进度百分比
|
* @return 进度 0-100
|
*/
|
HIDO_UINT8 OTA_GetProgress(HIDO_VOID);
|
|
/**
|
* @brief 取消当前OTA操作
|
* @return HIDO_OK: 成功, HIDO_ERR: 失败
|
*/
|
HIDO_INT32 OTA_Cancel(HIDO_VOID);
|
|
/**
|
* @brief 重置OTA模块到空闲状态
|
* @note 清除所有状态和进度信息
|
*/
|
HIDO_VOID OTA_Reset(HIDO_VOID);
|
|
/**
|
* @brief OTA模块周期性任务
|
* @note 需要在主循环中周期调用,处理解密和校验等耗时任务
|
*/
|
HIDO_VOID OTA_Poll(HIDO_VOID);
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif /* __OTA_UPGRADE_H__ */
|