nv_storage.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <string.h>
  2. #include "nv_storage.h"
  3. #include "bsp/AT24CXX.h"
  4. #include "app/sox/soc.h"
  5. #include "libs/logger.h"
  6. #include "libs/shark_utils.h"
  7. static void backup_timer_hander(shark_timer_t *timer);
  8. static void nv_save_soc_by_backup(int index);
  9. #define SOC_ADDR 0
  10. static shark_timer_t _save_backup_timer = {.handler = backup_timer_hander};
  11. #define SOC_SIZE (((sizeof(soc_t) + sizeof(uint16_t)) + 0xF)&(0xFFF0)) //ÐèÒª16×Ö½Ú¶ÔÆë
  12. #define SN_ADDR (SOC_ADDR + (SOC_SIZE * 2))
  13. int nv_save_sn(uint8_t *sn, int len){
  14. sn_t sn_info;
  15. if (len > sizeof(sn_info.sn)){
  16. return -1;
  17. }
  18. memcpy(sn_info.sn, sn, len);
  19. sn_info.len = len;
  20. sn_info.crc = shark_crc16_update(0, (const u8 *)sn_info.sn, len);
  21. return AT24CXX_Write(SN_ADDR, (uint8_t *)&sn_info, sizeof(sn_info));
  22. }
  23. int nv_read_sn(uint8_t *sn, int len){
  24. sn_t sn_info;
  25. if (len < sizeof(sn_info.sn)){
  26. return -1;
  27. }
  28. if (AT24CXX_Read(SN_ADDR, (uint8_t *)&sn_info, sizeof(sn_info)) < 0) {
  29. return -1;
  30. }
  31. if (sn_info.len > sizeof(sn_info.sn)){
  32. return -1;
  33. }
  34. uint16_t crc = shark_crc16_update(0, (const u8 *)sn_info.sn, sn_info.len);
  35. if (crc != sn_info.crc){
  36. return -1;
  37. }
  38. memcpy(sn, sn_info.sn, sn_info.len);
  39. return sn_info.len;
  40. }
  41. void nv_save_soc(void){
  42. nv_save_soc_by_backup(0);
  43. shark_timer_post(&_save_backup_timer, 10);
  44. }
  45. static void backup_timer_hander(shark_timer_t *timer){
  46. nv_save_soc_by_backup(1);
  47. }
  48. static void nv_save_soc_by_backup(int index){
  49. uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index;
  50. soc_t *soc = get_soc();
  51. uint16_t crc16 = shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t));
  52. AT24CXX_Write(nv_addr ,(uint8_t *)soc, sizeof(soc_t));
  53. AT24CXX_Write(nv_addr + sizeof(soc_t),(uint8_t *)&crc16, sizeof(crc16));
  54. }
  55. void nv_erase(void){
  56. uint8_t data = 0xFF;
  57. for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){
  58. AT24CXX_Write(SOC_ADDR + i, &data, 1);
  59. }
  60. for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){
  61. AT24CXX_Write(SOC_ADDR + (sizeof(soc_t) + sizeof(uint16_t)) + i, &data, 1);
  62. }
  63. }
  64. int nv_restore_soc_by_backup(int index, soc_t *soc){
  65. uint16_t crc_nv;
  66. uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index;
  67. AT24CXX_Read(nv_addr , (uint8_t *)soc, sizeof(soc_t));
  68. AT24CXX_Read(nv_addr + sizeof(soc_t), (uint8_t *)&crc_nv, sizeof(crc_nv));
  69. if (shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t)) != crc_nv){
  70. return -1;
  71. }
  72. return 0;
  73. }
  74. int nv_restore_soc(void){
  75. soc_t soc0, soc1;
  76. int success0, success1;
  77. success0 = nv_restore_soc_by_backup(0, &soc0);
  78. success1 = nv_restore_soc_by_backup(1, &soc1);
  79. printf("back %d-%d\n", success0, success1);
  80. if (success0 == 0 || success1 == 0){
  81. if (success1 != 0){
  82. nv_save_soc_by_backup(1);
  83. }
  84. if (success0 != 0){
  85. nv_save_soc_by_backup(0);
  86. }
  87. if (success0 == 0){
  88. *get_soc() = soc0;
  89. }else if (success1 == 0){
  90. *get_soc() = soc1;
  91. }
  92. }
  93. return ((success0 == 0) || (success1 == 0))?0:-1;
  94. }