通用 Wi-Fi SDK 开发环境适配

更新时间:2022-11-24 09:20:23下载pdf

版本记录

版本 编写/修订说明 修订日期 备注
1.0.0 创建文档 20200601

概述

TuyaOS 是涂鸦独创 IoT OS 操作系统,提供了按照业务需求选择组件,定制 SDK 的能力,是涂鸦开发者的利剑,具备轻量级、互联互通、安全传输、组件丰富、快速开发等关键能力,有效降低开发门槛、缩短开发周期,可广泛应用于可穿戴设备、视频监控、中控网关、智能音箱、智能家电、智能门锁等智能家居领域设备。

Tuya 通用 Wi-Fi SDK是基于 TuyaOS 技术体系按照物联网 Wi-Fi 应用场景,进行裁剪、定制得到的,适用于任意一款按照涂鸦平台导入规范进行适配导入的 Wi-Fi 芯片平台。

对于不同的开发者,Tuya 提供了不同的策略,给开发者提供不同的服务。其中,对于拥有较强的自主开发能力的,能够开发底层硬件、驱动的开发者,可以使用我们提供的 SDK,适配开发环境抽象接口,从而更加定制的实现设备功能。

本文档主要描述了如何对 Tuya 通用 Wi-Fi SDK 进行开发环境适配。开发环境包括了原厂的工具链、脚本、库文件等信息,如果你使用的是 Tuya 提供的模块,或者是Tuya 已经对此芯片平台进行了适配,你就不需自己去适配了,Tuya对外发布的 SDK 产物,都已经完成了编译适配、接口适配等工作,根据 README.md 文件的指引使用就可以了。

开发环境编译适配

开发环境包括了芯片原厂提供的工具链、脚本、库文件等信息,是编译 Tuya 通用 Wi-Fi SDK 时必须的,因此需要客户对开发环境按照以下规范进行适配,从而实现SDK、固件的编译。

SDK编译适配

客户使用自有的芯片平台对接Tuya 通用 Wi-Fi SDK,需要 Tuya 提供使用该芯片平台的编译工具编译生成的静态库或者是动态库文件。可以在 本文档的指引下,自助完成。分为以下几个步骤:

  • 需要把芯片生产原厂提供的工具、库、脚本等资料提供给 Tuya,同时也需要把编译选项、功能需求等需求列表发送给 Tuya 工程师。

  • Tuya 工程师按照需求对芯片生产原厂工具链进行适配。以 RTL8720CF 的适配为例:

    • 创建 toolchain 目录:在芯片生产原厂提供的工具链的根目录下创建 toolchain 目录,用于创建编译环境。

      通用 Wi-Fi SDK 开发环境适配

    • 创建 build_path: 用于导出工具链的编译工具位置。

      • TUYA_SDK_TOOLCHAIN_ZIP:用于标识工具链压缩包的位置,Tuya 自动化编译系统会判断这个变量的值,如果存在,会进行解压。
      • TUYA_SDK_BUILD_PATH:用于标识编译工具的位置,Tuya自动化编译系统会将这个PATH作为编译工具的前缀使用。 通用 Wi-Fi SDK 开发环境适配
    • 创建 platform.mk: 用于对接 Tuya 持续集成系统,按照客户的编译需求,进行自动化 SDK编译。

      • TUYA_PLATFORM_DIR:用于标识当前开发环境的位置。
      • TUYA_PLATFORM_CFLAGS:用于添加客户需要的CFLAGS、编译选项等 通用 Wi-Fi SDK 开发环境适配
    • 创建 build.conf

      • 用于定于客户需要个各种功能特性。详情请参照 附录.
  • Tuya 工程师将编译好的 Tuya 通用 Wi-Fi SDK 产物提供给客户,供调试、开发使用。客户拿到 Tuya 通用 Wi-Fi SDK产物之后,可以按照下面的固件编译适配,去调整的固件编译流程,编译出可以烧录到芯片上执行的固件。

固件编译适配

Tuya 提供编译好的 Tuya 通用 Wi-Fi SDK 产物解压之后,目录如下表所示:

目录 子目录 描述 备注
apps / 存放客户应用程序和涂鸦通用 Wi-Fi SDK 的 demo,每个应用或者demo应使用单独的文件夹保存 参照涂鸦通用 Wi-Fi SDK demo 使用说明
one_plug_demo 一个示例demo 一般会提供一个或者多个 demo
sdk / 存放涂鸦通用 Wi-Fi SDK 的头文件和库文件 参照后续的功能接口说明
include 涂鸦通用 Wi-Fi SDK 提供的 API 接口
lib 涂鸦通用 Wi-Fi SDK 编译得到的 libtuya_iot.a文件
platforms / 涂鸦通用 Wi-Fi SDK 的开发编译环境和工具链 默认是空的,在编译的时候,会通过build_app.sh下载相应的工具链
build_app.sh / 应用、demo 的编译入口 进行环境准备,以及编译
CHANGELOG.md / 版本修改的记录
README.md / Tuya SDK使用指南 根据使用指南,指引客户如何使用TuyaOS SDK

我们基于这个环境,提供了一套编译机制,客户也可以根据自己的需求,自己定义自己的编译过程。此处以 one_plug_demo 的固件编译过程为例,描述固件的编译过程:

通用 Wi-Fi SDK 开发环境适配

build_app.sh:下载开发环境包,执行 demo 里的编译脚本。我们支持多种编译方式,包括脚本,makefile。

通用 Wi-Fi SDK 开发环境适配

./apps/one_plug_demo/build.sh:进入开发环境,执行编译脚本,并进行打包处理工作。

通用 Wi-Fi SDK 开发环境适配

编译生成的产物会输出到apps/one_plug_demo/output/目录之下。

Tuya Common移植

Tuya Common 存放在 Tuya 通用 Wi-Fi SDK 产物包里,通过执行 build_app.sh 下载的经过 SDK 编译适配之后的开发环境里,包含了Tuya Commonm目录,客户可以直接使用这个目录里的相关代码。

通用 Wi-Fi SDK 开发环境适配

Tuya OS Adapter接口适配

Tuya OS Adapter层采用广泛使用的注册机制,由 Tuya 通用 Wi-Fi SDK 提供对底层功能进行抽象,提供接口描述定义,用户根据自己的需求,实现相关接口,并进行注册,从而实现 Tuya 通用 Wi-Fi SDK 的平台无关性。客户需要自己实现 Tuya OS Adapter,并放置于开发环境根目录。

通用 Wi-Fi SDK 开发环境适配

System

Tuya HAL System提供了一些操作系统的接口,需要不同的平台对其进行实现,如果是Linux平台,Tuya 通用 Wi-Fi SDK 提供了一套通用的 System相关接口的实现,如果客户有特殊的定制要求,可以按照自己的需求实现这些接口。


