Przeglądaj źródła

nv storage support backup0,1

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 lat temu
rodzic
commit
af4bcc8b95
1 zmienionych plików z 46 dodań i 13 usunięć
  1. 46 13
      Application/app/nv_storage.c

+ 46 - 13
Application/app/nv_storage.c

@@ -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;
 }