【已解决】RTL8720cs_3.3.2 编译无法通过

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
jafil10
Posts: 85

我之前使用 1.1.3版本的SDK,是可以正常使用涂鸦工具进行授权的,现在转3.3.2,mf_init 的接口就直接异常了。

愚者千虑必有一得
Posts: 510

Re: RTL8720cs_3.3.2 编译无法通过

这个crash log提供了查看堆栈的命令:
stact addr 0x10036780, size 0xfe4, top 0x10037390
Show more call stack info by run: addr2line -e ./asdk/image/target_img2.axf -f 0e019b18 0e02f4eb 0e0bbf4b 0e0195b1 0e0198c1 0e01a2cd 0e010745 0e01126d 0e010751 0e01074d 0e0dd360 0e0dd358 0e01126d 0e0dd358 0e0dd360 0e011689 0e00dee1 0e02f127 0e0e4c14 0e0e7b30 0e0dd882 0e010749 0e010745 0e01126d 0e010751 0e01074d 0e0119ff 0e02e4ad 0e0bbbc9
Exit CM BackTrace
你可以在在固件outpu路径下执行一下这个命令,把 ./asdk/image/target_img2.axf改成你对应的axf文件名,就可以看到crash在什么地方了。你这个问题可能是你注册的回调不符合3.3.2的mf_init的要求,你可以看看mf_init的几个回调,3.3.2应该没有pre gpio callback了,quick start demo里有相关的代码。

Code: Select all

    /**
 * @brief mf uart init
 *
 * @param[in] baud: Baud rate
 * @param[in] bufsz: uart receive buffer size
 *
 * @return none
 */
VOID mf_uart_init_callback(UINT_T baud, UINT_T bufsz)
{
    TAL_UART_CFG_T cfg;
    memset(&cfg, 0, sizeof(TAL_UART_CFG_T));
    cfg.base_cfg.baudrate = baud;
    cfg.base_cfg.databits = TUYA_UART_DATA_LEN_8BIT;
    cfg.base_cfg.parity = TUYA_UART_PARITY_TYPE_NONE;
    cfg.base_cfg.stopbits = TUYA_UART_STOP_LEN_1BIT;
    cfg.rx_buffer_size = bufsz;

    tal_uart_init(TUYA_UART_NUM_0, &cfg);

    return;
}

/**
 * @brief mf uart free
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_uart_free_callback(VOID)
{
    tal_uart_deinit(TUYA_UART_NUM_0);
    return;
}

/**
 * @brief mf uart send function
 *
 * @param[in] data: send data
 * @param[in] len: send data length
 * 
 * @return none
 */
VOID mf_uart_send_callback(IN BYTE_T *data, IN CONST UINT_T len)
{
    tal_uart_write(TUYA_UART_NUM_0, data, len);
    return;
}

/**
 * @brief mf uart receive function
 *
 * @param[in] buf: receive buffer
 * @param[in] len: receive buffer max length
 *
 * @return receive data length
 */
UINT_T mf_uart_recv_callback(OUT BYTE_T *buf, IN CONST UINT_T len)
{
    return tal_uart_read(TUYA_UART_NUM_0, buf, len);
}

/**
 * @brief Product test callback function
 *
 * @param[in] cmd: Command
 * @param[in] data: data
 * @param[out] ret_data: Resulting data
 * @param[out] ret_len: Resulting data length
 * 
 * @return OPRT_OK on success. Others on error, please refer to "tuya_error_code.h".
 */
OPERATE_RET mf_user_product_test_callback(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
    /* USER todo */
    return OPRT_OK;
}

/**
 * @brief mf configure write callback functions
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_user_callback(VOID)
{
    return ;
}

/**
 * @brief Callback function before entering the production test
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_user_enter_mf_callback(VOID)
{
    return ;
}
    // 产测初始化, 注册函数需要应用实现,其中串口驱动不需要应用提供
    MF_IMPORT_INTF_S intf = {0};

    intf.uart_init = mf_uart_init_callback;
    intf.uart_free = mf_uart_free_callback;
    intf.uart_send = mf_uart_send_callback;
    intf.uart_recv = mf_uart_recv_callback;

    intf.mf_user_product_test = mf_user_product_test_callback;
    intf.user_callback = mf_user_callback;
    intf.user_enter_mf_callback = mf_user_enter_mf_callback;

    TAL_PR_ERR("mf_init APP_BIN_NAME[%s] USER_SW_VER[%s]", APP_BIN_NAME, USER_SW_VER);
    
TUYA_CALL_ERR_RETURN(mf_init(&intf, APP_BIN_NAME, USER_SW_VER, TRUE));

另外你的mf init失败信息是什么?mf线程启动之后,如果500ms没有进入产测,就会自动退出。

愚者千虑必有一得
Posts: 510

Re: RTL8720cs_3.3.2 编译无法通过

jafil10 2023年 Mar 29日 21:14

我之前使用 1.1.3版本的SDK,是可以正常使用涂鸦工具进行授权的,现在转3.3.2,mf_init 的接口就直接异常了。

你的callback都没修改么?可以参考我上面回复贴的代码。

jafil10
Posts: 85

Re: RTL8720cs_3.3.2 编译无法通过

愚者千虑必有一得 2023年 Mar 30日 09:37
jafil10 2023年 Mar 29日 21:14

我之前使用 1.1.3版本的SDK,是可以正常使用涂鸦工具进行授权的,现在转3.3.2,mf_init 的接口就直接异常了。

你的callback都没修改么?可以参考我上面回复贴的代码。

Code: Select all

/**
 * @brief mf uart init
 *
 * @param[in] baud: Baud rate
 * @param[in] bufsz: uart receive buffer size
 *
 * @return none
 */