os_adapter_get_systemtickcount

SYS_TICK_T os_adapter_get_systemtickcount(void)
  • 函数说明

    获取系统当前的ticket值

  • 参数

  • 返回值

    系统当前的tick值

os_adapter_get_tickratems

unsigned int os_adapter_get_tickratems(void)
  • 函数说明

    获取系统1个ticket是多少个ms

  • 参数

  • 返回值

    系统1个ticket是多少个ms

os_adapter_system_sleep

void os_adapter_system_sleep(const unsigned long msTime)
  • 函数说明

    线程睡眠

  • 参数

输入/输出 参数名 描述
[in] msTime 系统sleep的时间(单位ms)
  • 返回值

os_adapter_system_isrstatus

bool os_adapter_system_isrstatus(void)
  • 函数说明

    获取系统是否处于中断例程里

  • 参数

  • 返回值

    bool : TRUE:在中断例程;FALSE:不在中断例程

os_adapter_system_reset

void os_adapter_system_reset(void)
  • 函数说明

    重启系统

  • 参数

  • 返回值

os_adapter_system_getheapsize

unsigned int os_adapter_system_getheapsize(void)
  • 函数说明

    获取系统剩余内存大小

  • 参数

  • 返回值

    剩余内存

os_adapter_system_get_rst_info

TY_RST_REASON_E os_adapter_system_get_rst_info(void)
  • 函数说明

    获取系统重启原因

TY_RST_REASON_E ——
TY_RST_POWER_OFF 电源重启
TY_RST_HARDWARE_WATCHDOG 硬件看门狗复位
TY_RST_FATAL_EXCEPTION 异代码常
TY_RST_SOFTWARE_WATCHDOG 软件看门狗重启
TY_RST_SOFTWARE 软件复位
TY_RST_DEEPSLEEP 深度睡眠
TY_RST_HARDWARE 硬件复位
TY_RST_OTHER 其它原因
TY_RST_UNSUPPORT 不支持
  • 参数

  • 返回值

    重启原因

os_adapter_get_random_data

int os_adapter_get_random_data(const unsigned int range)
  • 函数说明

    获取随机数

  • 参数

输入/输出 参数名 描述
[in] range 随机数range
  • 返回值

    随机值

  • 备注

    真随机数

os_adapter_set_cpu_lp_mode

int os_adapter_set_cpu_lp_mode(const bool en,const TY_CPU_SLEEP_MODE_E mode)
  • 函数说明

    设置cpu的低功耗模式

mode ——
TY_CPU_SLEEP 低功耗模式、os自动唤醒、15mA以内
TY_CPU_DEEP_SLEEP 深度睡眠
  • 参数
输入/输出 参数名 描述
[in] en 是否使能cpu低功耗模式
[in] mode cpu低功耗模式
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_CPU_LPMODE_SET_FAILED :失败

Memory

Tuya HAL Memory 提供了内存申请和释放的接口,需要不同的平台对其进行实现。如果是Linux平台,可以不提供,Tuya 通用 Wi-Fi SDK 提供了一套通用的 Linux 平台的接口实现。


os_adapter_system_malloc

void *os_adapter_system_malloc(const size_t size)
  • 函数说明

    内存分配

  • 参数

输入/输出 参数名 描述
[in] size 分配内存大小
  • 返回值

    NULL : 内存分配失败

    其他:分配成功

  • 备注

    适配层其它文件API需要申请内存,一律调用os_adapter_system_malloc

os_adapter_system_free

void os_adapter_system_free(void* ptr)
  • 函数说明

    内存释放

  • 参数

输入/输出 参数名 描述
[in] ptr 释放内存的地址
  • 返回值

  • 备注

    适配层其它文件API需要释放内存,一律调用os_adapter_system_free

Semaphore

Tuya HAL Semaphore 提供了信号量操作的接口,需要不同的平台对其进行实现。如果是Linux平台,可以不提供,Tuya 通用 Wi-Fi SDK 提供了一套通用的 Linux 平台的接口实现。


os_adapter_semaphore_create_init

int os_adapter_semaphore_create_init(SEM_HANDLE *pHandle, const unsigned int semCnt, const unsigned int sem_max)
  • 函数说明

    创建并初始化信号量

  • 参数

输入/输出 参数名 描述
[out] pHandle 信号量句柄的指针
[in] semCnt 初始化信号量个数
[in] sem_max 最大信号量数
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_THRD_CREAT_FAILED :失败

os_adapter_semaphore_wait

int os_adapter_semaphore_wait(const SEM_HANDLE semHandle)
  • 函数说明

    等待信号量

  • 参数

输入/输出 参数名 描述
[in] semHandle 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_SEM_WAIT_FAILED :失败

os_adapter_semaphore_post

int os_adapter_semaphore_post(const SEM_HANDLE semHandle)
  • 函数说明

    发送信号量

  • 参数

输入/输出 参数名 描述
[in] mutexHandle 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_SEM_POST_FAILED :失败

  • 备注

    需要区别线程上下文和中断上下文

os_adapter_semaphore_release

int os_adapter_semaphore_release(const SEM_HANDLE semHandle)
  • 函数说明

    释放信号量资源

  • 参数

输入/输出 参数名 描述
[in] semHandle 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_SEM_RELEASE_FAILED :失败

Mutex

Tuya HAL Mutex 提供了互斥量操作接口,需要不同的平台对其进行实现。如果是Linux平台,可以不提供,Tuya 通用 Wi-Fi SDK 提供了一套通用的 Linux 平台的接口实现。


os_adapter_mutex_create_init

int os_adapter_mutex_create_init(MUTEX_HANDLE *pMutexHandle)
  • 函数说明

    创建并初始化互斥锁

  • 参数

输入/输出 参数名 描述
[out] pMutexHandle 互斥锁句柄的指针
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_MUTEX_CREAT_FAILED :失败

os_adapter_mutex_release

int os_adapter_mutex_release(const MUTEX_HANDLE mutexHandle)
  • 函数说明

    释放互斥锁资源

  • 参数

输入/输出 参数名 描述
[in] mutexHandle 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MUTEX_RELEASE_FAILED :失败

os_adapter_mutex_lock

int os_adapter_mutex_lock(const MUTEX_HANDLE mutexHandle)
  • 函数说明

    加锁

  • 参数

输入/输出 参数名 描述
[in] mutexHandle 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MUTEX_LOCK_FAILED :失败

os_adapter_mutex_unlock

int os_adapter_mutex_unlock(const MUTEX_HANDLE mutexHandle)
  • 函数说明

    解锁

  • 参数

