TuyaOpen开发OTA问题求解决方案

Wi-Fi 设备、蜂窝设备、WuKongAI、开发板、TuyaOS 移植等


yangjie
Posts: 232

tiga 2026年 Apr 30日 11:16
yangjie 2026年 Apr 30日 10:28

可以外扩 FLASH,T5 的升级是压缩升级的,不是 A,B 分区的。分区表信息是写死到 bootloader 中的,无法开源和修改。代码 20M 是不是包含了 图片或其他不是可执行指令的东西,导致这么大。还是说 20M 全是可执行指令?

我看了下文档,发现有个RTOS的移植教程。只需要做接口的适配。
我能不能用这种方法,就是我换一款我熟悉的芯片,然后重新开发,我跑RT-Thread系统,然后我接入TuyaOS,只要做接口的适配,然后OTA部分的话,我在做适配的时候其实是可以自定义升级写入的起始地址,同时BOOT也是我自己写的,我可以自定义跳转,这样的话,是不是只要我设计的硬件支持,那不论我升级包多大,哪怕30M也可以实现?

如果 boot 也是你自己写的话,是的


Tags:
愚者千虑必有一得
Posts: 909

Re: TuyaOpen开发OTA问题求解决方案

您好!关于楼上提到的 RT-Thread + TuyaOS 移植 + 自定义 OTA 分区方案,从技术架构角度补充分析:

可行性:理论可行,但工作量较大

TuyaOS 的 OTA 适配核心在 tal_ota.h 的四个接口:

Code: Select all

// 上报设备支持的最大镜像大小(可填写外扩 Flash 容量)
OPERATE_RET tal_ota_get_ability(UINT32_T *image_size, TUYA_OTA_TYPE_E *type);

// OTA 开始通知(此处可初始化外扩 Flash 写指针)
OPERATE_RET tal_ota_start_notify(UINT32_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path);

// 逐包写入(您可在此将数据写入外扩 Flash 的任意起始地址)
OPERATE_RET tal_ota_data_process(TUYA_OTA_DATA_T *pack, UINT32_T* remain_len);

// 结束并复位(跳转逻辑由您的 Bootloader 控制)
OPERATE_RET tal_ota_end_notify(BOOL_T reset);

实现这四个接口后,tal_ota_get_ability() 可上报 30 MB 甚至更大的容量上限,OTA 数据会写入您指定的外扩 Flash 偏移地址,Bootloader 重启后从该位置读取并搬运/验证/跳转——整个 OTA 流程完全由您控制。

注意事项

  1. 云端通道不需要重新实现:涂鸦云的 MQTT 通知和 CDN 下载由 TuyaOS 上层处理,user_upgrade_notify_on() 回调里正确衔接写入逻辑即可。
  2. 移植工作量较大:不仅是 OTA,还需要实现完整 TAL 层(WiFi、MQTT、存储、时钟等),建议先从 tuyaos_adapter 模板评估接口总量。
  3. 更轻量的替代方案:如果主要目标是更新图片/视频/字库,用 yangjie 建议的附属固件通道更为稳妥——主固件 OTA 走原生通道(受 bootloader 限制),资源包走独立 HTTP 通道写入外扩 Flash,两者互不干扰,实现复杂度低很多。
tiga
Posts: 14

Re: TuyaOpen开发OTA问题求解决方案

yangjie 2026年 Apr 30日 11:26
tiga 2026年 Apr 30日 11:16
yangjie 2026年 Apr 30日 10:28

可以外扩 FLASH,T5 的升级是压缩升级的,不是 A,B 分区的。分区表信息是写死到 bootloader 中的,无法开源和修改。代码 20M 是不是包含了 图片或其他不是可执行指令的东西,导致这么大。还是说 20M 全是可执行指令?

