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 25e7d189d..b62c773e8 100644 Binary files a/loader/ARC/Lib/Release/STRGEXT_Sdio1.a and b/loader/ARC/Lib/Release/STRGEXT_Sdio1.a differ diff --git a/loader/ARC/Lib/Release/STRGINT_SpiFlash.a b/loader/ARC/Lib/Release/STRGINT_SpiFlash.a index f12747811..543b8ca4b 100644 Binary files a/loader/ARC/Lib/Release/STRGINT_SpiFlash.a and b/loader/ARC/Lib/Release/STRGINT_SpiFlash.a differ diff --git a/loader/Include/loader.h b/loader/Include/loader.h index b0f11ebbb..0e5788c29 100755 --- a/loader/Include/loader.h +++ b/loader/Include/loader.h @@ -27,7 +27,7 @@ - @b FALSE: special key is NOT pressed */ //@{ -typedef BOOL (*LDR_SPECIAL_KEY_CB)(void); +typedef BOOL (*LDR_SPECIAL_KEY_CB)(UINT32 ota_flag); //@} /** diff --git a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c index 1de9e15f4..461ff93e3 100755 --- a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c +++ b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c @@ -141,6 +141,7 @@ static UINT32 g_rtos_size = 0; #define PATH_PARTITION_NUTTX "partition_nuttx" #define PATH_PARTITION_TEEOS "partition_teeos" #define PATH_PARTITION_RTOS "partition_rtos" +#define PATH_PARTITION_SYS "partition_sys" #define PROPERTY_REG "reg" #define PROPERTY_LABEL "label" #define PROPERTY_PARTITION_NAME "partition_name" @@ -149,6 +150,7 @@ static DRAM_PARTITION g_dram_partition = {0}; static EMB_PARTITION g_emb_uboot = {0}; static EMB_PARTITION g_emb_teeos = {0}; static EMB_PARTITION g_emb_rtos = {0}; +static EMB_PARTITION g_emb_sys = {0}; #else // NO FDT_SUPPORT // refer to met-tbl.dtsi /nvt_memory_cfg static DRAM_PARTITION g_dram_partition = { @@ -691,12 +693,15 @@ _THUMB2 int bl_flash_open(void) //========================================================================== //int_strg_obj->flash_installIdentifyCB(nor_identify); + 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_)