feat: add EAF RTC and badge dual mode

1. 固定 RTC 数字人链路使用 ai_chat_ui_eaf,双模式开启后不再回退 LVGL/GIF 旧 RTC UI。

2. 保留电子吧唧 LVGL/SquareLine UI,只在电子吧唧运行模式启动 LVGL,避免与 EAF 抢同一 LCD flush。

3. 拆分 dzbj_hw_display_init 与 dzbj_display_init,AI/配网只初始化 LCD Touch 硬件,电子吧唧再启动 LVGL UI。

4. 配网模式使用 EAF 最小显示栈显示中文提示,请使用APP 蓝牙配网,不加载数字人资源和动画。

5. 开启 CONFIG_BAJI_BADGE_MODE,形成 RTC 数字人对话与电子吧唧图片显示双模式固件。

6. 电子吧唧图片扫描跳过 Background_360x360.jpg,避免 RTC 数字人背景进入吧唧图片列表。

7. BLE 图传在 BLE 5.0 关闭时跳过 2M PHY API,保持 legacy 1M PHY 兼容配网和图传。

8. sdkconfig.defaults 同步 BLE 内存优化,限制连接数和缓存,保留 GATT 与扫描能力。

9. 移除 ota.cc 编译和 app_update 直接依赖,双模式固件不创建 OTA 检查任务。

10. Ota 接口改为禁用 stub,保留接口兼容但不执行升级和版本检查。

11. Board 上报 JSON 的 OTA label 改为 disabled,避免依赖 OTA 运行分区。

12. partitions.csv 改为 factory 单 app 分区,扩大 app 到 0x900000,并扩大 storage 到 0x6F0000。

13. application 去除 OTA 任务句柄和服务器时间依赖,减少运行时资源占用。

14. system_info 去除 esp_ota_ops 依赖,配合无 OTA 分区配置。