输入/输出 参数名 描述
[in] mutexHandle 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MUTEX_UNLOCK_FAILED :失败

  • 备注

    需要区别线程上下文和中断上下文

Thread

Tuya HAL Thread 提供了Thread创建、释放的接口,需要不同的平台对其进行实现。如果是Linux平台,可以不提供,Tuya 通用 Wi-Fi SDK 提供了一套通用的 Linux 平台的接口实现。


os_adapter_thread_create

int os_adapter_thread_create(THREAD_HANDLE* thread, const char* name, const unsigned int stack_size, const unsigned int priority, const THREAD_FUNC_T func, const void* arg)
  • 函数说明

    创建并启动线程

  • 参数

输入/输出 参数名 描述
[out] thread 线程句柄的指针
[in] name 线程名字
[in] stack_size 线程堆栈大小,单位是byte,而不是4字节
[in] priority 线程优先级
[in] func 线程函数
[in] arg 用户参数
  • 返回值

    OPRT_OS_ADAPTER_OK : 创建成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_THRD_CREAT_FAILED :失败

  • 备注

    1. stack_size参数是1个byte为单位
    2. tuya业务会使用0、1、2、3、4、5六种线程优先级(优先级由低到高)

os_adapter_thread_release

int os_adapter_thread_release(THREAD_HANDLE thread)
  • 函数说明

    释放线程资源

  • 参数

输入/输出 参数名 描述
[in] thread 信号量句柄
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_THRD_RELEASE_FAILED :失败

os_adapter_thread_is_self

int os_adapter_thread_is_self(THREAD_HANDLE thread, bool* is_self)
  • 函数说明

    判断运行上下文是否在指定线程里

  • 参数

输入/输出 参数名 描述
[in] thread 信号量句柄
[out] is_self 是否在指定线程
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_THRD_JUDGE_SELF_FAILED :失败

Watch Dog

Tuya HAL Watch Dog 提供了Watch Dog创建和刷新的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


os_adapter_watchdog_init_start

unsigned int os_adapter_watchdog_init_start(const unsigned int timeval);
  • 函数说明

    用于初始化并运行watchdog

  • 参数

输入/输出 参数名 描述
[in] timeval 看门狗时间
  • 返回值

    int 芯片实际设置的看门狗时间

  • 备注

    涂鸦上层会设置看门狗时间为60s,若芯片不支持60s的看门狗,返回实际设置成功的时间

os_adapter_watchdog_refresh

void os_adapter_watchdog_refresh(void);
  • 函数说明

    用于刷新watch dog

  • 返回值

    void

os_adapter_watchdog_stop

void os_adapter_watchdog_stop(void);
  • 函数说明

    用于停止watch dog

  • 返回值

    void

RTC

Tuya HAL RTC 提供了RTC操作的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


os_adapter_rtc_init

void os_adapter_rtc_init(void)
  • 函数说明

    初始化芯片内部RTC

  • 返回值

    void 无返回值

os_adapter_rtc_set_time

void os_adapter_rtc_set_time(const time_t write_time)
  • 函数说明

    向芯片内部RTC设置时间

  • 参数

输入/输出 参数名 描述
[in] write_time 时间戳,单位为秒
  • 返回值

    void 无返回值

os_adapter_rtc_get_time

time_t os_adapter_rtc_get_time(void)
  • 函数说明

    从芯片内部rtc时钟获取时间

  • 参数

输入/输出 参数名 描述
[in] void
  • 返回值

    time_t 芯片内部的rtc时间,单位为秒

OTA

Tuya HAL OTA 提供了OTA操作的接口,需要不同的平台对其进行实现。


os_adapter_ota_start_inform

int os_adapter_ota_start_inform(unsigned int file_size);
  • 函数说明

    升级开始通知函数

  • 参数

输入/输出 参数名 描述
[in] file_size 固件升级包总大小
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_OTA_START_INFORM_FAILED :失败

  • 备注
    告知hal层即将开始ota升级,需要hal层预先申请升级ota管理资源,记录ota固件包大小。

os_adapter_ota_data_process

int os_adapter_ota_data_process(const unsigned int total_len, const unsigned int offset, const unsigned char* data, const unsigned int len, unsigned int* remain_len, void* pri_data);
  • 函数说明

    ota数据包处理

  • 参数

输入/输出 参数名 描述
[in] total_len ota升级固件总大小
[in] offset data指针在ota升级固件中的偏移量
[in] data 本次ota数据包buffer指针
[in] len 本次ota数据包长度
[out] remain_len 已经下发但未处理的数据包长度
[in] pri_data 保留参数,暂不使用
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_OTA_PROCESS_FAILED :失败

  • 备注

    此函数用于支撑ota升级,需结合涂鸦升级包拉取业务来实现。
    目前涂鸦有两种升级方式: 1.http固件升级;2.私有串口协议固件升级;但对该hal函数来说无需关心数据包的来源。
    ota升级过程中tuya sdk会循环收包,并将ota数据包通知给此函数,由此函数完成ota数据包写入flash的工作。

os_adapter_ota_end_inform

int os_adapter_ota_end_inform(bool reset);
  • 函数说明

    ota数据下载结束通知

  • 参数

输入/输出 参数名 描述
[in] reset 通知hal层下载结束是否需要重启
  • 返回值

    OPRT_OS_ADAPTER_OK :成功

    OPRT_OS_ADAPTER_OTA_VERIFY_FAILED :校验失败

    OPRT_OS_ADAPTER_OTA_END_INFORM_FAILED :失败

  • 备注

    ota数据包传输完成后会调用此通知函数,需在次函数中实现:
    1.释放ota开始时hal层申请的资源。
    2.做固件完整性校验
    3.修改ota参数区,重启之后运行新固件
    4.根据入参reset决定是否需要重启(tuya串口升级成功后的重启逻辑不在这个api实现)

Storage

Tuya HAL Storage 提供了Flash操作的接口,需要不同的平台对其进行实现。


os_adapter_flash_read

int os_adapter_flash_read(const unsigned int addr, unsigned char *dst, const unsigned int size);
  • 函数说明

    从flash读取数据

  • 参数

输入/输出 参数名 描述
[in] addr 读取的flash首地址
[out] dst 接收读取数据的buffer指针
[in] size 读取的buffer大小
  • 返回值

    0 : 成功;

    其他:失败错误码;

  • 备注

    1,由于tuya上层业务可能出现多线程同时调用os_adapter_flash层的api接口,因此os_adapter_flash_read,os_adapter_flash_write,os_adapter_flash_erase三个操作函数需要共用互斥锁。
    若调用的芯片flash api本身具有互斥性,则无需再加锁;若调用的芯片flash api本身不具互斥性,则需在os_adapter_flash层添加互斥锁。
    2,如果支持片上运行,在操作flash可能会导致系统tick不准,在操作flash后需要弥补系统tick(重要)。
    3,读一个扇区时间在3ms以内。

