#include "nv_storage.h" #include "bsp/AT24CXX.h" #include "app/sox/soc.h" #include "libs/logger.h" #include "libs/shark_utils.h" static void backup_timer_hander(shark_timer_t *timer); static void nv_save_soc_by_backup(int index); #define SOC_ADDR 0 static shark_timer_t _save_backup_timer = {.handler = backup_timer_hander}; #define SOC_SIZE (((sizeof(soc_t) + sizeof(uint16_t)) + 0xF)&(0xFFF0)) //ÐèÒª16×Ö½Ú¶ÔÆë void nv_save_soc(void){ nv_save_soc_by_backup(0); shark_timer_post(&_save_backup_timer, 10); } static void backup_timer_hander(shark_timer_t *timer){ nv_save_soc_by_backup(1); } static void nv_save_soc_by_backup(int index){ uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index; soc_t *soc = get_soc(); uint16_t crc16 = shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t)); AT24CXX_Write(nv_addr ,(uint8_t *)soc, sizeof(soc_t)); AT24CXX_Write(nv_addr + sizeof(soc_t),(uint8_t *)&crc16, sizeof(crc16)); } void nv_erase(void){ uint8_t data = 0xFF; for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){ AT24CXX_Write(SOC_ADDR + i, &data, 1); } for (int i = 0; i < sizeof(soc_t) + sizeof(uint16_t); i++){ AT24CXX_Write(SOC_ADDR + (sizeof(soc_t) + sizeof(uint16_t)) + i, &data, 1); } } int nv_restore_soc_by_backup(int index, soc_t *soc){ uint16_t crc_nv; uint16_t nv_addr = SOC_ADDR + SOC_SIZE * index; AT24CXX_Read(nv_addr , (uint8_t *)soc, sizeof(soc_t)); AT24CXX_Read(nv_addr + sizeof(soc_t), (uint8_t *)&crc_nv, sizeof(crc_nv)); if (shark_crc16_update(0, (const u8 *)soc, sizeof(soc_t)) != crc_nv){ return -1; } return 0; } int nv_restore_soc(void){ soc_t soc0, soc1; int success0, success1; success0 = nv_restore_soc_by_backup(0, &soc0); success1 = nv_restore_soc_by_backup(1, &soc1); printf("back %d-%d\n", success0, success1); if (success0 == 0 || success1 == 0){ if (success1 != 0){ nv_save_soc_by_backup(1); } if (success0 != 0){ nv_save_soc_by_backup(0); } if (success0 == 0){ *get_soc() = soc0; }else if (success1 == 0){ *get_soc() = soc1; } } return ((success0 == 0) || (success1 == 0))?0:-1; }