VOID mf_uart_init_callback(UINT_T baud, UINT_T bufsz)
{
    TAL_UART_CFG_T cfg;

    memset(&cfg, 0, sizeof(TAL_UART_CFG_T));
    cfg.base_cfg.baudrate = baud;
    cfg.base_cfg.databits = TUYA_UART_DATA_LEN_8BIT;
    cfg.base_cfg.parity = TUYA_UART_PARITY_TYPE_NONE;
    cfg.base_cfg.stopbits = TUYA_UART_STOP_LEN_1BIT;
    cfg.rx_buffer_size = bufsz;

    tal_uart_init(UART_NUM_0, &cfg);
}

/**
 * @brief mf uart free
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_uart_free_callback(VOID)
{
    TAL_PR_INFO("%s");
    tal_uart_deinit(UART_NUM_0);
}

/**
 * @brief mf uart send function
 *
 * @param[in] data: send data
 * @param[in] len: send data length
 * 
 * @return none
 */
VOID mf_uart_send_callback(IN BYTE_T *data, IN CONST UINT_T len)
{
    tal_uart_write(UART_NUM_0, data, len);
}

/**
 * @brief mf uart receive function
 *
 * @param[in] buf: receive buffer
 * @param[in] len: receive buffer max length
 *
 * @return receive data length
 */
UINT_T mf_uart_recv_callback(OUT BYTE_T *buf, IN CONST UINT_T len)
{
    return tal_uart_read(UART_NUM_0, buf, len);
}

/**
 * @brief Product test callback function
 *
 * @param[in] cmd: Command
 * @param[in] data: data
 * @param[out] ret_data: Resulting data
 * @param[out] ret_len: Resulting data length
 * 
 * @return OPRT_OK on success. Others on error, please refer to "tuya_error_code.h".
 */
OPERATE_RET mf_user_product_test_callback(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
    UNUSED(cmd);
    UNUSED(data);
    UNUSED(len);
    // UNUSED(ret_data);
    // UNUSED(ret_len);
    /* USER todo */
    ret_data = NULL;
    *ret_len = 0;
    return OPRT_OK;
}

BOOL_T mf_gpio_test_cb(IN CONST CHAR_T *in, OUT CHAR_T *out)
{
    UNUSED(in);
    UNUSED(out);
    return TRUE;
}

BOOL_T mf_pre_gpio_test_cb(VOID)
{
    return FALSE;
}

/**
 * @brief mf configure write callback functions
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_user_callback(VOID)
{
}

/**
 * @brief Callback function before entering the production test
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_user_enter_mf_callback(VOID)
{
}

    MF_IMPORT_INTF_S intf = {0};

    intf.uart_init = mf_uart_init_callback;
    intf.uart_free = mf_uart_free_callback;
    intf.uart_send = mf_uart_send_callback;
    intf.uart_recv = mf_uart_recv_callback;

    intf.gpio_test = mf_gpio_test_cb;
    intf.mf_user_product_test = mf_user_product_test_callback;
    intf.user_callback = mf_user_callback;
    intf.user_enter_mf_callback = mf_user_enter_mf_callback;
    intf.user_pre_gpio_test = mf_pre_gpio_test_cb;

    TUYA_CALL_ERR_RETURN(mf_init(&intf, APP_BIN_NAME, USER_SW_VER, TRUE));

我这边的代码是这样的,移植过来的时候,就已经按最新的去修改了。

jafil10
Posts: 85

Re: RTL8720cs_3.3.2 编译无法通过

愚者千虑必有一得 2023年 Mar 30日 09:36

这个crash log提供了查看堆栈的命令:
stact addr 0x10036780, size 0xfe4, top 0x10037390
Show more call stack info by run: addr2line -e ./asdk/image/target_img2.axf -f 0e019b18 0e02f4eb 0e0bbf4b 0e0195b1 0e0198c1 0e01a2cd 0e010745 0e01126d 0e010751 0e01074d 0e0dd360 0e0dd358 0e01126d 0e0dd358 0e0dd360 0e011689 0e00dee1 0e02f127 0e0e4c14 0e0e7b30 0e0dd882 0e010749 0e010745 0e01126d 0e010751 0e01074d 0e0119ff 0e02e4ad 0e0bbbc9
Exit CM BackTrace
你可以在在固件outpu路径下执行一下这个命令,把 ./asdk/image/target_img2.axf改成你对应的axf文件名,就可以看到crash在什么地方了。你这个问题可能是你注册的回调不符合3.3.2的mf_init的要求,你可以看看mf_init的几个回调,3.3.2应该没有pre gpio callback了,quick start demo里有相关的代码。

Code: Select all

    /**
 * @brief mf uart init
 *
 * @param[in] baud: Baud rate
 * @param[in] bufsz: uart receive buffer size
 *
 * @return none
 */
