#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