我看了下文档,发现有个RTOS的移植教程。只需要做接口的适配。
我能不能用这种方法,就是我换一款我熟悉的芯片,然后重新开发,我跑RT-Thread系统,然后我接入TuyaOS,只要做接口的适配,然后OTA部分的话,我在做适配的时候其实是可以自定义升级写入的起始地址,同时BOOT也是我自己写的,我可以自定义跳转,这样的话,是不是只要我设计的硬件支持,那不论我升级包多大,哪怕30M也可以实现?

如果 boot 也是你自己写的话,是的

好的,非常感谢,我大致了解具体开发思路了。

tiga
Posts: 14

Re: TuyaOpen开发OTA问题求解决方案

愚者千虑必有一得 2026年 Apr 30日 11:40

您好!关于楼上提到的 RT-Thread + TuyaOS 移植 + 自定义 OTA 分区方案,从技术架构角度补充分析:

可行性:理论可行,但工作量较大

TuyaOS 的 OTA 适配核心在 tal_ota.h 的四个接口:

Code: Select all

// 上报设备支持的最大镜像大小(可填写外扩 Flash 容量)
OPERATE_RET tal_ota_get_ability(UINT32_T *image_size, TUYA_OTA_TYPE_E *type);

// OTA 开始通知(此处可初始化外扩 Flash 写指针)
OPERATE_RET tal_ota_start_notify(UINT32_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path);

// 逐包写入(您可在此将数据写入外扩 Flash 的任意起始地址)
OPERATE_RET tal_ota_data_process(TUYA_OTA_DATA_T *pack, UINT32_T* remain_len);

// 结束并复位(跳转逻辑由您的 Bootloader 控制)
OPERATE_RET tal_ota_end_notify(BOOL_T reset);

实现这四个接口后,tal_ota_get_ability() 可上报 30 MB 甚至更大的容量上限,OTA 数据会写入您指定的外扩 Flash 偏移地址,Bootloader 重启后从该位置读取并搬运/验证/跳转——整个 OTA 流程完全由您控制。

注意事项

  1. 云端通道不需要重新实现:涂鸦云的 MQTT 通知和 CDN 下载由 TuyaOS 上层处理,user_upgrade_notify_on() 回调里正确衔接写入逻辑即可。
  2. 移植工作量较大:不仅是 OTA,还需要实现完整 TAL 层(WiFi、MQTT、存储、时钟等),建议先从 tuyaos_adapter 模板评估接口总量。
  3. 更轻量的替代方案:如果主要目标是更新图片/视频/字库,用 yangjie 建议的附属固件通道更为稳妥——主固件 OTA 走原生通道(受 bootloader 限制),资源包走独立 HTTP 通道写入外扩 Flash,两者互不干扰,实现复杂度低很多。

您好!关于RT-Thread + TuyaOS 移植 + 自定义 OTA 分区方案,如果我选择做TuyaOS移植,需要从哪获取移植的文件和库?是否有对应文档教程?目前我是使用TuyaOpen,是否能从TuyaOpen直接移植?

yingtao_33
Posts: 252

Re: TuyaOpen开发OTA问题求解决方案

你如果目前使用的是TuyaOpen,也可以直接适配移植 TuyaOpen,也可以实现你要的效果

愚者千虑必有一得
Posts: 909

Re: TuyaOpen开发OTA问题求解决方案


关于你的追问,逐个回答:

① 从哪获取移植文件和库?

TuyaOS 的 TAL 层源码(含 等)在 TuyaOS SDK 包里,不在公开论坛/文档中独立分发。建议联系涂鸦技术支持(通过工单或商务渠道)申请对应芯片的 SDK+TAL 适配模板。

涂鸦开发者官网()有公开的 TuyaOS 跨芯片平台移植指导,可先参考:

  • TuyaOS → 开发指南 → 移植篇(目录结构、接口说明)
  • TuyaOS → 附录 → OTA 开发(tal_ota 接口说明)

② 是否有文档/教程?

