|
|
@@ -4,17 +4,29 @@
|
|
|
#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
|
|
|
|
|
|
+#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));
|
|
|
- u64 start_time = shark_get_mseconds();
|
|
|
- AT24CXX_Write(SOC_ADDR ,(uint8_t *)soc, sizeof(soc_t));
|
|
|
- AT24CXX_Write(SOC_ADDR + sizeof(soc_t),(uint8_t *)&crc16, sizeof(crc16));
|
|
|
- printf("write e2rom time %lld\n", (shark_get_mseconds() - start_time));
|
|
|
+ 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){
|
|
|
@@ -22,20 +34,41 @@ void nv_erase(void){
|
|
|
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(void){
|
|
|
- soc_t soc;
|
|
|
- AT24CXX_Read(SOC_ADDR , (uint8_t *)&soc, sizeof(soc_t));
|
|
|
- uint16_t crc16 = shark_crc16_update(0, (const u8 *)&soc, sizeof(soc_t));
|
|
|
+int nv_restore_soc_by_backup(int index, soc_t *soc){
|
|
|
uint16_t crc_nv;
|
|
|
- AT24CXX_Read(SOC_ADDR + sizeof(soc_t), (uint8_t *)&crc_nv, sizeof(crc_nv));
|
|
|
- if (crc_nv != crc16) {
|
|
|
+ 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;
|
|
|
+}
|
|
|
|
|
|
- *get_soc() = soc;
|
|
|
|
|
|
- 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)){
|
|
|
+ nv_save_soc_by_backup(1);
|
|
|
+ *get_soc() = soc0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((success0 != 0) && (success1 == 0)){
|
|
|
+ nv_save_soc_by_backup(0);
|
|
|
+ *get_soc() = soc1;
|
|
|
+ }
|
|
|
+ return ((success0 == 0) || (success1 == 0))?0:-1;
|
|
|
}
|
|
|
|