Re: T5_3.13.6 附属固件ota问题
并且我按照demo,直接从ota start地址开始,写入了1.6mb的数据,但实际ota大小就8kb,现在无法在app查找到设备,对话功能都用不了,并且无法重置配网,有什么办法能恢复吗,附件是设备重启后的log
并且我按照demo,直接从ota start地址开始,写入了1.6mb的数据,但实际ota大小就8kb,现在无法在app查找到设备,对话功能都用不了,并且无法重置配网,有什么办法能恢复吗,附件是设备重启后的log
非常抱歉,第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]);
}
}把打印结果发出来,我帮您定位哪个分区适合做缓存区。
因为我直接从ota start的地址开始写入了1.6MB的内容到设备,现在设备异常,有什么办法能恢复吗
看log是db被破坏了,要全擦+重新授权。 你这个缓存,也开源直接在psram里缓存,直接申请一块内存。
有恢复方法吗,能否提供下,以前没弄过
是只要重新编译一个固件,然后固件里面定义好uuid和authkey,然后烧录这个固件就能恢复吗
chen12 2026年 5月 14日 16:17
是只要重新编译一个固件,然后固件里面定义好uuid和authkey,然后烧录这个固件就能恢复吗
您好!您这个思路方向不对——UUID 和 AUTHKEY 不能写死在固件里,因为它们是每一台设备唯一的身份凭证(量产时原厂烧录授权工具写入的)。如果写死在固件里并烧多台,这些设备在涂鸦云端会冲突,激活不了。
正确的恢复流程如下:
■ 第一步:确认原始授权信息是否还能找回
每颗 BK7258 模组出厂时,涂鸦都会预先烧录一组 UUID + AUTHKEY + PID(QR 码贴在模组或包装上)。找到这颗 T5 模组对应的授权信息:
关键:不要丢掉原始 UUID/AUTHKEY,否则这颗模组就"废"了(云端无法激活)。
■ 第二步:用授权工具重新烧录固件 + 授权
推荐方式(tyutool):
Code: Select all
# 下载 tyutool:https://www.tuyaos.com/tools
tyutool.exe
1. 选择模组型号:BK7258 (T5)
2. 选择烧录固件(.bin)
3. 勾选"烧录授权",填入原始的 UUID/AUTHKEY/PID
4. 点击"一键烧录",通过串口把固件 + 授权一起烧回去
这样烧完后:
■ 第三步:如果找不到原始 UUID/AUTHKEY
情况 A:这颗模组是公司从涂鸦平台申请的授权(自己买的授权码)
→ 登录涂鸦 IoT 平台 → 产品 → 授权管理,按模组的 MAC 地址反查 UUID/AUTHKEY
→ 还能找到就重新烧
情况 B:找不到且这是原厂预授权模组
→ 联系涂鸦对接人,提供模组 MAC 地址 和采购订单,申请补发授权
→ 涂鸦后台可以按 MAC 查到原始授权信息(出厂时有记录)
情况 C:单机开发板,没有配对授权
→ 可以申请一组测试授权(平台 → 授权管理 → 申请测试授权),量少可以免费申请几个
→ 烧录回去即可
■ 为什么不能"固件里定义 UUID/AUTHKEY 来恢复"
■ 回到"附属固件缓存"的原始需求
您之前是想缓存一个 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,改动较大)。
■ 建议行动顺序
Code: Select all
tal_flash_get_one_type_info如果您在授权平台找不到 UUID/AUTHKEY,或不确定模组是预授权还是自主申请的,把 模组 MAC 地址 + 采购渠道 发上来,我可以帮您对接平台查询。