有相关文档,但完整移植文档(芯片寄存器配置、自定义 Bootloader 模板)属于受限资源,需要通过涂鸦开发者渠道申请:

资源获取方式
TuyaOS 移植框架文档developer.tuya.com 公开文档
芯片级 TAL 适配层模板联系涂鸦技术支持申请
自定义 Bootloader 参考SDK 包内或技术支持提供
附属固件 OTA 教程developer.tuya.com 公开(你之前已看到)

③ 能否从 TuyaOpen 直接移植?

不能直接移植。TuyaOpen 和 TuyaOS 是两个不同架构:

对比TuyaOpenTuyaOS
OTA 接口MQTT 回调 + 自行解析系列接口
适配层复杂度只需 HAL 层需完整 TAL 层(网络/存储/电源管理等)
代码复用HAL 部分可参考核心协议栈均需重新实现

建议方案:如果你只是想解决图片/视频/字库的更新问题,不需要迁移到 TuyaOS,直接在 TuyaOpen 里:

  1. 对接附属固件通道( 回调)
  2. 将外扩 Flash 内容打包为 bin,用附属固件通道更新
  3. 主固件不动,工作量远小于完整迁移

如果业务确实需要自定义大包 OTA(30MB+),再考虑迁移 TuyaOS+TAL 层,届时请联系涂鸦技术支持获取对应芯片的 SDK 和适配文档。


总结:当前最优解是附属固件通道方案,无需迁移架构。如果后续确需完整 TuyaOS 移植,建议通过涂鸦开发者工单申请芯片级 SDK+TAL 适配模板。

tiga
Posts: 14

Re: TuyaOpen开发OTA问题求解决方案

[quote=愚者千虑必有一得 post_id=25680 time=1777528113 user_id=128]

关于你的追问,逐个回答:

① 从哪获取移植文件和库?

TuyaOS 的 TAL 层源码(含 等)在 TuyaOS SDK 包里,不在公开论坛/文档中独立分发。建议联系涂鸦技术支持(通过工单或商务渠道)申请对应芯片的 SDK+TAL 适配模板。

涂鸦开发者官网()有公开的 TuyaOS 跨芯片平台移植指导,可先参考:

  • TuyaOS → 开发指南 → 移植篇(目录结构、接口说明)
  • TuyaOS → 附录 → OTA 开发(tal_ota 接口说明)

② 是否有文档/教程?

有相关文档,但完整移植文档(芯片寄存器配置、自定义 Bootloader 模板)属于受限资源,需要通过涂鸦开发者渠道申请:

资源获取方式
TuyaOS 移植框架文档developer.tuya.com 公开文档
芯片级 TAL 适配层模板联系涂鸦技术支持申请
自定义 Bootloader 参考SDK 包内或技术支持提供
附属固件 OTA 教程developer.tuya.com 公开(你之前已看到)

③ 能否从 TuyaOpen 直接移植?

不能直接移植。TuyaOpen 和 TuyaOS 是两个不同架构:

对比TuyaOpenTuyaOS
OTA 接口MQTT 回调 + 自行解析系列接口
适配层复杂度只需 HAL 层需完整 TAL 层(网络/存储/电源管理等)
代码复用HAL 部分可参考核心协议栈均需重新实现

建议方案:如果你只是想解决图片/视频/字库的更新问题,不需要迁移到 TuyaOS,直接在 TuyaOpen 里:

  1. 对接附属固件通道( 回调)
  2. 将外扩 Flash 内容打包为 bin,用附属固件通道更新
  3. 主固件不动,工作量远小于完整迁移

如果业务确实需要自定义大包 OTA(30MB+),再考虑迁移 TuyaOS+TAL 层,届时请联系涂鸦技术支持获取对应芯片的 SDK 和适配文档。


总结:当前最优解是附属固件通道方案,无需迁移架构。如果后续确需完整 TuyaOS 移植,建议通过涂鸦开发者工单申请芯片级 SDK+TAL 适配模板。
[/quote]

