T5_3.13.6 附属固件ota问题

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


chen12
Posts: 81

并且我按照demo,直接从ota start地址开始,写入了1.6mb的数据,但实际ota大小就8kb,现在无法在app查找到设备,对话功能都用不了,并且无法重置配网,有什么办法能恢复吗,附件是设备重启后的log

Attachments
设备异常.txt
(24.05 KiB) Downloaded 8 times
愚者千虑必有一得
Posts: 929

Re: T5_3.13.6 附属固件ota问题

非常抱歉,第9楼我把 TUYA_FLASH_TYPE_OTA 说成"约2MB的完整镜像分区"是错的。您读出 size=8KB 才是对的,结合源码重新解释:

一、为什么 TUYA_FLASH_TYPE_OTA = 8KB

components/svc_upgrade/src/multi_section_upgrade.c 第235257行 tal_ota_get_flash_addr():

Code: Select all

// APP_BIN:当前运行的 APP 镜像长度
tkl_flash_get_one_type_info(TUYA_FLASH_TYPE_APP_BIN, &flash_info);
flash_addr->src_bin_len = flash_info.partition[0].size;

// APP:差分升级写入新镜像用的空间(几 MB)
tkl_flash_get_one_type_info(TUYA_FLASH_TYPE_APP, &flash_info);
flash_addr->diff_start_addr = flash_info.partition[0].start_addr;
flash_addr->flash_len = flash_info.partition[0].size;

// OTA:差分 patch 管理区(8KB 够用)
tkl_flash_get_one_type_info(TUYA_FLASH_TYPE_OTA, &flash_info);
flash_addr->manage_start_addr = flash_info.partition[0].start_addr;

结论:TUYA_FLASH_TYPE_OTA 不是完整固件分区,而是差分 OTA 运行时的 patch/step/buf 管理区,8KB 就够用。这就是 #define OTA_SIZE (8*1024) 的真实含义。

二、用哪个分区才能缓存完整固件

tuya_cloud_types.h 定义的分区类型:

Code: Select all

TUYA_FLASH_TYPE_APP_BIN   当前运行镜像
TUYA_FLASH_TYPE_APP       升级时写入新镜像(几 MB)
TUYA_FLASH_TYPE_OTA       差分 patch 管理区(8KB)
TUYA_FLASH_TYPE_USER0     用户自定义分区 0
TUYA_FLASH_TYPE_USER1     用户自定义分区 1
TUYA_FLASH_TYPE_RSV0~3    预留分区

做"附属固件预缓存区",不能用 OTA 类型,推荐三个方案。

方案 A:使用 USER0 / USER1 用户分区(首选)

T5 默认分区表里 USER 分区通常已预留,可直接使用:

Code: Select all

#include "tal_flash.h"

UINT32_T g_user_start = 0;
UINT32_T g_user_size  = 0;

void user_cache_init(void)
{
    TUYA_FLASH_BASE_INFO_T info;
    memset(&info, 0, sizeof(info));

if (tal_flash_get_one_type_info(TUYA_FLASH_TYPE_USER0, &info) != OPRT_OK
    || info.partition_num == 0) {
    TAL_PR_ERR("USER0 partition not available");
    return;
}
g_user_start = info.partition[0].start_addr;
g_user_size  = info.partition[0].size;
TAL_PR_INFO("USER0: start=0x%08X size=%uKB",
            g_user_start, g_user_size/1024);

// 整块擦除,后续按偏移直接写无需再擦
tal_flash_erase(g_user_start, g_user_size);
}

先读 USER0 的 size 确认够不够。

方案 B:T5 默认分区表不够 → 修改分区表

如果 USER 分区太小,需要在 vendor 层分区表扩大或新增自定义分区。T5(BK7258)的分区表位于:

Code: Select all

vendor/bk7258/tuyaos/tuyaos_adapter/src/tkl_flash.c
vendor/bk7258/bk_idk/middleware/driver/flash/flash_partition.c

修改后需要同步调整 bootloader 分区描述,改动较重,建议优先试方案 A。

