From 61bb7ba7f6b7a3ac74a079e0908adb6020bec5a2 Mon Sep 17 00:00:00 2001 From: greg Date: Sun, 4 Feb 2024 20:13:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0eMMC=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arm/include/asm/nvt-common/nvt_common.h | 1 + .../board/novatek/common/nvt_ivot_fw_update.c | 40 +++++++++++++++---- .../novatek/common/nvt_ivot_fw_update_utils.c | 11 +++++ .../board/novatek/nvt-na51089/na51089evb.c | 9 +++-- BSP/u-boot/drivers/mmc/nvt_ivot_mmc.c | 4 +- .../UIFlowMenuCommonItemEventCallback.c | 13 +++++- .../sifar/code/source/common/sf_common.c | 18 +++++---- loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c | 13 +++++- loader/Project/Model/Src/prj_main.c | 6 +-- 9 files changed, 90 insertions(+), 25 deletions(-) diff --git a/BSP/u-boot/arch/arm/include/asm/nvt-common/nvt_common.h b/BSP/u-boot/arch/arm/include/asm/nvt-common/nvt_common.h index ccbdfb210..79b859820 100755 --- a/BSP/u-boot/arch/arm/include/asm/nvt-common/nvt_common.h +++ b/BSP/u-boot/arch/arm/include/asm/nvt-common/nvt_common.h @@ -165,6 +165,7 @@ int nvt_process_rootfs_format(void); int nvt_check_is_fw_update_fw(void); int nvt_check_is_fomat_rootfs(void); int nvt_fs_set_blk_dev(void); +int nvt_fs_set_blk_dev_emmc(void); int nvt_process_sys_recovery(void); int nvt_flash_mark_bad(void); void nvt_shminfo_init(void); diff --git a/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update.c b/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update.c index b320b8d9c..ca39bd367 100755 --- a/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update.c +++ b/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update.c @@ -47,6 +47,7 @@ ((((UINT32)(data)) & 0x00FF0000) >> 8) | \ ((((UINT32)(data)) & 0xFF000000) >> 24)) ///< Swap [31:24] with [7:0] and [23:16] with [15:8]. static UINT32 g_LcdBl = TRUE; +static int curr_device = 1; static int nvt_update_partitions(unsigned int addr, unsigned int size, u64 part_off, u64 PartitionSize) { @@ -2347,16 +2348,39 @@ int nvt_fw_update(bool firm_upd_firm) } else if (p_shminfo->boot.LdCtrl2 & LDCF_BOOT_FLASH) { return ERR_NVT_UPDATE_NO_NEED; } else { - if (nvt_fs_set_blk_dev()) - return ERR_NVT_UPDATE_OPENFAILED; - else { - if (fs_size(get_nvt_bin_name(NVT_BIN_NAME_TYPE_FW), &size) < 0) { - return ERR_NVT_UPDATE_NO_NEED; - } - } + + /*added for emmc upgrade by greg*/ + extern struct mmc *init_mmc_device(int dev, bool force_init); + struct mmc *mmc; + mmc = init_mmc_device(curr_device, false); + if (!mmc) { + printf("Get eMMc device failed\n\r"); + return ERR_NVT_UPDATE_OPENFAILED; + } + + typedef int (*set_blk_dev_cb)(void); + set_blk_dev_cb nvt_fs_set_blk_dev_cb = NULL; + + if(nvt_fs_set_blk_dev() == 0 && fs_exists(get_nvt_bin_name(NVT_BIN_NAME_TYPE_FW))){ + printf("***found fw bin in sd card******\n"); + nvt_fs_set_blk_dev_cb = nvt_fs_set_blk_dev; + } + else if(nvt_fs_set_blk_dev_emmc() == 0 && fs_exists(get_nvt_bin_name(NVT_BIN_NAME_TYPE_FW))){ + + printf("***found fw bin in emmc*******\n"); + nvt_fs_set_blk_dev_cb = nvt_fs_set_blk_dev_emmc; + } + else{ + return ERR_NVT_UPDATE_OPENFAILED; + } + + if (nvt_fs_set_blk_dev_cb() || fs_size(get_nvt_bin_name(NVT_BIN_NAME_TYPE_FW), &size) < 0) { + return ERR_NVT_UPDATE_NO_NEED; + } + while (retry < UPDATE_ALL_IN_ONE_RETRY_TIMES) { - if (nvt_fs_set_blk_dev()) + if (nvt_fs_set_blk_dev_cb()) return ERR_NVT_UPDATE_OPENFAILED; else { #ifdef CONFIG_NVT_DISPLAY_BAR_FWUPDATE //uboot config diff --git a/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update_utils.c b/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update_utils.c index 45f9dcc83..8334bb4c3 100755 --- a/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update_utils.c +++ b/BSP/u-boot/board/novatek/common/nvt_ivot_fw_update_utils.c @@ -426,6 +426,17 @@ int nvt_fs_set_blk_dev(void) return 0; } +/*added for emmc upgrade by greg*/ +int nvt_fs_set_blk_dev_emmc(void) +{ + if (fs_set_blk_dev("mmc", "1:1", FS_TYPE_FAT)){ + printf("MMC interface configure failed\n"); + return -1; + } + + return 0; +} + #ifndef CONFIG_NVT_SPI_NONE int nvt_flash_mark_bad(void) { diff --git a/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c b/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c index 1ae1041f4..b3700fd50 100755 --- a/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c +++ b/BSP/u-boot/board/novatek/nvt-na51089/na51089evb.c @@ -158,18 +158,21 @@ static int nvt_handle_fw_abin(void) char buf[512] = {0}; int ota_upgrade_sts = 0; int is_ota = 0; + if(WDT_OTA_GET_STS() == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LOADER_DETECTING_FW)) { is_ota = 1; } else if(WDT_OTA_GET_STS() == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LOADER_DETECTING_FW_AUTO)) { - is_ota = 1; + is_ota = 1; #ifdef CONFIG_NVT_DISPLAY_BAR_FWUPDATE //uboot config sf_display_lcd_bl(0); #endif } + printf("is_ota: %d\r\n", is_ota); + /* To handle firmware update */ ret = nvt_fw_update(false); if (ret < 0) { @@ -396,7 +399,7 @@ static int nvt_handle_fw_auto(void) if (ret < 0) return ret; } else if (nvt_detect_fw_tbin()) { - ret = nvt_handle_fw_tbin(); + ret = nvt_handle_fw_tbin(); if (ret < 0) return ret; @@ -425,7 +428,7 @@ static int nvt_handle_fw_auto(void) if (ret < 0) return ret; } else { - ret = nvt_handle_fw_abin(); + ret = nvt_handle_fw_abin(); if (ret < 0) return ret; } diff --git a/BSP/u-boot/drivers/mmc/nvt_ivot_mmc.c b/BSP/u-boot/drivers/mmc/nvt_ivot_mmc.c index 3b2546677..fd28c7bf3 100755 --- a/BSP/u-boot/drivers/mmc/nvt_ivot_mmc.c +++ b/BSP/u-boot/drivers/mmc/nvt_ivot_mmc.c @@ -53,7 +53,7 @@ #define SDIO2_MASK 0x7FF0000 #else #define SDIO_MASK 0x7FF -#define SDIO2_MASK 0x7FF000 +#define SDIO2_MASK 0x7FF0000 //from 0x7FF000 to 0x7FF0000 for emmc speed added by greg #endif #ifdef CONFIG_NVT_FPGA_EMULATION @@ -383,7 +383,7 @@ void pll_set_sdioclock_rate(int id, u32 value) regdata |= value; } else { regdata &= ~SDIO2_MASK; - regdata |= value << 12; + regdata |= value << 16;//Improve the read and write speed of the emmc added by greg } if (id != SDIO_HOST_ID_3) diff --git a/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/UIFlowMenuCommonItemEventCallback.c b/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/UIFlowMenuCommonItemEventCallback.c index e0713de50..7007c8d92 100755 --- a/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/UIFlowMenuCommonItemEventCallback.c +++ b/code/application/source/cardv/SrcCode/UIWnd/LVGL_SPORTCAM/UIFlowLVGL/UIFlowMenuCommonItem/UIFlowMenuCommonItemEventCallback.c @@ -134,10 +134,21 @@ static int is_camera_fw_upgrade(void) //char font = System_Get_DCF_Disk_Drive(dcf_handle) == 'B' ? 'B' : 'A'; //char fw_file[64] = {'\0'}; //sprintf((char *)fw_file, "%c%s", font, FW_UPDATE_NAME); - hFile = FileSys_OpenFile(FW_UPDATE_NAME, FST_OPEN_READ); + hFile = FileSys_OpenFile("B:\\FW98565A.bin", FST_OPEN_READ); //hFile = FileSys_OpenFile(fw_file, FST_OPEN_READ); //if (gBattery < 40 || hFile == NULL) if (hFile == NULL) + { + printf("[%s:%d]emmc no update file\n", __FUNCTION__, __LINE__); + } + else + { + FileSys_CloseFile(hFile); + return UPGRADABLE; + } + + hFile = FileSys_OpenFile(FW_UPDATE_NAME, FST_OPEN_READ); + if (hFile == NULL) { printf("[%s:%d]sd card no update file\n", __FUNCTION__, __LINE__); return NOT_UPGRADABLE; 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 331a8ac11..93b304f3d 100755 --- a/code/lib/source/sifar/code/source/common/sf_common.c +++ b/code/lib/source/sifar/code/source/common/sf_common.c @@ -1780,7 +1780,7 @@ static SINT32 sf_cardv_proccess_cmd_key(SF_MESSAGE_BUF_S *pMessageBuf) } break; case SF_EVENT_KEY_TEST: - sf_do_upgrade_thread();//update + sf_do_upgrade_thread();//update break; default: @@ -2242,14 +2242,17 @@ static UINT32 sf_fwupdate(void) #else BOOL sf_ota_trigger(void) { + UINT32 uiUserData = 0; char cmd[128]={0}; - if((PWR_ON_SETUP == sf_cardv_convert_power_on_mode())) + if((PWR_ON_SETUP == sf_cardv_convert_power_on_mode())) { + uiUserData = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER); } else { + uiUserData = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER_AUTO); } Ux_PostEvent(NVTEVT_ALGMSG_FOCUSEND, 0); @@ -2328,8 +2331,7 @@ void* sf_sys_do_upgrade(void *arg) #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) if(sf_cardv_battery_value_get() < 40){ sf_sys_status_led_set(SF_LED_SYS_STATE_ERROR); @@ -2338,7 +2340,8 @@ void* sf_sys_do_upgrade(void *arg) // sf_set_fw_update(0); // } else{ - sf_mcu_reg_set(SF_MCU_SOFT_UPDATE, 1); + + sf_mcu_reg_set(SF_MCU_SOFT_UPDATE, 1); //sf_set_fw_update(1); sf_set_send_statu(TRUE); sf_sys_status_led_set(SF_LED_SYS_STATE_UPDATE); @@ -2347,12 +2350,13 @@ void* sf_sys_do_upgrade(void *arg) #if SF_UBOOT_UPDATA_FW sf_ota_trigger(); #else - //BKG_PostEvent(NVTEVT_BKW_FW_UPDATE); + + //BKG_PostEvent(NVTEVT_BKW_FW_UPDATE); if(0 != sf_fwupdate()){ sf_sys_status_led_set(SF_LED_SYS_STATE_ERROR); } else { - //SysResetFlag(); + //SysResetFlag(); puiPara->OtaFlag = 1; Save_MenuInfo(); //sync(); diff --git a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c index 90fed45cb..274dc7dcb 100755 --- a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c +++ b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c @@ -121,6 +121,8 @@ static UINT32 g_uiNandBlkSize = 0; static UINT32 g_rtos_load_addr = 0; static UINT32 g_rtos_target_addr = 0; static UINT32 g_rtos_size = 0; +static UINT32 g_update_from_emmc = 0; + #if (FDT_SUPPORT) #define PATH_MEM_DRAM "/nvt_memory_cfg/dram" @@ -2948,7 +2950,8 @@ _THUMB2 static unsigned int bl_process_flash_boot(unsigned char *p_tmp, DRAM_PAR } } #if 1 - else if (p_dram_partition->rtos_addr == 0 || DUAL_RTOS_SUPPORT || (gFastbootKeyCallBack == NULL) || (!gFastbootKeyCallBack())) { + //added by greg + else if (p_dram_partition->rtos_addr == 0 || DUAL_RTOS_SUPPORT || (gFastbootKeyCallBack == NULL) || (!gFastbootKeyCallBack()|| g_update_from_emmc)) { // load uboot er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); if (er != 0) { @@ -3442,6 +3445,12 @@ _THUMB2 UINT32 bl_mainFlow(void) debug_msg("\r\n"); // for line end RRRRRRR.... uiLoaderFunc |= FUNC_RUN_CARD; } + /* no fw found in sd card , start emmc check flow */ + else{ + + g_update_from_emmc = 1; + uiLoaderFunc &= ~(FUNC_UPDATE_LOADER); /* loader won't be updated by emmc */ + } #if UPDATE_SIM_CODE } #endif @@ -3455,6 +3464,8 @@ _THUMB2 UINT32 bl_mainFlow(void) else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack(ota_flag)) && ((gCardDetectCallBack != NULL) || (gCardDetectCallBack() == FALSE))) { debug_msg("No card inserted\r\n"); + g_update_from_emmc = 1; + uiLoaderFunc &= ~(FUNC_UPDATE_LOADER); /* loader won't be updated by emmc */ } #endif diff --git a/loader/Project/Model/Src/prj_main.c b/loader/Project/Model/Src/prj_main.c index b33b8e7f6..cd9285a4d 100755 --- a/loader/Project/Model/Src/prj_main.c +++ b/loader/Project/Model/Src/prj_main.c @@ -175,7 +175,7 @@ static BOOL prj_isSpecialKeyPressed(UINT32 ota_flag) static BOOL prj_issfSpecialKeyPressed(UINT32 ota_flag) { - #if (MODEL == MODEL_S530) + #if (MODEL == MODEL_S530) if ((!gpio_getPin(GPIO_SPECIAL_KEY)) && (gpio_getPin(GPIO_SPECIAL_USB))) #elif (MODEL == MODEL_S550) if ((!(gpio_getPin(GPIO_SPECIAL_KEY2)) && (gpio_getPin(GPIO_SPECIAL_USB))))//Force Upgrade @@ -242,7 +242,7 @@ _THUMB2 void prj_main(void) { PSTORAGE_OBJ strg_obj = NULL; loader_setVersion(_LDR_VER_); - + debug_msg("\r\n"); debug_msg("LD_VER "); debug_msg(Dec2HexStr2Bytes((LoaderInternalInfo[1] >> 28) & 0xF)); @@ -261,7 +261,7 @@ _THUMB2 void prj_main(void) } else { debug_msg(_LOADER_VERSION_STR_); } - + // Setup loader/fw file names loader_setUpdateFwName(_UPDATE_FW_NAME_); loader_setUpdateLdrName(_UPDATE_LOADER_NAME_);