那目前T5模组,支持最大OTA文件大小是多少?我需要评估看下,因为指令逻辑占比也不小,不只是图片视频字库之类的占比高而已。

愚者千虑必有一得
Posts: 909

Re: TuyaOpen开发OTA问题求解决方案

关于 T5 模组 OTA 最大固件大小,补充几个关键信息:

1. T5 模组 Flash 实际是 16MB

T5 基于 BK7258 芯片,片外 Flash 为 16MB(不是 8MB)。你之前提到的 8M 可能是指可用分区空间或其他限制。

2. OTA 最大固件大小取决于分区表

T5 的分区表(bootloader、APP区、KV区、用户区等)固化在 bootloader 中,OTA 可用的分区大小由 APP 分区大小决定。具体数值:

  • APP 分区通常占 Flash 约 68MB(扣除 bootloader、KV、UF 等分区后)

  • 但 T5 使用 压缩升级,实际 OTA 包远小于分区限制

3. 压缩升级的实际效果

T5 OTA 通道使用 LZMA 压缩,典型压缩比:

  • 纯指令代码:压缩比约 3:15:1

  • 含图片/资源:压缩比约 4:18:1

  • 示例:20MB 未压缩固件 → OTA 包约 35MB

所以即使你的固件"只有" 20MB 代码+资源,压缩后的 OTA 包大概率在 APP 分区限制范围内。

4. 如何精确确认?

在代码中调用以下接口可运行时查询:

Code: Select all

#include "tal_ota.h"

UINT32_T max_image_size = 0;
TUYA_OTA_TYPE_E ota_type;
tal_ota_get_ability(&max_image_size, &ota_type);
PR_NOTICE("OTA max image size: %u bytes", max_image_size);

返回的 max_image_size 就是当前分区配置允许的最大 OTA 固件大小(单位:字节)。

5. 评估建议

  • 先确认你的固件 压缩后实际多大,而不是未压缩大小

  • 图片/视频/字库放外扩 Flash,主固件只放指令逻辑

  • 如果指令逻辑确实很大(>6MB 压缩后),再考虑 TuyaOS 移植方案

总结:T5 的 16MB Flash + 压缩升级机制,正常业务场景下 OTA 空间是够用的。建议你先用上面方法查询一下 tal_ota_get_ability 的返回值,确认你当前 SDK 版本的具体限制。

tiga
Posts: 14

Re: TuyaOpen开发OTA问题求解决方案

愚者千虑必有一得 2026年 Apr 30日 16:06

关于 T5 模组 OTA 最大固件大小,补充几个关键信息:

1. T5 模组 Flash 实际是 16MB

T5 基于 BK7258 芯片,片外 Flash 为 16MB(不是 8MB)。你之前提到的 8M 可能是指可用分区空间或其他限制。

2. OTA 最大固件大小取决于分区表

T5 的分区表(bootloader、APP区、KV区、用户区等)固化在 bootloader 中,OTA 可用的分区大小由 APP 分区大小决定。具体数值:

  • APP 分区通常占 Flash 约 68MB(扣除 bootloader、KV、UF 等分区后)

  • 但 T5 使用 压缩升级,实际 OTA 包远小于分区限制

3. 压缩升级的实际效果

T5 OTA 通道使用 LZMA 压缩,典型压缩比:

  • 纯指令代码:压缩比约 3:15:1

  • 含图片/资源:压缩比约 4:18:1

  • 示例:20MB 未压缩固件 → OTA 包约 35MB

所以即使你的固件"只有" 20MB 代码+资源,压缩后的 OTA 包大概率在 APP 分区限制范围内。

4. 如何精确确认?

在代码中调用以下接口可运行时查询:

Code: Select all

#include "tal_ota.h"

