nv_storage.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. #if 0
  8. static void backup_timer_hander(shark_timer_t *timer);
  9. static void nv_save_soc_by_backup(int index);
  10. #endif
  11. static void nv_save_soc_task(shark_timer_t *timer);
  12. #define SOC_ADDR 0
  13. static shark_timer_t _save_backup_timer = {.handler = nv_save_soc_task};
  14. #define SOC_SIZE (((sizeof(soc_t) + sizeof(uint16_t)) + 0xF)&(0xFFF0)) //需要16字节对齐
  15. #define SN_ADDR (SOC_ADDR + (SOC_SIZE * 2))
  16. static uint8_t soc_write_pending = 0;
  17. static uint8_t soc_write_backup_index = 0;
  18. static uint8_t soc_write_index = 0;
  19. static uint8_t soc_data[(sizeof(soc_t) + sizeof(uint16_t))];
  20. int nv_read_write_test(void){
  21. uint8_t data[32];
  22. memset(data, 0x5a, sizeof(data));
  23. AT24CXX_Write(0, data, sizeof(data));
  24. memset(data, 0x0, sizeof(data));
  25. AT24CXX_Read(0, data, sizeof(data));
  26. for (int i = 0; i < sizeof(data); i++){
  27. if (data[i] != 0x5a) {
  28. return 1;
  29. }
  30. }
  31. return 0;
  32. }
  33. int nv_save_sn(uint8_t *sn, int len){
  34. sn_t sn_info;
  35. if (len > sizeof(sn_info.sn)){
  36. return -1;
  37. }
  38. memcpy(sn_info.sn, sn, len);
  39. sn_info.len = len;
  40. sn_info.crc = shark_crc16_update(0, (const u8 *)sn_info.sn, len);
  41. return AT24CXX_Write(SN_ADDR, (uint8_t *)&sn_info, sizeof(sn_info));
  42. }
  43. int nv_read_sn(uint8_t *sn, int len){
  44. sn_t sn_info;
  45. if (len < sizeof(sn_info.sn)){
  46. return -1;
  47. }
  48. if (AT24CXX_Read(SN_ADDR, (uint8_t *)&sn_info, sizeof(sn_info)) < 0) {
  49. return -1;
  50. }
  51. if (sn_info.len > sizeof(sn_info.sn)){
  52. return -1;
  53. }
  54. uint16_t crc = shark_crc16_update(0, (const u8 *)sn_info.sn, sn_info.len);
  55. if (crc != sn_info.crc){
  56. return -1;
  57. }
  58. memcpy(sn, sn_info.sn, sn_info.len);
  59. return sn_info.len;
  60. }
  61. /* soc 保存,拆分每次保存一个byte,确保e2rom写操作不会占用太长时间 */
  62. void nv_save_soc(void){
  63. #if 0
  64. nv_save_soc_by_backup(0);
  65. shark_timer_post(&_save_backup_timer, 10);
  66. #else
  67. if (soc_write_pending == 0){
  68. soc_write_pending = 1;
  69. memcpy(soc_data, (void *)get_soc(), sizeof(soc_t));
  70. soc_write_backup_index = 0;
  71. soc_write_index = 0;
  72. uint16_t crc16 = shark_crc16_update(0, (const u8 *)soc_data, sizeof(soc_t));
  73. shark_encode_u16(soc_data + sizeof(soc_t), crc16);
  74. shark_timer_post(&_save_backup_timer, 0);
  75. }
  76. #endif
  77. }
  78. static void nv_save_soc_task(shark_timer_t *timer){
  79. if (soc_write_pending == 0) {
  80. return;
  81. }
  82. if (soc_write_index < sizeof(soc_data)){
  83. AT24CXX_Write(SOC_ADDR + SOC_SIZE * soc_write_backup_index + soc_write_index, soc_data + soc_write_index, 1);
  84. soc_write_index ++;
  85. }else {
  86. soc_write_index = 0;
  87. soc_write_backup_index ++;
  88. if (soc_write_backup_index == 2){
  89. soc_write_pending = 0;
  90. sys_debug("write soc to nv OK\n");
  91. return;
  92. }
  93. }
  94. shark_timer_post(&_save_backup_timer, 0);
  95. }
  96. #if 0
  97. static void backup_timer_hander(shark_timer_t *timer){
  98. nv_save_soc_by_backup(1);
  99. }
  100. #endif
  101. static void nv_save_soc_by_backup(int index){
  102. uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index;
  103. soc_t *soc = get_soc();
  104. uint16_t crc16 = shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t));
  105. AT24CXX_Write(nv_addr ,(uint8_t *)soc, sizeof(soc_t));
  106. AT24CXX_Write(nv_addr + sizeof(soc_t),(uint8_t *)&crc16, sizeof(crc16));
  107. }
  108. void nv_save_all_soc(void){
  109. nv_save_soc_by_backup(0);
  110. nv_save_soc_by_backup(1);
  111. }
  112. void nv_erase_soc(int index){
  113. uint8_t data = 0xFF;
  114. for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){
  115. AT24CXX_Write(SOC_ADDR + SOC_SIZE * index + i, &data, 1);
  116. }
  117. }
  118. int nv_restore_soc_by_backup(int index, soc_t *soc){
  119. uint16_t crc_nv;
  120. uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index;
  121. AT24CXX_Read(nv_addr , (uint8_t *)soc, sizeof(soc_t));
  122. AT24CXX_Read(nv_addr + sizeof(soc_t), (uint8_t *)&crc_nv, sizeof(crc_nv));
  123. if (shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t)) != crc_nv){
  124. return -1;
  125. }
  126. return 0;
  127. }
  128. int nv_restore_soc(void){
  129. soc_t soc0, soc1;
  130. int success0, success1;
  131. success0 = nv_restore_soc_by_backup(0, &soc0);
  132. success1 = nv_restore_soc_by_backup(1, &soc1);
  133. if (success0 == 0 || success1 == 0){
  134. if (success0 == 0){
  135. *get_soc() = soc0;
  136. }else if (success1 == 0){
  137. *get_soc() = soc1;
  138. }
  139. if (success1 != 0){
  140. nv_save_soc_by_backup(1);
  141. }
  142. if (success0 != 0){
  143. nv_save_soc_by_backup(0);
  144. }
  145. }
  146. sys_debug("soc bk0=%d, bk1=%d\n", success0, success1);
  147. return ((success0 == 0) || (success1 == 0))?0:-1;
  148. }