os_adapter_flash_write

int os_adapter_flash_write(const unsigned int addr, const unsigned char *src, const unsigned int size);
  • 函数说明

    向flash写入数据

  • 参数

输入/输出 参数名 描述
[in] addr 写入的flash首地址
[in] dst 写入数据的buffer指针
[in] size 写入的buffer大小
  • 返回值

    0 : 成功;
    其他:失败错误码

  • 备注

    写一个扇区时间在20ms以内。

os_adapter_flash_erase

int os_adapter_flash_erase(const unsigned int addr, const unsigned int size);
  • 函数说明

    擦除flash块

  • 参数

输入/输出 参数名 描述
[in] addr 擦除的flash首地址
[in] size 擦除的flash大小
  • 返回值

    0 : 成功;

    其他:失败错误码;

  • 备注

    擦一个扇区时间在65ms以内。

os_adapter_storage_get_desc

UNI_STORAGE_DESC_S* os_adapter_storage_get_desc(void);
  • 函数说明

    获取芯片sdk为涂鸦应用数据划分的KV(Key-Value)-flash分区信息。

  • 参数

  • 返回值

    UNI_STORAGE_DESC_S* : KV-flash分区信息结构体指针

  • 备注

    1. 可以在os_adapter_storge.c中定义一个静态结构体变量,在其中描述芯片为tuya应用数据划分的KV-flash分区信息。例如
    static UNI_STORAGE_DESC_S storage = {
        SIMPLE_FLASH_START,
        SIMPLE_FLASH_SIZE,
        PARTITION_SIZE,
        SIMPLE_FLASH_SWAP_START,
        SIMPLE_FLASH_SWAP_SIZE,
        SIMPLE_FLASH_KEY_ADDR
    };
    
    UNI_STORAGE_DESC_S* os_adapter_storage_get_desc(void)
    {
        return &storage;
    }

  1. 推荐分区:
分区名 描述 长度(推荐值) 说明
SIMPLE_FLASH KV数据 0x10000(64K) 最少32K
SIMPLE_FLASH_SWAP KV数据的备份区 0x4000(16K) 最少12K
SIMPLE_FLASH_KEY_ADDR KV加密密钥存储区 0x1000(4K) 大小不可更改
  1. KV flash定好flash分区之后不能更改,如有改动不支持向前兼容。
  2. tuya 授权信息存放在KV区。

os_adapter_uf_get_desc

UF_PARTITION_TABLE_S* os_adapter_uf_get_desc(void);
  • 函数说明

    获取芯片sdk为涂鸦应用数据划分的uf_file-flash分区信息。

  • 参数

  • 返回值

    UF_PARTITION_TABLE_S* : UF_file-flash分区信息结构体指针

  • 备注

    1. tuya uf-file是一种类linux文件IO操作api(open,write,read,close等)的flash存储组件,支持应用层通过uf_file.h中的接口操作flash。
    2. 可以在os_adapter_storge.c中定义一个静态结构体变量,在其中描述芯片为tuya应用数据划分的uf_file-flash分区信息。例如
    static UF_PARTITION_TABLE_S uf_file = {
        .sector_size = PARTITION_SIZE,
        .uf_partition_num = 2,
        .uf_partition = {
            {xx, 0x8000},
            {xx, 0x18000}
        }
    };

  1. 推荐分区(几个分区合起来的大小不小于128K):
分区名 描述 长度(推荐值) 说明
UF_FILE_1 UF_FILE数据1区 0x8000(32K) 32K,起始位置可以调整
UF_FILE_2 UF_FILE数据2区 0x18000(96K) 96K,起始位置可以调整

Output

Tuya HAL Output 接口提供了日志输出重定向的接口,如果需要对日志输出进行重定向,可以实现此接口。如果不需要此功能,可以不实现。


os_adapter_output_log

void os_adapter_output_log(const char *str)
  • 函数说明

    打印字符串

  • 参数

输入/输出 参数名 描述
[in] str 字符串指针
  • 返回值

    void

os_adapter_log_close

int os_adapter_log_close(void)
  • 函数说明

    关闭log口
    业务需要用到log uart的io作为普通io时需要关闭uart功能

  • 参数

输入/输出 参数名 描述
[in] str 字符串指针
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_LOG_CLOSE_FAILED :失败

os_adapter_log_open

int os_adapter_log_open(void)
  • 函数说明

    恢复log口

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_LOG_OPEN_FAILED :失败

Wi-Fi

Tuya HAL Wi-Fi 提供了Wi-Fi操作的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


os_adapter_wifi_all_ap_scan

int os_adapter_wifi_all_ap_scan(AP_IF_S **ap_ary, unsigned int *num)
  • 函数说明

    扫描当前环境所有ap信息

  • 参数

输入/输出 参数名 描述
[out] ap_ary 扫描结果
[out] num 扫描ap个数
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_AP_SCAN_FAILED :失败

  • 备注

    1. 阻塞函数
    2. 只能扫描到当前国家码信道列表里的ap
    3. ap_ary需要在该api内分配内存(扫描到多个ap,需要分配连续的内存空间)
    4. 释放该内存由tuya sdk主动调用os_adapter_wifi_release_ap释放

os_adapter_wifi_assign_ap_scan

int os_adapter_wifi_assign_ap_scan(const char *ssid, AP_IF_S **ap)
  • 函数说明

    扫描当前环境指定ssid的ap信息

  • 参数

输入/输出 参数名 描述
[in] ssid 指定ssid
[out] ap 扫描结果
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_AP_SCAN_FAILED :扫描失败

  • 备注

    1. 阻塞函数
    2. 只能扫描到当前国家码信道列表里的ap
    3. 当环境存在指定ssid的ap,扫描到该ssid的成功率要超过98%
    4. ap需要在该api内分配内存(扫描到多个ap,需要分配连续的内存空间)
    5. 释放该内存由tuya sdk主动调用os_adapter_wifi_release_ap释放

os_adapter_wifi_release_ap

int os_adapter_wifi_release_ap(AP_IF_S *ap)
  • 函数说明

    释放ap信息资源

  • 参数

输入/输出 参数名 描述
[in] ap 需要释放的ap信息
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_AP_RELEASE_FAILED :失败

os_adapter_wifi_set_cur_channel

int os_adapter_wifi_set_cur_channel(const unsigned char chan)
  • 函数说明

    设置信道

  • 参数

