소스 검색

更新MCU工程(iram版本和sram-nos版本)
新增CPU固件加载成功后进行二次校验的逻辑,避免加载失败导致启动异常(默认已屏蔽,根据需要自行开启)。

helen 1 개월 전
부모
커밋
cd54f2fb2e
2개의 변경된 파일75개의 추가작업 그리고 0개의 파일을 삭제
  1. 37 0
      amt630hv160-mcu/amt630hv160-mcu-iram/src/App/loader_cpu.c
  2. 38 0
      amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/App/loader_cpu.c

+ 37 - 0
amt630hv160-mcu/amt630hv160-mcu-iram/src/App/loader_cpu.c

@@ -8,6 +8,11 @@
 #include "mailbox_message.h"
 
 
+/*
+	打开CHECK_CPU_SUPPORT宏定义会影响动画、UI首帧时间,
+	cpuapp程序为(x)KB, 耗时约(0.09 * x)ms.
+*/
+//#define CHECK_CPU_SUPPORT
 #define APPLDR_CHECKSUM_OFFSET	20
 #define UPDATE_BUF_SIZE			(1024 * 128)
 
@@ -261,6 +266,32 @@ static void LoadCpuLoader(void)
 #endif
 }
 
+#ifdef CHECK_CPU_SUPPORT
+static int CheckCpuProgram(void)
+{
+	SysInfo *sysinfo = GetSysInfo();
+	u32 checksum;
+
+	checksum = *(uint32_t*)(CPU_IRAM_BASE + APPLDR_CHECKSUM_OFFSET);
+	*(uint32_t*)(CPU_IRAM_BASE + APPLDR_CHECKSUM_OFFSET) = 0;
+
+	if (checksum != xcrc32((void *)CPU_IRAM_BASE, sysinfo->loader_size, 0xFFFFFFFF, HARD_CALC_CRC)) {
+		printf("%s,cpuldr checksum error.\n", __func__);
+		return -1;
+	}
+
+	checksum = *(uint32_t*)(DDR_BASE + APPLDR_CHECKSUM_OFFSET);
+	*(uint32_t*)(DDR_BASE + APPLDR_CHECKSUM_OFFSET) = 0;
+
+	if (checksum != xcrc32((void *)DDR_BASE, sysinfo->app_size, 0xFFFFFFFF, HARD_CALC_CRC)) {
+		printf("%s,cpuapp checksum error.\n", __func__);
+		return -1;
+	}
+
+	return 0;
+}
+#endif
+
 void StartCpu(void)
 {
 #ifndef APP_FOR_BURN
@@ -273,6 +304,12 @@ void StartCpu(void)
 
 	SaveChipInfoForCpu();
 	LoadCpuLoader();
+
+#ifdef CHECK_CPU_SUPPORT
+	if (CheckCpuProgram())
+		return;
+#endif
+
 	SelCpuPadConfig();
 
 	//*(volatile uint32_t *)0x20000000 = 0xeafffffe;			// a7 while(1) debug cpu

+ 38 - 0
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/App/loader_cpu.c

@@ -7,6 +7,12 @@
 #include "fs/diskio.h"
 #include "mailbox_message.h"
 
+/*
+	打开CHECK_CPU_SUPPORT宏定义会影响动画、UI首帧时间,
+	cpuapp程序为(x)KB, 耗时约(0.37 * x)ms.
+*/
+//#define CHECK_CPU_SUPPORT
+#define APPLDR_CHECKSUM_OFFSET	20
 
 u8 cpu_running = 0;
 u8 cpu_access_status = 0;
@@ -258,6 +264,32 @@ static void LoadCpuLoader(void)
 #endif
 }
 
+#ifdef CHECK_CPU_SUPPORT
+static int CheckCpuProgram(void)
+{
+	SysInfo *sysinfo = GetSysInfo();
+	u32 checksum;
+
+	checksum = *(uint32_t*)(CPU_IRAM_BASE + APPLDR_CHECKSUM_OFFSET);
+	*(uint32_t*)(CPU_IRAM_BASE + APPLDR_CHECKSUM_OFFSET) = 0;
+
+	if (checksum != xcrc32((void *)CPU_IRAM_BASE, sysinfo->loader_size, 0xFFFFFFFF, HARD_CALC_CRC)) {
+		printf("%s,cpuldr checksum error.\n", __func__);
+		return -1;
+	}
+
+	checksum = *(uint32_t*)(DDR_BASE + APPLDR_CHECKSUM_OFFSET);
+	*(uint32_t*)(DDR_BASE + APPLDR_CHECKSUM_OFFSET) = 0;
+
+	if (checksum != xcrc32((void *)DDR_BASE, sysinfo->app_size, 0xFFFFFFFF, HARD_CALC_CRC)) {
+		printf("%s,cpuapp checksum error.\n", __func__);
+		return -1;
+	}
+
+	return 0;
+}
+#endif
+
 void StartCpu(void)
 {
 	/* DDR Init*/
@@ -268,6 +300,12 @@ void StartCpu(void)
 
 	SaveChipInfoForCpu();
 	LoadCpuLoader();
+
+#ifdef CHECK_CPU_SUPPORT
+	if (CheckCpuProgram())
+		return;
+#endif
+
 	SelCpuPadConfig();
 	//*(volatile uint32_t *)0x20000000 = 0xeafffffe;			// a7 while(1) debug cpu