parabak.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (c) 2026, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2026-03-09 user first version
  9. */
  10. #ifndef __PARABAK_H__
  11. #define __PARABAK_H__
  12. #include <rtthread.h>
  13. #include <stdint.h>
  14. #include "ym310_protecl.h"
  15. extern SYS_INFO sys_info;
  16. extern DEV_INFO dev_info;
  17. extern LIMIT limit;
  18. /* 与 ecode 中一致的时间结构体 */
  19. struct parabak_tm
  20. {
  21. uint8_t tm_sec;
  22. uint8_t tm_min;
  23. uint8_t tm_hour;
  24. uint8_t tm_mday;
  25. uint8_t tm_mon;
  26. uint8_t tm_year;
  27. };
  28. /* 备份项编号枚举,需与备份表一一对应 */
  29. typedef enum
  30. {
  31. PARABAK_ID_SYS_INFO = 0, /* sys_info 结构体 */
  32. PARABAK_ID_DEV_INFO, /* dev_info 结构体 */
  33. PARABAK_ID_LIMIT, /* limit 结构体 */
  34. /* 可继续添加 */
  35. PARABAK_ID_MAX
  36. } parabak_id_t;
  37. /* 备份头部结构(存储于每个分区的第一个扇区,大小 32 字节) */
  38. typedef struct
  39. {
  40. uint32_t magic; /* 魔数,标识已初始化 (例如 0x50415241) */
  41. uint32_t version; /* 版本号,用于区分不同格式 */
  42. uint32_t data_len; /* 数据实际长度(字节) */
  43. uint32_t data_crc; /* 数据 CRC32 校验值 */
  44. struct parabak_tm time_stamp; /* 备份时间戳 */
  45. uint8_t state; /* 状态:0=未备份, 1=已备份, 2=已还原 */
  46. uint8_t reserved[9]; /* 保留,对齐到 32 字节 (32 - 4*4 - 6 -1 = 32-23=9) */
  47. } parabak_header_t;
  48. /* 备份项信息表(由用户在外部定义,此处仅声明) */
  49. typedef struct
  50. {
  51. parabak_id_t id; /* 编号 */
  52. void *data_ptr; /* 内存中的结构体指针 */
  53. size_t data_size; /* 结构体大小 */
  54. const char *partition_name; /* FAL 分区名,分区大小应为 8KB */
  55. const char *env_key; /* EasyFlash 键名,用于写入 env */
  56. } parabak_item_t;
  57. /* 初始化备份模块(创建互斥锁等) */
  58. int parabak_init(void);
  59. /* 备份指定编号的结构体到对应分区 */
  60. int parabak_backup(parabak_id_t id);
  61. /* 校验指定编号的备份与内存是否一致(0=一致,-1=不一致或错误) */
  62. int parabak_verify(parabak_id_t id);
  63. /* 从备份还原到内存(不写入 env) */
  64. int parabak_restore(parabak_id_t id);
  65. /* 自检备份区域:检查头部和数据 CRC 是否一致,返回当前状态(-1 错误,0 未备份,1 已备份,2 已还原) */
  66. int parabak_self_check(parabak_id_t id, parabak_header_t *hdr);
  67. /* 获取备份头信息(可用于查看时间戳等) */
  68. int parabak_get_header(parabak_id_t id, parabak_header_t *hdr);
  69. /**
  70. * @brief 自动校验所有备份区,对状态为已备份的分区进行校验,失败则还原
  71. * @return 0 所有正常,>0 被还原的第一个分区ID,-1 系统错误
  72. */
  73. int parabak_auto_check(void);
  74. #endif /* __PARABAK_H__ */