yincheng.zhong
昨天 c8240d55741f0ed86099a0a8c616f4fc68372134
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
/*****************************************************************************
* @file    BootMark.h
* @brief   Boot标记管理模块 - 负责读写APP启动标记
* @details Flash区域规划:
*          - Boot标记区:0x08020000-0x0803FFFF (128KB Flash参数表区)
*          - APP1标记:0x08020000 (32字节)
*          - APP2标记:0x08020020 (32字节)
*          - APP1区域:0x08080000-0x080BFFFF (256KB)
*          - APP2区域:0x080C0000-0x080FFFFF (256KB)
*          - OTA下载区:0x08100000-0x0813FFFF (Bank2第一个256KB)
* @author  AI Assistant
* @date    2025-12-21
*****************************************************************************/
 
#ifndef __BOOTMARK_H__
#define __BOOTMARK_H__
 
#ifdef __cplusplus
extern "C" {
#endif
 
/*****************************************************************************
* 头文件包含
*****************************************************************************/
#include "stm32h7xx_hal.h"
 
/*****************************************************************************
* 宏定义
*****************************************************************************/
// Flash地址定义 (Single Bank with Staging 架构)
// BANK 1
#define BOOT_LOADER_ADDR        0x08000000  // Bootloader (128KB)
#define BOOT_MARK_BASE_ADDR     0x08020000  // BootMark / Config (128KB)
#define BOOT_APP_ADDR           0x08040000  // APP 运行区 (256KB)
 
// BANK 2
#define BOOT_OTA_DOWNLOAD_ADDR  0x08100000  // OTA加密下载区 (256KB)
#define BOOT_OTA_STAGING_ADDR   0x08140000  // OTA解密暂存区 (256KB)
#define BOOT_PARAM_ADDR         0x08180000  // 参数存储区 (128KB)
#define BOOT_PATH_ADDR          0x081A0000  // 路径存储区 (128KB)
 
#define BOOT_APP_MAX_SIZE       (256 * 1024)  // APP最大大小:256KB
 
// 魔术字和标志
#define BOOT_MARK_MAGIC         0x424F4F54  // "BOOT" ASCII码
#define BOOT_UPDATE_PENDING     0x5A5A5A5A  // 待更新标志
#define BOOT_UPDATE_NONE        0x00000000  // 无更新
 
// 返回值定义
#define BOOT_OK                 0           // 成功
#define BOOT_ERR_PARAM          -1          // 参数错误
#define BOOT_ERR_FLASH          -2          // Flash操作失败
#define BOOT_ERR_CRC            -3          // CRC校验失败
#define BOOT_ERR_MAGIC          -4          // 魔术字错误
#define BOOT_ERR_NO_UPDATE      -5          // 没有待处理的更新
 
/*****************************************************************************
* 数据类型定义
*****************************************************************************/
 
/**
 * @brief Boot标记结构体(32字节对齐)
 */
typedef struct {
    uint32_t u32Magic;           // 魔术字:0x424F4F54 ("BOOT")
    uint32_t u32UpdateFlag;      // 更新标志:0x5A5A5A5A = 有更新待处理
    uint32_t u32FirmwareSize;    // 暂存区固件大小
    uint32_t u32FirmwareCRC;     // 暂存区固件CRC32
    uint32_t u32Version;         // 新固件版本号
    uint32_t u32SrcAddress;      // 源地址(暂存区)
    uint32_t u32DstAddress;      // 目标地址(APP运行区)
    uint32_t u32BootMarkCRC;     // 本结构体的CRC32(除本字段外的前28字节)
} BootMark_t;
 
/*****************************************************************************
* 函数声明
*****************************************************************************/
 
/**
 * @brief 初始化Boot标记模块
 * @return BOOT_OK=成功,其他=失败
 */
int32_t BootMark_Init(void);
 
/**
 * @brief 读取Boot标记
 * @param pMark 输出Boot标记结构体
 * @return BOOT_OK=成功,BOOT_ERR_CRC=CRC错误,BOOT_ERR_MAGIC=魔术字错误
 */
int32_t BootMark_Read(BootMark_t *pMark);
 
/**
 * @brief 写入Boot标记(请求更新)
 * @param pMark Boot标记结构体
 * @return BOOT_OK=成功,其他=失败
 */
int32_t BootMark_Write(const BootMark_t *pMark);
 
/**
 * @brief 清除Boot标记(更新完成或取消)
 * @return BOOT_OK=成功,其他=失败
 */
int32_t BootMark_Clear(void);
 
/**
 * @brief 验证暂存区固件完整性(CRC32校验)
 * @param pMark Boot标记(包含暂存区地址、大小、CRC)
 * @return BOOT_OK=校验通过,BOOT_ERR_CRC=校验失败
 */
int32_t BootMark_VerifyStaging(const BootMark_t *pMark);
 
/**
 * @brief 计算Boot标记的CRC32(用于pMark->u32BootMarkCRC字段)
 * @param pMark Boot标记结构体
 * @return CRC32值
 */
uint32_t BootMark_CalculateCRC(const BootMark_t *pMark);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __BOOTMARK_H__ */