15. 同步最新烧录运行日志,记录本轮双模式与配网测试结果。
This commit is contained in:
Rdzleo 2026-06-02 13:15:34 +08:00
parent 24e0d19d29
commit 6b166f4463
15 changed files with 993 additions and 655 deletions

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,6 @@ set(SOURCES "audio_codecs/audio_codec.cc"
"iot/thing_manager.cc"
"system_info.cc"
"application.cc"
"ota.cc"
"settings.cc"
"background_task.cc"
"bluetooth_provisioning.cc" #
@ -28,10 +27,9 @@ set(SOURCES "audio_codecs/audio_codec.cc"
"dzbj/pages_pwm.c"
"dzbj/dzbj_init.c" # dzbj_hw_display_initdzbj_display_init #ifdef
"dzbj/fatfs.c" # DecodeImg AI BG GIF PoC fatfs_init/list
# Phase 10: ai_chat_ui
# CONFIG_BAJI_BADGE_MODE=y ai_chat_ui.c (LVGL )
# CONFIG_BAJI_BADGE_MODE=n ai_chat_ui_eaf.c (esp_emote_gfx )
# if(CONFIG_BAJI_BADGE_MODE)
# Phase 10: RTC 使 EAF UI
# CONFIG_BAJI_BADGE_MODE
"dzbj/ai_chat_ui_eaf.c"
"fonts/font_puhui_20_4.c" # 20px 4bppGB2312
# SquareLine Studio UI AI 使
"ui/ui.c"
@ -56,27 +54,7 @@ set(SOURCES "audio_codecs/audio_codec.cc"
"ui/images/ui_img_s12_png.c"
"ui/images/ui_img_s13_png.c"
"ui/images/ui_img_s14_png.c"
# emoji PNG
"ui/images/ui_img_neutral_png.c"
"ui/images/ui_img_happy_png.c"
"ui/images/ui_img_sad_png.c"
"ui/images/ui_img_angry_png.c"
"ui/images/ui_img_crying_png.c"
"ui/images/ui_img_funny_png.c"
"ui/images/ui_img_laughing_png.c"
# GIF 200x89
"ui/images/my_emotion/emotion_angry_200_89.c"
"ui/images/my_emotion/emotion_blink1_200_89.c"
"ui/images/my_emotion/emotion_blink_fast_200_89.c"
"ui/images/my_emotion/emotion_blink_slow_200_89.c"
"ui/images/my_emotion/emotion_dizzy_200_89.c"
"ui/images/my_emotion/emotion_happy_200_89.c"
"ui/images/my_emotion/emotion_sad_200_89.c"
"ui/images/my_emotion/emotion_sleep_200_89.c"
# GIF 45x45
"ui/images/my_icon/icon_emotion_confused_45.c"
"ui/images/my_icon/icon_emotion_sleep_45.c"
"ui/images/my_icon/icon_emotion_thinking_45.c"
# LVGL/GIF ai_chat_ui.c 使 RTC EAF UI
)
set(INCLUDE_DIRS "." "display" "audio_codecs" "protocols" "audio_processing" "audio" "dzbj" "ui")
@ -210,7 +188,8 @@ file(GLOB BOARD_SOURCES
list(APPEND SOURCES ${BOARD_SOURCES})
# === srcsCONFIG_BAJI_BADGE_MODE=n ===
# Kconfig
# Kconfig
# RTC 使 ai_chat_ui_eaf.c退 LVGL/GIF
if(CONFIG_BAJI_BADGE_MODE)
list(APPEND SOURCES
# dzbj
@ -221,11 +200,6 @@ if(CONFIG_BAJI_BADGE_MODE)
"dzbj/dzbj_button.c"
"dzbj/dzbj_battery.c"
"dzbj/ble_transfer.c"
# LVGL UIAI + PoC
"dzbj/ai_chat_ui.c"
"dzbj/sprite_demo.c"
"dzbj/dual_gif_demo.c"
"dzbj/bg_gif_demo.c"
# SquareLine Studio UI 9
"ui/screens/ui_ScreenHome.c"
"ui/screens/ui_ScreenImg.c"
@ -237,11 +211,6 @@ if(CONFIG_BAJI_BADGE_MODE)
"ui/screens/ui_ScreenSharing.c"
"ui/screens/ui_ScreenReceiving.c"
)
else()
# Phase 10: EAF UI LVGL ai_chat_ui.c + bg_gif_demo.c
list(APPEND SOURCES
"dzbj/ai_chat_ui_eaf.c"
)
endif()
if(CONFIG_CONNECTION_TYPE_MQTT_UDP)
@ -293,7 +262,7 @@ idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS ${INCLUDE_DIRS}
# D'' AEC: esp-sr esp_aec.h API (aec_create/aec_process/aec_destroy)
# loopback ref (DAC PCM copy ring buffer) AEC
REQUIRES esp_wifi esp_netif esp_event nvs_flash bt spi_flash app_update efuse volc_engine_rtc_lite common zlib esp_lcd driver esp-sr
REQUIRES esp_wifi esp_netif esp_event nvs_flash bt spi_flash esp_app_format efuse volc_engine_rtc_lite common zlib esp_lcd driver esp-sr
WHOLE_ARCHIVE
)

View File

@ -103,7 +103,6 @@ Application::Application() {
dialog_watchdog_task_handle_ = nullptr; // 初始化对话看门狗任务句柄
clock_ticks_ = 0; // 初始化时钟计数
main_loop_task_handle_ = nullptr; // 初始化主循环任务句柄
check_new_version_task_handle_ = nullptr; // 初始化版本检查任务句柄
audio_loop_task_handle_ = nullptr; // 初始化音频循环任务句柄
esp_timer_create_args_t clock_timer_args = {
@ -322,106 +321,7 @@ void Application::ApplyAEC(std::vector<int16_t>& mic_inout) {
}
void Application::CheckNewVersion() {
// ESP_LOGI(TAG, "OTA版本检查已临时禁用");
// return;
auto& board = Board::GetInstance();
auto display = board.GetDisplay();
// Check if there is a new firmware version available
ota_.SetPostData(board.GetJson());// 发送当前设备的JSON数据到OTA服务器用于检查是否有新的固件版本 包办板载信息 BOARD_TYPE
const int MAX_RETRY = 10;
int retry_count = 0;
while (true) {
if (!ota_.CheckVersion()) {
retry_count++;
if (retry_count >= MAX_RETRY) {
ESP_LOGE(TAG, "Too many retries, exit version check");
return;
}
ESP_LOGW(TAG, "Check new version failed, retry in %d seconds (%d/%d)", 60, retry_count, MAX_RETRY);
vTaskDelay(pdMS_TO_TICKS(60000));
continue;
}
retry_count = 0;
if (ota_.HasNewVersion()) {
Alert(Lang::Strings::OTA_UPGRADE, Lang::Strings::UPGRADING, "happy", Lang::Sounds::P3_UPGRADE);
// Wait for the chat state to be idle
do {
vTaskDelay(pdMS_TO_TICKS(3000));
} while (GetDeviceState() != kDeviceStateIdle);
// Use main task to do the upgrade, not cancelable
Schedule([this, display]() {
SetDeviceState(kDeviceStateUpgrading);
display->SetIcon(FONT_AWESOME_DOWNLOAD);
std::string message = std::string(Lang::Strings::NEW_VERSION) + ota_.GetFirmwareVersion();
display->SetChatMessage("system", message.c_str());
auto& board = Board::GetInstance();
board.SetPowerSaveMode(false);// 关闭低功耗模式
#if CONFIG_USE_WAKE_WORD_DETECT || CONFIG_USE_CUSTOM_WAKE_WORD
wake_word_detect_.Stop();
#endif
// 预先关闭音频输出,避免升级过程有音频操作
auto codec = board.GetAudioCodec();
codec->EnableInput(false);
codec->EnableOutput(false);
{
std::lock_guard<std::mutex> lock(mutex_);
audio_decode_queue_.clear();
}
background_task_->WaitForCompletion();
delete background_task_;
background_task_ = nullptr;
vTaskDelay(pdMS_TO_TICKS(1000));
ota_.StartUpgrade([display](int progress, size_t speed) {
char buffer[64];
snprintf(buffer, sizeof(buffer), "%d%% %zuKB/s", progress, speed / 1024);
display->SetChatMessage("system", buffer);
});
// If upgrade success, the device will reboot and never reach here
display->SetStatus(Lang::Strings::UPGRADE_FAILED);
ESP_LOGI(TAG, "Firmware upgrade failed...");
vTaskDelay(pdMS_TO_TICKS(3000));
Reboot();
});
return;
}
// No new version, mark the current version as valid
ota_.MarkCurrentVersionValid();
std::string message = std::string(Lang::Strings::VERSION) + ota_.GetCurrentVersion();
display->ShowNotification(message.c_str());
// 检查是否有设备激活码
// if (ota_.HasActivationCode()) {
// // Activation code is valid
// SetDeviceState(kDeviceStateActivating);//设置设备状态为激活中
// // ShowActivationCode();//显示设备激活码
// // Check again in 60 seconds or until the device is idle
// for (int i = 0; i < 60; ++i) {
// if (device_state_ == kDeviceStateIdle) {
// break;
// }
// vTaskDelay(pdMS_TO_TICKS(1000));
// }
// continue;
// }
SetDeviceState(kDeviceStateIdle);
display->SetChatMessage("system", "");
ResetDecoder();
PlaySound(Lang::Sounds::P3_SUCCESS);
// Exit the loop if upgrade or idle
break;
}
ESP_LOGI(TAG, "OTA disabled in this dual-mode firmware");
}
// 取消设备激活码播报,当前设备绑定使用Wi-Fi的Mac地址进行绑定
@ -1945,20 +1845,7 @@ void Application::Start() {
});
protocol_->Start();
// Check for new firmware version or get the MQTT broker address
ota_.SetCheckVersionUrl(CONFIG_OTA_VERSION_URL);
ota_.SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str());
ota_.SetHeader("Client-Id", board.GetUuid());
ota_.SetHeader("Accept-Language", Lang::CODE);
auto app_desc = esp_app_get_description();
ota_.SetHeader("User-Agent", std::string(BOARD_NAME "/") + app_desc->version);
// 禁用自动OTA - 注释掉下面的任务创建OTA自动升级
xTaskCreate([](void* arg) {
Application* app = (Application*)arg;
app->CheckNewVersion();
vTaskDelete(NULL);
}, "check_new_version", 4096 * 2, this, 2, nullptr);
// 当前双模式固件不启用 OTA避免创建检查任务并占用运行时资源。
#if CONFIG_USE_AUDIO_PROCESSOR
@ -2227,18 +2114,6 @@ void Application::OnClockTimer() {
//ESP_LOGI(TAG, "此设备角色为: %s",CONFIG_DEVICE_ROLE);
// ESP_LOGI(TAG, "此设备角色为: KAKA 1028 升级成功!");
// 如果我们已经同步了服务器时间如果设备处于空闲状态请将状态设置为时钟“HH:MM”
if (ota_.HasServerTime()) {
if (device_state_ == kDeviceStateIdle) {
Schedule([this]() {
// Set status to clock "HH:MM"
time_t now = time(NULL);// 获取当前时间
char time_str[64];// 时间字符串缓冲区
strftime(time_str, sizeof(time_str), "%H:%M ", localtime(&now));// 格式化时间字符串
Board::GetInstance().GetDisplay()->SetStatus(time_str);// 设置显示状态
});
}
}
}
}
@ -4891,4 +4766,3 @@ void Application::WakeFromHibernate() {
ESP_LOGI(TAG, "✓ 唤醒完成,已触发 RTC 重连");
}

View File

@ -17,7 +17,6 @@
#include "protocol.h"
#include "websocket_protocol.h"
#include "ota.h"
#include "background_task.h"
#include "audio/simple_pipeline.h"
// #include "ble_service.h" // BLE JSON Service 暂不使用
@ -134,7 +133,6 @@ private:
#if CONFIG_USE_AUDIO_PROCESSOR
AudioProcessor audio_processor_;
#endif
Ota ota_;
std::mutex mutex_;
std::list<std::function<void()>> main_tasks_;
std::unique_ptr<Protocol> protocol_;
@ -186,7 +184,6 @@ private:
TaskHandle_t dialog_watchdog_task_handle_; // 对话看门狗任务句柄
int clock_ticks_;
TaskHandle_t main_loop_task_handle_;
TaskHandle_t check_new_version_task_handle_;
// Audio encode / decode
TaskHandle_t audio_loop_task_handle_;

View File

@ -5,7 +5,7 @@
#include "assets/lang_config.h"
#include <esp_log.h>
#include <esp_ota_ops.h>
#include <esp_app_desc.h>
#include <esp_chip_info.h>
#include <esp_random.h>
@ -151,8 +151,7 @@ std::string Board::GetJson() {
json += "],";
json += "\"ota\":{";
auto ota_partition = esp_ota_get_running_partition();
json += "\"label\":\"" + std::string(ota_partition->label) + "\"";
json += "\"label\":\"disabled\"";
json += "},";
json += "\"board\":" + GetBoardJson();

View File

@ -59,7 +59,6 @@ extern "C" void init_spiffs_image_list(void);
// AI 对话屏幕初始化(纯 C避免 lv_font_t 冲突)
extern "C" void ai_chat_screen_init(void);
extern "C" void ai_chat_resume_animation(void);
// 配网模式专用最小化初始化 (只显示文字, 不加载 EAF 资源 / 不创建 anim)
extern "C" void ai_chat_screen_init_provisioning(const char* hint_text);
// 背光初始化pages_pwm.h 包含 LVGL 头文件,不能直接 include
@ -253,24 +252,17 @@ public:
#endif
{
// ===== AI 对话模式 =====
// 仅硬件+LVGL 初始化(不加载 SquareLine UI
// 仅初始化 LCD/Touch 硬件。LVGL 只属于电子吧唧模式AI/配网路径由 EAF 或纯提示接管。
dzbj_hw_display_init(codec_i2c_bus_);
// 配网模式跳过 EAF 数字人初始化, 节省 ~30 KB DRAM + 4.32 MB PSRAM,
// 让 BLE Bluedroid stack 有足够 DRAM 完成 advertising data malloc.
// 配网期间用户操作只需要听音效 + 看简单提示, 不需要数字人界面.
if (WifiBoard::NeedsProvisioning()) {
// 配网模式: EAF 最小化初始化 (仅显示文字, 不加载 8 张 EAF 资源 + 不创建 anim)
// 省 4.32 MB PSRAM (EAF 资源) + 数字人 anim 的 DRAM 占用
// 保留 ~30 KB DRAM 给 gfx flush buffer (启动时预分配, 不抢 BLE 初始化)
// 显示"请使用APP\n蓝牙配网"提示
// 跟 adaptation_dzbjImg_shar (用 LVGL 显示 GIF + 配网) 同思路, 用 EAF 替代 LVGL
ESP_LOGI(TAG, "🔵 配网模式: EAF 最小化初始化, 显示配网提示文字");
ai_chat_screen_init_provisioning("请使用APP\n蓝牙配网~");
// 配网模式只启用 EAF 最小显示栈renderer + label不加载数字人资源和动画。
ESP_LOGI(TAG, "🔵 配网模式: 使用 EAF 最小显示栈显示中文提示");
ai_chat_screen_init_provisioning("请使用APP\n蓝牙配网");
} else {
// 加载 AI 对话专用屏幕
ai_chat_screen_init();
}
vTaskDelay(pdMS_TO_TICKS(100)); // 等待首帧渲染
}
pwm_init(); // 点亮背光
ESP_LOGI(TAG, "🤖 AI对话模式启动");

View File

@ -454,12 +454,16 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
ESP_LOGI(CONN_TAG, "Connected, conn_id %u, remote "ESP_BD_ADDR_STR"",
param->connect.conn_id, ESP_BD_ADDR_HEX(param->connect.remote_bda));
esp_ble_gap_update_conn_params(&conn_params);
// 请求 2M PHY 提升传输速度(对端不支持时自动回退 1M不影响兼容性
// BLE 5.0 开启时请求 2M PHYRTC 双模式默认关闭 BLE 5.0,走 legacy 1M 保配网稳定。
#if CONFIG_BT_BLE_50_FEATURES_SUPPORTED
esp_ble_gap_set_preferred_phy(param->connect.remote_bda,
ESP_BLE_GAP_NO_PREFER_TRANSMIT_PHY | ESP_BLE_GAP_NO_PREFER_RECEIVE_PHY,
ESP_BLE_GAP_PHY_2M_PREF_MASK,
ESP_BLE_GAP_PHY_2M_PREF_MASK,
ESP_BLE_GAP_PHY_OPTIONS_NO_PREF);
#else
ESP_LOGI(CONN_TAG, "BLE 5.0 disabled, keep legacy 1M PHY for compatibility");
#endif
break;
}
case ESP_GATTS_DISCONNECT_EVT:

View File

@ -12,10 +12,9 @@
#define TAG "DZBJ"
// 仅硬件+LVGL 初始化(不加载 SquareLine UI不点亮背光
//
// Phase 10: 数字人 EAF 模式CONFIG_BAJI_BADGE_MODE=n下跳过 LVGL 初始化
// 让 esp_emote_gfx 接管 panel_handle避免双框架冲突
// 仅 LCD/Touch 硬件初始化,不启动 LVGL。
// 双模式固件中 CONFIG_BAJI_BADGE_MODE 只是"支持电子吧唧"的编译开关,
// 不能用它判断当前运行模式AI/EAF/配网路径必须避免初始化 LVGL。
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
ESP_LOGI(TAG, "开始初始化显示硬件...");
@ -34,15 +33,7 @@ void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
ESP_LOGI(TAG, "屏幕触摸已禁用 (DZBJ_ENABLE_TOUCH=0)");
#endif
#ifdef CONFIG_BAJI_BADGE_MODE
// 4. LVGL 初始化(仅吧唧模式)
lvgl_lcd_init();
ESP_LOGI(TAG, "LVGL 初始化完成");
#else
// Phase 10: 数字人 EAF 模式下不初始化 LVGL
// esp_emote_gfx 会在 ai_chat_screen_init 中接管 panel_handle
ESP_LOGI(TAG, "数字人 EAF 模式: 跳过 LVGL 初始化,等待 esp_emote_gfx 接管");
#endif
ESP_LOGI(TAG, "硬件初始化完成,跳过 LVGL等待上层显示管线接管");
}
#ifdef CONFIG_BAJI_BADGE_MODE
@ -50,6 +41,10 @@ void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus) {
dzbj_hw_display_init(i2c_bus);
// 电子吧唧模式才启动 LVGL + SquareLine UI。
lvgl_lcd_init();
ESP_LOGI(TAG, "LVGL 初始化完成");
// SquareLine UI 初始化
ui_init();
ESP_LOGI(TAG, "UI 初始化完成");

View File

@ -14,8 +14,8 @@ extern "C" {
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus);
#endif
// 仅硬件+LVGL 初始化(不加载 SquareLine UI不点亮背光—— 公共
// 用于 AI 模式:调用方自行加载 AI 专用屏幕后再点亮背光
// 仅 LCD/Touch 硬件初始化,不启动 LVGL。
// 用于 AI/EAF 和配网模式:避免 LVGL 与 EAF 双显示栈抢内部 SRAM。
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus);
#ifdef __cplusplus