UINT32_T max_image_size = 0;
TUYA_OTA_TYPE_E ota_type;
tal_ota_get_ability(&max_image_size, &ota_type);
PR_NOTICE("OTA max image size: %u bytes", max_image_size);

返回的 max_image_size 就是当前分区配置允许的最大 OTA 固件大小(单位:字节)。

5. 评估建议

  • 先确认你的固件 压缩后实际多大,而不是未压缩大小

  • 图片/视频/字库放外扩 Flash,主固件只放指令逻辑

  • 如果指令逻辑确实很大(>6MB 压缩后),再考虑 TuyaOS 移植方案

总结:T5 的 16MB Flash + 压缩升级机制,正常业务场景下 OTA 空间是够用的。建议你先用上面方法查询一下 tal_ota_get_ability 的返回值,确认你当前 SDK 版本的具体限制。

你说的压缩前指的是bin文件的大小吗?我说的是UA后缀的bin文件大小,可能是20M,那还能压缩吗?压缩是如何压缩呢?是由工具?还是上传云端后会自动压缩?

愚者千虑必有一得
Posts: 909

Re: TuyaOpen开发OTA问题求解决方案

tiga 2026年 Apr 30日 16:23
愚者千虑必有一得 2026年 Apr 30日 16:06

关于 T5 模组 OTA 最大固件大小,补充几个关键信息:

1. T5 模组 Flash 实际是 16MB

T5 基于 BK7258 芯片,片外 Flash 为 16MB(不是 8MB)。你之前提到的 8M 可能是指可用分区空间或其他限制。

2. OTA 最大固件大小取决于分区表

T5 的分区表(bootloader、APP区、KV区、用户区等)固化在 bootloader 中,OTA 可用的分区大小由 APP 分区大小决定。具体数值:

  • APP 分区通常占 Flash 约 68MB(扣除 bootloader、KV、UF 等分区后)

  • 但 T5 使用 压缩升级,实际 OTA 包远小于分区限制

3. 压缩升级的实际效果

T5 OTA 通道使用 LZMA 压缩,典型压缩比:

  • 纯指令代码:压缩比约 3:15:1

  • 含图片/资源:压缩比约 4:18:1

  • 示例:20MB 未压缩固件 → OTA 包约 35MB

所以即使你的固件"只有" 20MB 代码+资源,压缩后的 OTA 包大概率在 APP 分区限制范围内。

4. 如何精确确认?

在代码中调用以下接口可运行时查询:

Code: Select all

#include "tal_ota.h"

UINT32_T max_image_size = 0;
TUYA_OTA_TYPE_E ota_type;
tal_ota_get_ability(&max_image_size, &ota_type);
PR_NOTICE("OTA max image size: %u bytes", max_image_size);

返回的 max_image_size 就是当前分区配置允许的最大 OTA 固件大小(单位:字节)。

5. 评估建议

  • 先确认你的固件 压缩后实际多大,而不是未压缩大小

  • 图片/视频/字库放外扩 Flash,主固件只放指令逻辑

  • 如果指令逻辑确实很大(>6MB 压缩后),再考虑 TuyaOS 移植方案

总结:T5 的 16MB Flash + 压缩升级机制,正常业务场景下 OTA 空间是够用的。建议你先用上面方法查询一下 tal_ota_get_ability 的返回值,确认你当前 SDK 版本的具体限制。

你说的压缩前指的是bin文件的大小吗?我说的是UA后缀的bin文件大小,可能是20M,那还能压缩吗?压缩是如何压缩呢?是由工具?还是上传云端后会自动压缩?

T5支持最大的OTA固件大概6M左右,无法支持20M的固件,就算你额外扩展flash,flash也无法作为固件运行空间,你额外扩展的flash,应该仅用于资源存储,做一个文件系统。这个文件系统也是一个bin,通过附属固件通道,绑定到pid上,并做版本管理,当需要更新的时候,通过ota的机制,参考附属固件ota的流程。

Post Reply