输入/输出 参数名 描述
[in] chan 信道
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_CHAN_SET_FAILED :失败

  • 备注

    1,设置当前国家码信道范围之外的信道报失败
    2,支持在sniffer回调里设置信道

os_adapter_wifi_get_cur_channel

int os_adapter_wifi_get_cur_channel(unsigned char *chan)
  • 函数说明

    获取当前信道

  • 参数

输入/输出 参数名 描述
[out] chan 信道
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_CHAN_GET_FAILED :失败

os_adapter_wifi_get_ip

int os_adapter_wifi_get_ip(const WF_IF_E wf, NW_IP_S *ip)
  • 函数说明

    获取 Wi-Fi 的 ip 信息( ip 地址、网关地址、地址掩码)

  • 参数

输入/输出 参数名 描述
[in] wf Wi-Fi 模式 ,WF_STATION:station type,WF_AP:ap type
[out] ip ip 信息
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_IP_GET_FAILED :失败

  • 备注
    需要区分不同模式(依据传参wf)下的ip信息

os_adapter_wifi_set_mac

int os_adapter_wifi_set_mac(const WF_IF_E wf, const NW_MAC_S *mac)
  • 函数说明

    设置mac地址

  • 参数

输入/输出 参数名 描述
[in] wf Wi-Fi 模式 ,WF_STATION:station type,WF_AP:ap type
[in] mac mac地址
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_MAC_SET_FAILED:失败

  • 备注

    永久生效,断电不丢失

os_adapter_wifi_get_mac

int os_adapter_wifi_get_mac(const WF_IF_E wf, NW_MAC_S *mac)
  • 函数说明

    获取mac地址

  • 参数

输入/输出 参数名 描述
[in] wf Wi-Fi 模式 ,WF_STATION:station type,WF_AP:ap type
[out] mac mac地址
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_MAC_GET_FAILED :失败

  • 备注

    STATIONAP模式下的mac地址需要区分工作模式(依据传参wf)

os_adapter_wifi_set_work_mode

int os_adapter_wifi_set_work_mode(const WF_WK_MD_E mode)
  • 函数说明

    设置 Wi-Fi 工作模式

  • 参数

输入/输出 参数名 描述
[in] mode Wi-Fi 工作模式,WWM_LOWPOWER :低功耗(指关闭 Wi-Fi 模块);WWM_SNIFFER: monitor;WWM_STATION: station,WWM_SOFTAP:softap;WWM_STATIONAP:stationap
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_WORKMODE_SET_FAILED :失败

  • 备注

    1. 从设备上电到调用tuya entrance要求在200ms以内。
    2. 如果设备初始化时间超过200ms,底层可以做一些必要的初始化之后就调用tuya entrance,将耗时间的 Wi-Fi 初始化放在另一个线程执行。
    3. os_adapter_wifi_set_work_mode是tuya业务使用 Wi-Fi 调用的第一个api,在这个api需要判断 Wi-Fi 初始化是否结束,
      如果没结束,要在这里等到结束才开始往下执行(只需要判断一次)。
    4. 如果设备从上电到tuya entrance少于200ms,无需考虑这点。

os_adapter_wifi_get_work_mode

int os_adapter_wifi_get_work_mode(WF_WK_MD_E *mode)
  • 函数说明

    获取 Wi-Fi 工作模式

  • 参数

输入/输出 参数名 描述
[out] mode Wi-Fi 工作模式,WWM_LOWPOWER :低功耗(指关闭 Wi-Fi 模块);WWM_SNIFFER: monitor;WWM_STATION: station,WWM_SOFTAP:softap;WWM_STATIONAP:stationap
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_WORKMODE_GET_FAILED :失败

os_adapter_wifi_sniffer_set

int os_adapter_wifi_sniffer_set(const bool en, const SNIFFER_CALLBACK cb)
  • 函数说明

    设置sniffer功能开关

  • 参数

输入/输出 参数名 描述
[in] en 开或关sniffer功能
[in] cb 抓包数据回调
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_SNIFFER_SET_FAILED :失败

  • 备注

    返给应用的数据要括管理包数据

os_adapter_wifi_ap_start

int os_adapter_wifi_ap_start( const WF_AP_CFG_IF_S *cfg)
  • 函数说明

    启动ap模式

  • 参数

输入/输出 参数名 描述
[in] cfg ap配置参数
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_AP_START_FAILED :失败

  • 备注

    1,需要根据max_conn来设置ap模式下最多允许几个sta能连接成功。
    2,需要根据ip信息来设置ap模式下的ip信息。
    3,stationap模式,如果ap port有连接的情况下staiton port连接路由器,连接过程以及连接
    失败后ap port不可以有断连情况以及可以收发广播包。
    4,配网ez+ap共存:
    4.1 softap或者stationap模式下可以使能sniffer功能以及可以切换信道。
    4.2 使能sniffer功能之后,扔给回调的数据要包括ap port的设备连接请求包。

os_adapter_wifi_ap_stop

int os_adapter_wifi_ap_stop(void)
  • 函数说明

    停止ap模式

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_AP_STOP_FAILED :失败

  • 备注

    1,需要针对设备当前所处模式softap或stationap做不同的关闭逻辑
    2,stationap模式下,如果station port端有连接,关闭ap port过程station port不能有断连情况

os_adapter_wifi_get_connected_ap_info_v2

int os_adapter_wifi_get_connected_ap_info_v2(FAST_WF_CONNECTED_AP_INFO_V2_S **fast_ap_info)
  • 函数说明

    获取所连ap信息,用于快连功能

  • 参数

输入/输出 参数名 描述
[out] fast_ap_info 所连ap信息
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_APINFO_GET_FAILED :失败

  • 备注

    1,fast_ap_info 需要在该api内动态申请内存
    2, 每次重连路由器成功都会获取一次路由器信息,如有更新会同步到flash

os_adapter_fast_station_connect_v2

int os_adapter_fast_station_connect_v2(const FAST_WF_CONNECTED_AP_INFO_V2_S *fast_ap_info)
  • 函数说明

    快速连接路由器

  • 参数

输入/输出 参数名 描述
[in] fast_ap_info 快连所需的ap信息
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_FAST_CONN_FAILED :失败

  • 备注

    配过网且重启之后第一次连接才会调用这个函数

os_adapter_wifi_station_connect

int os_adapter_wifi_station_connect(const char *ssid, const char *passwd)
  • 函数说明

    连接路由器

  • 参数

输入/输出 参数名 描述
[in] ssid ssid
[in] passwd passwd
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_CONN_FAILED :失败

  • 备注

    1,非阻塞,启动连接流程成功后,上层会每隔1s钟调用os_adapter_wifi_station_get_status查询 Wi-Fi 连接状态
    2,需要使能自动重连功能,重连时间在1min以内即可,上层断连情况下会每隔1min发起一次重连

