Files
chrg/apps/boot/application/include/app.h
T
2025-09-17 09:11:22 +08:00

92 lines
4.2 KiB
C

#ifndef __APP_H__
#define __APP_H__
#include "firmware.h"
#include "ymodem.h"
#include "transfer.h"
#include "utils.h"
typedef enum {
EXE_FLOW_NOTHING = 0x00,
EXE_FLOW_ACCIDENT_UPDATE, /* 意外更新固件流程 */
EXE_FLOW_NEED_HOST_SEND_FIRMWARE, /* 需要主机下发固件包 */
EXE_FLOW_FIND_RUNNING_FIRMWARE, /* (0) 在各分区查找可运行的固件 */
EXE_FLOW_WAIT_FIRMWARE, /* 等待接收固件包 */
EXE_FLOW_VERIFY_FIRMWARE_HEAD, /* (1) 校验收到的固件包头 */
EXE_FLOW_ERASE_OLD_FIRMWARE, /* 擦除旧固件 */
EXE_FLOW_ERASE_OLD_FIRMWARE_DONE, /* 完成擦除旧固件 */
EXE_FLOW_WRITE_FIRMWARE_HEAD, /* 将固件包头写入 flash */
EXE_FLOW_WRITE_FIRMWARE_HEAD_DONE, /* 完成固件包头的写入 */
EXE_FLOW_VERIFY_FIRMWARE_PKG, /* (2) 校验固件分包数据的正确性 */
EXE_FLOW_WRITE_NEW_FIRMWARE, /* 写入新的固件分包到分区 */
EXE_FLOW_WRITE_NEW_FIRMWARE_DONE, /* 写入新的固件分包完成 */
EXE_FLOW_UPDATE_FIRMWARE, /* (3) 开始更新固件 */
EXE_FLOW_VERIFY_FIRMWARE, /* 校验整个固件包体的数据正确性 */
EXE_FLOW_VERIFY_FIRMWARE_DONE, /* 完成校验整个固件包体的数据正确性 */
EXE_FLOW_ERASE_APP, /* 擦除 APP 分区的固件 */
EXE_FLOW_UPDATE_TO_APP, /* 将其它分区的固件更新到 APP 分区 */
EXE_FLOW_VERIFY_APP, /* 校验 APP 分区固件的数据正确性 */
EXE_FLOW_UPDATE_TO_APP_DONE, /* 校验 APP 分区固件通过后,将剩余数据写入 */
EXE_FLOW_ERASE_DOWNLOAD, /* 擦除 download 分区 */
EXE_FLOW_ERASE_DOWNLOAD_DONE, /* 完成擦除 download 分区 */
EXE_FLOW_JUMP_TO_APP, /* 跳转至 APP 运行 */
EXE_FLOW_RECOVERY, /* 恢复出厂固件 */
EXE_FLOW_FAILED, /* 失败流程 */
} eFLOW;
/* 固件更新的缩略步骤,用于计算固件更新的进度 */
typedef enum {
STEP_VERIFY_FIRMWARE = 0x00, /* 校验接收到的固件包 */
STEP_ERASE_APP, /* 擦除 APP 分区 */
STEP_UPDATE_TO_APP, /* 更新固件包到 APP 分区 */
STEP_VERIFY_APP, /* 校验 APP 固件 */
STEP_ERASE_DOWNLOAD, /* 擦除 download 分区 */
} eSTAGE;
/* 应用状态 */
typedef enum {
BOOT_STATUS_NONE = 0x00,
BOOT_STATUS_NO_UPDATE, /* 无须更新固件的标志 */
BOOT_STATUS_ENTER_UPDATE_MODE, /* 进入固件更新模式的标志 */
BOOT_STATUS_ACCIDENT_UPDATE, /* 意外更新固件中 */
BOOT_STATUS_UPDATE_SUCCESS, /* 更新固件成功 */
BOOT_STATUS_UPDATE_FAILED, /* 更新固件失败 */
BOOT_STATUS_NO_FIRMWARE, /* 无任何可用固件 */
BOOT_STATUS_NO_APP, /* 无 APP 固件 */
BOOT_STATUS_READ_PART_ERR, /* 读取分区失败 */
BOOT_STATUS_APP_VERIFY_ERR, /* APP 固件校验错误 */
BOOT_STATUS_APP_CAN_NOT_VERIFY, /* APP 固件无法校验 */
BOOT_STATUS_AUTO_UPDATE_FAILED, /* 自动更新失败 */
} eSTATE;
struct upgrade_t {
eSTATE state; /* 记录 bootloader 所处的状态 */
eFLOW flow; /* 应用执行的流程 */
eSTAGE stage; /* 固件的更新阶段,便于程序判断 progress 的增加系数 */
eRESULT result; /* 指令执行结果 */
eErrCode errCode; /* 指令执行失败时的故障码 */
uint8_t start :1; /* 开始固件更新流程的标志 */
uint8_t :0;
uint8_t progress; /* 固件更新的总进度, 0-100 */
};
extern void System_Init (void);
extern void APP_Init (void);
extern void APP_Running (void);
#endif