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