From 7ce822975ccab879cdad9ca45d189e3356af9464 Mon Sep 17 00:00:00 2001 From: payton Date: Tue, 24 Oct 2023 17:08:35 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=BD=AF=E5=8D=87=E7=BA=A7=E6=94=B9=E5=88=B0?= =?UTF-8?q?uboot=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../na51089_evb_cardv_defconfig_release | 3 +- .../board/novatek/nvt-na51089/na51089evb.c | 46 +++ .../cardv/SrcCode/PrjCfg_HUNTING_S550.h | 1 + .../source/cardv/SrcCode/System/SysMain_Exe.c | 2 +- .../cardv/SrcCode/UIApp/Photo/UIAppPhoto.h | 18 + .../SrcCode/UIApp/Photo/UIAppPhoto_Exe.c | 4 + .../SrcCode/UIApp/Photo/UIAppPhoto_cmd.c | 58 ++++ .../UIApp/Transcode/UIAppTranscode_Exe.c | 4 +- .../lib/source/sifar/code/include/sf_common.h | 2 + .../sifar/code/source/common/sf_common.c | 72 +++- loader/ARC/Lib/Release/STRGEXT_Sdio1.a | Bin 4100 -> 4100 bytes loader/ARC/Lib/Release/STRGINT_SpiFlash.a | Bin 10312 -> 10632 bytes loader/Include/loader.h | 2 +- loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c | 324 +++++++++++++++++- loader/Project/Model/Src/prj_main.c | 36 +- loader/Project/Model/Src/prj_main.h | 19 + 16 files changed, 579 insertions(+), 12 deletions(-) diff --git a/BSP/linux-kernel/arch/arm/configs/na51089_evb_cardv_defconfig_release b/BSP/linux-kernel/arch/arm/configs/na51089_evb_cardv_defconfig_release index bf91df8fe..c44170d64 100644 --- a/BSP/linux-kernel/arch/arm/configs/na51089_evb_cardv_defconfig_release +++ b/BSP/linux-kernel/arch/arm/configs/na51089_evb_cardv_defconfig_release @@ -1436,7 +1436,8 @@ CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set -# CONFIG_NA51055_WATCHDOG is not set +CONFIG_NA51055_WATCHDOG=y +# CONFIG_NA51055_WATCHDOG_EXTERNAL_RESET is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_FTWDT010_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set diff --git a/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c b/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c index 5f0b575b4..ec508534f 100755 --- a/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c +++ b/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c @@ -127,12 +127,35 @@ int board_eth_init(bd_t *bis) } #ifdef CONFIG_NVT_IVOT_SOC_FW_UPDATE_SUPPORT + +#define MAKEFOURCC(ch0, ch1, ch2, ch3) ((unsigned int)(unsigned char)(ch0) | ((unsigned int)(unsigned char)(ch1) << 8) | ((unsigned int)(unsigned char)(ch2) << 16) | ((unsigned int)(unsigned char)(ch3) << 24 )) +#define WDT_REG_ADDR(ofs) (IOADDR_WDT_REG_BASE+(ofs)) +#define WDT_GETREG(ofs) INW(WDT_REG_ADDR(ofs)) +#define WDT_SETREG(ofs,value) OUTW(WDT_REG_ADDR(ofs), (value)) + +typedef enum { + WDT_OTA_STS_INVALID = 0, + WDT_OTA_STS_LOADER_DETECTING_FW, + WDT_OTA_STS_UBOOT_UPDATE_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_OPEN_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_READ_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_NO_NEED, + WDT_OTA_STS_UBOOT_UPDATE_UNKNOWN, + WDT_OTA_STS_UBOOT_UPDATE_OK, /* uboot stage ok */ + WDT_OTA_STS_LINUX_TRIGGER, /* linux stage trigger ota */ +} WDT_OTA_STS; + +#define WDT_OTA_MAKEFOURCC(sts) MAKEFOURCC('O','T','A', sts) +#define WDT_OTA_SET_STS(sts) WDT_SETREG(0x84, WDT_OTA_MAKEFOURCC(sts)) +#define WDT_OTA_GET_STS() WDT_GETREG(0x84) + static int nvt_handle_fw_abin(void) { int ret = 0; char cmdline[1024] = {0}; char buf[1024] = {0}; int ota_upgrade_sts = 0; + int is_ota = (WDT_OTA_GET_STS() == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LOADER_DETECTING_FW)) ? 1 : 0; /* To handle firmware update */ ret = nvt_fw_update(false); @@ -140,19 +163,38 @@ static int nvt_handle_fw_abin(void) switch (ret) { case ERR_NVT_UPDATE_FAILED: printf("%sUpdate fail %s\r\n", ANSI_COLOR_RED, ANSI_COLOR_RESET); + + if(is_ota) + WDT_OTA_SET_STS(WDT_OTA_STS_UBOOT_UPDATE_FAILED); + return -1; break; case ERR_NVT_UPDATE_OPENFAILED: printf("Open SD fail:%s No SD device? %s\r\n", ANSI_COLOR_YELLOW, ANSI_COLOR_RESET); + + if(is_ota) + WDT_OTA_SET_STS(WDT_OTA_STS_UBOOT_UPDATE_OPEN_FAILED); + break; case ERR_NVT_UPDATE_READ_FAILED: printf("%sRead SD fail %s\r\n", ANSI_COLOR_RED, ANSI_COLOR_RESET); + + if(is_ota) + WDT_OTA_SET_STS(WDT_OTA_STS_UBOOT_UPDATE_READ_FAILED); + return -1; break; case ERR_NVT_UPDATE_NO_NEED: printf("%sNo need to update (%s) %s\r\n", ANSI_COLOR_YELLOW, get_nvt_bin_name(NVT_BIN_NAME_TYPE_FW), ANSI_COLOR_RESET); + + if(is_ota) + WDT_OTA_SET_STS(WDT_OTA_STS_UBOOT_UPDATE_NO_NEED); + break; default: + if(is_ota) + WDT_OTA_SET_STS(WDT_OTA_STS_UBOOT_UPDATE_UNKNOWN); + break; } ret = nvt_fdt_init(true); @@ -162,6 +204,9 @@ static int nvt_handle_fw_abin(void) } else{ printf("%s%s:%d Update successfully %s\r\n", ANSI_COLOR_YELLOW, __FUNCTION__, __LINE__, ANSI_COLOR_RESET); ota_upgrade_sts = 1; + + if(is_ota) + WDT_OTA_SET_STS(WDT_OTA_STS_UBOOT_UPDATE_OK); } /* * To handle bootargs expanding for the kernel /proc/cmdline and uboot mtdids env setting @@ -175,6 +220,7 @@ static int nvt_handle_fw_abin(void) if (ota_upgrade_sts == 1) { strcat(cmdline, "ota_flag=0x1"); } + env_set("bootargs",cmdline); return 0; diff --git a/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h b/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h index 8a4c1be46..bd02a19ee 100755 --- a/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h +++ b/code/application/source/cardv/SrcCode/PrjCfg_HUNTING_S550.h @@ -970,6 +970,7 @@ #define SF_CAM_UP_FILE "S530.tar.bz2" #define SF_CAM_UP_FILE_PATH "/mnt/sd/S530.tar.bz2" #define SF_CAMERA_GPS_INFO_FILENAME SF_SD_ROOT"/gps.txt" +#define SF_UBOOT_UPDATA_FW ENABLE //////////////////////sf end/////////////////////////////// /******************************************************************************************* diff --git a/code/application/source/cardv/SrcCode/System/SysMain_Exe.c b/code/application/source/cardv/SrcCode/System/SysMain_Exe.c index e5b987596..6ec76d4bf 100755 --- a/code/application/source/cardv/SrcCode/System/SysMain_Exe.c +++ b/code/application/source/cardv/SrcCode/System/SysMain_Exe.c @@ -158,7 +158,7 @@ INT32 System_GetBootFirstMode(void) { return PRIMARY_MODE_PHOTO; } - else if((PWR_ON_SETUP != PowerOnMode) || (sf_get_fw_update())) + else if((PWR_ON_SETUP != PowerOnMode) /*|| (sf_get_fw_update())*/) { return PRIMARY_MODE_TRANSCODE; } diff --git a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h index 6ba18bf35..0717d5ef0 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h +++ b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto.h @@ -329,6 +329,24 @@ typedef enum { UIAPPPHOTO_FRAME_CMD_MAX } UIAPPPHOTO_FRAME_CMD; +#define IOADDR_WDT_REG_BASE (0xF0050000) +#define WDT_REG_ADDR(ofs) (IOADDR_WDT_REG_BASE+(ofs)) +#define WDT_DATA_OFS 0x84 + +typedef enum { + WDT_OTA_STS_INVALID = 0, + WDT_OTA_STS_LOADER_DETECTING_FW, + WDT_OTA_STS_UBOOT_UPDATE_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_OPEN_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_READ_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_NO_NEED, + WDT_OTA_STS_UBOOT_UPDATE_UNKNOWN, + WDT_OTA_STS_UBOOT_UPDATE_OK, + WDT_OTA_STS_LINUX_TRIGGER, +} WDT_OTA_STS; + +#define WDT_OTA_MAKEFOURCC(sts) MAKEFOURCC('O','T','A', sts) + typedef struct _PhotoFrameDataType { UINT32 offset; UINT32 size; diff --git a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c index 497f18a3f..d7df8b1a3 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c +++ b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_Exe.c @@ -4037,6 +4037,10 @@ INT32 PhotoExe_OnNR(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray) INT32 PhotoExe_OnFocusEnd(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray) { + extern UIMenuStoreInfo currentInfo; + currentInfo.OtaFlag = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER); + + Save_MenuInfo(); return NVTEVT_CONSUME; } diff --git a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_cmd.c b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_cmd.c index c1edb8f83..2596facc9 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_cmd.c +++ b/code/application/source/cardv/SrcCode/UIApp/Photo/UIAppPhoto_cmd.c @@ -581,6 +581,62 @@ static BOOL cmd_photo_trigger_cap(unsigned char argc, char **argv) } +static BOOL cmd_photo_ota_trigger(unsigned char argc, char **argv) +{ + UINT32 uiUserData = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER); + char cmd[128]={0}; + + Ux_PostEvent(NVTEVT_ALGMSG_FOCUSEND, 0); + + sprintf(cmd, "mem w %x %x",WDT_REG_ADDR(WDT_DATA_OFS),uiUserData); + system(cmd); + system("watchdog -T 1 -t 5 /dev/watchdog"); + + return TRUE; +} + +static BOOL cmd_photo_ota_result(unsigned char argc, char **argv) +{ + + system("devmem 0xF0050084 32 > /tmp/ota_sts"); + + FILE* fd = fopen("/tmp/ota_sts", "r"); + char buf[16]; + UINT32 ota_mask = 0x00FFFFFF; /* mask status */ + UINT32 ota_prefix = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_UBOOT_UPDATE_OK) & ota_mask; /* OTA */ + + if(fd){ + + buf[11] = '\0'; + fread(buf, 10, 1, fd); + DBG_DUMP("ota_sts_str = %s\n", buf); + + UINT32 ota_sts = strtoul(buf, NULL, 16); + + DBG_DUMP("ota_sts = %08X , masked = %08X\n", ota_sts, ota_sts & ota_mask); + + /* OTA success */ + if(ota_sts == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_UBOOT_UPDATE_OK)){ + DBG_DUMP("update ok!\n"); + } + /* not OTA */ + else if(ota_sts == 0x0){ + DBG_DUMP("not ota\n"); + } + /* OTA wrong status */ + else if ((ota_sts & ota_mask) == ota_prefix){ + DBG_DUMP("ota error!\n"); + } + + } + else{ + DBG_ERR("/tmp/ota_sts not found!\n"); + } + + return TRUE; +} + + static SXCMD_BEGIN(uiphoto_cmd_tbl, "uiphoto_cmd_tbl") SXCMD_ITEM("fd %", cmd_fd, "fd off/on, indxe value 0 ~ 1") SXCMD_ITEM("ev %", cmd_ev, "ev -2 ~ +2, index value 0 ~ 12") @@ -604,6 +660,8 @@ SXCMD_ITEM("quefull %", cmd_quefull, "ui queue full") SXCMD_ITEM("dumpfdb", cmd_photo_dumpfdb, "dump filedb 0") SXCMD_ITEM("photo %", cmd_photo, "photo mode setting") SXCMD_ITEM("cap", cmd_photo_trigger_cap, "trigger cap") +SXCMD_ITEM("ota_trigger %", cmd_photo_ota_trigger, "ota trigger") +SXCMD_ITEM("ota_result %", cmd_photo_ota_result, "ota result") SXCMD_END() diff --git a/code/application/source/cardv/SrcCode/UIApp/Transcode/UIAppTranscode_Exe.c b/code/application/source/cardv/SrcCode/UIApp/Transcode/UIAppTranscode_Exe.c index f8fe77698..6125d3614 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Transcode/UIAppTranscode_Exe.c +++ b/code/application/source/cardv/SrcCode/UIApp/Transcode/UIAppTranscode_Exe.c @@ -107,7 +107,7 @@ static HD_RESULT _TranscodeExe_CommPool_Init(void) /* src image yuv buffer */ mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE() + _TranscodeExe_Get_Max_Cap_Buf_Size(); - #if HUNTING_CAMERA_MCU == ENABLE + #if (HUNTING_CAMERA_MCU == ENABLE) && (SF_UBOOT_UPDATA_FW != ENABLE) if(sf_get_fw_update()) { mem_cfg.pool_info[id].blk_cnt = 0; @@ -124,7 +124,7 @@ static HD_RESULT _TranscodeExe_CommPool_Init(void) id++; mem_cfg.pool_info[id].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[id].blk_size = DBGINFO_BUFSIZE() + _TranscodeExe_Get_Target_Buf_Size(); - #if HUNTING_CAMERA_MCU == ENABLE + #if (HUNTING_CAMERA_MCU == ENABLE) && (SF_UBOOT_UPDATA_FW != ENABLE) if(sf_get_fw_update()) { mem_cfg.pool_info[id].blk_cnt = 0; diff --git a/code/lib/source/sifar/code/include/sf_common.h b/code/lib/source/sifar/code/include/sf_common.h index 6e149a5e1..c1a7116d6 100755 --- a/code/lib/source/sifar/code/include/sf_common.h +++ b/code/lib/source/sifar/code/include/sf_common.h @@ -136,4 +136,6 @@ void sf_set_wifi_socket(int fd); int sf_get_wifi_socket(void); BOOL sf_cmd_para_printf(unsigned char argc, char **argv); BOOL cmd_blu_switch(unsigned char argc, char **argv); +BOOL sf_ota_trigger(void); +BOOL sf_ota_result(void); #endif diff --git a/code/lib/source/sifar/code/source/common/sf_common.c b/code/lib/source/sifar/code/source/common/sf_common.c index 275bff57c..854adf5de 100755 --- a/code/lib/source/sifar/code/source/common/sf_common.c +++ b/code/lib/source/sifar/code/source/common/sf_common.c @@ -2067,11 +2067,73 @@ static UINT32 sf_fwupdate(void) return result; } +BOOL sf_ota_trigger(void) +{ + UINT32 uiUserData = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER); + char cmd[128]={0}; + + Ux_PostEvent(NVTEVT_ALGMSG_FOCUSEND, 0); + + sprintf(cmd, "mem w %x %x",WDT_REG_ADDR(WDT_DATA_OFS),uiUserData); + system(cmd); + system("watchdog -T 1 -t 5 /dev/watchdog"); + + return TRUE; +} + +BOOL sf_ota_result(void) +{ + + system("devmem 0xF0050084 32 > /tmp/ota_sts"); + + FILE* fd = fopen("/tmp/ota_sts", "r"); + char buf[16]; + UINT32 ota_mask = 0x00FFFFFF; /* mask status */ + UINT32 ota_prefix = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_UBOOT_UPDATE_OK) & ota_mask; /* OTA */ + + if(fd){ + + buf[11] = '\0'; + fread(buf, 10, 1, fd); + DBG_DUMP("ota_sts_str = %s\n", buf); + + UINT32 ota_sts = strtoul(buf, NULL, 16); + + DBG_DUMP("ota_sts = %08X , masked = %08X\n", ota_sts, ota_sts & ota_mask); + + /* OTA success */ + if(ota_sts == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_UBOOT_UPDATE_OK)){ + DBG_DUMP("update ok!\n"); + sf_mcu_reg_set(SF_MCU_SOFT_UPDATE, 0); + sf_set_send_statu(FALSE); + } + /* not OTA */ + else if(ota_sts == 0x0){ + DBG_DUMP("not ota\n"); + } + /* OTA wrong status */ + else if ((ota_sts & ota_mask) == ota_prefix){ + DBG_DUMP("ota error!\n"); + sf_sys_status_led_set(SF_LED_SYS_STATE_ERROR); + sf_mcu_reg_set(SF_MCU_SOFT_UPDATE, 0); + sf_set_send_statu(FALSE); + vos_util_delay_ms(1000); + } + + + } + else{ + DBG_ERR("/tmp/ota_sts not found!\n"); + } + + return TRUE; +} void* sf_sys_do_upgrade(void *arg) { //int s32Ret = 0; + #if !SF_UBOOT_UPDATA_FW UIMenuStoreInfo *puiPara = sf_ui_para_get(); - + #endif SLOGW("Begin to do Upgrade!\n"); //if(sf_is_enough_power_to_update() == FALSE) @@ -2085,6 +2147,9 @@ void* sf_sys_do_upgrade(void *arg) sf_sys_status_led_set(SF_LED_SYS_STATE_UPDATE); vos_util_delay_ms(500); + #if SF_UBOOT_UPDATA_FW + sf_ota_trigger(); + #else //BKG_PostEvent(NVTEVT_BKW_FW_UPDATE); if(0 != sf_fwupdate()){ sf_sys_status_led_set(SF_LED_SYS_STATE_ERROR); @@ -2095,6 +2160,7 @@ void* sf_sys_do_upgrade(void *arg) Save_MenuInfo(); //sync(); } + sf_mcu_reg_set(SF_MCU_SOFT_UPDATE, 0); sf_set_send_statu(FALSE); //if(PWR_ON_SETUP == sf_cardv_convert_power_on_mode()) @@ -2102,6 +2168,7 @@ void* sf_sys_do_upgrade(void *arg) vos_util_delay_ms(1000); Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); } + #endif } //sf_set_fw_update(0); @@ -2443,7 +2510,8 @@ void sf_save_camera_info(void) }*/ sf_get_wifi_ssid(wifissid); - SF_SPRINTF(temp, "IMEI:%s\r\nSoftwareVER:%s\r\nModuleVER:%s\r\nMcuVER:%s\r\nICCID:%s\r\nSSID:%s\r\n", puiPara->ModuleImei, localver, puiPara->ModuleSubver, mcuver, puiPara->SimIccid, wifissid); + SF_SPRINTF(temp, "IMEI:%s\r\nSoftwareVER:%s\r\nModuleVER:%s\r\nMcuVER:%s\r\nICCID:%s\r\nICCID-A:%s\r\nICCID-V:%s\r\nSSID:%s\r\nBLE:%s\r\n", + puiPara->ModuleImei, localver, puiPara->ModuleSubver, mcuver, puiPara->SimIccid, puiPara->SimIccid, puiPara->SimIccid, wifissid,puiPara->BluSsid); if(access((char*)SF_CAMERA_INFO_FILENAME, F_OK) == 0) { diff --git a/loader/ARC/Lib/Release/STRGEXT_Sdio1.a b/loader/ARC/Lib/Release/STRGEXT_Sdio1.a index 25e7d189d592ba4f8cd55fd4b38494f6b4a5824a..b62c773e88aa8a27a6f3eaa93cb1505fdb691e9c 100644 GIT binary patch delta 404 zcmZosXi=CT#bIe?Y+z_%Vm47JLkz}NP%yMKH8Hh-kQ*07Fxj_x>Aw8n+`55jy>N!} zmj-9ygiAl>7$|@FV|)lmGkt9^Dlh`dd|+V~PN?yg%5eJ9kR+8Ln<4t8A@%pg%E|i7 zqP!)Z{$CoBOMLvlR239Y4rI1xPw@hZM5auh&TPsUKKU%OtaPBq|L_0)Gbl7aU{HSl zoYC&$MPIPUr{_MCSy?VxN_sEZDU$%y73BYgp)f!Jq*~Nl)I-dRVX~N~m^X;esK8^s z*KO~M56z59QVB1fGwf$!VB9Rux{--dX7fpQY36!21_lN$RR)F{DBT94`574IKb(MUvmlo delta 422 zcmZosXi=CT#bIJ%VrFP;WHM1HLkz}NP%yMKH8C}XkQ*07Fh#a_>Aw8n+`55jy>N!} zmj-9yg#0gmj2gV95*oaKA|F_og%j$$r81npG$ctS$YzLsX-NHjvD$}GIYmJ^;s5u4 z|5X#zGQ>VGvi-hT=IQ^XA-T-Q|4UUt>EuXed-gOhph#reviGzJP)8LkR=ZW^vYyOpGF%PqIrh*V{2LFmS0d zFqA;)IuOmzz%T_$Z-CMVp!6#!{RKp;F)*+(LTDin4bs*I=t_VHz7lKN^aDlL#6|__s7Mww zeb^aiBHm78^BOgoCe4_L5<7qzQqy#-aoQ!ZEym24e=-}BrrkA|ZcQilckbSA-7q<` zm)|{)d(OG%-g|br*m_{ip@P(fHC5huwbcvy-MZVDYudbp^Q-6A%D-N3O-(gq-s+nE zmrI@JG)82p7EsEn*}VSiU!=8`9yw$7vyGPTeMqYHd@Pk5edraQ;0)B0No1Ys)G585z^nY<>NL|!Jk4B{ zaiqz2bJgln|1-@6`ZK)ATx{uYD$@J;c5{{KGyal!qvyvBw94lo5dAuZ8$Q@N@!ha!uo+p-u!}ZNa$;ZhoeRI!SOmFFX{SS zG~3!T(dSfeTfe-o!6SB{1&mx43oDc6`*=ac+3>}Rw?moZqZQ?$3l(R^hPY|Uti?)b zD0;~L(wO3DiMXtuwim-g(H-_fp=W_h?dsUsXs$hVRBJPplyvj(S;(|*OXzI0(SDHs zaEd3Bs_kQHWF;^a$GDmQW{M|x5ZoIWXE5Hu2w{AU(S&ghgQ((0q(wFVw)qzW>|~Gb z=^55<>(^rghcTWyw(|IcY|hHim6+q`NR-(h2x&o9>K_}4s`i$MDeb4R!h!okDbXC$ z?(U)PSU2r=y+0*7)kL!^!C2nF*{I2$I+ha6HJQaF8R>10+^>uX(-G*lj_v8qjQEs1 zY|&(28u6L-ba#!N?KNwEjxnwNGn1?CX1aPY#vGOU98uQ0M~c9V0_|-o2t4Pni#U`5 zy&&L@s7hT#!JPYS(}O($EcRCFaHEvz?yaos{*b$el`RRm1E+DLE3dXhw%Im`6KYMI zFDqT~;WZ>cPTvF4oE$TaxWWbJ{pUZ8JUtRs>?vcndk?3axU$NxiVeOJ9*LUmFOPlQ z`&`PgD|;GymqrwmqD8~a4K0z!ZIthO;r8CWr{du)S64v3M94?O%Q0Up=ELE*{@`d! z#A$1ZsI~!~leWOr${$Qyum$NjToZ4%AsL5jYyP0C$2v%|r4v3OyStI^+C*YQ6K}U0 z^STMv{%E+Z*L5oHM{D~qe2ssemY?wrE{V;=m=nXzGt-?xx-x&u>-Rs|bolhoaBX($ zme17Gh5Cj;>#g9jy(_QBBB$TFmTKPaRodyVbYhTDaMNElic`Kx67CS?Sa*?n^P|L-O8s zbf+rOoAP9D`bc}!=uL~hFV3|qK(5TU`l`=_o26lsyiJPZYTij|$PDdfdjt{h$Z+$3y@gw0yME~{!qJi}rkS&~>)oS4x> zWv)q4UF?ALI0brzx%giZ#x<$|U~GBz|-fe`yl`Nit8_MERjrfdlychi1w0&^49YGIk&A_I(Dtu)wZjAiV*S`v`Y3woJ+!CAJen zzYVB7&KQ;m+$C|h#C?RQgd1qXBPk)?Hk-edKWpiH#^~AD7BX>rZHQSb%|!UwjMWhj zI}sMbAJB5_oZ5zM3C}Gk4t6qj4{=?LiKLLpKH`CwgcW1|Bt)oe+$kHp-baW`I|*U8 zn-H7aC;6u&(&HxiLCGJMctpyd2L{Q3qQo7g5@G?p36f_?%#-p$$-5<%N_n~D7fEcD z_>k0Zki0JOkVM?;peS!DwHh3QLt?eWT8T>}`Xnxs*dVc4Vyncpgs5{fRjz`uha^5G z@h5~hw-bnugJA452~gtS6Qaa#5zb@mUxd(WvUDYcuqz{k-6ld@uAfW&ixOXx_&#Ab zW48&h?i)g^n?e8s|NCtH>L%+;$Ga(#2NeI2TJc#}mX(x7ufL{@h zN>Tfzz;uUbBiV#F0!{KWB#O%pzlD^*8u5bD#Da7o7<{Ox({#7Z48A!%)5Ht3LjG>? zI$on~qT%5!Cm!uc=pU}?wH{SjvG>Faxt(Y5sPEH_=pYwVDz<6P7_IFNAxs|tUwUmK_huBRmMg6L)?JB-1h*gUlKE5k^T&IzAHg8Sfr0vco_Xn{Q0 z?pNS98Ahx=?vQvB6v=@pS}o+%a*HsGz;w{b4r4rX=F}ivgXGnM-nNMogBe0JAC~Y@}5t!g>x)Tgd<=i|8^ItWjT@8v z^~L=KMWN`W7!GYXH7Yz6kZ1x9*OEXIO=;vyJFk>CWH5#fnjpi@4Lf|$V&Zfjb_)%L u@juNfupB@xmHd-g9$yT~Ln-*D00vKBP*T(c=s@5kK?id1gp&kDe*Xu}=O%st delta 4604 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 + debug_msg("flash_open\r\n"); er = int_strg_obj->flash_open(); if (er < 0) { debug_err("flash open fail\r\n"); return -1; } + debug_msg("flash_open end\r\n"); + //OUTREG32(NAND_TABLE_VERSION_ADDR, INREG32(uiStorageVersion)); //if (er == E_OK) { @@ -714,7 +719,6 @@ _THUMB2 int bl_flash_open(void) } else { g_uiStartBlkUpdateFW = StartNandBlkUpdateFW; } - g_is_flash_open = TRUE; return 0; } @@ -1786,6 +1790,318 @@ _THUMB2 static int bl_load_uboot_from_flash(unsigned char *p_fdt, unsigned char return 0; } +/***********************************************************************************/ + +//#define VER_STR_MAX 32 +//#define CHAR char +//#define FL_IndexInfoMAX 216 +//#define NVT_MAX_BSS_DESC (64) +//#define NVT_WIFIIPC_MAC_ADDR_LEN (6) +//#define NVT_MESH_ID_LEN 32 +// +//#define NVT_WSC_MAX_SSID_LEN (64) +//#define NVT_MAX_WEP_KEY_LEN (26) +//#define NVT_MAX_NETWORK_KEY_LEN (64) +//#define NVT_PIN_LEN (8) +//#define NVT_MAX_DEVICE_NAME_LEN (32) +// +//#define SF_TIMER_MAX_NUMBER 2 +//typedef struct sf_PARA_TIME_S +//{ +// UINT16 Year; +// UINT16 Mon; +// UINT16 Day; +// +// UINT16 Hour; +// UINT16 Min; +// UINT16 Sec; +//} SF_PARA_TIME_S; +// +//typedef struct sf_WORKTIME_S +//{ +// SF_PARA_TIME_S StartTime; +// SF_PARA_TIME_S StopTime; +//} SF_WORKTIME_S; +// +// +// typedef struct _UIMenuUIMenuStoreInfo { +// UINT32 OtaFlag; +// //Common +// CHAR strMakerString[VER_STR_MAX]; +// CHAR strModelString[VER_STR_MAX]; +// CHAR strSoftwareVer[VER_STR_MAX]; +// CHAR strMakeNote[VER_STR_MAX]; +// CHAR strImageDescription[VER_STR_MAX]; +// UINT32 uhInfoSize; +// UINT32 UIParameter[FL_IndexInfoMAX]; +// UINT32 ulmodeIndex ; //Record Last Mode Index +// UINT32 cbYear; +// UINT32 cbMonth; +// UINT32 cbDay; +// UINT32 cbFileID; +// UINT32 ubLanguageIndex; +// //photo menu +// UINT32 ubAFWindowIndex; +// UINT32 ubAFBeamIndex; +// UINT32 ubContAF; +// UINT32 ubAEmode; +// UINT32 ubQviewIndex; +// UINT32 ubDzoom; +// UINT32 ubBlinkDet; +// UINT32 ubSlowShutter; +// UINT32 ubContshotIndex; +// UINT32 ubTimelapseIndex; +// UINT32 ubDatePrint; +// UINT32 ubPanModeIndex; +// UINT32 ubFlashIndex; +// UINT32 ubEVIndex; +// UINT32 ubSizeIndex; +// UINT32 ubQualityIndex; +// UINT32 ubWBIndex; +// UINT32 ubColorIndex; +// UINT32 ubISOIndex; +// UINT32 ubFDIndex ; +// UINT32 ubSharpnessIndex; +// UINT32 ubPhotoDispMode; +// +// //wifi +// CHAR strSSID[NVT_WSC_MAX_SSID_LEN]; +// CHAR strPASSPHRASE[NVT_MAX_WEP_KEY_LEN]; +// +// CHAR strSSID_hotspot_1[NVT_WSC_MAX_SSID_LEN]; +// CHAR strPASSPHRASE_hotspot_1[NVT_MAX_WEP_KEY_LEN]; +// +// +// //============Sifar==============///Payton +// SF_PARA_TIME_S TimelapseTime; +// SF_WORKTIME_S WorkTime[SF_TIMER_MAX_NUMBER]; +// SF_PARA_TIME_S PirDelayTime; +// SF_PARA_TIME_S DailyReportTime; +// SF_PARA_TIME_S DailyReportTime2; +// +// SF_PARA_TIME_S TimeSend1; +// SF_PARA_TIME_S TimeSend2; +// SF_PARA_TIME_S TimeSend3; +// SF_PARA_TIME_S TimeSend4; +// +// //#2023/02/10#Payton - begin +// CHAR CamNameSwitch;/*ON/OFF ,cam name off*/ +// CHAR CamMode;/* 0 Photo / 1 Video / 2 PIC+Video*/ +// CHAR FlashLed;/* 0 High / 1 Low */ +// CHAR ImgSize;/* 24M/12M/8M/5M */ +// CHAR NightMode;/* Max.Range/Balanced/Min.Blur */ +// CHAR Multishot;/*1P/2P/3P/4P/5P*/ +// CHAR MultiShotIntevel;/*0s/1s/2s*/ +// CHAR SendMulti;/*OFF/ON*/ +// CHAR VideoSize;/*FHD-1080P/HD-720P/WVGA*/ +// CHAR VideoTimeMenu;/*5/10/15/20/30/40/50/59*/ +// CHAR VideoLenth; +// CHAR PirSwitch;/*OFF/ON*/ +// CHAR PirSensitivity;/*High/Middle/Low*/ +// CHAR PirDelaySwitch;/*OFF/ON*/ +// CHAR TimelapseSwitch;/*OFF/ON*/ +// CHAR WorkTime1Switch;/*OFF/ON*/ +// CHAR WorkTime2Switch;/*OFF/ON*/ +// CHAR SimAutoSwitch;/*Auto/Manual*/ +// CHAR SendMaxNum;/*Unlimited/1~99*/ +// CHAR GprsMode;/*Daily/Instant*/ +// CHAR DailyReportSwitch;/*OFF/ON*/ +// CHAR ReDailyReport; +// CHAR DailyReportTestSwitch; +// CHAR SimPinFlag;/*ON*/ +// CHAR GpsSwitch;/*0:OFF;1:ON*/ +// CHAR Language; +// CHAR DateStyle;/*YY/MM/DD-(CN) / MM/DD/YY-(US) / DD/MM/YY-(EU)*/ +// CHAR StampSwitch;/*0:OFF;1:ON*///FL_DATE_STAMP +// CHAR BatteryType;/*Alkaline/NI-MH/LI*/ +// CHAR SdLoopSwitch;/*0:OFF;1:ON*/ +// CHAR PwdSwitch;/*0:OFF;1:ON*/ +// CHAR SendPhotoSwitch;/*0:OFF;1:ON*/ +// CHAR SendVideoSwitch;/*0:OFF;1:ON*/ +// CHAR SendPicSize;/*Small/Bigger/Original*/ +// CHAR SendMultishotIndex1;/*OFF/ON*/ +// CHAR SendMultishotIndex2;/*OFF/ON*/ +// CHAR SendMultishotIndex3;/*OFF/ON*/ +// CHAR SendMultishotIndex4;/*OFF/ON*/ +// CHAR SendMultishotIndex5;/*OFF/ON*/ +// CHAR DateAuto;/*Auto/Manual*/ +// CHAR NTPZoneS; +// CHAR NTPZoneH; +// CHAR NTPZoneM; +// CHAR DigitPirSensitivity;/*9\7\5*/ +// CHAR DigitPirCnt; +// CHAR DigitPirWindowTime; +// CHAR CamArmDiable; +// CHAR DebugMode;/*0:OFF;1:ON*/ +// CHAR AutoOffSwitch;/*0:OFF;1:ON*/ +// CHAR AutoLogSwitch;/*0:OFF;1:ON*/ +// CHAR RawSwitch;/*0:OFF;1:ON*/ +// //ProfLogSwitch;/*0:OFF;1:ON*/ +// CHAR GprsSwitch;/*0:OFF;1:ON*/ +// CHAR GpsSendFlag;/*dp need send flag;*/ +// CHAR FristSendDailyAndGps; +// CHAR NetGeneration;/*0:NO 1:xx 2:2G 3:3G 4:4G*/ +// CHAR NeedTimeSyncStartUp; +// CHAR NetWorkNeedSearch; +// //SmsNumber; +// CHAR QLogSwitch;/*0:OFF;1:ON*/ +// CHAR GpsAntiTheftSwitch; +// CHAR BatteryLogSwitch; +// +// ////////////S530//////// +// CHAR GpsNumber; +// CHAR TimeSend1Switch;/*OFF/ON*/ +// CHAR TimeSend2Switch;/*OFF/ON*/ +// CHAR TimeSend3Switch;/*OFF/ON*/ +// CHAR TimeSend4Switch;/*OFF/ON*/ +// CHAR SendType; +// CHAR PicUpDailyReport; +// /////////////////////// +// +// CHAR CamNameStr[13]; +// CHAR PwdStr[7]; +// CHAR Latitude[16]; +// CHAR Longitude[16]; +// CHAR Sim4gApn[40]; +// CHAR Sim4gUsr[40]; +// CHAR Sim4gPwd[20];/* */ +// CHAR SimPinStr[8];/* */ +// CHAR MmsMmsc[50]; +// CHAR MmsApn[40]; +// CHAR MmsProxy[40]; +// CHAR MmsPort[6]; +// CHAR MmsUsr[40]; +// CHAR MmsPwd[20]; +// CHAR ModuleImei[20]; +// CHAR ModuleVer[50]; +// CHAR ModuleSubver[50]; +// CHAR AcmIp[60]; +// CHAR AcmPort[5]; +// CHAR WebIp[70]; +// CHAR OperatorCode[8]; +// CHAR SimIccid[21]; +// CHAR ServiceProvider[64]; +// UINT8 SimSignal; +// UINT8 SimType; +// UINT8 FtpSwitch;/*FTP/OFF/FTPS*/ +// UINT8 FtpIp[40]; +// UINT8 FtpPort[5]; +// UINT8 FtpUsr[40]; +// UINT8 FtpPwd[20]; +// +// UINT8 FtpsIp[40]; +// UINT8 FtpsPort[5]; +// UINT8 FtpsUsr[40]; +// UINT8 FtpsPwd[20]; +// +// UINT8 OtaFtpIp[40]; +// UINT8 OtaFtpPort[5]; +// UINT8 OtaFtpUserName[40]; +// UINT8 OtaFtpPassWord[40]; +// +// UINT8 WifiSwitch; +// UINT8 WifiMode; +// UINT8 WifiApPWD[16]; +// UINT8 Zoom; +// UINT32 FileKey; +// +// UINT32 x1; +// UINT32 x2; +// UINT32 x3; +// UINT32 x4; +// UINT32 x5; +// UINT32 x6; +// //============Sifar==============///Payton +// +// } UIMenuStoreInfo; + + _THUMB2 static void *bl_get_sys_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) + { + #if (FDT_SUPPORT) + if (bl_get_partition(p_fdt, PATH_PARTITION_SYS, &g_emb_sys, p_id) != 0) { + return NULL; + } + #else + *p_id = NVTPACK_IDX_RTOS; + #endif + g_emb_sys.EmbType = 0x12; + return &g_emb_sys; + } + + _THUMB2 static int bl_load_sys_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) + { + int er; + int sys_partition_id; + DRAM_PARTITION *p_dram_partition = NULL; + unsigned int blk_size = int_strg_obj->flash_getBlockSize(); + EMB_PARTITION *p_emb_partition_sys = bl_get_sys_partition(p_fdt, &sys_partition_id); + + if (p_emb_partition_sys == NULL) { + debug_err("null p_emb_partition_sys\r\n"); + return -1; + } + + p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); + if (p_dram_partition == NULL) { + debug_err("null p_dram_partition\r\n"); + return -1; + } + + if ((er = int_strg_obj->flash_readSectors(p_emb_partition_sys->PartitionOffset / blk_size, p_emb_partition_sys->PartitionSize, p_tmp, NAND_RW_FIRMWARE)) < 0) { + debug_err_var("bl_load_sys_from_flash,er=", er); + bl_displayErrMsg(RWErrorMsg); // read sys failed + return -1; + } + +// UIMenuStoreInfo* info = (UIMenuStoreInfo*)p_tmp; + +// debug_err_var("FL_PHOTO_SIZE=", info->UIParameter[1]); +// debug_err_var("OtaFlag=", info->OtaFlag); + return 0; + } + + /* assume ota_flag is read from partition_sys and in the first word */ + _THUMB2 static UINT32 bl_check_ota_flag(void) + { + int er; + unsigned char *p_fdt = NULL; + DRAM_PARTITION *p_dram_partition = NULL; + unsigned char *p_tmp = (unsigned char *)SDRAM_Start_FW; + + // open flash + if (bl_flash_open() != 0) { + debug_msg("flash open failed\r\n"); + return 0; + } + + #if (FDT_SUPPORT) + // load fdt + er = bl_load_fdt_from_flash(p_tmp, SDRAM_Start_FW, &p_fdt); // dtb size less than 32MB to be safer. + if (er != 0) { + bl_displayErrMsg("load fdt failed\r\n"); + return 0; + } + #endif + + p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); + if (p_dram_partition == NULL) { + debug_err("null p_dram_partition\r\n"); + return 0; + } + + if(bl_load_sys_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp)){ + debug_err("bl_load_sys_from_flash failed\r\n"); + return 0; + } + + UINT32* ota_flag = (UINT32*)p_tmp; + debug_msg_var("ota_flag=", *ota_flag); + + return (*ota_flag); + } + + /***********************************************************************************/ + _THUMB2 static int bl_load_rtos_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) { int er; @@ -2890,6 +3206,8 @@ _THUMB2 UINT32 bl_mainFlow(void) #endif } + UINT32 ota_flag = bl_check_ota_flag(); + #if !(USB_WRITELOADER || UART_UPDATE) if (bl_load_rtos_from_uart(uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH, &adjusted_addr, &adjusted_size) == 0) { //specail case, load small rtos from uart @@ -2929,7 +3247,7 @@ _THUMB2 UINT32 bl_mainFlow(void) #endif } #if 1 - else if ((gSpecialKeyCallBack()) && (gCardDetectCallBack())) { + else if ((gSpecialKeyCallBack(ota_flag)) && (gCardDetectCallBack())) { if (card_open() == TRUE && fat_initFAT(uiheapBufferAddr, FAT_HEAP_BUFFER_SIZE) == TRUE) { #if UPDATE_SIM_CODE BOOL bWDTInit = UTL_canUpdateSecKey(); @@ -3115,7 +3433,7 @@ _THUMB2 UINT32 bl_mainFlow(void) } } #endif - else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack()) && + else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack(ota_flag)) && ((gCardDetectCallBack != NULL) || (gCardDetectCallBack() == FALSE))) { debug_msg("No card inserted\r\n"); } diff --git a/loader/Project/Model/Src/prj_main.c b/loader/Project/Model/Src/prj_main.c index b1ca86fcf..ff1119eda 100755 --- a/loader/Project/Model/Src/prj_main.c +++ b/loader/Project/Model/Src/prj_main.c @@ -83,7 +83,39 @@ void debug_disable_msg(void) {} - @b TRUE: Special key(s) is(are) pressed - @b FALSE: Otherwise */ -static BOOL prj_isSpecialKeyPressed(void) + +static BOOL prj_is_WDT_OTA(void) +{ + static UINT32 ota_sts = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_INVALID); + + /* only update once */ + if(ota_sts == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_INVALID)) + ota_sts = WDT_OTA_READ_STS(); + + debug_msg_var("ota_sts = ", ota_sts); + + if(ota_sts == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER)){ + WDT_OTA_SET_STS(WDT_OTA_STS_LOADER_DETECTING_FW); + return TRUE; + } + else{ + return FALSE; + } +} + +/* Read ota flag in the flash */ +static BOOL prj_is_Flash_OTA(UINT32 ota_flag) +{ + if(ota_flag == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER)){ + WDT_OTA_SET_STS(WDT_OTA_STS_LOADER_DETECTING_FW); + return TRUE; + } + else{ + return FALSE; + } +} + +static BOOL prj_isSpecialKeyPressed(UINT32 ota_flag) { // Detect key example, must press shutter2 and playback mode keys // OUT_0: DGPIO 0 @@ -123,7 +155,7 @@ static BOOL prj_isSpecialKeyPressed(void) { return TRUE; } - else if(!(gpio_getPin(GPIO_SPECIAL_KEY2))) + else if(!(gpio_getPin(GPIO_SPECIAL_KEY2)) || prj_is_WDT_OTA() || prj_is_Flash_OTA(ota_flag)) { return TRUE; }else { diff --git a/loader/Project/Model/Src/prj_main.h b/loader/Project/Model/Src/prj_main.h index dfd0fb3ad..be742a380 100755 --- a/loader/Project/Model/Src/prj_main.h +++ b/loader/Project/Model/Src/prj_main.h @@ -70,7 +70,26 @@ #define STORAGE_EXT_TYPE (STORAGE_EXT_SDIO1) #endif +/************************************************************* + * OTA + ************************************************************/ +#include "nvtpack.h" +#define WDT_OTA_MAKEFOURCC(sts) MAKEFOURCC('O','T','A', sts) +#define WDT_DATA (WDT_REG_BASE_ADDR + 0x84) +#define WDT_OTA_READ_STS() INREG32(WDT_DATA) +#define WDT_OTA_SET_STS(sts) OUTREG32(WDT_DATA, WDT_OTA_MAKEFOURCC(sts)) +typedef enum { + WDT_OTA_STS_INVALID = 0, + WDT_OTA_STS_LOADER_DETECTING_FW, + WDT_OTA_STS_UBOOT_UPDATE_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_OPEN_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_READ_FAILED, + WDT_OTA_STS_UBOOT_UPDATE_NO_NEED, + WDT_OTA_STS_UBOOT_UPDATE_UNKNOWN, + WDT_OTA_STS_UBOOT_UPDATE_OK, + WDT_OTA_STS_LINUX_TRIGGER, +} WDT_OTA_STS; // Card detect GPIO offset #if (CARD_DETECT_PIN == _CARD_DETECT_TYPE_1_)