nv_storage.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "nv_storage.h"
  2. #include "bsp/AT24CXX.h"
  3. #include "app/sox/soc.h"
  4. #include "libs/logger.h"
  5. #include "libs/shark_utils.h"
  6. static void backup_timer_hander(shark_timer_t *timer);
  7. static void nv_save_soc_by_backup(int index);
  8. #define SOC_ADDR 0
  9. static shark_timer_t _save_backup_timer = {.handler = backup_timer_hander};
  10. #define SOC_SIZE (((sizeof(soc_t) + sizeof(uint16_t)) + 0xF)&(0xFFF0)) //ÐèÒª16×Ö½Ú¶ÔÆë
  11. void nv_save_soc(void){
  12. nv_save_soc_by_backup(0);
  13. shark_timer_post(&_save_backup_timer, 10);
  14. }
  15. static void backup_timer_hander(shark_timer_t *timer){
  16. nv_save_soc_by_backup(1);
  17. }
  18. static void nv_save_soc_by_backup(int index){
  19. uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index;
  20. soc_t *soc = get_soc();
  21. uint16_t crc16 = shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t));
  22. AT24CXX_Write(nv_addr ,(uint8_t *)soc, sizeof(soc_t));
  23. AT24CXX_Write(nv_addr + sizeof(soc_t),(uint8_t *)&crc16, sizeof(crc16));
  24. }
  25. void nv_erase(void){
  26. uint8_t data = 0xFF;
  27. for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){
  28. AT24CXX_Write(SOC_ADDR + i, &data, 1);
  29. }
  30. for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){
  31. AT24CXX_Write(SOC_ADDR + (sizeof(soc_t) + sizeof(uint16_t)) + i, &data, 1);
  32. }
  33. }
  34. int nv_restore_soc_by_backup(int index, soc_t *soc){
  35. uint16_t crc_nv;
  36. uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index;
  37. AT24CXX_Read(nv_addr , (uint8_t *)soc, sizeof(soc_t));
  38. AT24CXX_Read(nv_addr + sizeof(soc_t), (uint8_t *)&crc_nv, sizeof(crc_nv));
  39. if (shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t)) != crc_nv){
  40. return -1;
  41. }
  42. return 0;
  43. }
  44. int nv_restore_soc(void){
  45. soc_t soc0, soc1;
  46. int success0, success1;
  47. success0 = nv_restore_soc_by_backup(0, &soc0);
  48. success1 = nv_restore_soc_by_backup(1, &soc1);
  49. printf("back %d-%d\n", success0, success1);
  50. if ((success0 == 0) && (success1 != 0)){
  51. nv_save_soc_by_backup(1);
  52. *get_soc() = soc0;
  53. }
  54. if ((success0 != 0) && (success1 == 0)){
  55. nv_save_soc_by_backup(0);
  56. *get_soc() = soc1;
  57. }
  58. return ((success0 == 0) || (success1 == 0))?0:-1;
  59. }