/* * Copyright (c) 2026, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2026-03-09 user first version */ #ifndef __PARABAK_H__ #define __PARABAK_H__ #include #include #include "ym310_protecl.h" extern SYS_INFO sys_info; extern DEV_INFO dev_info; extern LIMIT limit; /* 与 ecode 中一致的时间结构体 */ struct parabak_tm { uint8_t tm_sec; uint8_t tm_min; uint8_t tm_hour; uint8_t tm_mday; uint8_t tm_mon; uint8_t tm_year; }; /* 备份项编号枚举,需与备份表一一对应 */ typedef enum { PARABAK_ID_SYS_INFO = 0, /* sys_info 结构体 */ PARABAK_ID_DEV_INFO, /* dev_info 结构体 */ PARABAK_ID_LIMIT, /* limit 结构体 */ /* 可继续添加 */ PARABAK_ID_MAX } parabak_id_t; /* 备份头部结构(存储于每个分区的第一个扇区,大小 32 字节) */ typedef struct { uint32_t magic; /* 魔数,标识已初始化 (例如 0x50415241) */ uint32_t version; /* 版本号,用于区分不同格式 */ uint32_t data_len; /* 数据实际长度(字节) */ uint32_t data_crc; /* 数据 CRC32 校验值 */ struct parabak_tm time_stamp; /* 备份时间戳 */ uint8_t state; /* 状态:0=未备份, 1=已备份, 2=已还原 */ uint8_t reserved[9]; /* 保留,对齐到 32 字节 (32 - 4*4 - 6 -1 = 32-23=9) */ } parabak_header_t; /* 备份项信息表(由用户在外部定义,此处仅声明) */ typedef struct { parabak_id_t id; /* 编号 */ void *data_ptr; /* 内存中的结构体指针 */ size_t data_size; /* 结构体大小 */ const char *partition_name; /* FAL 分区名,分区大小应为 8KB */ const char *env_key; /* EasyFlash 键名,用于写入 env */ } parabak_item_t; /* 初始化备份模块(创建互斥锁等) */ int parabak_init(void); /* 备份指定编号的结构体到对应分区 */ int parabak_backup(parabak_id_t id); /* 校验指定编号的备份与内存是否一致(0=一致,-1=不一致或错误) */ int parabak_verify(parabak_id_t id); /* 从备份还原到内存(不写入 env) */ int parabak_restore(parabak_id_t id); /* 自检备份区域:检查头部和数据 CRC 是否一致,返回当前状态(-1 错误,0 未备份,1 已备份,2 已还原) */ int parabak_self_check(parabak_id_t id, parabak_header_t *hdr); /* 获取备份头信息(可用于查看时间戳等) */ int parabak_get_header(parabak_id_t id, parabak_header_t *hdr); /** * @brief 自动校验所有备份区,对状态为已备份的分区进行校验,失败则还原 * @return 0 所有正常,>0 被还原的第一个分区ID,-1 系统错误 */ int parabak_auto_check(void); #endif /* __PARABAK_H__ */