移植 TuyaOS 到 Linux 平台

更新时间:2024-08-05 06:34:22下载pdf

Linux 系统的操作系统、网络、文件系统相关的接口都是统一的,TuyaOS 框架也内嵌了一份默认的接口实现,如果没有特殊的需求,您可以直接使用。

Linux 系统还有一些涉及硬件的能力,在不同的硬件、芯片上可能存在差异。TuyaOS 生成了这些能力接口的空函数,需要您按照自己的硬件、芯片的实际情况,完成接口的适配。

编译适配

Linux 系统的 TuyaOS Kernel 已经提供了默认的编译脚本,这些脚本存放于适配模板的 tuyaos/ 目录下。固件编译入口 tuyaos/build.sh 会直接调用 tuyaos/Makefile,实现可执行文件的编译。您可以根据自己的实际情况进行修改。

适配 RTC

支持实时时钟(Real-time clock,RTC)的平台可以实现 RTC 相关的接口,通过 RTC 提供的精确计时的能力,保障设备的时间准确。

TuyaOS 在设备配网激活之后,会和云端进行数据交互,获取云端的时间信息并设置到 RTC 中。TuyaOS 需要依赖 RTC 提供的时间服务进行工作。一旦检测到本地时间和云端时间偏差超过 5 秒,开发框架会再次通过云端更新时间,以保障时间偏差不至于扩大。但是,当设备处于离线状态时,则完全依赖于 RTC 自身的精度来保障时间的准确性。

接口
说明
OPERATE_RET tkl_rtc_init ( VOID_T ) 初始化 RTC 器件,使得其能够正常工作,注意,RTC 时间统计周期应为秒级。
OPERATE_RET tkl_rtc_deinit ( VOID_T ) 卸载 RTC 器件,释放相关资源。
OPERATE_RET tkl_rtc_time_set ( TIME_T time_sec ) 设置 RTC 时间戳,参数单位精度是秒级。设置成功之后,RTC 计时以该时间戳为起点。
OPERATE_RET tkl_rtc_time_get ( TIME_T *time_sec ) 获取当前系统的时间戳。

适配看门狗

支持看门狗(WatchDog)的平台可以实现 WatchDog 相关的接口,通过 WatchDog 来保障设备异常状态下能够通过超时重启的机制恢复,避免设备进入无法使用的状态。在 TuyaOS 里,喂狗操作是在一个独立的、高优先级的线程里进行的,不会受普通业务操作的影响。

接口
说明
UINT32_T tkl_watchdog_init ( TUYA_WDOG_BASE_CFG_T *cfg ) 初始化 WatchDog 器件,返回值是实际的超时周期,周期不应小于 5 秒。
OPERATE_RET tkl_watchdog_deinit ( VOID_T ) 卸载 WatchDog 器件,释放相关资源,和初始化 WatchDog 对应。
OPERATE_RET tkl_watchdog_refresh ( VOID_T ) 刷新 WatchDog,重置 WatchDog 状态。刷新周期是实际周期的三分之一。

适配连接接口

连接接口是指开发平台的连接能力驱动接口,如有线、Wi-Fi、低功耗蓝牙等,可以按照您的目标平台实际连接方式进行适配。

有线

一般 Linux 系统、带有屏幕的产品,移植默认使用有线连接。您通过界面的方式配置网络,然后通过 局域网绑定扫码绑定 的方式来对设备进行激活。

接口
说明
OPERATE_RET tkl_wired_get_status (TKL_WIRED_STAT_E *status) 获取有线网络连接状态,以接口 linkup 并且获取到 IP 地址为 TKL_WIRED_LINK_UP,否则为 TKL_WIRED_LINK_DOWN
OPERATE_RET tkl_wired_set_status_cb (TKL_WIRED_STATUS_CHANGE_CB cb) 设置有线网络连接状态变化通知回调。当有线网络状态发生变化时(以接口 linkup 并且获取到 IP 地址为 TKL_WIRED_LINK_UP,否则为 TKL_WIRED_LINK_DOWN),需要通过 cb 将状态通知给 TuyaOS,以触发内部各种状态和事件。
OPERATE_RET tkl_wired_get_ip (NW_IP_S *ip) 获取网络接口 IP 地址,设备和云端、App 等通信都基于该 IP 地址,所以需要确认返回的是连接到路由器的网络接口的 IP 地址。
OPERATE_RET tkl_wired_get_mac (NW_MAC_S *mac) 获取网络接口 MAC 地址。
OPERATE_RET tkl_wired_set_mac (CONST NW_MAC_S *mac) 设置网络接口 MAC 地址。

