T2-U开发板启动与初始化

基于 TuyaOS 的开发板,如 T2 等


Post Reply
User avatar
chenyisong
Posts: 95

编译第一个工程

tuyaos_demo_quickstart 为 TuyaOS 联网单品统一的 demo 工程,在体现 TuyaOS 联网单品开发的基本能力下,提供一个尽可能简单的示例,方便开发者借助此示例熟悉 TuyaOS 开发流程,开发自己的智能设备。

tuyaos_demo_quickstart 具备以下功能:

  • 可配置配网按钮
  • 可配置配网指示灯
  • 支持蓝牙配网、热点配网模式
  • 连接涂鸦云后,自动回复 APP 通过涂鸦云下发信息,用于演示app下发。
  • 按钮短按触发上报功能
  • 按钮长按移除设备功能

应用程序启动流程

1. 入口函数

TuyaOS 联网单品统一的入口函数为 tuya_app_main

Code: Select all

   VOID_T tuya_app_main(VOID_T)
   {
       THREAD_CFG_T thrd_param = {4096, 4, "tuya_app_main"};
       tal_thread_create_and_start(&ty_app_thread, NULL, NULL, tuya_app_thread, NULL, &thrd_param);
   }

tuya_app_main 会创建一个 ty_app_thread 线程,调用 TUYA_LwIP_Init() 函数完成 lwip 初始化,并调用 user_main() 或 app_main() 函数,进入应用层代码。

Code: Select all

    STATIC VOID_T tuya_app_thread(VOID_T *arg)
    {
        /* Initialization LWIP first!!! */
    #if defined(ENABLE_LWIP) && (ENABLE_LWIP == 1)
        TUYA_LwIP_Init();
    #endif
   
        user_main();
   
        tal_thread_delete(ty_app_thread);
        ty_app_thread = NULL;
    }

2. TuyaOS 初始化

在 user_main()/app_main() 函数中,会调用 tuya_iot_init_params() 函数实现 TuyaOS 初始化。

Code: Select all

STATIC VOID_T user_main(VOID_T)
{
    OPERATE_RET rt = OPRT_OK;

    /* Initialization, because DB initialization takes a long time, 
     * which affects the startup efficiency of some devices, 
     * so special processing is performed during initialization to delay initialization of DB
     */
    TY_INIT_PARAMS_S init_param = {0};
    init_param.init_db = TRUE;
    strcpy(init_param.sys_env, TARGET_PLATFORM);
    TUYA_CALL_ERR_LOG(tuya_iot_init_params(NULL, &init_param));

    tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);

    /* Initialization device */
    TAL_PR_DEBUG("device_init in");
    TUYA_CALL_ERR_LOG(__soc_device_init());

    return;
}

tuya_iot_init_params() 函数是 TuyaOS 的初始化接口,接口内部会对 TuyaOS 的内部基础功能进行资源分配、初始化。一般来说,这个接口会第一个调用。开发者如果有一些需要尽早启动,并且和 TuyaOS 无关的逻辑,可以在此接口调用之前执行。

Code: Select all

/**
 * @brief tuya_iot_init_params 
 * @desc init tuyaos framework
 *
 * @param[in] fs_storge_path: filesystem read write storge path
 *            (if os have no fs,then fs_storge_path is invalid)
 * @param[in] p_param: custom init params
 *
 * @return OPRT_OK: success  Other: fail
 */
OPERATE_RET tuya_iot_init_params(IN CONST CHAR_T *fs_storge_path, IN CONST TY_INIT_PARAMS_S *p_param);
  • CHAR_T *fs_storge_path:数据存储路径,仅在Linux 系统下使用,如果不提供,则默认在程序当前路径下创建数据库目录 tuya_db_files

  • TY_INIT_PARAMS_S *p_param:初始化配置,Linux 系统可以设置为 NULL


    Code: Select all

      typedef struct {
        BOOL_T init_db;	//TuyaOS 初始化系统服务时,是否初始化 KV 数据存储服务。如果选择不初始化,则后续需要显式调用 tuya_iot_kv_flash_init_param 以使能 KV 数据存储服务。
        CHAR_T sys_env[SYS_ENV_LEN]; // 系统环境变量(Linux 适用)
        CHAR_T log_seq_path[LOG_SEQ_PATH_LEN]; // 日志序文件存储路径(Linux 适用)
      }TY_INIT_PARAMS_S;

更多详细信息可点击:系统服务初始化参数

产品创建

tuyaos_demo_quickstart 示例中,默认的 PID 在 tuya_app_main.c 中通过宏定义,开发者开发自己的智能设备需替换该宏。

Code: Select all

#define PID "uiiyltkjmkhwumga"