VOID mf_uart_init_callback(UINT_T baud, UINT_T bufsz)
{
    TAL_UART_CFG_T cfg;
    memset(&cfg, 0, sizeof(TAL_UART_CFG_T));
    cfg.base_cfg.baudrate = baud;
    cfg.base_cfg.databits = TUYA_UART_DATA_LEN_8BIT;
    cfg.base_cfg.parity = TUYA_UART_PARITY_TYPE_NONE;
    cfg.base_cfg.stopbits = TUYA_UART_STOP_LEN_1BIT;
    cfg.rx_buffer_size = bufsz;

    tal_uart_init(TUYA_UART_NUM_0, &cfg);

    return;
}

/**
 * @brief mf uart free
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_uart_free_callback(VOID)
{
    tal_uart_deinit(TUYA_UART_NUM_0);
    return;
}

/**
 * @brief mf uart send function
 *
 * @param[in] data: send data
 * @param[in] len: send data length
 * 
 * @return none
 */
VOID mf_uart_send_callback(IN BYTE_T *data, IN CONST UINT_T len)
{
    tal_uart_write(TUYA_UART_NUM_0, data, len);
    return;
}

/**
 * @brief mf uart receive function
 *
 * @param[in] buf: receive buffer
 * @param[in] len: receive buffer max length
 *
 * @return receive data length
 */
UINT_T mf_uart_recv_callback(OUT BYTE_T *buf, IN CONST UINT_T len)
{
    return tal_uart_read(TUYA_UART_NUM_0, buf, len);
}

/**
 * @brief Product test callback function
 *
 * @param[in] cmd: Command
 * @param[in] data: data
 * @param[out] ret_data: Resulting data
 * @param[out] ret_len: Resulting data length
 * 
 * @return OPRT_OK on success. Others on error, please refer to "tuya_error_code.h".
 */
OPERATE_RET mf_user_product_test_callback(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
    /* USER todo */
    return OPRT_OK;
}

/**
 * @brief mf configure write callback functions
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_user_callback(VOID)
{
    return ;
}

/**
 * @brief Callback function before entering the production test
 *
 * @param[in] none
 *
 * @return none
 */
VOID mf_user_enter_mf_callback(VOID)
{
    return ;
}
    // 产测初始化, 注册函数需要应用实现,其中串口驱动不需要应用提供
    MF_IMPORT_INTF_S intf = {0};

    intf.uart_init = mf_uart_init_callback;
    intf.uart_free = mf_uart_free_callback;
    intf.uart_send = mf_uart_send_callback;
    intf.uart_recv = mf_uart_recv_callback;

    intf.mf_user_product_test = mf_user_product_test_callback;
    intf.user_callback = mf_user_callback;
    intf.user_enter_mf_callback = mf_user_enter_mf_callback;

    TAL_PR_ERR("mf_init APP_BIN_NAME[%s] USER_SW_VER[%s]", APP_BIN_NAME, USER_SW_VER);
    
TUYA_CALL_ERR_RETURN(mf_init(&intf, APP_BIN_NAME, USER_SW_VER, TRUE));

另外你的mf init失败信息是什么?mf线程启动之后,如果500ms没有进入产测,就会自动退出。

这个调试我清楚,但得不到有用的信息,我呆会把这个调试日志发出来。另外,我是把loguart给打开了,跟这个有关系吗?我记得授权口不是使用loguart的。

jafil10
Posts: 85

Re: RTL8720cs_3.3.2 编译无法通过

这个你们那边会出现这个现象吗?

jafil10
Posts: 85

Re: RTL8720cs_3.3.2 编译无法通过

你好,这个问题能解决吗?

愚者千虑必有一得
Posts: 510

Re: RTL8720cs_3.3.2 编译无法通过

jafil10 2023年 Mar 30日 11:19

这个你们那边会出现这个现象吗?

我现在还不太清楚你的现象是什么,crash的原因知道了,产测失败的原因不知道,你要发log出来。

jafil10
Posts: 85

Re: RTL8720cs_3.3.2 编译无法通过

愚者千虑必有一得 2023年 Mar 30日 19:52
jafil10 2023年 Mar 30日 11:19

这个你们那边会出现这个现象吗?

我现在还不太清楚你的现象是什么,crash的原因知道了,产测失败的原因不知道,你要发log出来。

我这边的现象就是crash了,没有办法进入产测。正常如果不crash的话,是可以正常授权的吧?

jafil10
Posts: 85

Re: RTL8720cs_3.3.2 编译无法通过

愚者千虑必有一得 2023年 Mar 30日 19:52
jafil10 2023年 Mar 30日 11:19

这个你们那边会出现这个现象吗?

我现在还不太清楚你的现象是什么,crash的原因知道了,产测失败的原因不知道,你要发log出来。

能否把你那边修复crash的库发给我验证一下?

Post Reply