【求助】【TuyaOS OS】修改运行主频运行正常,OTA失败

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


Post Reply
luzhihui
Posts: 32

1)开发包全称:tuyaos-subdev-bt_3.10.0_phy6222_ble_ble-common_1.0.3.tar
2)问题现象:在APP上点击升级后,大约4秒设备就复位了,APP显示升级失败。

我首先是在3.9.0上遇到这个问题,然后我用最新的SDK一点点的移植代码,测试找问题,最终在修改主频后出现OTA失败。
修改主频位置在这里,有原本的16M改为48M后出现OTA失败。

Code: Select all

int main(void)
{
    watchdog_config(WDG_2S);

#if (FLASH_PROTECT_FEATURE == 1)
    hal_flash_enable_lock(MAIN_INIT);
#endif

tkl_init_first();

g_system_clk = SYS_CLK_XTAL_16M; //SYS_CLK_DBL_32M; //SYS_CLK_XTAL_16M; //SYS_CLK_DLL_64M; //SYS_CLK_DLL_48M;
g_clk32K_config = CLK_32K_RCOSC; //CLK_32K_XTAL, CLK_32K_RCOSC

drv_irq_init();
init_config();
#if (HOST_CONFIG & OBSERVER_CFG)
    extern void ll_patch_advscan(void);
    ll_patch_advscan();
#else
    extern void ll_patch_slave(void);
    ll_patch_slave();
#endif

Tags:
User avatar
逻辑的院子
Posts: 284
Contact:

Re: 【求助】【TuyaOS OS】修改运行主频运行正常,OTA失败

如果使用默认的主频g_system_clk = SYS_CLK_XTAL_16M不会有问题;
如果修改主频为g_system_clk = SYS_CLK_DLL_48M,由于在OTA开始之前会调用hal_system_clock_change_active接口来修改主频,该接口的参数如果与已有主频一致则会返回1,导致程序卡死,所以如果修改主频为SYS_CLK_DLL_48M,可以同时修改tkl_ota.c中的tkl_ota_start_notify接口为:

Code: Select all

OPERATE_RET tkl_ota_start_notify(UINT_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path)
{
#if (HOST_CONFIG & OBSERVER_CFG)
    tkl_ble_gap_scan_stop();
#endif

uint8_t st = 0;

do {
    if (hw_version_is_old()) {
        if (g_system_clk != SYS_CLK_DBL_32M) {
            st = hal_system_clock_change_active(SYS_CLK_DBL_32M, clk_change_mod_restore);
        }
    } else {
        if (g_system_clk != SYS_CLK_DLL_48M) {
            st = hal_system_clock_change_active(SYS_CLK_DLL_48M, clk_change_mod_restore);
        }
    }
} while (st == 1);

return OPRT_OK;
}
luzhihui
Posts: 32

Re: 【求助】【TuyaOS OS】修改运行主频运行正常,OTA失败

这样改也不行,目前用的tuyaos-subdev-bt_3.10.0_phy6222_ble_ble-common_1.0.3.tar这个版本SDK验证。
修改这里

Code: Select all

g_system_clk = SYS_CLK_DLL_48M; //SYS_CLK_DBL_32M; //SYS_CLK_XTAL_16M; //SYS_CLK_DLL_64M; //SYS_CLK_DLL_48M;
    g_clk32K_config = CLK_32K_RCOSC; //CLK_32K_XTAL, CLK_32K_RCOSC

另外修改

Code: Select all

OPERATE_RET tkl_ota_start_notify(UINT_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path)
{
    extern volatile sysclk_t g_system_clk;
#if (HOST_CONFIG & OBSERVER_CFG)
    tkl_ble_gap_scan_stop();
#endif

uint8_t st = 0;

do {
    if (hw_version_is_old()) {
        if (g_system_clk != SYS_CLK_DBL_32M) {
            st = hal_system_clock_change_active(SYS_CLK_DBL_32M, clk_change_mod_restore);
        }
    } else {
        if (g_system_clk != SYS_CLK_DLL_48M) {
            st = hal_system_clock_change_active(SYS_CLK_DLL_48M, clk_change_mod_restore);
        }
    }
} while (st == 1);

return OPRT_OK;
}

测试使用48M依然会失败

luzhihui
Posts: 32

Re: 【求助】【TuyaOS OS】修改运行主频运行正常,OTA失败

逻辑的院子 2024年 Jul 9日 14:48

如果使用默认的主频g_system_clk = SYS_CLK_XTAL_16M不会有问题;
如果修改主频为g_system_clk = SYS_CLK_DLL_48M,由于在OTA开始之前会调用hal_system_clock_change_active接口来修改主频,该接口的参数如果与已有主频一致则会返回1,导致程序卡死,所以如果修改主频为SYS_CLK_DLL_48M,可以同时修改tkl_ota.c中的tkl_ota_start_notify接口为:

Code: Select all

OPERATE_RET tkl_ota_start_notify(UINT_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path)
{
#if (HOST_CONFIG & OBSERVER_CFG)
    tkl_ble_gap_scan_stop();
#endif

uint8_t st = 0;

do {
    if (hw_version_is_old()) {
        if (g_system_clk != SYS_CLK_DBL_32M) {
            st = hal_system_clock_change_active(SYS_CLK_DBL_32M, clk_change_mod_restore);
        }
    } else {
        if (g_system_clk != SYS_CLK_DLL_48M) {
            st = hal_system_clock_change_active(SYS_CLK_DLL_48M, clk_change_mod_restore);
        }
    }
} while (st == 1);

return OPRT_OK;
}

修改48M按照这样改不行,但是用SYS_CLK_DBL_32M是可以OTA成功的。

User avatar
逻辑的院子
Posts: 284
Contact:

Re: 【求助】【TuyaOS OS】修改运行主频运行正常,OTA失败

你打印一下这个变量,看看芯片版本
extern unsigned char chip_hw_version;

Post Reply