yincheng.zhong
2 天以前 567085ead3f6adaabd884f16ab4b17c62e8f0403
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*****************************************************************************
* @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__ */