os_adapter_wifi_station_disconnect

int os_adapter_wifi_station_disconnect(void)
  • 函数说明

    断开路由器

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_DISCONN_FAILED :失败

os_adapter_wifi_station_get_conn_ap_rssi

int os_adapter_wifi_station_get_conn_ap_rssi(char *rssi)
  • 函数说明

    获取所连ap的信号强度

  • 参数

输入/输出 参数名 描述
[out] rssi 信号强度
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_RSSI_GET_FAILED :失败

  • 备注

    1,不移动设备和路由器的位置,多次获取rssi只能出现小范围的波动
    2,移动设备和路由器的位置,获取rssi会有对应的变化

os_adapter_wifi_get_bssid

int os_adapter_wifi_get_bssid(unsigned char *mac)
  • 函数说明

    获取所连ap的mac地址

  • 参数

输入/输出 参数名 描述
[out] mac mac地址
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_BSSID_GET_FAILED :失败

os_adapter_wifi_station_get_status

int os_adapter_wifi_station_get_status(WF_STATION_STAT_E *stat)
  • 函数说明

    获取 Wi-Fi 当前的连接状态

  • 参数

输入/输出 参数名 描述
[out] stat 连接状态, WSS_IDLE:空闲;WSS_CONNECTING : 连接中;WSS_PASSWD_WRONG: 密码错误;WSS_CONN_FAIL: 连接失败;WSS_CONN_SUCCESS: 连接成功;WSS_GOT_IP:dhcp成功
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_STAT_GET_FAILED :失败

os_adapter_wifi_set_country_code

int os_adapter_wifi_set_country_code(const COUNTRY_CODE_E ccode)
  • 函数说明

    设置国家码

  • 参数

输入/输出 参数名 描述
[in] ccode 国家码,COUNTRY_CODE_CN: 中国区 1-13 ;COUNTRY_CODE_US :美国区 1-11;COUNTRY_CODE_JP: 日本区 1-14;COUNTRY_CODE_EU
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_CCODE_SET_FAILED :失败

  • 备注

    1,国家码暂时只需要支持中国区(CN 1-13)、美国区(US 1-11)、日本区(JP 1-14)、欧洲区(EU 1-13)
    2,针对不同的国家码,需要达到的要求如下:
    2.1 扫描路由器时只能扫到国家码对应信道列表的ap。
    2.2 欧洲区需要实现欧洲自适应功能
    2.3 设置信道时,设置的信道不在当前国家码的信道列表范围之内,设置信道返回error

os_adapter_wifi_send_mgnt

int os_adapter_wifi_send_mgnt(const unsigned char *buf, const unsigned int len)
  • 函数说明

    发送管理包数据

  • 参数

输入/输出 参数名 描述
[in] buf 管理包数据buf
[in] len 管理包数据长度
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_MGNT_SEND_FAILED :失败

os_adapter_wifi_register_recv_mgnt_callback

int os_adapter_wifi_register_recv_mgnt_callback(const bool enable, const WIFI_REV_MGNT_CB recv_cb)
  • 函数说明

    设置应用层是否接收管理包数据

  • 参数

输入/输出 参数名 描述
[in] enable 是否开启接收管理包数据
[in] recv_cb 接收管理包数据回调
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_MGNT_REG_FAILED :失败

os_adapter_set_wifi_lp_mode

int os_adapter_set_wifi_lp_mode(IN const bool en, IN const unsigned int dtim)
  • 函数说明

    Wi-Fi 低功耗设置

  • 参数

输入/输出 参数名 描述
[in] en 是否开启 Wi-Fi 低功耗模式
[in] dtim dtim参数
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_WF_LPMODE_SET_FAILED :失败

BLE

Tuya HAL BLE 提供了 BLE 操作的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


ty_bt_param_t