PID 可在 涂鸦 IoT 平台 创建产品后获取,更详细产品创建流程可参考:https://developer.tuya.com/cn/docs/iot-device-dev/application-creation?id=Kbxw7ket3aujc

设备初始化

产品相关的信息通过 tuya_iot_wf_soc_dev_init() 接口注册至 TuyaOS 。

Code: Select all

/**
 * @brief tuya_iot_wf_soc_dev_init_param 
 *
 * @param[in] cfg
 * @param[in] start_mode
 * @param[in] cbs: tuya wifi sdk user callbacks,note cbs->dev_ug_cb is useless
 * @param[in] firmware_key
 * @param[in] product_key: product key/proudct id,get from tuya open platform
 * @param[in] wf_sw_ver: wifi module software version format:xx.xx.xx (0<=x<=9)
 *
 * @return OPERATE_RET
 */
 OPERATE_RET tuya_iot_wf_soc_dev_init_param(IN CONST GW_WF_CFG_MTHD_SEL cfg, IN CONST GW_WF_START_MODE start_mode,
                                     IN CONST TY_IOT_CBS_S *cbs,IN CONST CHAR_T *firmware_key,
                                     IN CONST CHAR_T *product_key,IN CONST CHAR_T *wf_sw_ver);
#define tuya_iot_wf_soc_dev_init(cfg, start_mode,cbs,product_key,wf_sw_ver) \
        tuya_iot_wf_soc_dev_init_param(cfg, start_mode,cbs,NULL,product_key,wf_sw_ver)

此接口是 TuyaOS 应用产品初始化接口,通过开发者传递过来的 PID、固件key、版本信息,到涂鸦云激活,并向云端获取对应 PID 的模型,即 schema 信息对设备进行初始化。此函数接口参数较多,下面逐一解释每个参数的含义:

  • GW_WF_CFG_MTHD_SEL cfgWi-Fi 设备配网模式。更多详细使用说明参照 配网模式的定义

  • GW_WF_START_MODE start_modeWi-Fi 设备配网启动方式。详细使用说明参照 配网启动方式的定义

  • TY_IOT_CBS_S *cbs IoT 设备功能回调函数

    • 和设备本身相关
      • gw_status_cb:通知开发者设备激活的状态发生改变。
      • gw_reset_cb:通知开发者设备被重置了。
      • dev_obj_dp_cb:通知开发者有 obj 类型 DP 指令下发。
      • dev_raw_dp_cb:通知开发者有 raw 类型 DP 指令下发。
      • dev_dp_query_cb:通知您需要查询指定 DP 当前的状态。
    • 和设备带的可独立 OTA 的功能模组相关
    • pre_gw_ug_cb:通知开发者,设备带的可独立 OTA 的功能模组有升级请求,开发者通过返回值告诉开发框架当前是否允许升级。
    • gw_ug_cb:通知开发者,设备带的可独立 OTA 的功能模组开始进入升级流程,并告知开发者拉取升级数据时所需的 URL 等必要信息。
    • 和设备下挂的子设备相关
    • pre_dev_ug_cb:通知开发者,设备所属的子设备有升级请求,开发者通过返回值告诉开发框架当前是否允许升级。
    • dev_ug_cb:通知开发者,设备所属的子设备开始进入升级流程,并告知开发者拉取升级数据时所需的 URL 等必要信息。
    • dev_reset_cb:通知开发者,设备所属的子设备被重置了(单品类设备无需关心)。

Code: Select all

/**
* @brief Definition of gateway callback functions
*/
typedef struct {
    /** status update */
    GW_STATUS_CHANGED_CB gw_status_cb;
    /** gateway upgrade */
    GW_UG_INFORM_CB gw_ug_cb;
    /** gateway reset */
    GW_RESET_IFM_CB gw_reset_cb;
    /** structured DP info */
    DEV_OBJ_DP_CMD_CB dev_obj_dp_cb;
    /** raw DP info */
    DEV_RAW_DP_CMD_CB dev_raw_dp_cb;
    /** DP query */
    DEV_DP_QUERY_CB dev_dp_query_cb;
    /** sub-device upgrade */
    DEV_UG_INFORM_CB dev_ug_cb;
    /** sub-device reset */
    DEV_RESET_IFM_CB dev_reset_cb;
    /** active short url */
    ACTIVE_SHORTURL_CB active_shorturl;
    /** gateway upgrade pre-condition */
    GW_UG_INFORM_CB pre_gw_ug_cb;
    /** sub-device upgrade pre-condition */
    DEV_UG_INFORM_CB pre_dev_ug_cb;
} TY_IOT_CBS_S;

更多详细信息可点击:IoT 设备功能回调函数

注意:

  1. 您按需注册相关回调,无需注册的填 NULL 即可。

  2. 单品类设备的开发者无需关心与子设备相关的回调函数,填 NULL 即可。

Post Reply