Wi-Fi

接口
说明
OPERATE_RET tkl_wifi_init ( WIFI_EVENT_CB cb ) 初始化 Wi-Fi
OPERATE_RET tkl_wifi_scan_ap (
CONST SCHAR_T *ssid,
AP_IF_S **ap_ary,
UINT_T *num )
扫描周边热点,可以指定 SSID
OPERATE_RET tkl_wifi_release_ap ( AP_IF_S *ap ) 释放扫描到的热点信息,和扫描配套使用,否则会导致内存泄露
OPERATE_RET tkl_wifi_start_ap ( CONST WF_AP_CFG_IF_S *cfg ) 启动热点,需要指 SSID、密码等信息
OPERATE_RET tkl_wifi_stop_ap ( VOID_T ) 关闭热点,释放资源,和启动热点配套使用
OPERATE_RET tkl_wifi_set_cur_channel ( CONST UCHAR_T chan ) 设置 Wi-Fi 工作信道
OPERATE_RET tkl_wifi_get_cur_channel ( UCHAR_T *chan ) 获取 Wi-Fi 工作信道
OPERATE_RET tkl_wifi_set_sniffer (
CONST BOOL_T en,
CONST SNIFFER_CALLBACK cb )
设置 Sniffer 回调,需要把 Sniffer 的原始报文上报
OPERATE_RET tkl_wifi_get_ip ( CONST WF_IF_E wf, NW_IP_S *ip ) 获取 Wi-Fi 接口 IP 地址
OPERATE_RET tkl_wifi_set_ip ( CONST WF_IF_E wf, NW_IP_S *ip ) 设置 Wi-Fi 接口 IP 地址
OPERATE_RET tkl_wifi_set_mac ( CONST WF_IF_E wf, CONST NW_MAC_S *mac ) 设置 Wi-Fi 接口 MAC 地址
OPERATE_RET tkl_wifi_get_mac ( CONST WF_IF_E wf, NW_MAC_S *mac ) 获取 Wi-Fi 接口 MAC 地址
OPERATE_RET tkl_wifi_set_work_mode ( CONST WF_WK_MD_E mode ) 设置 Wi-Fi 工作模式
OPERATE_RET tkl_wifi_get_work_mode ( WF_WK_MD_E *mode ) 获取 Wi-Fi 工作模式
OPERATE_RET tkl_wifi_get_connected_ap_info ( FAST_WF_CONNECTED_AP_INFO_T **fast_ap_info ) 获取 Wi-Fi 连接的热点信息
OPERATE_RET tkl_wifi_get_bssid ( UCHAR_T *mac ) 获取 Wi-Fi 接口 BSSID
OPERATE_RET tkl_wifi_set_country_code ( CONST COUNTRY_CODE_E ccode ) 设置 Wi-Fi 接口的国家码
OPERATE_RET tkl_wifi_set_rf_calibrated ( VOID_T ) 设置 Wi-Fi 射频校准标志位, 一般产测时需要使用,不使用涂鸦产测的话不需要适配
OPERATE_RET tkl_wifi_set_lp_mode ( CONST BOOL_T enable, CONST UCHAR_T dtim ) 设置 Wi-Fi 低功耗模式
OPERATE_RET tkl_wifi_station_fast_connect ( CONST FAST_WF_CONNECTED_AP_INFO_T *fast_ap_info ) Wi-Fi 基于已保存的信息,快速连接热点
OPERATE_RET tkl_wifi_station_connect ( CONST SCHAR_T *ssid, CONST SCHAR_T *passwd ) Wi-Fi 连接热点
OPERATE_RET tkl_wifi_station_disconnect ( VOID_T ) Wi-Fi 断开和热点的连接
OPERATE_RET tkl_wifi_station_get_conn_ap_rssi ( SCHAR_T *rssi ) 获取信号强度
OPERATE_RET tkl_wifi_station_get_status ( WF_STATION_STAT_E *stat ) 获取连接状态
OPERATE_RET tkl_wifi_send_mgnt ( CONST UCHAR_T *buf, CONST UINT_T len ) 发送管理帧
OPERATE_RET tkl_wifi_register_recv_mgnt_callback (
CONST BOOL_T enable,
CONST WIFI_REV_MGNT_CB recv_cb )
接收管理帧
OPERATE_RET tkl_wifi_ioctl ( WF_IOCTL_CMD_E cmd, VOID *args ) 万能接口,供后续扩展