View File

@ -327,6 +327,9 @@ void img_loop_task(void *pvParameters) {
while((entry = readdir(dir)) != NULL && file_count < 10) {
// 检查是否是图片文件(.jpg, .jpeg, .png等
const char *name = entry->d_name;
if(strcmp(name, "Background_360x360.jpg") == 0) {
continue;
}
int len = strlen(name);
if(len > 4) {
const char *ext = name + len - 4;
@ -417,6 +420,9 @@ void init_spiffs_image_list(void) {
while((entry = readdir(dir)) != NULL && spiffs_image_count < MAX_IMAGE_FILES) {
// 检查是否是图片文件(.jpg, .jpeg, .png等
const char *name = entry->d_name;
if(strcmp(name, "Background_360x360.jpg") == 0) {
continue;
}
int len = strlen(name);
if(len > 4 && len < MAX_FILENAME_LEN) {
const char *ext = name + len - 4;

View File

@ -4,22 +4,23 @@
#include <functional>
#include <string>
#include <map>
#include <utility>
class Ota {
public:
Ota();
~Ota();
Ota() = default;
~Ota() = default;
void SetCheckVersionUrl(std::string check_version_url);
void SetHeader(const std::string& key, const std::string& value);
void SetPostData(const std::string& post_data);
bool CheckVersion();
bool HasNewVersion() { return has_new_version_; }
bool HasMqttConfig() { return has_mqtt_config_; }
bool HasActivationCode() { return has_activation_code_; }
bool HasServerTime() { return has_server_time_; }
void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
void MarkCurrentVersionValid();
void SetCheckVersionUrl(std::string check_version_url) { check_version_url_ = std::move(check_version_url); }
void SetHeader(const std::string& key, const std::string& value) { headers_[key] = value; }
void SetPostData(const std::string& post_data) { post_data_ = post_data; }
bool CheckVersion() { return false; }
bool HasNewVersion() { return false; }
bool HasMqttConfig() { return false; }
bool HasActivationCode() { return false; }
bool HasServerTime() { return false; }
void StartUpgrade(std::function<void(int progress, size_t speed)> callback) {}
void MarkCurrentVersionValid() {}
const std::string& GetFirmwareVersion() const { return firmware_version_; }
const std::string& GetCurrentVersion() const { return current_version_; }
@ -39,11 +40,6 @@ private:
std::string firmware_url_;
std::string post_data_;
std::map<std::string, std::string> headers_;
void Upgrade(const std::string& firmware_url);
std::function<void(int progress, size_t speed)> upgrade_callback_;
std::vector<int> ParseVersion(const std::string& version);
bool IsNewVersionAvailable(const std::string& currentVersion, const std::string& newVersion);
};
#endif // _OTA_H

View File

@ -7,7 +7,6 @@
#include <esp_system.h>
#include <esp_partition.h>
#include <esp_app_desc.h>
#include <esp_ota_ops.h>
#define TAG "SystemInfo"
@ -133,4 +132,3 @@ exit: //Common return path
free(end_array);
return ret;
}

View File

@ -1,8 +1,6 @@
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
ota_0, app, ota_0, 0x10000, 0x580000,
ota_1, app, ota_1, 0x590000, 0x580000,
storage, data, spiffs, 0xB10000, 0x4F0000,
factory, app, factory, 0x10000, 0x900000,
storage, data, spiffs, 0x910000, 0x6F0000,

1 # ESP-IDF Partition Table
2 # Name, Type, SubType, Offset, Size, Flags
3 nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
4 phy_init, data, phy, 0xf000, 0x1000,
5 ota_0, app, ota_0, 0x10000, 0x580000, factory, app, factory, 0x10000, 0x900000,
6 ota_1, app, ota_1, 0x590000, 0x580000, storage, data, spiffs, 0x910000, 0x6F0000,
storage, data, spiffs, 0xB10000, 0x4F0000,

View File

@ -587,7 +587,7 @@ CONFIG_CONNECTION_TYPE_VOLC_RTC=y
#
# Baji RTC Toy Configuration
#
# CONFIG_BAJI_BADGE_MODE is not set
CONFIG_BAJI_BADGE_MODE=y
# end of Baji RTC Toy Configuration
CONFIG_WEBSOCKET_URL="wss://xiaozhi-dev-api.goods.fun/xiaozhi/v1"
@ -1029,18 +1029,18 @@ CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_WARNING=y
CONFIG_BT_LOG_BLUFI_TRACE_LEVEL=2
# end of BT DEBUG LOG LEVEL
CONFIG_BT_ACL_CONNECTIONS=4
CONFIG_BT_MULTI_CONNECTION_ENBALE=y
CONFIG_BT_ACL_CONNECTIONS=1
# CONFIG_BT_MULTI_CONNECTION_ENBALE is not set
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
# CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY is not set
CONFIG_BT_SMP_ENABLE=y
CONFIG_BT_SMP_MAX_BONDS=15
CONFIG_BT_SMP_MAX_BONDS=2
# CONFIG_BT_BLE_ACT_SCAN_REP_ADV_SCAN is not set
CONFIG_BT_MAX_DEVICE_NAME_LEN=32
CONFIG_BT_BLE_RPA_TIMEOUT=900
# CONFIG_BT_BLE_50_FEATURES_SUPPORTED is not set
CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y
CONFIG_BT_BLE_42_DTM_TEST_EN=y
# CONFIG_BT_BLE_42_DTM_TEST_EN is not set
CONFIG_BT_BLE_42_ADV_EN=y
CONFIG_BT_BLE_42_SCAN_EN=y
CONFIG_BT_BLE_VENDOR_HCI_EN=y
@ -1052,8 +1052,8 @@ CONFIG_BT_BLE_VENDOR_HCI_EN=y
# Controller Options
#
CONFIG_BT_CTRL_MODE_EFF=1
CONFIG_BT_CTRL_BLE_MAX_ACT=6
CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=6
CONFIG_BT_CTRL_BLE_MAX_ACT=2
CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=2
CONFIG_BT_CTRL_BLE_STATIC_ACL_TX_BUF_NB=0
CONFIG_BT_CTRL_PINNED_TO_CORE_0=y
# CONFIG_BT_CTRL_PINNED_TO_CORE_1 is not set
@ -1061,7 +1061,7 @@ CONFIG_BT_CTRL_PINNED_TO_CORE=0
CONFIG_BT_CTRL_HCI_MODE_VHCI=y
# CONFIG_BT_CTRL_HCI_MODE_UART_H4 is not set
CONFIG_BT_CTRL_HCI_TL=1
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=30
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=10
CONFIG_BT_BLE_CCA_MODE_NONE=y
# CONFIG_BT_BLE_CCA_MODE_HW is not set
# CONFIG_BT_BLE_CCA_MODE_SW is not set
@ -1103,7 +1103,7 @@ CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DEVICE=y
# CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATA is not set
# CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATA_DEVICE is not set
CONFIG_BT_CTRL_SCAN_DUPL_TYPE=0
CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE=100
CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE=10
CONFIG_BT_CTRL_DUPL_SCAN_CACHE_REFRESH_PERIOD=0
# CONFIG_BT_CTRL_BLE_MESH_SCAN_DUPL_EN is not set
# CONFIG_BT_CTRL_COEX_PHY_CODED_TX_RX_TLIM_EN is not set
@ -1134,7 +1134,7 @@ CONFIG_BT_CTRL_LE_PING_EN=y
# end of BLE disconnects when Instant Passed (0x28) occurs
# CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY is not set
CONFIG_BT_CTRL_DTM_ENABLE=y
# CONFIG_BT_CTRL_DTM_ENABLE is not set
CONFIG_BT_CTRL_BLE_MASTER=y
# CONFIG_BT_CTRL_BLE_TEST is not set
CONFIG_BT_CTRL_BLE_SCAN=y
@ -1661,7 +1661,7 @@ CONFIG_SPIRAM_USE_MALLOC=y
# CONFIG_SPIRAM_MEMTEST is not set
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y
# end of SPI RAM config

View File

@ -163,6 +163,16 @@ CONFIG_BT_STACK_NO_LOG=n
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=n
CONFIG_BT_RESERVE_DRAM=0x10000
CONFIG_BT_ACL_CONNECTIONS=1
CONFIG_BT_MULTI_CONNECTION_ENBALE=n
CONFIG_BT_SMP_MAX_BONDS=2
CONFIG_BT_CTRL_BLE_MAX_ACT=2
CONFIG_BT_BLE_42_DTM_TEST_EN=n
CONFIG_BT_CTRL_DTM_ENABLE=n
CONFIG_BT_BLE_42_SCAN_EN=y
CONFIG_BT_CTRL_BLE_SCAN=y
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=10
CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE=10
# BluFi 未被代码使用(两种模式均用自定义 GATT Server关闭以减少无关兼容风险
CONFIG_BT_BLUFI_ENABLED=n
@ -182,4 +192,4 @@ CONFIG_LWIP_MAX_SOCKETS=20
# === Baji RTC Toy 模式开关 ===
# 数字人 RTC 单一形态固件CONFIG_BAJI_BADGE_MODE=n
# 双模式AI + 电子吧唧固件CONFIG_BAJI_BADGE_MODE=y
CONFIG_BAJI_BADGE_MODE=n
CONFIG_BAJI_BADGE_MODE=y