typedef VOID (*TY_BT_MSG_CB)(int id, ty_bt_cb_event_t e, unsigned char *buf, unsigned int len); typedef struct { char name[DEVICE_NAME_LEN]; //蓝牙名字 ty_bt_mode_t mode; unsigned char link_num; // 最大支持客户端连接数,默认是1 TY_BT_MSG_CB cb; // 事件和数据回调函数 tuya_ble_data_buf_t adv; // 广播内容 tuya_ble_data_buf_t scan_rsp; // 客户端(APP)扫描响应数据 }ty_bt_param_t;

ty_bt_scan_info_t

typedef struct { ty_bt_scan_type_t scan_type; /* 扫描类型 */ char name[DEVICE_NAME_LEN]; // 蓝牙名字,设置为TY_BT_SCAN_BY_NAME时生效 char bd_addr[6]; //蓝牙的MAC,设置为TY_BT_SCAN_BY_MAC时生效 char rssi; // 扫描到后,返回信号强度 unsigned char channel; // 扫描到后,返回信道 unsigned char timeout_s; /* 扫描超时,在规定的时间没扫到,返回失败,单位是second. */ }ty_bt_scan_info_t;

os_adapter_bt_port_init

int os_adapter_bt_port_init(ty_bt_param_t *p)
  • 函数说明

    初始化蓝牙:在 Wi-Fi 和蓝牙共用RF的情况,该函数需要支持多次调用,即在调用tuya_bt_port_deinit关闭蓝牙后,可以再次调用该函数来重新初始化蓝牙

  • 参数

输入/输出 参数名 描述
[in] p 蓝牙参数结构体指针
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_BT_INIT_FAILED :失败

  • 备注

    1 不能在该函数里面添加sleep函数来等待初始化完成
    2 蓝牙初始化完成后,是通过TY_BT_EVENT_ADV_READY事件回到通知到应用层

os_adapter_bt_port_deinit

int os_adapter_bt_port_deinit(void)

  • 函数说明

    关闭蓝牙初始化

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_BT_DEINIT_FAILED :失败

  • 备注

    1 在 Wi-Fi 和蓝牙共用RF的情况,关闭 Wi-Fi 前,需要先调用该函数关闭蓝牙
    2 在低功耗的情况下,调用该函数来关闭蓝牙从而达到低功耗

os_adapter_bt_gap_disconnect

int os_adapter_bt_gap_disconnect(void)
  • 函数说明

    蓝牙作为slave主动断开连接

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_BT_DISCONN_FAILED :失败

os_adapter_bt_send

int os_adapter_bt_send(unsigned char *data, unsigned char len)

  • 函数说明

    蓝牙作为slave发送数据

  • 参数

输入/输出 参数名 描述
[in] data 数据指针
[in] len 数据长度
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_BT_SEND_FAILED :失败

os_adapter_bt_reset_adv

int os_adapter_bt_reset_adv(tuya_ble_data_buf_t *adv, tuya_ble_data_buf_t *scan_resp)

  • 函数说明

    重置蓝牙广播内容和扫描响应内容

  • 参数

输入/输出 参数名 描述
[in] adv 蓝牙广播数据
[in] lscan_respen 蓝牙扫描响应数据
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_BT_ADV_RESET_FAILED :失败

os_adapter_bt_get_rssi

int os_adapter_bt_get_rssi(signed char *rssi)

  • 函数说明

    获取蓝牙的信号强度

  • 参数

输入/输出 参数名 描述
[out] rssi 信号强度指针
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_BT_RSSI_GET_FAILED :失败

os_adapter_bt_start_adv

int os_adapter_bt_start_adv()

  • 函数说明

    启动蓝牙广播,直接使用原有的参数

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_BT_ADV_START_FAILED :失败

os_adapter_bt_stop_adv

int os_adapter_bt_stop_adv()

  • 函数说明

    停止蓝牙广播

  • 参数

  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_BT_ADV_STOP_FAILED :失败

9-os_adapter_bt_assign_scan

int os_adapter_bt_assign_scan(ty_bt_scan_info_t *info)

  • 函数说明

    扫描指定蓝牙名字,获取蓝牙信息,用于产测

  • 参数

输入/输出 参数名 描述
[inout] info 蓝牙信息
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_BT_SCAN_FAILED :失败

  • 备注

    1 scan_type为TY_BT_SCAN_BY_NAME,则扫描特定的蓝牙名字的信标
    2 scan_type为TY_BT_SCAN_BY_MAC,则扫描特定的MAC地址的信标
    3 返回的信息中,一定需要携带信号强度

UART

Tuya HAL UART 提供了 UART 操作的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


TY_UART_PORT_E

typedef enum { TY_UART0 = 0x00, TY_UART1, TY_UART2, TY_UART3, TY_UART_NUM, } TY_UART_PORT_E; 涂鸦默认TY_UART0为日志口,TY_UART1是用户口,TY_UART2、TY_UART3是拓展串口。 涂鸦上层授权、用户对接用的串口是TY_UART1,如果涂鸦设定的串口对应关系和芯 片平台有冲突,请在适配层做调整。

os_adapter_uart_init

int *os_adapter_uart_init(const TY_UART_DEV_S *uart)
  • 函数说明

    串口初始化

  • 参数

输入/输出 参数名 描述
[in] uart 串口句柄,需要初始化相关参数 。uart->port: 串口id;uart->arg : 配置参数;uart->cb:UART rx中断回调
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_UART_INIT_FAILED :失败

os_adapter_uart_deinit

int os_adapter_uart_deinit(const TY_UART_PORT_E port)
  • 函数说明

    串口反初始化函数

  • 参数

输入/输出 参数名 描述
[in] port 串口
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_UART_DEINIT_FAILED :失败

os_adapter_uart_send_char

int os_adapter_uart_send_char(const TY_UART_PORT_E port, const unsigned char ch)
  • 函数说明

    串口数据发送函数

  • 参数

输入/输出 参数名 描述
[in] port 串口
[in] ch 要发送的数据
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_UART_SEND_FAILED :失败

os_adapter_uart_pool_read_char

int os_adapter_uart_pool_read_char(const TY_UART_PORT_E port, unsigned char *ch)
  • 函数说明

    串口轮询读数据

  • 参数

输入/输出 参数名 描述
[in] port 串口
[out] ch 接收数据的指针
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_UART_READ_FAILED :失败

GPIO

Tuya HAL GPIO提供了 GPIO 操作的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


os_adapter_gpio_inout_set

int os_adapter_gpio_inout_set(const TY_GPIO_PORT_E port, const bool in)
  • 函数说明

    设置GPIO输入输出状态

  • 参数

输入/输出 参数名 描述
[in] port GPIO口
[in] in 0:输出;1:输入
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_GPIO_INOUT_SET_FAILED :失败

os_adapter_gpio_mode_set

int os_adapter_gpio_mode_set(const TY_GPIO_PORT_E port, const TY_GPIO_MODE_E mode)
  • 函数说明

    设置GPIO模式函数

mode ——
TY_GPIO_PULLUP 上拉模式
TY_GPIO_PULLDOWN 下拉模式
TY_GPIO_PULLUP_PULLDOWN 推挽输出模式
TY_GPIO_OPENDRAIN 开漏输出模式
TY_GPIO_FLOATING 浮空输入模式
  • 参数
输入/输出 参数名 描述
[in] port GPIO口
[in] mode GPIO工作模式
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_GPIO_MODE_SET_FAILED :失败

os_adapter_gpio_read

int os_adapter_gpio_read(const TY_GPIO_PORT_E port)
  • 函数说明

    读取GPIO口电平状态函数

  • 参数

输入/输出 参数名 描述
[in] port GPIO口
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_GPIO_READ_FAILED :失败

os_adapter_gpio_write

int os_adapter_gpio_write(const TY_GPIO_PORT_E port, const bool high)
  • 函数说明

    设置GPIO口电平状态函数

  • 参数

输入/输出 参数名 描述
[in] port GPIO口
[in] high 电平状态:0:低电平;1:高电平
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_GPIO_WRITE_FAILED :失败

os_adapter_gpio_irq_init

int os_adapter_gpio_irq_init(const TY_GPIO_PORT_E port, const TY_GPIO_CALLBACK cb, const TY_GPIO_IRQ_TRIG_TYPE trig_type)
  • 函数说明

    初始化GPIO口中断函数

trig_type ——
TY_IRQ_NONE
TY_IRQ_RISE 上升沿触发
TY_IRQ_FALL 下降沿触发
TY_TRQ_BOTH 双边沿触发
TY_IRQ_HIGH 高电平触发
TY_IRQ_LOW 低电平触发
  • 参数
输入/输出 参数名 描述
[in] port GPIO口
[in] cb 分配给GPIO的中断回调函数
[in] trig_type 中断触发源类型
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_GPIO_IRQ_INIT_FAILED :失败

I2C

Tuya HAL I2C提供了 I2C 操作的接口,需要不同的平台对其进行实现。如果不需要此功能,可以不实现。


os_adapter_i2c_open

int os_adapter_i2c_open(int port)
  • 函数说明

    打开I2C设备

  • 参数

输入/输出 参数名 描述
[in] port i2c设备编号
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败

    OPRT_OS_ADAPTER_I2C_OPEN_FAILED :失败

os_adapter_i2c_close

int os_adapter_i2c_close(int port)
  • 函数说明

    关闭I2C设备

  • 参数

输入/输出 参数名 描述
[in] port i2c设备编号
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功

    OPRT_OS_ADAPTER_INVALID_PARM :传参错误

    OPRT_OS_ADAPTER_I2C_CLOSE_FAILED :失败

os_adapter_i2c_read

int os_adapter_i2c_read(int port, int addr, uint8_t* buf, int len)
  • 函数说明

    读数据

  • 参数

输入/输出 参数名 描述
[in] port 使用的i2c设备编号
[in] addr 从机地址
[out] buf 读取的数据缓冲区地址
[in] len 缓冲区长度
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功
    OPRT_OS_ADAPTER_INVALID_PARM :传参错误
    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败
    OPRT_OS_ADAPTER_I2C_READ_FAILED :失败

os_adapter_i2c_write

int os_adapter_i2c_write(int port, int addr, uint8_t const* buf, int len)
  • 函数说明

    写数据

  • 参数

输入/输出 参数名 描述
[in] port 使用的i2c设备编号
[in] addr 从机地址
[in] buf 读取的数据缓冲区地址
[in] len 缓冲区长度
  • 返回值

    OPRT_OS_ADAPTER_OK : 成功
    OPRT_OS_ADAPTER_INVALID_PARM :传参错误
    OPRT_OS_ADAPTER_MALLOC_FAILED :申请内存失败
    OPRT_OS_ADAPTER_I2C_WRITE_FAILED :失败

Tuya HAL 接口注册

实现了所需要的的Tuya HAL接口之后,需要把这些实现注册到TuyaOS SDK。这样 SDK 就可以使用这些实现。

附录

Tuya HAL错误码

No. Name Value message
1 OPRT_OS_ADAPTER_INIT_MUTEX_ATTR_FAILED -10100 初始化同步属性失败
2 OPRT_OS_ADAPTER_SET_MUTEX_ATTR_FAILED -10101 设置同步属性失败
3 OPRT_OS_ADAPTER_DESTROY_MUTEX_ATTR_FAILED -10102 销毁同步属性失败
4 OPRT_OS_ADAPTER_INIT_MUTEX_FAILED -10103 初始化互斥量失败
5 OPRT_OS_ADAPTER_MUTEX_LOCK_FAILED -10104 互斥量加锁失败
6 OPRT_OS_ADAPTER_MUTEX_TRYLOCK_FAILED -10105 互斥量尝试加锁失败
7 OPRT_OS_ADAPTER_MUTEX_LOCK_BUSY -10106 互斥量忙
8 OPRT_OS_ADAPTER_MUTEX_UNLOCK_FAILED -10107 互斥量解锁失败
9 OPRT_OS_ADAPTER_MUTEX_RELEASE_FAILED -10108 互斥量释放失败
10 OPRT_OS_ADAPTER_CR_MUTEX_ERR -10109 互斥量创建失败
11 OPRT_OS_ADAPTER_MEM_PARTITION_EMPTY -10110 内存分区空
12 OPRT_OS_ADAPTER_MEM_PARTITION_FULL -10111 内存分区满
13 OPRT_OS_ADAPTER_MEM_PARTITION_NOT_FOUND -10112 内存分区不存在
14 OPRT_OS_ADAPTER_INIT_SEM_FAILED -10113 初始化信号量失败
15 OPRT_OS_ADAPTER_WAIT_SEM_FAILED -10114 等待信号量失败
16 OPRT_OS_ADAPTER_POST_SEM_FAILED -10115 释放信号量失败
17 OPRT_OS_ADAPTER_THRD_STA_UNVALID -10116 线程状态非法
18 OPRT_OS_ADAPTER_THRD_CR_FAILED -10117 线程创建失败
19 OPRT_OS_ADAPTER_THRD_JOIN_FAILED -10118 线程JOIN函数调用失败
20 OPRT_OS_ADAPTER_THRD_SELF_CAN_NOT_JOIN -10119 自身线程不能调用JOIN函数
21 OPRT_OS_ADAPTER_COND_CREATE_FAILED -10120 创建条件变量失败
22 OPRT_OS_ADAPTER_COND_RELEASE_FAILED -10121 释放条件变量失败
23 OPRT_OS_ADAPTER_COND_WAIT_FAILED -10122 等待条件变量失败
24 OPRT_OS_ADAPTER_COND_WAIT_TIMEOUT -10123 等待条件变量超时
25 OPRT_OS_ADAPTER_COND_SIGNAL_FAILED -10124 通知条件变量失败
26 OPRT_OS_ADAPTER_COND_BROADCAST_FAILED -10125 广播条件变量失败

Tuya Build.conf

No. Name default message
1 TUYA_IOT_DEBUG 1 设置DEBUG模式
2 KV_KEY_SEED 生成KEY-VALUE存储加密KEY的种子1,为了兼容老的产品(RTOS、LINUX使用),新产品不需要提供
3 KV_KEY_PROJECT_NAME 生成KEY-VALUE存储加密KEY的种子,为了兼容老的产品(LINUX使用),新产品不需要提供
4 WIFI_GW 1 使能Wi-Fi
5 GW_SUPPORT_WIRED_WIFI 0 使能有线 + Wi-Fi ,必须保证WIFI_GW也使能
6 TY_BT_MOD 0 使能蓝牙
7 ENABLE_STATION_AP_MODE 0 使能Station AP模式
8 KV_FILE 0 使能KV_FILE,如果是0,则使用KV_FLASH,一般linux设置为1,ROTS设置为0
9 SHUTDOWN_MODE 1 使能Socket shutdown 模式
10 LITTLE_END 1 设置系统大小端模式
11 TLS_SESSION 0 使能TLS session保持,每个session保持会消耗240字节内存
12 TLS_MODE TLS_TUYA_ECC_PSK TLS模式
13 ENABLE_CLOUD_OPERATION 0 使能使能流服务
14 ENABLE_SYS_RPC 0 使能RPC
15 TY_SECURITY_CHIP 0 使能安全芯片能力,有安全芯片的时候开启
16 TY_RTC 1 使能RTC
17 TY_WATCHDOG 1 使能看门狗
18 TUYA_OPERATOR_TYPE 0 第三方运营商ID上报,按bit使能不同的运营商
19 ENABLE_HTTP_TRUNK 0 使能HTTP TRUNK模式
20 QRCODE_ACTIVE_MODE 0 使能扫码配网
21 ENABLE_AP_FAST_CONNECT 0 使能AP快连模式
22 TY_WIFI_FFC 0 使能FFC
23 ENABLE_GOOGLE_LOCAL_HOME 0 使能google local home控制
24 ENABLE_LAN_LINKAGE 1 使能局域网联动