蓝牙

蓝牙设备可以作为以下两种设备:

  • 外围(Peripheral)设备:能被 App 控制,可以接受建立连接请求的装置。
  • 中心(Central)设备:能扫描周边的外围设备,可以发起建立连接请求的装置,建立绑定关系,被遥控器类设备控制。

您可以根据自己的需求,选择需求的接口来进行适配,减少适配的工作量。

  • 蓝牙协议栈

    接口
    说明
    OPERATE_RET tkl_ble_stack_init ( UCHAR_T role ) 初始化蓝牙协议栈
    OPERATE_RET tkl_ble_stack_deinit ( UCHAR_T role ) 卸载蓝牙协议栈,和初始化对应
    OPERATE_RET tkl_ble_stack_gatt_link ( USHORT_T *p_link ) 获取 GATT 连接信息
    OPERATE_RET tkl_ble_gap_callback_register ( CONST TKL_BLE_GAP_EVT_FUNC_CB gap_evt ) 注册 GAP 事件回调
    OPERATE_RET tkl_ble_gatt_callback_register ( CONST TKL_BLE_GATT_EVT_FUNC_CB gatt_evt ) 注册 GATT 事件回调
    OPERATE_RET tkl_ble_gap_addr_set ( TKL_BLE_GAP_ADDR_T CONST *p_peer_addr ) 设置 GAP 地址
    OPERATE_RET tkl_ble_gap_address_get ( TKL_BLE_GAP_ADDR_T *p_peer_addr ) 获取 GAP 地址
    OPERATE_RET tkl_ble_gap_conn_param_update (
    USHORT_T conn_handle,
    TKL_BLE_GAP_CONN_PARAMS_T CONST *p_conn_params )
    更新连接参数
    OPERATE_RET tkl_ble_gap_tx_power_set ( UCHAR_T role, INT_T tx_power ) 设置发射功率
    OPERATE_RET tkl_ble_gap_rssi_get ( USHORT_T conn_handle ) 获取连接信号强度
  • 外围设备

    接口
    说明
    OPERATE_RET tkl_ble_gap_adv_start ( TKL_BLE_GAP_ADV_PARAMS_T CONST *p_adv_params ) 启动 GAP 广播
    OPERATE_RET tkl_ble_gap_adv_stop ( VOID ) 停止 GAP 广播
    OPERATE_RET tkl_ble_gap_adv_rsp_data_set (
    TKL_BLE_DATA_T CONST *p_adv,
    TKL_BLE_DATA_T CONST *p_scan_rsp )
    设置 adv resp 数据
    OPERATE_RET tkl_ble_gap_adv_rsp_data_update (
    TKL_BLE_DATA_T CONST *p_adv,
    TKL_BLE_DATA_T CONST *p_scan_rsp )
    更新 adv resp 数据
    OPERATE_RET tkl_ble_gap_name_set ( CHAR_T *p_name ) 设置名称
    OPERATE_RET tkl_ble_gap_disconnect (
    USHORT_T conn_handle,
    UCHAR_T hci_reason )
    断开和中心设备的连接
    OPERATE_RET tkl_ble_gatts_service_add ( TKL_BLE_GATTS_PARAMS_T *p_service ) 添加能力
    OPERATE_RET tkl_ble_gatts_value_set (
    USHORT_T conn_handle,
    USHORT_T char_handle,
    UCHAR_T *p_data,
    USHORT_T length )
    设置指定属性的值
    OPERATE_RET tkl_ble_gatts_value_get (
    USHORT_T conn_handle,
    USHORT_T char_handle,
    UCHAR_T *p_data,
    USHORT_T length )
    获取指定属性的值
    OPERATE_RET tkl_ble_gatts_value_notify (
    USHORT_T conn_handle,
    USHORT_T char_handle,
    UCHAR_T *p_data,
    USHORT_T length )
    通知指定属性,无需确认
    OPERATE_RET tkl_ble_gatts_value_indicate (
    USHORT_T conn_handle,
    USHORT_T char_handle,
    UCHAR_T *p_data,
    USHORT_T length )
    指示指定属性,需要确认
    OPERATE_RET tkl_ble_gatts_exchange_mtu_reply (
    USHORT_T conn_handle,
    USHORT_T server_rx_mtu )
    应答 MTU Exchange
  • 中心设备

    接口
    说明
    OPERATE_RET tkl_ble_gap_scan_start ( TKL_BLE_GAP_SCAN_PARAMS_T CONST *p_scan_params ) 启动扫描 GAP 广播
    OPERATE_RET tkl_ble_gap_scan_stop ( VOID ) 关闭扫描 GAP 广播,和启动对应
    OPERATE_RET tkl_ble_gap_connect (
    TKL_BLE_GAP_ADDR_T CONST *p_peer_addr,
    TKL_BLE_GAP_SCAN_PARAMS_T CONST *p_scan_params,
    TKL_BLE_GAP_CONN_PARAMS_T CONST *p_conn_params )
    连接外围设备
    OPERATE_RET tkl_ble_gap_disconnect ( USHORT_T conn_handle, UCHAR_T hci_reason ) 断开与外围设备的连接
    OPERATE_RET tkl_ble_gattc_all_service_discovery ( USHORT_T conn_handle ) 发现所有服务
    OPERATE_RET tkl_ble_gattc_all_char_discovery (
    USHORT_T conn_handle,
    USHORT_T start_handle,
    USHORT_T end_handle )
    发现所有特征
    OPERATE_RET tkl_ble_gattc_char_desc_discovery (
    USHORT_T conn_handle,
    USHORT_T start_handle,
    USHORT_T end_handle )
    发现所有描述符
    OPERATE_RET tkl_ble_gattc_write_without_rsp (
    USHORT_T conn_handle,
    USHORT_T char_handle,
    UCHAR_T *p_data,
    USHORT_T length )
    写 GATT server 数据,不需要应答
    OPERATE_RET tkl_ble_gattc_write (
    USHORT_T conn_handle,
    USHORT_T char_handle,
    UCHAR_T *p_data,
    USHORT_T length )
    写 GATT server 数据,需要应答
    OPERATE_RET tkl_ble_gattc_read ( USHORT_T conn_handle, USHORT_T char_handle ) 读取 GATT server 数据
    OPERATE_RET tkl_ble_gattc_exchange_mtu_request (
    USHORT_T conn_handle,
    USHORT_T client_rx_mtu )
    请求 MTU exchange

适配其他外设接口

完成上述接口,可以保障 TuyaOS 最小功能集的正常运行,其他的接口,可以使用原厂接口,也可以参考 TuyaOS 提供的外设驱动进行适配。

测试验收

  • 您也可以通过开发框架自带的示例集合来验证接口适配的正确性,示例集合存放在开发框架 software/TuyaOS/apps/tuyaos_demo_examples 目录下,可以直接编译这个目录,烧录到开发板上运行,通过命令行来执行功能示例。

  • 您也可以结合您要开发的产品的实际功能,来验证产品的功能和性能。