方案 C(最稳妥):外挂 SPI Flash

主 Flash 空间紧张时直接加外挂 SPI Flash 做缓存,应用层用 tkl_spi_* 接口读写,不受 TuyaOS 分区表约束。适合蓝牙附属固件较大(>1MB)场景。

三、对第9楼回复的更正

第9楼我说"TUYA_FLASH_TYPE_OTA 实际约2MB"是错的。正确结论:

Code: Select all

分区类型                 作用                         T5 上典型大小
TUYA_FLASH_TYPE_APP_BIN  当前运行镜像                  几 MB
TUYA_FLASH_TYPE_APP      OTA 下载的新镜像区            几 MB
TUYA_FLASH_TYPE_OTA      差分 patch 管理区            【8KB】
TUYA_FLASH_TYPE_USER0/1  用户自定义                   看分区表

之前误导了您,非常抱歉。建议您先跑一次下面的诊断代码打印所有可用分区:

Code: Select all

static const TUYA_FLASH_TYPE_E types[] = {
    TUYA_FLASH_TYPE_APP_BIN, TUYA_FLASH_TYPE_APP, TUYA_FLASH_TYPE_OTA,
    TUYA_FLASH_TYPE_USER0,   TUYA_FLASH_TYPE_USER1,
    TUYA_FLASH_TYPE_RSV0,    TUYA_FLASH_TYPE_RSV1,
};
static const char *names[] = {
    "APP_BIN","APP","OTA","USER0","USER1","RSV0","RSV1",
};

for (int i = 0; i < sizeof(types)/sizeof(types[0]); i++) {
    TUYA_FLASH_BASE_INFO_T info;
    memset(&info, 0, sizeof(info));
    if (tal_flash_get_one_type_info(types[i], &info) == OPRT_OK
        && info.partition_num > 0) {
        TAL_PR_INFO("%-8s: 0x%08X size=%uKB", names[i],
                    info.partition[0].start_addr,
                    info.partition[0].size/1024);
    } else {
        TAL_PR_INFO("%-8s: N/A", names[i]);
    }
}

把打印结果发出来,我帮您定位哪个分区适合做缓存区。

chen12
Posts: 81

Re: T5_3.13.6 附属固件ota问题

因为我直接从ota start的地址开始写入了1.6MB的内容到设备,现在设备异常,有什么办法能恢复吗

愚者千虑必有一得
Posts: 929

Re: T5_3.13.6 附属固件ota问题

chen12 2026年 May 14日 14:26

因为我直接从ota start的地址开始写入了1.6MB的内容到设备,现在设备异常,有什么办法能恢复吗

看log是db被破坏了,要全擦+重新授权。 你这个缓存,也开源直接在psram里缓存,直接申请一块内存。

chen12
Posts: 81

Re: T5_3.13.6 附属固件ota问题

有恢复方法吗,能否提供下,以前没弄过

chen12
Posts: 81

Re: T5_3.13.6 附属固件ota问题

是只要重新编译一个固件,然后固件里面定义好uuid和authkey,然后烧录这个固件就能恢复吗

愚者千虑必有一得
Posts: 929

chen12 2026年 5月 14日 16:17
是只要重新编译一个固件,然后固件里面定义好uuid和authkey,然后烧录这个固件就能恢复吗

您好!您这个思路方向不对——UUID 和 AUTHKEY 不能写死在固件里,因为它们是每一台设备唯一的身份凭证(量产时原厂烧录授权工具写入的)。如果写死在固件里并烧多台,这些设备在涂鸦云端会冲突,激活不了。

正确的恢复流程如下:

■ 第一步:确认原始授权信息是否还能找回
每颗 BK7258 模组出厂时,涂鸦都会预先烧录一组 UUID + AUTHKEY + PID(QR 码贴在模组或包装上)。找到这颗 T5 模组对应的授权信息:

  • 模组标签上的贴纸(QR 码扫描)
  • 如果是从涂鸦平台申请的授权,在开发者平台 → 授权管理 可以查到 UUID/AUTHKEY 对
  • 授权工具 tyutool 上一次烧录的 log 里也会留存

