2025-12-25 12:07:06 +08:00
|
|
|
#ifndef __OTA_H
|
|
|
|
|
#define __OTA_H
|
|
|
|
|
|
|
|
|
|
#include "Can.h"
|
2026-01-01 01:39:19 +08:00
|
|
|
#include "aes128.h"
|
2025-12-25 12:07:06 +08:00
|
|
|
#include "config.h"
|
|
|
|
|
#include "gd32c10x.h"
|
2026-01-01 01:39:19 +08:00
|
|
|
#include <stdint.h>
|
2025-12-25 12:07:06 +08:00
|
|
|
|
|
|
|
|
class OTAHandler {
|
|
|
|
|
public:
|
2026-01-01 01:39:19 +08:00
|
|
|
u32 ota_stateota_time;
|
2026-01-07 23:14:15 +08:00
|
|
|
u32 received_size;
|
|
|
|
|
u32 expected_size;
|
2025-12-25 12:07:06 +08:00
|
|
|
|
|
|
|
|
void init();
|
|
|
|
|
void process();
|
2026-01-01 01:39:19 +08:00
|
|
|
bool isActive() const { return ota_state; }
|
2025-12-25 12:07:06 +08:00
|
|
|
|
2026-01-07 23:14:15 +08:00
|
|
|
void handleOTAMessage(u32 id, u8 *data, u8 len);
|
2025-12-25 12:07:06 +08:00
|
|
|
void jumpToApplication();
|
|
|
|
|
|
|
|
|
|
private:
|
2026-01-07 23:14:15 +08:00
|
|
|
u32 ota_time;
|
2025-12-25 12:07:06 +08:00
|
|
|
void eraseApplicationArea();
|
2026-01-07 23:14:15 +08:00
|
|
|
void writeApplicationData(u32 offset, u8 *data, u32 size);
|
2026-01-03 18:00:28 +08:00
|
|
|
bool verifyApplicationData(u32 offset, u8 *data, u32 size);
|
2026-01-01 01:39:19 +08:00
|
|
|
typedef enum {
|
|
|
|
|
OTA_STATE_IDLE = 0,
|
|
|
|
|
OTA_STATE_WAITING_RANDOM, // 第二阶段等待随机数
|
|
|
|
|
OTA_STATE_WAITING_CONFIRM, // 等待上位机确认
|
|
|
|
|
OTA_STATE_CHECKING_FIRMWARE,
|
|
|
|
|
OTA_STATE_RECEIVING_FIRMWARE,
|
|
|
|
|
OTA_STATE_FINISHED
|
|
|
|
|
} ota_state_t;
|
|
|
|
|
typedef enum {
|
|
|
|
|
OTA_ERROR_NONE = 0,
|
|
|
|
|
OTA_ERROR_TIMEOUT,
|
2026-01-03 18:00:28 +08:00
|
|
|
OTA_ERROR_FLASH_ERROR,
|
2026-01-01 01:39:19 +08:00
|
|
|
OTA_ERROR_INVALID_KEY,
|
|
|
|
|
OTA_ERROR_INVALID_PACKET,
|
|
|
|
|
OTA_ERROR_INVALID_HANDSHAKE,
|
|
|
|
|
OTA_ERROR_INVALID_CRC,
|
|
|
|
|
OTA_ERROR_INVALID_SIZE
|
|
|
|
|
} ota_error_t;
|
2026-01-03 18:00:28 +08:00
|
|
|
|
2026-01-07 23:14:15 +08:00
|
|
|
u8 device_uid[12]; // 从GD32 UID寄存器读取
|
|
|
|
|
u8 current_K_session[16];
|
|
|
|
|
u8 nonce_server[16];
|
2026-01-01 01:39:19 +08:00
|
|
|
|
|
|
|
|
aes128_context aes_ctx; // AES上下文
|
|
|
|
|
ota_state_t ota_state = OTA_STATE_IDLE;
|
|
|
|
|
ota_error_t ota_error = OTA_ERROR_NONE;
|
2025-12-25 12:07:06 +08:00
|
|
|
};
|
2026-01-07 23:14:15 +08:00
|
|
|
void getDeviceSerialNumber(u8 *buffer);
|
|
|
|
|
void calculate_crc32_with_key(const u8 *key, const u8 *data,
|
2026-01-01 01:39:19 +08:00
|
|
|
u8 *output);
|
2026-01-07 23:14:15 +08:00
|
|
|
void send_error_frame(u8 error);
|
2026-01-03 18:00:28 +08:00
|
|
|
bool validateApplication();
|
2026-01-05 00:52:20 +08:00
|
|
|
fmc_state_enum move_app_data();
|
|
|
|
|
|
2025-12-25 12:07:06 +08:00
|
|
|
#endif
|