关键:不要丢掉原始 UUID/AUTHKEY,否则这颗模组就"废"了(云端无法激活)。

■ 第二步:用授权工具重新烧录固件 + 授权
推荐方式(tyutool):

Code: Select all

# 下载 tyutool:https://www.tuyaos.com/tools
tyutool.exe

1. 选择模组型号:BK7258 (T5)
2. 选择烧录固件(.bin)
3. 勾选"烧录授权",填入原始的 UUID/AUTHKEY/PID
4. 点击"一键烧录",通过串口把固件 + 授权一起烧回去

这样烧完后:

  • Flash 被完全擦除(包括您写坏的 0x7c9000 区域)
  • 固件重新写入
  • UUID/AUTHKEY 被写回专门的授权分区(不是您的应用层 KV)
  • 设备重启后能正常配网、激活、上线

■ 第三步:如果找不到原始 UUID/AUTHKEY
情况 A:这颗模组是公司从涂鸦平台申请的授权(自己买的授权码)
→ 登录涂鸦 IoT 平台 → 产品 → 授权管理,按模组的 MAC 地址反查 UUID/AUTHKEY
→ 还能找到就重新烧

情况 B:找不到且这是原厂预授权模组
→ 联系涂鸦对接人,提供模组 MAC 地址 和采购订单,申请补发授权
→ 涂鸦后台可以按 MAC 查到原始授权信息(出厂时有记录)

情况 C:单机开发板,没有配对授权
→ 可以申请一组测试授权(平台 → 授权管理 → 申请测试授权),量少可以免费申请几个
→ 烧录回去即可

■ 为什么不能"固件里定义 UUID/AUTHKEY 来恢复"

  1. 一机一码:每台设备的 UUID/AUTHKEY 都必须唯一,硬编码等于所有烧了这固件的设备共用一个身份,云端只认第一台激活的,其它都激活失败
  2. AUTHKEY 是加密凭证:激活时设备用 AUTHKEY 签名,云端用数据库里的 AUTHKEY 验签,签错了激活就失败
  3. 授权分区独立于应用:UUID/AUTHKEY 存在 UF(UserFlash)或独立 LICENSE 分区,不是应用 KV,应用层根本不应该直接写这块

■ 回到"附属固件缓存"的原始需求

您之前是想缓存一个 1.6MB 的附属固件——按 p25804 的三个方案,绝对不要往 0x7c9000 的 TUYA_FLASH_TYPE_OTA 区域写(那只是 8KB 差分 patch 管理区),正确做法再强调一次:

方案 A:PSRAM 缓存我方平台同事 p25806 推荐,最简单
T5 带 8MB PSRAM,直接

Code: Select all

tkl_system_malloc(1.6*1024*1024)

申请缓存即可,掉电丢失也无所谓(反正每次 OTA 重新拉)。

方案 B:USER0/USER1 用户分区
掉电保留,需先用

Code: Select all

tal_flash_get_one_type_info(TUYA_FLASH_TYPE_USER0, &info)

确认分区大小,不够再考虑改分区表。

方案 C:修改分区表

Code: Select all

vendor/bk7258/

的分区配置中新增 2MB 的自定义分区(这个需要重新烧 bootloader,改动较大)。

■ 建议行动顺序

  1. 立刻找回这颗模组的原始 UUID/AUTHKEY(标签 or 平台查)
  2. 用 tyutool 重新烧录固件 + 授权 → 设备恢复
  3. 把附属固件缓存改为 PSRAM 方案(最简单,不碰 Flash)
  4. 以后写 Flash 前一定要先

    Code: Select all

    tal_flash_get_one_type_info
    查 size,不要按 TKL 层硬编码宏直接算地址

如果您在授权平台找不到 UUID/AUTHKEY,或不确定模组是预授权还是自主申请的,把 模组 MAC 地址 + 采购渠道 发上来,我可以帮您对接平台查询。

Post Reply