diff --git a/.gitignore b/.gitignore index 338f3cfe..66174ddd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ sdkconfig.old dependencies.lock .env +releases/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 082707d8..71aef19f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.16) -set(PROJECT_VER "0.3.1") +set(PROJECT_VER "0.4.1") add_compile_options(-Wno-error=format= -Wno-format) diff --git a/README.md b/README.md index 372eaa74..256a9cc6 100755 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # 小智 AI 聊天机器人 -BiliBili 视频介绍 [【ESP32+SenseVoice+Qwen72B打造你的AI聊天伴侣!】](https://www.bilibili.com/video/BV11msTenEH3/?share_source=copy_web&vd_source=ee1aafe19d6e60cf22e60a93881faeba) - 这是虾哥的第一个硬件作品。 +[ESP32+SenseVoice+Qwen72B打造你的AI聊天伴侣!【bilibili】](https://www.bilibili.com/video/BV11msTenEH3/?share_source=copy_web&vd_source=ee1aafe19d6e60cf22e60a93881faeba) + +[手工打造你的 AI 女友,新手入门教程【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/) + ## 项目目的 本项目基于乐鑫的 ESP-IDF 进行开发。 @@ -18,16 +20,16 @@ BiliBili 视频介绍 [【ESP32+SenseVoice+Qwen72B打造你的AI聊天伴侣! - Wi-Fi 配网 - 支持 BOOT 键唤醒和打断 -- 离线语音唤醒(使用乐鑫方案) +- 离线语音唤醒(乐鑫方案) - 流式语音对话(WebSocket 协议) -- 支持国语、粤语、英语、日语、韩语 5 种语言识别(使用 SenseVoice 方案) +- 支持国语、粤语、英语、日语、韩语 5 种语言识别(SenseVoice 方案) - 声纹识别(识别是谁在喊 AI 的名字,[3D Speaker 项目](https://github.com/modelscope/3D-Speaker)) -- 使用大模型 TTS(火山引擎方案,阿里云接入中) +- 使用大模型 TTS(火山引擎与 CosyVoice 方案) - 支持可配置的提示词和音色(自定义角色) -- 免费提供 Qwen2.5 72B 和 豆包模型(受限于性能和额度,人多后可能会限额) +- Qwen2.5 72B 或 豆包 API - 支持每轮对话后自我总结,生成记忆体 -- 扩展液晶显示屏,显示信号强弱(后面可以显示中文字幕) -- 支持 ML307 Cat.1 4G 模块(可选) +- 扩展液晶显示屏,显示信号强弱 +- 支持 ML307 Cat.1 4G 模块 ## 硬件部分 @@ -35,60 +37,29 @@ BiliBili 视频介绍 [【ESP32+SenseVoice+Qwen72B打造你的AI聊天伴侣! [《小智 AI 聊天机器人百科全书》](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink) -第二版接线图如下: +面包板接线图如下: -![第二版接线图](docs/wiring2.jpg) +![面包板接线图](docs/wiring2.jpg) ## 固件部分 ### 免开发环境烧录 -新手第一次操作建议先不要搭建开发环境,直接使用免开发环境烧录的固件。 +新手第一次操作建议先不要搭建开发环境,直接使用免开发环境烧录的固件。固件使用的是作者友情提供的测试服,目前开放免费使用,请勿用于商业用途。 -点击 [这里](https://github.com/78/xiaozhi-esp32/releases) 下载最新版固件。 +[Flash烧录固件(无IDF开发环境)](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS) -固件使用的是作者友情提供的测试服,目前开放免费使用,请勿用于商业用途。 -### 搭建开发环境 +### 开发环境 - Cursor 或 VSCode - 安装 ESP-IDF 插件,选择 SDK 版本 5.3 或以上 - Ubuntu 比 Windows 更好,编译速度快,也免去驱动问题的困扰 -### 配置项目与编译固件 -- 目前只支持 ESP32 S3,Flash 至少 8MB, PSRAM 至少 2MB(注意:默认配置只兼容 8MB PSRAM,如果你使用 2MB PSRAM,需要修改配置,否则无法识别) -- 配置 OTA Version URL 为 `https://api.tenclass.net/xiaozhi/ota/` -- 配置 WebSocket URL 为 `wss://api.tenclass.net/xiaozhi/v1/` -- 配置 WebSocket Access Token 为 `test-token` -- 如果 INMP441 和 MAX98357 接线跟默认配置不一样,需要修改 GPIO 配置 -- 配置完成后,编译固件 +## AI 角色配置 +如果你已经拥有一个小智 AI 聊天机器人,可以参考 [后台操作视频教程](https://www.bilibili.com/video/BV1jUCUY2EKM/) -## 配置 Wi-Fi (4G 版本跳过) - -按照上述接线,烧录固件,设备上电后,开发板上的 RGB 会闪烁蓝灯(部分开发板需要焊接 RGB 灯的开关才会亮),进入配网状态。 - -打开手机 Wi-Fi,连接上设备热点 `Xiaozhi-xxxx` 后,使用浏览器访问 `http://192.168.4.1`,进入配网页面。 - -选择你的路由器 WiFi,输入密码,点击连接,设备会在 3 秒后自动重启,之后设备会自动连接到路由器。 - -## 测试设备是否连接成功 - -设备连接上路由器后,闪烁一下绿灯。此时,喊一声“你好,小智”,设备会先亮蓝灯(表示连接服务器),然后再亮绿灯,播放语音。 - -如果没有亮蓝灯,说明麦克风有问题,请检查接线是否正确。 - -如果没有亮绿灯,或者蓝灯常亮,说明设备没有连接到服务器,请检查 WiFi 连接是否正常。 - -如果设备已经连接 Wi-Fi,但是没有声音,请检查是否接线正确。 - -在 v0.2.1 版本之后的固件,也可以按下连接 GPIO 1 的按钮(低电平有效),进行录音测试。 - -## 配置设备 - -如果上述步骤测试成功,设备会播报你的设备 ID,你需要到 [小智测试服的控制面板](https://xiaozhi.tenclass.net/) 页面,添加设备。 - -详细的使用说明以及测试服的注意事项,请参考 [小智测试服的帮助说明](https://xiaozhi.tenclass.net/help)。 - +详细的使用说明以及测试服的注意事项,请参考 [小智测试服的帮助说明](https://xiaozhi.me/help)。 diff --git a/docs/wiring2.jpg b/docs/wiring2.jpg index 910e2f59..f3a67ae7 100644 Binary files a/docs/wiring2.jpg and b/docs/wiring2.jpg differ diff --git a/main/Application.cc b/main/Application.cc index 2db2513f..25772158 100644 --- a/main/Application.cc +++ b/main/Application.cc @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -22,34 +23,33 @@ int answer_flag = 0; extern lv_obj_t *label1; extern lv_obj_t *label_reply; Application::Application() - : button_((gpio_num_t)CONFIG_BOOT_BUTTON_GPIO) + : boot_button_((gpio_num_t)CONFIG_BOOT_BUTTON_GPIO), + volume_up_button_((gpio_num_t)CONFIG_VOLUME_UP_BUTTON_GPIO), + volume_down_button_((gpio_num_t)CONFIG_VOLUME_DOWN_BUTTON_GPIO), +#ifdef CONFIG_USE_DISPLAY + display_(CONFIG_DISPLAY_SDA_PIN, CONFIG_DISPLAY_SCL_PIN), +#endif #ifdef CONFIG_USE_ML307 - , ml307_at_modem_(CONFIG_ML307_TX_PIN, CONFIG_ML307_RX_PIN, 4096), http_(ml307_at_modem_), - firmware_upgrade_(http_) #else - , http_(), +#endif firmware_upgrade_(http_) -#endif -#ifdef CONFIG_USE_DISPLAY - , - display_(CONFIG_DISPLAY_SDA_PIN, CONFIG_DISPLAY_SCL_PIN) -#endif { event_group_ = xEventGroupCreate(); - opus_encoder_.Configure(CONFIG_AUDIO_INPUT_SAMPLE_RATE, 1); + opus_encoder_.Configure(16000, 1); opus_decoder_ = opus_decoder_create(opus_decode_sample_rate_, 1, NULL); - if (opus_decode_sample_rate_ != CONFIG_AUDIO_OUTPUT_SAMPLE_RATE) - { - opus_resampler_.Configure(opus_decode_sample_rate_, CONFIG_AUDIO_OUTPUT_SAMPLE_RATE); + if (opus_decode_sample_rate_ != CONFIG_AUDIO_OUTPUT_SAMPLE_RATE) { + output_resampler_.Configure(CONFIG_AUDIO_OUTPUT_SAMPLE_RATE, opus_decode_sample_rate_); + } + if (16000 != CONFIG_AUDIO_INPUT_SAMPLE_RATE) { + input_resampler_.Configure(CONFIG_AUDIO_INPUT_SAMPLE_RATE, 16000); } firmware_upgrade_.SetCheckVersionUrl(CONFIG_OTA_VERSION_URL); firmware_upgrade_.SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); - firmware_upgrade_.SetPostData(SystemInfo::GetJsonString()); } Application::~Application() @@ -199,8 +199,29 @@ void Application::Start() ml307_at_modem_.ResetConnections(); ml307_at_modem_.WaitForNetworkReady(); - ESP_LOGI(TAG, "ML307 IMEI: %s", ml307_at_modem_.GetImei().c_str()); - ESP_LOGI(TAG, "ML307 ICCID: %s", ml307_at_modem_.GetIccid().c_str()); + std::string imei = ml307_at_modem_.GetImei(); + std::string iccid = ml307_at_modem_.GetIccid(); + ESP_LOGI(TAG, "ML307 IMEI: %s", imei.c_str()); + ESP_LOGI(TAG, "ML307 ICCID: %s", iccid.c_str()); + + // If low power, the material ready event will be triggered by the modem because of a reset + ml307_at_modem_.OnMaterialReady([this]() { + ESP_LOGI(TAG, "ML307 material ready"); + Schedule([this]() { + SetChatState(kChatStateIdle); + }); + }); + + // Set the board type for OTA + std::string carrier_name = ml307_at_modem_.GetCarrierName(); + int csq = ml307_at_modem_.GetCsq(); + std::string board_json = std::string("{\"type\":\"compact.4g\","); + board_json += "\"revision\":\"" + module_name + "\","; + board_json += "\"carrier\":\"" + carrier_name + "\","; + board_json += "\"csq\":\"" + std::to_string(csq) + "\","; + board_json += "\"imei\":\"" + imei + "\","; + board_json += "\"iccid\":\"" + iccid + "\"}"; + firmware_upgrade_.SetBoardJson(board_json); #else // Try to connect to WiFi, if failed, launch the WiFi configuration AP auto &wifi_station = WifiStation::GetInstance(); @@ -224,34 +245,59 @@ void Application::Start() wifi_ap.Start(); return; } + + // Set the board type for OTA + std::string board_json = std::string("{\"type\":\"compact.wifi\","); + board_json += "\"ssid\":\"" + wifi_station.GetSsid() + "\","; + board_json += "\"rssi\":" + std::to_string(wifi_station.GetRssi()) + ","; + board_json += "\"channel\":" + std::to_string(wifi_station.GetChannel()) + ","; + board_json += "\"ip\":\"" + wifi_station.GetIpAddress() + "\","; + board_json += "\"mac\":\"" + SystemInfo::GetMacAddress() + "\"}"; + firmware_upgrade_.SetBoardJson(board_json); #endif label_ask_set_text("网络连接成功"); - audio_device_.OnInputData([this](const int16_t *data, int size) - { + audio_device_.Initialize(); + audio_device_.OnInputData([this](std::vector&& data) { + if (16000 != CONFIG_AUDIO_INPUT_SAMPLE_RATE) { + if (audio_device_.input_channels() == 2) { + auto left_channel = std::vector(data.size() / 2); + auto right_channel = std::vector(data.size() / 2); + for (size_t i = 0, j = 0; i < left_channel.size(); ++i, j += 2) { + left_channel[i] = data[j]; + right_channel[i] = data[j + 1]; + } + auto resampled_left = std::vector(input_resampler_.GetOutputSamples(left_channel.size())); + auto resampled_right = std::vector(input_resampler_.GetOutputSamples(right_channel.size())); + input_resampler_.Process(left_channel.data(), left_channel.size(), resampled_left.data()); + input_resampler_.Process(right_channel.data(), right_channel.size(), resampled_right.data()); + data.resize(resampled_left.size() + resampled_right.size()); + for (size_t i = 0, j = 0; i < resampled_left.size(); ++i, j += 2) { + data[j] = resampled_left[i]; + data[j + 1] = resampled_right[i]; + } + } else { + auto resampled = std::vector(input_resampler_.GetOutputSamples(data.size())); + input_resampler_.Process(data.data(), data.size(), resampled.data()); + data = std::move(resampled); + } + } #ifdef CONFIG_USE_AFE_SR - if (audio_processor_.IsRunning()) - { - audio_processor_.Input(data, size); - } - if (wake_word_detect_.IsDetectionRunning()) - { - wake_word_detect_.Feed(data, size); - } + if (audio_processor_.IsRunning()) { + audio_processor_.Input(data); + } + if (wake_word_detect_.IsDetectionRunning()) { + wake_word_detect_.Feed(data); + } #else - std::vector pcm(data, data + size); - Schedule([this, pcm = std::move(pcm)]() - { + Schedule([this, data = std::move(data)]() { if (chat_state_ == kChatStateListening) { std::lock_guard lock(mutex_); - audio_encode_queue_.emplace_back(std::move(pcm)); + audio_encode_queue_.emplace_back(std::move(data)); cv_.notify_all(); } }); #endif }); - // Initialize the audio device - audio_device_.Start(CONFIG_AUDIO_INPUT_SAMPLE_RATE, CONFIG_AUDIO_OUTPUT_SAMPLE_RATE); - // OPUS encoder / decoder use a lot of stack memory const size_t opus_stack_size = 4096 * 8; audio_encode_task_stack_ = (StackType_t *)heap_caps_malloc(opus_stack_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); @@ -265,12 +311,13 @@ void Application::Start() { Application* app = (Application*)arg; app->AudioPlayTask(); - vTaskDelete(NULL); }, "play_audio", 4096 * 2, this, 5, NULL); + vTaskDelete(NULL); + }, "play_audio", 4096 * 4, this, 4, NULL); #ifdef CONFIG_USE_AFE_SR - wake_word_detect_.OnVadStateChange([this](bool speaking) - { Schedule([this, speaking]() - { + wake_word_detect_.Initialize(audio_device_.input_channels(), audio_device_.input_reference()); + wake_word_detect_.OnVadStateChange([this](bool speaking) { + Schedule([this, speaking]() { auto& builtin_led = BuiltinLed::GetInstance(); if (chat_state_ == kChatStateListening) { if (speaking) { @@ -314,9 +361,9 @@ void Application::Start() wake_word_detect_.StartDetection(); }); }); wake_word_detect_.StartDetection(); - audio_processor_.OnOutput([this](std::vector &&data) - { Schedule([this, data = std::move(data)]() - { + audio_processor_.Initialize(audio_device_.input_channels(), audio_device_.input_reference()); + audio_processor_.OnOutput([this](std::vector&& data) { + Schedule([this, data = std::move(data)]() { if (chat_state_ == kChatStateListening) { std::lock_guard lock(mutex_); audio_encode_queue_.emplace_back(std::move(data)); @@ -328,9 +375,8 @@ void Application::Start() builtin_led.SetGreen(); builtin_led.BlinkOnce(); - button_.OnClick([this]() - { Schedule([this]() - { + boot_button_.OnClick([this]() { + Schedule([this]() { if (chat_state_ == kChatStateIdle) { SetChatState(kChatStateConnecting); StartWebSocketClient(); @@ -354,8 +400,51 @@ void Application::Start() } } }); }); - xTaskCreate([](void *arg) - { + volume_up_button_.OnClick([this]() { + Schedule([this]() { + auto volume = audio_device_.output_volume() + 10; + if (volume > 100) { + volume = 100; + } + audio_device_.SetOutputVolume(volume); +#ifdef CONFIG_USE_DISPLAY + display_.ShowNotification("Volume\n" + std::to_string(volume)); +#endif + }); + }); + + volume_up_button_.OnLongPress([this]() { + Schedule([this]() { + audio_device_.SetOutputVolume(100); +#ifdef CONFIG_USE_DISPLAY + display_.ShowNotification("Volume\n100"); +#endif + }); + }); + + volume_down_button_.OnClick([this]() { + Schedule([this]() { + auto volume = audio_device_.output_volume() - 10; + if (volume < 0) { + volume = 0; + } + audio_device_.SetOutputVolume(volume); +#ifdef CONFIG_USE_DISPLAY + display_.ShowNotification("Volume\n" + std::to_string(volume)); +#endif + }); + }); + + volume_down_button_.OnLongPress([this]() { + Schedule([this]() { + audio_device_.SetOutputVolume(0); +#ifdef CONFIG_USE_DISPLAY + display_.ShowNotification("Volume\n0"); +#endif + }); + }); + + xTaskCreate([](void* arg) { Application* app = (Application*)arg; app->MainLoop(); vTaskDelete(NULL); }, "main_loop", 4096 * 2, this, 5, NULL); @@ -482,11 +571,13 @@ BinaryProtocol *Application::AllocateBinaryProtocol(const uint8_t *payload, size void Application::AudioEncodeTask() { ESP_LOGI(TAG, "Audio encode task started"); - while (true) - { + const int max_audio_play_queue_size_ = 2; + + while (true) { std::unique_lock lock(mutex_); - cv_.wait(lock, [this]() - { return !audio_encode_queue_.empty() || !audio_decode_queue_.empty(); }); + cv_.wait(lock, [this]() { + return !audio_encode_queue_.empty() || (!audio_decode_queue_.empty() && audio_play_queue_.size() < max_audio_play_queue_size_); + }); if (!audio_encode_queue_.empty()) { @@ -500,7 +591,9 @@ void Application::AudioEncodeTask() auto protocol = AllocateBinaryProtocol(opus, opus_size); Schedule([this, protocol, opus_size]() { if (ws_client_ && ws_client_->IsConnected()) { - ws_client_->Send(protocol, sizeof(BinaryProtocol) + opus_size, true); + if (!ws_client_->Send(protocol, sizeof(BinaryProtocol) + opus_size, true)) { + ESP_LOGE(TAG, "Failed to send audio data"); + } } heap_caps_free(protocol); }); }); @@ -522,11 +615,10 @@ void Application::AudioEncodeTask() continue; } - if (opus_decode_sample_rate_ != CONFIG_AUDIO_OUTPUT_SAMPLE_RATE) - { - int target_size = opus_resampler_.GetOutputSamples(frame_size); + if (opus_decode_sample_rate_ != CONFIG_AUDIO_OUTPUT_SAMPLE_RATE) { + int target_size = output_resampler_.GetOutputSamples(frame_size); std::vector resampled(target_size); - opus_resampler_.Process(packet->pcm.data(), frame_size, resampled.data()); + output_resampler_.Process(packet->pcm.data(), frame_size, resampled.data()); packet->pcm = std::move(resampled); } @@ -551,9 +643,7 @@ void Application::HandleAudioPacket(AudioPacket *packet) // This will block until the audio device has finished playing the audio audio_device_.OutputData(packet->pcm); - if (break_speaking_) - { - break_speaking_ = false; + if (break_speaking_) { skip_to_end_ = true; // Play a silence and skip to the end @@ -565,13 +655,16 @@ void Application::HandleAudioPacket(AudioPacket *packet) break; } case kAudioPacketTypeStart: - Schedule([this]() - { SetChatState(kChatStateSpeaking); }); + break_speaking_ = false; + skip_to_end_ = false; + Schedule([this]() { + SetChatState(kChatStateSpeaking); + }); break; case kAudioPacketTypeStop: - skip_to_end_ = false; - Schedule([this]() - { SetChatState(kChatStateListening); }); + Schedule([this]() { + SetChatState(kChatStateListening); + }); break; case kAudioPacketTypeSentenceStart: ESP_LOGI(TAG, "<< %s", packet->text.c_str()); @@ -606,6 +699,7 @@ void Application::AudioPlayTask() { return !audio_play_queue_.empty(); }); auto packet = std::move(audio_play_queue_.front()); audio_play_queue_.pop_front(); + cv_.notify_all(); lock.unlock(); HandleAudioPacket(packet); @@ -625,7 +719,7 @@ void Application::SetDecodeSampleRate(int sample_rate) if (opus_decode_sample_rate_ != CONFIG_AUDIO_OUTPUT_SAMPLE_RATE) { ESP_LOGI(TAG, "Resampling audio from %d to %d", opus_decode_sample_rate_, CONFIG_AUDIO_OUTPUT_SAMPLE_RATE); - opus_resampler_.Configure(opus_decode_sample_rate_, CONFIG_AUDIO_OUTPUT_SAMPLE_RATE); + output_resampler_.Configure(opus_decode_sample_rate_, CONFIG_AUDIO_OUTPUT_SAMPLE_RATE); } } @@ -637,15 +731,20 @@ void Application::StartWebSocketClient() delete ws_client_; } + std::string url = CONFIG_WEBSOCKET_URL; std::string token = "Bearer " + std::string(CONFIG_WEBSOCKET_ACCESS_TOKEN); #ifdef CONFIG_USE_ML307 ws_client_ = new WebSocket(new Ml307SslTransport(ml307_at_modem_, 0)); #else - ws_client_ = new WebSocket(new TlsTransport()); + if (url.find("wss://") == 0) { + ws_client_ = new WebSocket(new TlsTransport()); + } else { + ws_client_ = new WebSocket(new TcpTransport()); + } #endif ws_client_->SetHeader("Authorization", token.c_str()); - ws_client_->SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); ws_client_->SetHeader("Protocol-Version", std::to_string(PROTOCOL_VERSION).c_str()); + ws_client_->SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); ws_client_->OnConnected([this]() { @@ -656,7 +755,7 @@ void Application::StartWebSocketClient() std::string message = "{"; message += "\"type\":\"hello\","; message += "\"audio_params\":{"; - message += "\"format\":\"opus\", \"sample_rate\":" + std::to_string(CONFIG_AUDIO_INPUT_SAMPLE_RATE) + ", \"channels\":1"; + message += "\"format\":\"opus\", \"sample_rate\":16000, \"channels\":1"; message += "}}"; ws_client_->Send(message); }); @@ -689,6 +788,10 @@ void Application::StartWebSocketClient() if (sample_rate != NULL) { SetDecodeSampleRate(sample_rate->valueint); } + + // If the device is speaking, we need to break the speaking + break_speaking_ = true; + skip_to_end_ = true; } else if (strcmp(state->valuestring, "stop") == 0) { packet->type = kAudioPacketTypeStop; } else if (strcmp(state->valuestring, "sentence_end") == 0) { @@ -711,7 +814,16 @@ memset(minimax_content, 0, sizeof(minimax_content)); ESP_LOGI(TAG, "minimax_content: %s", minimax_content); label_ask_set_text(minimax_content); } + } else if (strcmp(type->valuestring, "llm") == 0) { + auto emotion = cJSON_GetObjectItem(root, "emotion"); + if (emotion != NULL) { + ESP_LOGD(TAG, "EMOTION: %s", emotion->valuestring); + } + } else { + ESP_LOGW(TAG, "Unknown message type: %s", type->valuestring); } + } else { + ESP_LOGE(TAG, "Missing message type, data: %s", data); } cJSON_Delete(root); } }); @@ -731,8 +843,7 @@ memset(minimax_content, 0, sizeof(minimax_content)); SetChatState(kChatStateIdle); }); }); - if (!ws_client_->Connect(CONFIG_WEBSOCKET_URL)) - { + if (!ws_client_->Connect(url.c_str())) { ESP_LOGE(TAG, "Failed to connect to websocket server"); return; } diff --git a/main/Application.h b/main/Application.h index 94682250..7dd00e0c 100644 --- a/main/Application.h +++ b/main/Application.h @@ -1,7 +1,6 @@ #ifndef _APPLICATION_H_ #define _APPLICATION_H_ -#include "AudioDevice.h" #include #include #include @@ -17,6 +16,7 @@ #include #include +#include "BoxAudioDevice.h" #include "Display.h" #include "FirmwareUpgrade.h" @@ -85,8 +85,17 @@ private: Application(); ~Application(); - Button button_; + Button boot_button_; + Button volume_up_button_; + Button volume_down_button_; +#ifdef CONFIG_AUDIO_CODEC_ES8311_ES7210 + BoxAudioDevice audio_device_; +#else AudioDevice audio_device_; +#endif +#ifdef CONFIG_USE_DISPLAY + Display display_; +#endif #ifdef CONFIG_USE_AFE_SR WakeWordDetect wake_word_detect_; AudioProcessor audio_processor_; @@ -98,9 +107,6 @@ private: EspHttp http_; #endif FirmwareUpgrade firmware_upgrade_; -#ifdef CONFIG_USE_DISPLAY - Display display_; -#endif std::mutex mutex_; std::condition_variable_any cv_; std::list> main_tasks_; @@ -123,7 +129,8 @@ private: int opus_duration_ms_ = 60; int opus_decode_sample_rate_ = CONFIG_AUDIO_OUTPUT_SAMPLE_RATE; - OpusResampler opus_resampler_; + OpusResampler input_resampler_; + OpusResampler output_resampler_; TaskHandle_t check_new_version_task_ = nullptr; StaticTask_t check_new_version_task_buffer_; diff --git a/main/AudioDevice.cc b/main/AudioDevice.cc index 5242cf0d..e5b44550 100644 --- a/main/AudioDevice.cc +++ b/main/AudioDevice.cc @@ -1,155 +1,12 @@ #include "AudioDevice.h" #include #include -#include "driver/gpio.h" -#include "driver/i2s_std.h" -#include "esp_system.h" -#include "esp_check.h" -#include "es8311.h" -#include "driver/i2c.h" -#include "es7210.h" +#include #define TAG "AudioDevice" - - -/* Example configurations */ -#define EXAMPLE_RECV_BUF_SIZE (2400) -#define EXAMPLE_SAMPLE_RATE (16000) -#define EXAMPLE_MCLK_MULTIPLE (384) // If not using 24-bit data width, 256 should be enough -#define EXAMPLE_MCLK_FREQ_HZ (EXAMPLE_SAMPLE_RATE * EXAMPLE_MCLK_MULTIPLE) -#define EXAMPLE_VOICE_VOLUME 70 - - -#define ES7210_I2C_ADDR (0x40) -#define ES7210_SAMPLE_RATE (48000) -#define ES7210_I2S_FORMAT ES7210_I2S_FMT_I2S -#define ES7210_MCLK_MULTIPLE (256) -#define ES7210_BIT_WIDTH ES7210_I2S_BITS_16B -#define ES7210_MIC_BIAS ES7210_MIC_BIAS_2V87 -#define ES7210_MIC_GAIN ES7210_MIC_GAIN_9DB -#define ES7210_ADC_VOLUME (0) - - -/* I2C port and GPIOs */ -#define I2C_NUM I2C_NUM_0 - -#define I2C_SCL_IO (GPIO_NUM_18) -#define I2C_SDA_IO (GPIO_NUM_17) - -/* I2S port and GPIOs */ -#define I2S_NUM I2S_NUM_0 -#define I2S_MCK_IO (GPIO_NUM_16) -#define I2S_BCK_IO (GPIO_NUM_9) -#define I2S_WS_IO (GPIO_NUM_45) -#define I2S_DO_IO (GPIO_NUM_8) -#define I2S_DI_IO (GPIO_NUM_10) -static i2s_chan_handle_t tx_handle = NULL; -static i2s_chan_handle_t rx_handle = NULL; -static es7210_dev_handle_t es7210_handle = NULL; - -static void es7210_init(bool is_tdm) -{ - /* Create ES7210 device handle */ - es7210_i2c_config_t es7210_i2c_conf = { - .i2c_port = I2C_NUM, - .i2c_addr = ES7210_I2C_ADDR - }; - es7210_new_codec(&es7210_i2c_conf, &es7210_handle); - - ESP_LOGI(TAG, "Configure ES7210 codec parameters"); - es7210_codec_config_t codec_conf = { - .sample_rate_hz = ES7210_SAMPLE_RATE, - .mclk_ratio = ES7210_MCLK_MULTIPLE, - .i2s_format = ES7210_I2S_FORMAT, - .bit_width = ES7210_BIT_WIDTH, - .mic_bias = ES7210_MIC_BIAS, - .mic_gain = ES7210_MIC_GAIN, - .flags = { - .tdm_enable = 1}}; - es7210_config_codec(es7210_handle, &codec_conf); - es7210_config_volume(es7210_handle, ES7210_ADC_VOLUME); -} - -static esp_err_t es8311_codec_init(void) -{ - /* Initialize I2C peripheral */ - // const i2c_config_t es_i2c_cfg = { - // .mode = I2C_MODE_MASTER, - // .sda_io_num = I2C_SDA_IO, - // .scl_io_num = I2C_SCL_IO, - // .sda_pullup_en = GPIO_PULLUP_ENABLE, - // .scl_pullup_en = GPIO_PULLUP_ENABLE, - // .master = { - // .clk_speed = 400000, - // } - // }; - // ESP_RETURN_ON_ERROR(i2c_param_config(I2C_NUM, &es_i2c_cfg), TAG, "config i2c failed"); - // ESP_RETURN_ON_ERROR(i2c_driver_install(I2C_NUM, I2C_MODE_MASTER, 0, 0, 0), TAG, "install i2c driver failed"); - - /* Initialize es8311 codec */ - es8311_handle_t es_handle = es8311_create(I2C_NUM, ES8311_ADDRRES_0); - ESP_RETURN_ON_FALSE(es_handle, ESP_FAIL, TAG, "es8311 create failed"); - const es8311_clock_config_t es_clk = { - .mclk_inverted = false, - .sclk_inverted = false, - .mclk_from_mclk_pin = true, - .mclk_frequency = EXAMPLE_MCLK_FREQ_HZ, - .sample_frequency = EXAMPLE_SAMPLE_RATE}; - - ESP_ERROR_CHECK(es8311_init(es_handle, &es_clk, ES8311_RESOLUTION_16, ES8311_RESOLUTION_16)); - ESP_RETURN_ON_ERROR(es8311_sample_frequency_config(es_handle, EXAMPLE_SAMPLE_RATE * EXAMPLE_MCLK_MULTIPLE, EXAMPLE_SAMPLE_RATE), TAG, "set es8311 sample frequency failed"); - ESP_RETURN_ON_ERROR(es8311_voice_volume_set(es_handle, EXAMPLE_VOICE_VOLUME, NULL), TAG, "set es8311 volume failed"); - ESP_RETURN_ON_ERROR(es8311_microphone_config(es_handle, false), TAG, "set es8311 microphone failed"); -#if CONFIG_EXAMPLE_MODE_ECHO - ESP_RETURN_ON_ERROR(es8311_microphone_gain_set(es_handle, EXAMPLE_MIC_GAIN), TAG, "set es8311 microphone gain failed"); -#endif - return ESP_OK; -} - -static esp_err_t i2s_driver_init(void) -{ - i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM, I2S_ROLE_MASTER); - chan_cfg.auto_clear = true; // Auto clear the legacy data in the DMA buffer - ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, &rx_handle)); - i2s_std_config_t std_cfg = { - .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(EXAMPLE_SAMPLE_RATE), - .slot_cfg = { - .data_bit_width = I2S_DATA_BIT_WIDTH_32BIT, - .slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO, - .slot_mode = I2S_SLOT_MODE_MONO, - .slot_mask = I2S_STD_SLOT_LEFT, - .ws_width = I2S_DATA_BIT_WIDTH_32BIT, - .ws_pol = false, - .bit_shift = true, - .left_align = true, - .big_endian = false, - .bit_order_lsb = false - }, - .gpio_cfg = { - .mclk = I2S_MCK_IO, - .bclk = I2S_BCK_IO, - .ws = I2S_WS_IO, - .dout = I2S_DO_IO, - .din = I2S_DI_IO, - .invert_flags = { - .mclk_inv = false, - .bclk_inv = false, - .ws_inv = false, - }, - }, - }; - std_cfg.clk_cfg.mclk_multiple = (i2s_mclk_multiple_t)EXAMPLE_MCLK_MULTIPLE; - - ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle, &std_cfg)); - ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle, &std_cfg)); - ESP_ERROR_CHECK(i2s_channel_enable(tx_handle)); - ESP_ERROR_CHECK(i2s_channel_enable(rx_handle)); - - return ESP_OK; -} - - -AudioDevice::AudioDevice() { +AudioDevice::AudioDevice() + : input_sample_rate_(CONFIG_AUDIO_INPUT_SAMPLE_RATE), + output_sample_rate_(CONFIG_AUDIO_OUTPUT_SAMPLE_RATE) { } AudioDevice::~AudioDevice() { @@ -164,51 +21,16 @@ AudioDevice::~AudioDevice() { } } -void AudioDevice::Start(int input_sample_rate, int output_sample_rate) { - input_sample_rate_ = input_sample_rate; - output_sample_rate_ = output_sample_rate; - -// #ifdef CONFIG_AUDIO_DEVICE_I2S_SIMPLEX -// CreateSimplexChannels(); -// #else -// CreateDuplexChannels(); -// #endif - -// ESP_ERROR_CHECK(i2s_channel_enable(tx_handle_)); -// ESP_ERROR_CHECK(i2s_channel_enable(rx_handle_)); - printf("i2s es8311 codec example start\n-----------------------------\n"); - /* Initialize i2s peripheral */ - if (i2s_driver_init() != ESP_OK) - { - ESP_LOGE(TAG, "i2s driver init failed"); - abort(); - } - else - { - ESP_LOGI(TAG, "i2s driver init success"); - } - /* Initialize i2c peripheral and config es8311 codec by i2c */ - if (es8311_codec_init() != ESP_OK) - { - ESP_LOGE(TAG, "es8311 codec init failed"); - abort(); - } - else - { - ESP_LOGI(TAG, "es8311 codec init success"); - } - es7210_init(true); - esp_rom_gpio_pad_select_gpio(GPIO_NUM_48); - gpio_set_direction(GPIO_NUM_48, GPIO_MODE_OUTPUT); - gpio_set_level(GPIO_NUM_48, 1); // 输出高电平 - - xTaskCreate([](void* arg) { - auto audio_device = (AudioDevice*)arg; - audio_device->InputTask(); - }, "audio_input", 1024*10, this, 20, &audio_input_task_); +void AudioDevice::Initialize() { +#ifdef CONFIG_AUDIO_I2S_METHOD_SIMPLEX + CreateSimplexChannels(); +#else + CreateDuplexChannels(); +#endif } void AudioDevice::CreateDuplexChannels() { +#ifdef CONFIG_AUDIO_I2S_METHOD_DUPLEX duplex_ = true; i2s_chan_config_t chan_cfg = { @@ -243,10 +65,10 @@ void AudioDevice::CreateDuplexChannels() { }, .gpio_cfg = { .mclk = I2S_GPIO_UNUSED, - .bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_BCLK, - .ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_WS, - .dout = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_SPK_GPIO_DOUT, - .din = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_DIN, + .bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_BCLK, + .ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_LRCK, + .dout = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_DOUT, + .din = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_DIN, .invert_flags = { .mclk_inv = false, .bclk_inv = false, @@ -256,11 +78,14 @@ void AudioDevice::CreateDuplexChannels() { }; ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &std_cfg)); ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle_, &std_cfg)); + ESP_ERROR_CHECK(i2s_channel_enable(tx_handle_)); + ESP_ERROR_CHECK(i2s_channel_enable(rx_handle_)); ESP_LOGI(TAG, "Duplex channels created"); +#endif } -#ifdef CONFIG_AUDIO_DEVICE_I2S_SIMPLEX void AudioDevice::CreateSimplexChannels() { +#ifdef CONFIG_AUDIO_I2S_METHOD_SIMPLEX // Create a new channel for speaker i2s_chan_config_t chan_cfg = { .id = I2S_NUM_0, @@ -295,7 +120,7 @@ void AudioDevice::CreateSimplexChannels() { .gpio_cfg = { .mclk = I2S_GPIO_UNUSED, .bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_SPK_GPIO_BCLK, - .ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_SPK_GPIO_WS, + .ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_SPK_GPIO_LRCK, .dout = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_SPK_GPIO_DOUT, .din = I2S_GPIO_UNUSED, .invert_flags = { @@ -311,24 +136,38 @@ void AudioDevice::CreateSimplexChannels() { chan_cfg.id = I2S_NUM_1; ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, nullptr, &rx_handle_)); std_cfg.clk_cfg.sample_rate_hz = (uint32_t)input_sample_rate_; - std_cfg.gpio_cfg.bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_BCLK; + std_cfg.gpio_cfg.bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_SCK; std_cfg.gpio_cfg.ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_WS; std_cfg.gpio_cfg.dout = I2S_GPIO_UNUSED; std_cfg.gpio_cfg.din = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_MIC_GPIO_DIN; ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle_, &std_cfg)); - ESP_LOGI(TAG, "Simplex channels created"); -} -#endif -void AudioDevice::Write(const int16_t* data, int samples) { + ESP_ERROR_CHECK(i2s_channel_enable(tx_handle_)); + ESP_ERROR_CHECK(i2s_channel_enable(rx_handle_)); + ESP_LOGI(TAG, "Simplex channels created"); +#endif +} + +int AudioDevice::Write(const int16_t* data, int samples) { int32_t buffer[samples]; + + // output_volume_: 0-100 + // volume_factor_: 0-65536 + int32_t volume_factor = pow(double(output_volume_) / 100.0, 2) * 65536; for (int i = 0; i < samples; i++) { - buffer[i] = int32_t(data[i]) << 15; + int64_t temp = int64_t(data[i]) * volume_factor; // 使用 int64_t 进行乘法运算 + if (temp > INT32_MAX) { + buffer[i] = INT32_MAX; + } else if (temp < INT32_MIN) { + buffer[i] = INT32_MIN; + } else { + buffer[i] = static_cast(temp); + } } size_t bytes_written; - ESP_ERROR_CHECK(i2s_channel_write(tx_handle, buffer, samples * sizeof(int32_t), &bytes_written, portMAX_DELAY)); - + ESP_ERROR_CHECK(i2s_channel_write(tx_handle_, buffer, samples * sizeof(int32_t), &bytes_written, portMAX_DELAY)); + return bytes_written / sizeof(int32_t); } int AudioDevice::Read(int16_t* dest, int samples) { @@ -348,8 +187,16 @@ int AudioDevice::Read(int16_t* dest, int samples) { return samples; } -void AudioDevice::OnInputData(std::function callback) { +void AudioDevice::OnInputData(std::function&& data)> callback) { on_input_data_ = callback; + + // 创建音频输入任务 + if (audio_input_task_ == nullptr) { + xTaskCreate([](void* arg) { + auto audio_device = (AudioDevice*)arg; + audio_device->InputTask(); + }, "audio_input", 4096 * 2, this, 3, &audio_input_task_); + } } void AudioDevice::OutputData(std::vector& data) { @@ -357,15 +204,20 @@ void AudioDevice::OutputData(std::vector& data) { } void AudioDevice::InputTask() { - int duration = 20; - int input_frame_size = input_sample_rate_ / 1000 * duration; - int16_t input_buffer[input_frame_size]; - - + int duration = 30; + int input_frame_size = input_sample_rate_ / 1000 * duration * input_channels_; while (true) { - int samples = Read(input_buffer, input_frame_size); + std::vector input_data(input_frame_size); + int samples = Read(input_data.data(), input_data.size()); if (samples > 0) { - on_input_data_(input_buffer, samples); + if (on_input_data_) { + on_input_data_(std::move(input_data)); + } } } } + +void AudioDevice::SetOutputVolume(int volume) { + output_volume_ = volume; + ESP_LOGI(TAG, "Set output volume to %d", output_volume_); +} diff --git a/main/AudioDevice.h b/main/AudioDevice.h index 84bbed55..aa0fa404 100644 --- a/main/AudioDevice.h +++ b/main/AudioDevice.h @@ -2,7 +2,6 @@ #define _AUDIO_DEVICE_H #include -#include #include #include @@ -12,33 +11,42 @@ class AudioDevice { public: AudioDevice(); - ~AudioDevice(); + virtual ~AudioDevice(); + virtual void Initialize(); - void Start(int input_sample_rate, int output_sample_rate); - void OnInputData(std::function callback); + void OnInputData(std::function&& data)> callback); void OutputData(std::vector& data); + virtual void SetOutputVolume(int volume); - int input_sample_rate() const { return input_sample_rate_; } - int output_sample_rate() const { return output_sample_rate_; } - bool duplex() const { return duplex_; } + inline bool duplex() const { return duplex_; } + inline bool input_reference() const { return input_reference_; } + inline int input_sample_rate() const { return input_sample_rate_; } + inline int output_sample_rate() const { return output_sample_rate_; } + inline int input_channels() const { return input_channels_; } + inline int output_channels() const { return output_channels_; } + inline int output_volume() const { return output_volume_; } private: + TaskHandle_t audio_input_task_ = nullptr; + std::function&& data)> on_input_data_; + + void InputTask(); + void CreateSimplexChannels(); + +protected: bool duplex_ = false; + bool input_reference_ = false; int input_sample_rate_ = 0; int output_sample_rate_ = 0; + int input_channels_ = 1; + int output_channels_ = 1; + int output_volume_ = 70; i2s_chan_handle_t tx_handle_ = nullptr; i2s_chan_handle_t rx_handle_ = nullptr; - TaskHandle_t audio_input_task_ = nullptr; - - EventGroupHandle_t event_group_; - std::function on_input_data_; - - void CreateDuplexChannels(); - void CreateSimplexChannels(); - void InputTask(); - int Read(int16_t* dest, int samples); - void Write(const int16_t* data, int samples); + virtual void CreateDuplexChannels(); + virtual int Read(int16_t* dest, int samples); + virtual int Write(const int16_t* data, int samples); }; #endif // _AUDIO_DEVICE_H diff --git a/main/AudioProcessor.cc b/main/AudioProcessor.cc index fe937212..bde340bb 100644 --- a/main/AudioProcessor.cc +++ b/main/AudioProcessor.cc @@ -8,6 +8,12 @@ static const char* TAG = "AudioProcessor"; AudioProcessor::AudioProcessor() : afe_communication_data_(nullptr) { event_group_ = xEventGroupCreate(); +} + +void AudioProcessor::Initialize(int channels, bool reference) { + channels_ = channels; + reference_ = reference; + int ref_num = reference_ ? 1 : 0; afe_config_t afe_config = { .aec_init = false, @@ -21,18 +27,18 @@ AudioProcessor::AudioProcessor() .wakenet_model_name = NULL, .wakenet_model_name_2 = NULL, .wakenet_mode = DET_MODE_90, - .afe_mode = SR_MODE_LOW_COST, - .afe_perferred_core = 0, - .afe_perferred_priority = 5, + .afe_mode = SR_MODE_HIGH_PERF, + .afe_perferred_core = 1, + .afe_perferred_priority = 1, .afe_ringbuf_size = 50, .memory_alloc_mode = AFE_MEMORY_ALLOC_MORE_PSRAM, .afe_linear_gain = 1.0, .agc_mode = AFE_MN_PEAK_AGC_MODE_2, .pcm_config = { - .total_ch_num = 1, - .mic_num = 1, - .ref_num = 0, - .sample_rate = CONFIG_AUDIO_INPUT_SAMPLE_RATE, + .total_ch_num = channels_, + .mic_num = channels_ - ref_num, + .ref_num = ref_num, + .sample_rate = 16000, }, .debug_init = false, .debug_hook = {{ AFE_DEBUG_HOOK_MASE_TASK_IN, NULL }, { AFE_DEBUG_HOOK_FETCH_TASK_IN, NULL }}, @@ -47,7 +53,7 @@ AudioProcessor::AudioProcessor() auto this_ = (AudioProcessor*)arg; this_->AudioProcessorTask(); vTaskDelete(NULL); - }, "audio_communication", 4096 * 2, this, 5, NULL); + }, "audio_communication", 4096 * 2, this, 1, NULL); } AudioProcessor::~AudioProcessor() { @@ -57,10 +63,10 @@ AudioProcessor::~AudioProcessor() { vEventGroupDelete(event_group_); } -void AudioProcessor::Input(const int16_t* data, int size) { - input_buffer_.insert(input_buffer_.end(), data, data + size); +void AudioProcessor::Input(std::vector& data) { + input_buffer_.insert(input_buffer_.end(), data.begin(), data.end()); - auto chunk_size = esp_afe_vc_v1.get_feed_chunksize(afe_communication_data_); + auto chunk_size = esp_afe_vc_v1.get_feed_chunksize(afe_communication_data_) * channels_; while (input_buffer_.size() >= chunk_size) { auto chunk = input_buffer_.data(); esp_afe_vc_v1.feed(afe_communication_data_, chunk); @@ -92,6 +98,9 @@ void AudioProcessor::AudioProcessorTask() { xEventGroupWaitBits(event_group_, PROCESSOR_RUNNING, pdFALSE, pdTRUE, portMAX_DELAY); auto res = esp_afe_vc_v1.fetch(afe_communication_data_); + if ((xEventGroupGetBits(event_group_) & PROCESSOR_RUNNING) == 0) { + continue; + } if (res == nullptr || res->ret_value == ESP_FAIL) { if (res != nullptr) { ESP_LOGI(TAG, "Error code: %d", res->ret_value); diff --git a/main/AudioProcessor.h b/main/AudioProcessor.h index 993a1708..d095e0cc 100644 --- a/main/AudioProcessor.h +++ b/main/AudioProcessor.h @@ -15,7 +15,8 @@ public: AudioProcessor(); ~AudioProcessor(); - void Input(const int16_t* data, int size); + void Initialize(int channels, bool reference); + void Input(std::vector& data); void Start(); void Stop(); bool IsRunning(); @@ -26,6 +27,8 @@ private: esp_afe_sr_data_t* afe_communication_data_ = nullptr; std::vector input_buffer_; std::function&& data)> output_callback_; + int channels_; + bool reference_; void AudioProcessorTask(); }; diff --git a/main/BoxAudioDevice.cc b/main/BoxAudioDevice.cc new file mode 100644 index 00000000..a2b7135f --- /dev/null +++ b/main/BoxAudioDevice.cc @@ -0,0 +1,232 @@ +#include "BoxAudioDevice.h" +#include +#include + +static const char* TAG = "BoxAudioDevice"; + +BoxAudioDevice::BoxAudioDevice() { +} + +BoxAudioDevice::~BoxAudioDevice() { + ESP_ERROR_CHECK(esp_codec_dev_close(output_dev_)); + esp_codec_dev_delete(output_dev_); + ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_)); + esp_codec_dev_delete(input_dev_); + + audio_codec_delete_codec_if(in_codec_if_); + audio_codec_delete_ctrl_if(in_ctrl_if_); + audio_codec_delete_codec_if(out_codec_if_); + audio_codec_delete_ctrl_if(out_ctrl_if_); + audio_codec_delete_gpio_if(gpio_if_); + audio_codec_delete_data_if(data_if_); + + ESP_ERROR_CHECK(i2c_del_master_bus(i2c_master_handle_)); +} + +void BoxAudioDevice::Initialize() { + duplex_ = true; // 是否双工 + input_reference_ = CONFIG_AUDIO_CODEC_INPUT_REFERENCE; // 是否使用参考输入,实现回声消除 + input_channels_ = input_reference_ ? 2 : 1; // 输入通道数 + + // Initialize I2C peripheral + i2c_master_bus_config_t i2c_bus_cfg = { + .i2c_port = I2C_NUM_0, + .sda_io_num = (gpio_num_t)CONFIG_AUDIO_CODEC_I2C_SDA_PIN, + .scl_io_num = (gpio_num_t)CONFIG_AUDIO_CODEC_I2C_SCL_PIN, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + .intr_priority = 0, + .trans_queue_depth = 0, + .flags = { + .enable_internal_pullup = 1, + }, + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &i2c_master_handle_)); + + CreateDuplexChannels(); + + // Do initialize of related interface: data_if, ctrl_if and gpio_if + audio_codec_i2s_cfg_t i2s_cfg = { + .port = I2S_NUM_0, + .rx_handle = rx_handle_, + .tx_handle = tx_handle_, + }; + data_if_ = audio_codec_new_i2s_data(&i2s_cfg); + assert(data_if_ != NULL); + + // Output + audio_codec_i2c_cfg_t i2c_cfg = { + .port = I2C_NUM_0, + .addr = ES8311_CODEC_DEFAULT_ADDR, + .bus_handle = i2c_master_handle_, + }; + out_ctrl_if_ = audio_codec_new_i2c_ctrl(&i2c_cfg); + assert(out_ctrl_if_ != NULL); + + gpio_if_ = audio_codec_new_gpio(); + assert(gpio_if_ != NULL); + + es8311_codec_cfg_t es8311_cfg = {}; + es8311_cfg.ctrl_if = out_ctrl_if_; + es8311_cfg.gpio_if = gpio_if_; + es8311_cfg.codec_mode = ESP_CODEC_DEV_WORK_MODE_DAC; + es8311_cfg.pa_pin = CONFIG_AUDIO_CODEC_PA_PIN; + es8311_cfg.use_mclk = true; + es8311_cfg.hw_gain.pa_voltage = 5.0; + es8311_cfg.hw_gain.codec_dac_voltage = 3.3; + out_codec_if_ = es8311_codec_new(&es8311_cfg); + assert(out_codec_if_ != NULL); + + esp_codec_dev_cfg_t dev_cfg = { + .dev_type = ESP_CODEC_DEV_TYPE_OUT, + .codec_if = out_codec_if_, + .data_if = data_if_, + }; + output_dev_ = esp_codec_dev_new(&dev_cfg); + assert(output_dev_ != NULL); + + ESP_ERROR_CHECK(esp_codec_dev_set_out_vol(output_dev_, output_volume_)); + + // Play 16bit 1 channel + esp_codec_dev_sample_info_t fs = { + .bits_per_sample = 16, + .channel = 1, + .channel_mask = 0, + .sample_rate = (uint32_t)output_sample_rate_, + .mclk_multiple = 0, + }; + ESP_ERROR_CHECK(esp_codec_dev_open(output_dev_, &fs)); + + // Input + i2c_cfg.addr = ES7210_CODEC_DEFAULT_ADDR; + in_ctrl_if_ = audio_codec_new_i2c_ctrl(&i2c_cfg); + assert(in_ctrl_if_ != NULL); + + es7210_codec_cfg_t es7210_cfg = {}; + es7210_cfg.ctrl_if = in_ctrl_if_; + es7210_cfg.mic_selected = ES7120_SEL_MIC1 | ES7120_SEL_MIC2 | ES7120_SEL_MIC3 | ES7120_SEL_MIC4; + in_codec_if_ = es7210_codec_new(&es7210_cfg); + assert(in_codec_if_ != NULL); + + dev_cfg.dev_type = ESP_CODEC_DEV_TYPE_IN; + dev_cfg.codec_if = in_codec_if_; + input_dev_ = esp_codec_dev_new(&dev_cfg); + assert(input_dev_ != NULL); + + fs.channel = 4; + if (input_channels_ == 1) { + fs.channel_mask = ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0); + } else { + fs.channel_mask = ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0) | ESP_CODEC_DEV_MAKE_CHANNEL_MASK(1); + } + ESP_ERROR_CHECK(esp_codec_dev_open(input_dev_, &fs)); + + ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain(input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0), 30.0)); + + ESP_LOGI(TAG, "BoxAudioDevice initialized"); +} + +void BoxAudioDevice::CreateDuplexChannels() { + assert(input_sample_rate_ == output_sample_rate_); + + i2s_chan_config_t chan_cfg = { + .id = I2S_NUM_0, + .role = I2S_ROLE_MASTER, + .dma_desc_num = 6, + .dma_frame_num = 240, + .auto_clear_after_cb = true, + .auto_clear_before_cb = false, + .intr_priority = 0, + }; + ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle_, &rx_handle_)); + + i2s_std_config_t std_cfg = { + .clk_cfg = { + .sample_rate_hz = (uint32_t)output_sample_rate_, + .clk_src = I2S_CLK_SRC_DEFAULT, + .ext_clk_freq_hz = 0, + .mclk_multiple = I2S_MCLK_MULTIPLE_256 + }, + .slot_cfg = { + .data_bit_width = I2S_DATA_BIT_WIDTH_16BIT, + .slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO, + .slot_mode = I2S_SLOT_MODE_STEREO, + .slot_mask = I2S_STD_SLOT_BOTH, + .ws_width = I2S_DATA_BIT_WIDTH_16BIT, + .ws_pol = false, + .bit_shift = true, + .left_align = true, + .big_endian = false, + .bit_order_lsb = false + }, + .gpio_cfg = { + .mclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_MCLK, + .bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_BCLK, + .ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_LRCK, + .dout = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_DOUT, + .din = I2S_GPIO_UNUSED, + .invert_flags = { + .mclk_inv = false, + .bclk_inv = false, + .ws_inv = false + } + } + }; + + i2s_tdm_config_t tdm_cfg = { + .clk_cfg = { + .sample_rate_hz = (uint32_t)input_sample_rate_, + .clk_src = I2S_CLK_SRC_DEFAULT, + .ext_clk_freq_hz = 0, + .mclk_multiple = I2S_MCLK_MULTIPLE_256, + .bclk_div = 8, + }, + .slot_cfg = { + .data_bit_width = I2S_DATA_BIT_WIDTH_16BIT, + .slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO, + .slot_mode = I2S_SLOT_MODE_STEREO, + .slot_mask = i2s_tdm_slot_mask_t(I2S_TDM_SLOT0 | I2S_TDM_SLOT1 | I2S_TDM_SLOT2 | I2S_TDM_SLOT3), + .ws_width = I2S_TDM_AUTO_WS_WIDTH, + .ws_pol = false, + .bit_shift = true, + .left_align = false, + .big_endian = false, + .bit_order_lsb = false, + .skip_mask = false, + .total_slot = I2S_TDM_AUTO_SLOT_NUM + }, + .gpio_cfg = { + .mclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_MCLK, + .bclk = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_BCLK, + .ws = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_LRCK, + .dout = I2S_GPIO_UNUSED, + .din = (gpio_num_t)CONFIG_AUDIO_DEVICE_I2S_GPIO_DIN, + .invert_flags = { + .mclk_inv = false, + .bclk_inv = false, + .ws_inv = false + } + } + }; + + ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &std_cfg)); + ESP_ERROR_CHECK(i2s_channel_init_tdm_mode(rx_handle_, &tdm_cfg)); + ESP_ERROR_CHECK(i2s_channel_enable(tx_handle_)); + ESP_ERROR_CHECK(i2s_channel_enable(rx_handle_)); + ESP_LOGI(TAG, "Duplex channels created"); +} + +int BoxAudioDevice::Read(int16_t *buffer, int samples) { + ESP_ERROR_CHECK(esp_codec_dev_read(input_dev_, (void*)buffer, samples * sizeof(int16_t))); + return samples; +} + +int BoxAudioDevice::Write(const int16_t *buffer, int samples) { + ESP_ERROR_CHECK(esp_codec_dev_write(output_dev_, (void*)buffer, samples * sizeof(int16_t))); + return samples; +} + +void BoxAudioDevice::SetOutputVolume(int volume) { + ESP_ERROR_CHECK(esp_codec_dev_set_out_vol(output_dev_, volume)); + AudioDevice::SetOutputVolume(volume); +} diff --git a/main/BoxAudioDevice.h b/main/BoxAudioDevice.h new file mode 100644 index 00000000..28a4e3fe --- /dev/null +++ b/main/BoxAudioDevice.h @@ -0,0 +1,36 @@ +#ifndef _BOX_AUDIO_DEVICE_H +#define _BOX_AUDIO_DEVICE_H + +#include "AudioDevice.h" +#include +#include +#include +#include + + +class BoxAudioDevice : public AudioDevice { +public: + BoxAudioDevice(); + virtual ~BoxAudioDevice(); + void Initialize() override; + void SetOutputVolume(int volume) override; + +private: + i2c_master_bus_handle_t i2c_master_handle_ = nullptr; + + const audio_codec_data_if_t* data_if_ = nullptr; + const audio_codec_ctrl_if_t* out_ctrl_if_ = nullptr; + const audio_codec_if_t* out_codec_if_ = nullptr; + const audio_codec_ctrl_if_t* in_ctrl_if_ = nullptr; + const audio_codec_if_t* in_codec_if_ = nullptr; + const audio_codec_gpio_if_t* gpio_if_ = nullptr; + + esp_codec_dev_handle_t output_dev_ = nullptr; + esp_codec_dev_handle_t input_dev_ = nullptr; + + void CreateDuplexChannels() override; + int Read(int16_t* dest, int samples) override; + int Write(const int16_t* data, int samples) override; +}; + +#endif // _BOX_AUDIO_DEVICE_H diff --git a/main/Button.cc b/main/Button.cc index 5dcaf3c4..46ffd847 100644 --- a/main/Button.cc +++ b/main/Button.cc @@ -6,8 +6,8 @@ static const char* TAG = "Button"; Button::Button(gpio_num_t gpio_num) : gpio_num_(gpio_num) { button_config_t button_config = { .type = BUTTON_TYPE_GPIO, - .long_press_time = 3000, - .short_press_time = 100, + .long_press_time = 1000, + .short_press_time = 50, .gpio_button_config = { .gpio_num = gpio_num, .active_level = 0 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 7efe8365..f4fa7139 100755 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -16,6 +16,9 @@ set(SOURCES "AudioDevice.cc" if(CONFIG_USE_AFE_SR) list(APPEND SOURCES "AudioProcessor.cc" "WakeWordDetect.cc") endif() +if(CONFIG_AUDIO_CODEC_ES8311_ES7210) + list(APPEND SOURCES "BoxAudioDevice.cc") +endif() idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS "." diff --git a/main/Display.cc b/main/Display.cc index 6f141be7..8106a61c 100644 --- a/main/Display.cc +++ b/main/Display.cc @@ -17,7 +17,7 @@ Display::Display(int sda_pin, int scl_pin) : sda_pin_(sda_pin), scl_pin_(scl_pin ESP_LOGI(TAG, "Display Pins: %d, %d", sda_pin_, scl_pin_); i2c_master_bus_config_t bus_config = { - .i2c_port = I2C_NUM_0, + .i2c_port = I2C_NUM_1, .sda_io_num = (gpio_num_t)sda_pin_, .scl_io_num = (gpio_num_t)scl_pin_, .clk_source = I2C_CLK_SRC_DEFAULT, @@ -104,20 +104,29 @@ Display::Display(int sda_pin, int scl_pin) : sda_pin_(sda_pin), scl_pin_(scl_pin lv_label_set_text(label_, "Initializing..."); lv_obj_set_width(label_, disp_->driver->hor_res); lv_obj_set_height(label_, disp_->driver->ver_res); - lv_obj_set_style_text_line_space(label_, 0, 0); - lv_obj_set_style_pad_all(label_, 0, 0); - lv_obj_set_style_outline_pad(label_, 0, 0); + + notification_ = lv_label_create(lv_disp_get_scr_act(disp_)); + lv_label_set_text(notification_, "Notification\nTest"); + lv_obj_set_width(notification_, disp_->driver->hor_res); + lv_obj_set_height(notification_, disp_->driver->ver_res); + lv_obj_set_style_opa(notification_, LV_OPA_MIN, 0); lvgl_port_unlock(); } } Display::~Display() { - if (label_ != nullptr) { - lvgl_port_lock(0); - lv_obj_del(label_); - lvgl_port_unlock(); + if (notification_timer_ != nullptr) { + esp_timer_stop(notification_timer_); + esp_timer_delete(notification_timer_); } + lvgl_port_lock(0); + if (label_ != nullptr) { + lv_obj_del(label_); + lv_obj_del(notification_); + } + lvgl_port_unlock(); + if (disp_ != nullptr) { lvgl_port_deinit(); esp_lcd_panel_del(panel_); @@ -136,4 +145,35 @@ void Display::SetText(const std::string &text) { } } +void Display::ShowNotification(const std::string &text) { + if (notification_ != nullptr) { + lvgl_port_lock(0); + lv_label_set_text(notification_, text.c_str()); + lv_obj_set_style_opa(notification_, LV_OPA_MAX, 0); + lv_obj_set_style_opa(label_, LV_OPA_MIN, 0); + lvgl_port_unlock(); + + if (notification_timer_ != nullptr) { + esp_timer_stop(notification_timer_); + esp_timer_delete(notification_timer_); + } + + esp_timer_create_args_t timer_args = { + .callback = [](void *arg) { + Display *display = static_cast(arg); + lvgl_port_lock(0); + lv_obj_set_style_opa(display->notification_, LV_OPA_MIN, 0); + lv_obj_set_style_opa(display->label_, LV_OPA_MAX, 0); + lvgl_port_unlock(); + }, + .arg = this, + .dispatch_method = ESP_TIMER_TASK, + .name = "Notification Timer", + .skip_unhandled_events = false, + }; + ESP_ERROR_CHECK(esp_timer_create(&timer_args, ¬ification_timer_)); + ESP_ERROR_CHECK(esp_timer_start_once(notification_timer_, 3000000)); + } +} + #endif diff --git a/main/Display.h b/main/Display.h index 308778b5..c57bc622 100644 --- a/main/Display.h +++ b/main/Display.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -14,6 +15,7 @@ public: ~Display(); void SetText(const std::string &text); + void ShowNotification(const std::string &text); private: int sda_pin_; @@ -25,6 +27,8 @@ private: esp_lcd_panel_handle_t panel_ = nullptr; lv_disp_t *disp_ = nullptr; lv_obj_t *label_ = nullptr; + lv_obj_t *notification_ = nullptr; + esp_timer_handle_t notification_timer_ = nullptr; std::string text_; }; diff --git a/main/FirmwareUpgrade.cc b/main/FirmwareUpgrade.cc index 56f67aba..3fd8a40c 100644 --- a/main/FirmwareUpgrade.cc +++ b/main/FirmwareUpgrade.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -24,10 +25,6 @@ void FirmwareUpgrade::SetCheckVersionUrl(std::string check_version_url) { check_version_url_ = check_version_url; } -void FirmwareUpgrade::SetPostData(const std::string& post_data) { - post_data_ = post_data; -} - void FirmwareUpgrade::SetHeader(const std::string& key, const std::string& value) { headers_[key] = value; } @@ -45,13 +42,9 @@ void FirmwareUpgrade::CheckVersion() { http_.SetHeader(header.first, header.second); } - if (post_data_.empty()) { - http_.Open("GET", check_version_url_); - } else { - http_.SetHeader("Content-Type", "application/json"); - http_.SetContent(post_data_); - http_.Open("POST", check_version_url_); - } + http_.SetHeader("Content-Type", "application/json"); + http_.SetContent(GetPostData()); + http_.Open("POST", check_version_url_); auto response = http_.GetBody(); http_.Close(); @@ -257,3 +250,99 @@ bool FirmwareUpgrade::IsNewVersionAvailable(const std::string& currentVersion, c return newer.size() > current.size(); } + +void FirmwareUpgrade::SetBoardJson(const std::string& board_json) { + board_json_ = board_json; +} + +std::string FirmwareUpgrade::GetPostData() { + /* + { + "flash_size": 4194304, + "psram_size": 0, + "minimum_free_heap_size": 123456, + "mac_address": "00:00:00:00:00:00", + "chip_model_name": "esp32s3", + "chip_info": { + "model": 1, + "cores": 2, + "revision": 0, + "features": 0 + }, + "application": { + "name": "my-app", + "version": "1.0.0", + "compile_time": "2021-01-01T00:00:00Z" + "idf_version": "4.2-dev" + "elf_sha256": "" + }, + "partition_table": [ + "app": { + "label": "app", + "type": 1, + "subtype": 2, + "address": 0x10000, + "size": 0x100000 + } + ], + "ota": { + "label": "ota_0" + } + } + */ + std::string json = "{"; + json += "\"flash_size\":" + std::to_string(SystemInfo::GetFlashSize()) + ","; + json += "\"minimum_free_heap_size\":" + std::to_string(SystemInfo::GetMinimumFreeHeapSize()) + ","; + json += "\"mac_address\":\"" + SystemInfo::GetMacAddress() + "\","; + json += "\"chip_model_name\":\"" + SystemInfo::GetChipModelName() + "\","; + json += "\"chip_info\":{"; + + esp_chip_info_t chip_info; + esp_chip_info(&chip_info); + json += "\"model\":" + std::to_string(chip_info.model) + ","; + json += "\"cores\":" + std::to_string(chip_info.cores) + ","; + json += "\"revision\":" + std::to_string(chip_info.revision) + ","; + json += "\"features\":" + std::to_string(chip_info.features); + json += "},"; + + json += "\"application\":{"; + auto app_desc = esp_app_get_description(); + json += "\"name\":\"" + std::string(app_desc->project_name) + "\","; + json += "\"version\":\"" + std::string(app_desc->version) + "\","; + json += "\"compile_time\":\"" + std::string(app_desc->date) + "T" + std::string(app_desc->time) + "Z\","; + json += "\"idf_version\":\"" + std::string(app_desc->idf_ver) + "\","; + + char sha256_str[65]; + for (int i = 0; i < 32; i++) { + snprintf(sha256_str + i * 2, sizeof(sha256_str) - i * 2, "%02x", app_desc->app_elf_sha256[i]); + } + json += "\"elf_sha256\":\"" + std::string(sha256_str) + "\""; + json += "},"; + + json += "\"partition_table\": ["; + esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); + while (it) { + const esp_partition_t *partition = esp_partition_get(it); + json += "{"; + json += "\"label\":\"" + std::string(partition->label) + "\","; + json += "\"type\":" + std::to_string(partition->type) + ","; + json += "\"subtype\":" + std::to_string(partition->subtype) + ","; + json += "\"address\":" + std::to_string(partition->address) + ","; + json += "\"size\":" + std::to_string(partition->size); + json += "},"; + it = esp_partition_next(it); + } + json.pop_back(); // Remove the last comma + json += "],"; + + json += "\"ota\":{"; + auto ota_partition = esp_ota_get_running_partition(); + json += "\"label\":\"" + std::string(ota_partition->label) + "\""; + json += "},"; + + json += "\"board\":" + board_json_; + + // Close the JSON object + json += "}"; + return json; +} diff --git a/main/FirmwareUpgrade.h b/main/FirmwareUpgrade.h index 1fe86c80..a7f282f6 100644 --- a/main/FirmwareUpgrade.h +++ b/main/FirmwareUpgrade.h @@ -12,8 +12,8 @@ public: FirmwareUpgrade(Http& http); ~FirmwareUpgrade(); + void SetBoardJson(const std::string& board_json); void SetCheckVersionUrl(std::string check_version_url); - void SetPostData(const std::string& post_data); void SetHeader(const std::string& key, const std::string& value); void CheckVersion(); bool HasNewVersion() { return has_new_version_; } @@ -26,13 +26,14 @@ private: bool has_new_version_ = false; std::string firmware_version_; std::string firmware_url_; - std::string post_data_; + std::string board_json_; std::map headers_; void Upgrade(const std::string& firmware_url); std::function upgrade_callback_; std::vector ParseVersion(const std::string& version); bool IsNewVersionAvailable(const std::string& currentVersion, const std::string& newVersion); + std::string GetPostData(); }; #endif // _FIRMWARE_UPGRADE_H diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 1597144f..b580576c 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -30,49 +30,136 @@ config AUDIO_OUTPUT_SAMPLE_RATE help Audio output sample rate. -config AUDIO_DEVICE_I2S_MIC_GPIO_WS - int "I2S GPIO WS" - default 4 +choice AUDIO_CODEC + prompt "Audio Codec" + default AUDIO_CODEC_NONE help - GPIO number of the I2S WS. + Audio codec. + config AUDIO_CODEC_ES8311_ES7210 + bool "Box: ES8311 + ES7210" + config AUDIO_CODEC_NONE + bool "None" +endchoice -config AUDIO_DEVICE_I2S_MIC_GPIO_BCLK - int "I2S GPIO BCLK" - default 5 - help - GPIO number of the I2S BCLK. +menu "Box Audio Codec I2C and PA Control" + depends on AUDIO_CODEC_ES8311_ES7210 + + config AUDIO_CODEC_I2C_SDA_PIN + int "Audio Codec I2C SDA Pin" + default 39 + help + Audio codec I2C SDA pin. -config AUDIO_DEVICE_I2S_MIC_GPIO_DIN - int "I2S GPIO DIN" - default 6 - help - GPIO number of the I2S DIN. + config AUDIO_CODEC_I2C_SCL_PIN + int "Audio Codec I2C SCL Pin" + default 38 + help + Audio codec I2C SCL pin. + + config AUDIO_CODEC_PA_PIN + int "Audio Codec PA Pin" + default 40 + help + Audio codec PA pin. + + config AUDIO_CODEC_INPUT_REFERENCE + bool "Audio Codec Input Reference" + default y + help + Audio codec input reference. +endmenu -config AUDIO_DEVICE_I2S_SPK_GPIO_DOUT - int "I2S GPIO DOUT" - default 7 +choice AUDIO_I2S_METHOD + prompt "Audio I2S Method" + default AUDIO_I2S_METHOD_SIMPLEX if AUDIO_CODEC_NONE + default AUDIO_I2S_METHOD_DUPLEX if AUDIO_CODEC_ES8311_ES7210 help - GPIO number of the I2S DOUT. - -config AUDIO_DEVICE_I2S_SIMPLEX - bool "I2S Simplex" - default y - help - Enable I2S Simplex mode. - -config AUDIO_DEVICE_I2S_SPK_GPIO_BCLK - int "I2S SPK GPIO BCLK" - default 15 - depends on AUDIO_DEVICE_I2S_SIMPLEX - help - GPIO number of the I2S MIC BCLK. - -config AUDIO_DEVICE_I2S_SPK_GPIO_WS - int "I2S SPK GPIO WS" - default 16 - depends on AUDIO_DEVICE_I2S_SIMPLEX - help - GPIO number of the I2S MIC WS. + Audio I2S method. + config AUDIO_I2S_METHOD_SIMPLEX + bool "Simplex" + help + Use I2S 0 as the audio input and I2S 1 as the audio output. + config AUDIO_I2S_METHOD_DUPLEX + bool "Duplex" + help + Use I2S 0 as the audio input and audio output. +endchoice + +menu "Audio I2S Simplex" + depends on AUDIO_I2S_METHOD_SIMPLEX + + config AUDIO_DEVICE_I2S_MIC_GPIO_WS + int "I2S MIC GPIO WS" + default 4 + help + GPIO number of the I2S MIC WS. + + config AUDIO_DEVICE_I2S_MIC_GPIO_SCK + int "I2S MIC GPIO BCLK" + default 5 + help + GPIO number of the I2S MIC SCK. + + config AUDIO_DEVICE_I2S_MIC_GPIO_DIN + int "I2S MIC GPIO DIN" + default 6 + help + GPIO number of the I2S MIC DIN. + + config AUDIO_DEVICE_I2S_SPK_GPIO_DOUT + int "I2S SPK GPIO DOUT" + default 7 + help + GPIO number of the I2S SPK DOUT. + + config AUDIO_DEVICE_I2S_SPK_GPIO_BCLK + int "I2S SPK GPIO BCLK" + default 15 + help + GPIO number of the I2S SPK BCLK. + + config AUDIO_DEVICE_I2S_SPK_GPIO_LRCK + int "I2S SPK GPIO WS" + default 16 + help + GPIO number of the I2S SPK LRCK. + +endmenu + +menu "Audio I2S Duplex" + depends on AUDIO_I2S_METHOD_DUPLEX + + config AUDIO_DEVICE_I2S_GPIO_MCLK + int "I2S GPIO MCLK" + default -1 + help + GPIO number of the I2S WS. + + config AUDIO_DEVICE_I2S_GPIO_LRCK + int "I2S GPIO LRCK" + default 4 + help + GPIO number of the I2S LRCK. + + config AUDIO_DEVICE_I2S_GPIO_BCLK + int "I2S GPIO BCLK / SCLK" + default 5 + help + GPIO number of the I2S BCLK. + + config AUDIO_DEVICE_I2S_GPIO_DIN + int "I2S GPIO DIN" + default 6 + help + GPIO number of the I2S DIN. + + config AUDIO_DEVICE_I2S_GPIO_DOUT + int "I2S GPIO DOUT" + default 7 + help + GPIO number of the I2S DOUT. + +endmenu config BOOT_BUTTON_GPIO int "Boot Button GPIO" @@ -80,6 +167,18 @@ config BOOT_BUTTON_GPIO help GPIO number of the boot button. +config VOLUME_UP_BUTTON_GPIO + int "Volume Up Button GPIO" + default 40 + help + GPIO number of the volume up button. + +config VOLUME_DOWN_BUTTON_GPIO + int "Volume Down Button GPIO" + default 39 + help + GPIO number of the volume down button. + config USE_AFE_SR bool "Use Espressif AFE SR" default y diff --git a/main/SystemInfo.cc b/main/SystemInfo.cc index f62393fc..c2462590 100644 --- a/main/SystemInfo.cc +++ b/main/SystemInfo.cc @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -41,96 +40,6 @@ std::string SystemInfo::GetChipModelName() { return std::string(CONFIG_IDF_TARGET); } -std::string SystemInfo::GetJsonString() { - /* - { - "flash_size": 4194304, - "psram_size": 0, - "minimum_free_heap_size": 123456, - "mac_address": "00:00:00:00:00:00", - "chip_model_name": "esp32s3", - "chip_info": { - "model": 1, - "cores": 2, - "revision": 0, - "features": 0 - }, - "application": { - "name": "my-app", - "version": "1.0.0", - "compile_time": "2021-01-01T00:00:00Z" - "idf_version": "4.2-dev" - "elf_sha256": "" - }, - "partition_table": [ - "app": { - "label": "app", - "type": 1, - "subtype": 2, - "address": 0x10000, - "size": 0x100000 - } - ], - "ota": { - "label": "ota_0" - } - } - */ - std::string json = "{"; - json += "\"flash_size\":" + std::to_string(GetFlashSize()) + ","; - json += "\"minimum_free_heap_size\":" + std::to_string(GetMinimumFreeHeapSize()) + ","; - json += "\"mac_address\":\"" + GetMacAddress() + "\","; - json += "\"chip_model_name\":\"" + GetChipModelName() + "\","; - json += "\"chip_info\":{"; - - esp_chip_info_t chip_info; - esp_chip_info(&chip_info); - json += "\"model\":" + std::to_string(chip_info.model) + ","; - json += "\"cores\":" + std::to_string(chip_info.cores) + ","; - json += "\"revision\":" + std::to_string(chip_info.revision) + ","; - json += "\"features\":" + std::to_string(chip_info.features); - json += "},"; - - json += "\"application\":{"; - auto app_desc = esp_app_get_description(); - json += "\"name\":\"" + std::string(app_desc->project_name) + "\","; - json += "\"version\":\"" + std::string(app_desc->version) + "\","; - json += "\"compile_time\":\"" + std::string(app_desc->date) + "T" + std::string(app_desc->time) + "Z\","; - json += "\"idf_version\":\"" + std::string(app_desc->idf_ver) + "\","; - - char sha256_str[65]; - for (int i = 0; i < 32; i++) { - snprintf(sha256_str + i * 2, sizeof(sha256_str) - i * 2, "%02x", app_desc->app_elf_sha256[i]); - } - json += "\"elf_sha256\":\"" + std::string(sha256_str) + "\""; - json += "},"; - - json += "\"partition_table\": ["; - esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); - while (it) { - const esp_partition_t *partition = esp_partition_get(it); - json += "{"; - json += "\"label\":\"" + std::string(partition->label) + "\","; - json += "\"type\":" + std::to_string(partition->type) + ","; - json += "\"subtype\":" + std::to_string(partition->subtype) + ","; - json += "\"address\":" + std::to_string(partition->address) + ","; - json += "\"size\":" + std::to_string(partition->size); - json += "},"; - it = esp_partition_next(it); - } - json.pop_back(); // Remove the last comma - json += "],"; - - json += "\"ota\":{"; - auto ota_partition = esp_ota_get_running_partition(); - json += "\"label\":\"" + std::string(ota_partition->label) + "\""; - json += "}"; - - // Close the JSON object - json += "}"; - return json; -} - esp_err_t SystemInfo::PrintRealTimeStats(TickType_t xTicksToWait) { #define ARRAY_SIZE_OFFSET 5 TaskStatus_t *start_array = NULL, *end_array = NULL; diff --git a/main/SystemInfo.h b/main/SystemInfo.h index a750bcf6..54d2c3e4 100644 --- a/main/SystemInfo.h +++ b/main/SystemInfo.h @@ -13,7 +13,6 @@ public: static size_t GetFreeHeapSize(); static std::string GetMacAddress(); static std::string GetChipModelName(); - static std::string GetJsonString(); static esp_err_t PrintRealTimeStats(TickType_t xTicksToWait); }; diff --git a/main/WakeWordDetect.cc b/main/WakeWordDetect.cc index a53ffcd6..1c90fa5e 100644 --- a/main/WakeWordDetect.cc +++ b/main/WakeWordDetect.cc @@ -15,6 +15,24 @@ WakeWordDetect::WakeWordDetect() wake_word_opus_() { event_group_ = xEventGroupCreate(); +} + +WakeWordDetect::~WakeWordDetect() { + if (afe_detection_data_ != nullptr) { + esp_afe_sr_v1.destroy(afe_detection_data_); + } + + if (wake_word_encode_task_stack_ != nullptr) { + free(wake_word_encode_task_stack_); + } + + vEventGroupDelete(event_group_); +} + +void WakeWordDetect::Initialize(int channels, bool reference) { + channels_ = channels; + reference_ = reference; + int ref_num = reference_ ? 1 : 0; srmodel_list_t *models = esp_srmodel_init("model"); for (int i = 0; i < models->num; i++) { @@ -25,7 +43,7 @@ WakeWordDetect::WakeWordDetect() } afe_config_t afe_config = { - .aec_init = false, + .aec_init = reference_, .se_init = true, .vad_init = true, .wakenet_init = true, @@ -37,17 +55,17 @@ WakeWordDetect::WakeWordDetect() .wakenet_model_name_2 = NULL, .wakenet_mode = DET_MODE_90, .afe_mode = SR_MODE_HIGH_PERF, - .afe_perferred_core = 0, - .afe_perferred_priority = 5, + .afe_perferred_core = 1, + .afe_perferred_priority = 1, .afe_ringbuf_size = 50, .memory_alloc_mode = AFE_MEMORY_ALLOC_MORE_PSRAM, .afe_linear_gain = 1.0, .agc_mode = AFE_MN_PEAK_AGC_MODE_2, .pcm_config = { - .total_ch_num = 1, - .mic_num = 1, - .ref_num = 0, - .sample_rate = CONFIG_AUDIO_INPUT_SAMPLE_RATE + .total_ch_num = channels_, + .mic_num = channels_ - ref_num, + .ref_num = ref_num, + .sample_rate = 16000 }, .debug_init = false, .debug_hook = {{ AFE_DEBUG_HOOK_MASE_TASK_IN, NULL }, { AFE_DEBUG_HOOK_FETCH_TASK_IN, NULL }}, @@ -62,19 +80,7 @@ WakeWordDetect::WakeWordDetect() auto this_ = (WakeWordDetect*)arg; this_->AudioDetectionTask(); vTaskDelete(NULL); - }, "audio_detection", 4096 * 2, this, 5, NULL); -} - -WakeWordDetect::~WakeWordDetect() { - if (afe_detection_data_ != nullptr) { - esp_afe_sr_v1.destroy(afe_detection_data_); - } - - if (wake_word_encode_task_stack_ != nullptr) { - free(wake_word_encode_task_stack_); - } - - vEventGroupDelete(event_group_); + }, "audio_detection", 4096 * 2, this, 1, NULL); } void WakeWordDetect::OnWakeWordDetected(std::function callback) { @@ -97,10 +103,10 @@ bool WakeWordDetect::IsDetectionRunning() { return xEventGroupGetBits(event_group_) & DETECTION_RUNNING_EVENT; } -void WakeWordDetect::Feed(const int16_t* data, int size) { - input_buffer_.insert(input_buffer_.end(), data, data + size); +void WakeWordDetect::Feed(std::vector& data) { + input_buffer_.insert(input_buffer_.end(), data.begin(), data.end()); - auto chunk_size = esp_afe_sr_v1.get_feed_chunksize(afe_detection_data_); + auto chunk_size = esp_afe_sr_v1.get_feed_chunksize(afe_detection_data_) * channels_; while (input_buffer_.size() >= chunk_size) { esp_afe_sr_v1.feed(afe_detection_data_, input_buffer_.data()); input_buffer_.erase(input_buffer_.begin(), input_buffer_.begin() + chunk_size); @@ -166,7 +172,7 @@ void WakeWordDetect::EncodeWakeWordData() { auto start_time = esp_timer_get_time(); // encode detect packets OpusEncoder* encoder = new OpusEncoder(); - encoder->Configure(CONFIG_AUDIO_INPUT_SAMPLE_RATE, 1, 60); + encoder->Configure(16000, 1, 60); encoder->SetComplexity(0); this_->wake_word_opus_.resize(4096 * 4); size_t offset = 0; diff --git a/main/WakeWordDetect.h b/main/WakeWordDetect.h index 81bf34cf..143f7ebc 100644 --- a/main/WakeWordDetect.h +++ b/main/WakeWordDetect.h @@ -19,7 +19,8 @@ public: WakeWordDetect(); ~WakeWordDetect(); - void Feed(const int16_t* data, int size); + void Initialize(int channels, bool reference); + void Feed(std::vector& data); void OnWakeWordDetected(std::function callback); void OnVadStateChange(std::function callback); void StartDetection(); @@ -36,6 +37,8 @@ private: std::function wake_word_detected_callback_; std::function vad_state_change_callback_; bool is_speaking_ = false; + int channels_; + bool reference_; TaskHandle_t wake_word_encode_task_ = nullptr; StaticTask_t wake_word_encode_task_buffer_; diff --git a/main/idf_component.yml b/main/idf_component.yml index 6f3f34a9..f967f22b 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -3,9 +3,10 @@ dependencies: espressif/iot_usbh_modem: "^0.2.1" espressif/esp_modem: "^1.1.0" 78/esp-builtin-led: "^1.0.2" - 78/esp-wifi-connect: "^1.1.0" + 78/esp-wifi-connect: "^1.2.0" 78/esp-opus-encoder: "^1.0.2" - 78/esp-ml307: "^1.1.1" + 78/esp-ml307: "^1.2.1" + espressif/esp_codec_dev: "^1.3.1" espressif/esp-sr: "^1.9.0" espressif/button: "^3.3.1" lvgl/lvgl: "^8.4.0" diff --git a/main/main.cc b/main/main.cc index 92010bd5..e2db74c9 100755 --- a/main/main.cc +++ b/main/main.cc @@ -154,6 +154,19 @@ static void on_modem_event(void *arg, esp_event_base_t event_base, extern "C" void app_main(void) { +#ifdef CONFIG_AUDIO_CODEC_ES8311_ES7210 + // Make GPIO15 HIGH to enable the 4G module + gpio_config_t ml307_enable_config = { + .pin_bit_mask = (1ULL << 15), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + gpio_config(&ml307_enable_config); + gpio_set_level(GPIO_NUM_15, 1); +#endif + // Check if the reset button is pressed SystemReset system_reset; system_reset.CheckButtons(); diff --git a/pack.py b/pack.py deleted file mode 100644 index 00194a78..00000000 --- a/pack.py +++ /dev/null @@ -1,68 +0,0 @@ -#! /usr/bin/env python3 - -import csv -import os - -# 例如:1000, 0x1000, 1M -def read_value(text): - text = text.strip() - if text.endswith('K'): - return int(text[:-1]) * 1024 - elif text.endswith('M'): - return int(text[:-1]) * 1024 * 1024 - else: - if text.startswith('0x'): - return int(text, 16) - else: - return int(text) - - -def write_bin(image_data, offset, file_path, max_size=None): - # Read file_path and write to image_data - with open(file_path, 'rb') as f: - data = f.read() - if max_size is not None: - assert len(data) <= max_size, f"Data from {file_path} is too large" - image_data[offset:offset+len(data)] = data - print(f"Write {os.path.basename(file_path)} to 0x{offset:08X} with size 0x{len(data):08X}") - - -''' -根据 partitions.csv 文件,把 bin 文件打包成一个 4MB 的 image 文件,方便烧录 -''' -def pack_firmware_image(): - # Create a 4MB image filled with 0xFF - image_size = 4 * 1024 * 1024 - image_data = bytearray([0xFF] * image_size) - - build_dir = os.path.join(os.path.dirname(__file__), 'build') - write_bin(image_data, 0, os.path.join(build_dir, 'bootloader', 'bootloader.bin')) - write_bin(image_data, 0x8000, os.path.join(build_dir, 'partition_table', 'partition-table.bin')) - - # 读取 partitions.csv 文件 - with open('partitions.csv', 'r') as f: - reader = csv.reader(f) - for row in reader: - if row[0] == 'model': - file_path = os.path.join(build_dir, 'srmodels', 'srmodels.bin') - elif row[0] == 'factory': - file_path = os.path.join(build_dir, 'xiaozhi.bin') - else: - continue - - offset = read_value(row[3]) - size = read_value(row[4]) - write_bin(image_data, offset, file_path, size) - - # 写入 image 文件 - output_path = os.path.join(build_dir, 'xiaozhi.img') - with open(output_path, 'wb') as f: - f.write(image_data) - print(f"Image file {output_path} created with size 0x{len(image_data):08X}") - - # Compress image with zip without directory - os.system(f"zip -j {output_path}.zip {output_path}") - - -if __name__ == '__main__': - pack_firmware_image() diff --git a/publish.py b/publish.py deleted file mode 100644 index cc7c6445..00000000 --- a/publish.py +++ /dev/null @@ -1,51 +0,0 @@ -#! /usr/bin/env python3 -from dotenv import load_dotenv -load_dotenv() - -import os -import oss2 -import json - -def get_version(): - with open('CMakeLists.txt', 'r') as f: - for line in f: - if line.startswith('set(PROJECT_VER'): - return line.split('"')[1] - return '0.0.0' - -def upload_bin_to_oss(bin_path, oss_key): - auth = oss2.Auth(os.environ['OSS_ACCESS_KEY_ID'], os.environ['OSS_ACCESS_KEY_SECRET']) - bucket = oss2.Bucket(auth, os.environ['OSS_ENDPOINT'], os.environ['OSS_BUCKET_NAME']) - bucket.put_object(oss_key, open(bin_path, 'rb')) - - -if __name__ == '__main__': - # 获取版本号 - version = get_version() - print(f'version: {version}') - - # 上传 bin 文件到 OSS - upload_bin_to_oss('build/xiaozhi.bin', f'firmwares/xiaozhi-{version}.bin') - - # File URL - file_url = os.path.join(os.environ['OSS_BUCKET_URL'], f'firmwares/xiaozhi-{version}.bin') - print(f'Uploaded bin to OSS: {file_url}') - - firmware_json = { - "version": version, - "url": file_url - } - with open(f"build/firmware.json", "w") as f: - json.dump(firmware_json, f, indent=4) - - # copy firmware.json to server - firmware_config_path = os.environ['FIRMWARE_CONFIG_PATH'] - ret = os.system(f'scp build/firmware.json {firmware_config_path}') - if ret != 0: - print(f'Failed to copy firmware.json to server') - exit(1) - print(f'Copied firmware.json to server: {firmware_config_path}') - - - - diff --git a/sdkconfig.box b/sdkconfig.box new file mode 100644 index 00000000..896a75e7 --- /dev/null +++ b/sdkconfig.box @@ -0,0 +1,2667 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.3.0 Project Configuration +# +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_LCDCAM_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_CACHE_SUPPORT_WRAP=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_RISCV_COPROC_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_USB_OTG_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_XT_WDT_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_MEMPROT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=24 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=5 +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=49 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=48 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=48 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_SUPPORT_DMA=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_RGB_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=1 +CONFIG_SOC_LCD_RGB_PANELS=1 +CONFIG_SOC_LCD_I80_BUS_WIDTH=16 +CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 +CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 +CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTCIO_PIN_COUNT=22 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=y +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_SUPPORT_OCT=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_SRC_FREQ_120M=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TOUCH_SENSOR_VERSION=2 +CONFIG_SOC_TOUCH_SENSOR_NUM=15 +CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 +CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y +CONFIG_SOC_TOUCH_SAMPLER_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_USB_OTG_PERIPH_NUM=1 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y +CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_OPI_MODE=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_LEADER_TX_LINE=y +CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_SDMMC_DELAY_PHASE_NUM=4 +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32s3" +CONFIG_IDF_INIT_VERSION="5.3.0" +CONFIG_IDF_TARGET_ESP32S3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=0 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y +# CONFIG_BOOTLOADER_APP_ANTI_ROLLBACK is not set +CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y +CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON=y +CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS=y +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0x10 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +CONFIG_BOOTLOADER_RESERVE_RTC_MEM=y +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_USB_OTG_NUM=3 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_FLASH_COUNT_PAGES_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_SUSPEND_WAITI_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_WRITEBACK_BUG=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_OCT_FLASH is not set +CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=y +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="16MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Xiaozhi Assistant +# +CONFIG_OTA_VERSION_URL="https://api.tenclass.net/xiaozhi/ota/" +CONFIG_WEBSOCKET_URL="wss://api.tenclass.net/xiaozhi/v1/" +CONFIG_WEBSOCKET_ACCESS_TOKEN="test-token" +CONFIG_AUDIO_INPUT_SAMPLE_RATE=24000 +CONFIG_AUDIO_OUTPUT_SAMPLE_RATE=24000 +CONFIG_AUDIO_CODEC_ES8311_ES7210=y +# CONFIG_AUDIO_CODEC_NONE is not set + +# +# Box Audio Codec I2C and PA Control +# +CONFIG_AUDIO_CODEC_I2C_SDA_PIN=39 +CONFIG_AUDIO_CODEC_I2C_SCL_PIN=38 +CONFIG_AUDIO_CODEC_PA_PIN=40 +CONFIG_AUDIO_CODEC_INPUT_REFERENCE=y +# end of Box Audio Codec I2C and PA Control + +# CONFIG_AUDIO_I2S_METHOD_SIMPLEX is not set +CONFIG_AUDIO_I2S_METHOD_DUPLEX=y + +# +# Audio I2S Duplex +# +CONFIG_AUDIO_DEVICE_I2S_GPIO_MCLK=0 +CONFIG_AUDIO_DEVICE_I2S_GPIO_LRCK=47 +CONFIG_AUDIO_DEVICE_I2S_GPIO_BCLK=48 +CONFIG_AUDIO_DEVICE_I2S_GPIO_DIN=45 +CONFIG_AUDIO_DEVICE_I2S_GPIO_DOUT=21 +# end of Audio I2S Duplex + +CONFIG_BOOT_BUTTON_GPIO=0 +CONFIG_VOLUME_UP_BUTTON_GPIO=6 +CONFIG_VOLUME_DOWN_BUTTON_GPIO=7 +CONFIG_USE_AFE_SR=y +CONFIG_USE_ML307=y +CONFIG_ML307_RX_PIN=17 +CONFIG_ML307_TX_PIN=16 +CONFIG_USE_DISPLAY=y +CONFIG_DISPLAY_HEIGHT=64 +CONFIG_DISPLAY_SDA_PIN=4 +CONFIG_DISPLAY_SCL_PIN=5 +# end of Xiaozhi Assistant + +# +# Builtin LED +# +CONFIG_BUILTIN_LED_GPIO=8 +# end of Builtin LED + +# +# ESP Speech Recognition +# +CONFIG_MODEL_IN_FLASH=y +# CONFIG_MODEL_IN_SDCARD is not set +CONFIG_USE_AFE=y +CONFIG_AFE_INTERFACE_V1=y +# CONFIG_USE_NSNET is not set +CONFIG_USE_WAKENET=y +# CONFIG_SR_WN_WN8_ALEXA is not set +# CONFIG_SR_WN_WN9_HILEXIN is not set +# CONFIG_SR_WN_WN9_XIAOAITONGXUE is not set +# CONFIG_SR_WN_WN9_ALEXA is not set +# CONFIG_SR_WN_WN9_HIESP is not set +# CONFIG_SR_WN_WN9_HIMFIVE is not set +CONFIG_SR_WN_WN9_NIHAOXIAOZHI_TTS=y +# CONFIG_SR_WN_WN9_JARVIS_TTS is not set +# CONFIG_SR_WN_WN9_COMPUTER_TTS is not set +# CONFIG_SR_WN_WN9_HEYWILLOW_TTS is not set +# CONFIG_SR_WN_WN9_SOPHIA_TTS is not set +# CONFIG_SR_WN_WN9_NIHAOXIAOXIN_TTS is not set +# CONFIG_SR_WN_WN9_XIAOMEITONGXUE_TTS is not set +# CONFIG_SR_WN_WN9_HIXIAOXING_TTS is not set +# CONFIG_SR_WN_WN9_MYCROFT_TTS is not set +# CONFIG_SR_WN_WN9_HEYPRINTER_TTS is not set +# CONFIG_SR_WN_WN9_XIAOLONGXIAOLONG_TTS is not set +# CONFIG_SR_WN_WN9_MIAOMIAOTONGXUE_TTS is not set +# CONFIG_SR_WN_WN9_HIJOY_TTS is not set +# CONFIG_SR_WN_WN9_HILILI_TTS is not set +# CONFIG_SR_WN_WN9_HITELLY_TTS is not set +# CONFIG_SR_WN_WN9_HEYWANDA_TTS is not set +# CONFIG_SR_WN_WN9_HIMIAOMIAO_TTS is not set +# CONFIG_SR_WN_WN9_XIAOBINXIAOBIN_TTS is not set +# CONFIG_SR_WN_WN9_ASTROLABE_TTS is not set +# CONFIG_SR_WN_WN9_CUSTOMWORD is not set +# CONFIG_SR_WN_LOAD_MULIT_WORD is not set +# CONFIG_USE_MULTINET is not set +# end of ESP Speech Recognition + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +# CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING is not set +CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +# CONFIG_APPTRACE_DEST_USB_CDC is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set +CONFIG_BT_ALARM_MAX_NUM=50 +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# TWAI Configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of TWAI Configuration + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Temperature Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=2048 +CONFIG_HTTPD_MAX_URI_LEN=2048 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32S3_REV_MIN_0=y +# CONFIG_ESP32S3_REV_MIN_1 is not set +# CONFIG_ESP32S3_REV_MIN_2 is not set +CONFIG_ESP32S3_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-S3 Revision (Rev v0.99) +# +CONFIG_ESP32S3_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +# end of Hardware Settings + +# +# LCD and Touch Panel +# + +# +# LCD Touch Drivers are maintained in the IDF Component Registry +# + +# +# LCD Peripheral Configuration +# +CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set +# CONFIG_LCD_RGB_RESTART_IN_VSYNC is not set +# end of LCD Peripheral Configuration +# end of LCD and Touch Panel + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +CONFIG_ESP_PHY_ENABLE_USB=y +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP PSRAM +# +CONFIG_SPIRAM=y + +# +# SPI RAM config +# +# CONFIG_SPIRAM_MODE_QUAD is not set +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_TYPE_AUTO=y +# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_CLK_IO=30 +CONFIG_SPIRAM_CS_IO=26 +# CONFIG_SPIRAM_XIP_FROM_PSRAM is not set +# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set +# CONFIG_SPIRAM_RODATA is not set +CONFIG_SPIRAM_SPEED_80M=y +# CONFIG_SPIRAM_SPEED_40M is not set +CONFIG_SPIRAM_SPEED=80 +# CONFIG_SPIRAM_ECC_ENABLE is not set +CONFIG_SPIRAM_BOOT_INIT=y +# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set +# CONFIG_SPIRAM_USE_MEMMAP is not set +# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set +CONFIG_SPIRAM_USE_MALLOC=y +# CONFIG_SPIRAM_MEMTEST is not set +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=4096 +CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 +# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set +# end of SPI RAM config +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +# CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +# CONFIG_ESP32S3_DATA_CACHE_32KB is not set +CONFIG_ESP32S3_DATA_CACHE_64KB=y +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x10000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_32B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=64 +# end of Cache config + +# +# Memory +# +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_CDC is not set +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +# end of Brownout Detector + +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1280 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=16 +# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is not set +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y +CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U32=y +# CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U64 is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_WDT_USE_ROM_IMPL=y +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=0 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +# CONFIG_LWIP_WND_SCALE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_LWIP_PPP_SUPPORT is not set +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set +CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA512_C=y +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# end of Newlib + +CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND=y + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# Thread Operational Dataset +# +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset + +CONFIG_OPENTHREAD_XTAL_ACCURACY=130 +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE=y + +# +# Thread Address Query Config +# +# end of Thread Address Query Config +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +CONFIG_SPI_FLASH_HPM_ON=y +CONFIG_SPI_FLASH_HPM_DC_AUTO=y +# CONFIG_SPI_FLASH_HPM_DC_DISABLE is not set +CONFIG_SPI_FLASH_SUSPEND_QVL_SUPPORTED=y +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_TH_SUPPORTED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# USB-OTG +# +CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE=256 +CONFIG_USB_HOST_HW_BUFFER_BIAS_BALANCED=y +# CONFIG_USB_HOST_HW_BUFFER_BIAS_IN is not set +# CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT is not set + +# +# Root Hub configuration +# +CONFIG_USB_HOST_DEBOUNCE_DELAY_MS=250 +CONFIG_USB_HOST_RESET_HOLD_MS=30 +CONFIG_USB_HOST_RESET_RECOVERY_MS=30 +CONFIG_USB_HOST_SET_ADDR_RECOVERY_MS=10 +# end of Root Hub configuration + +# CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK is not set +CONFIG_USB_OTG_SUPPORTED=y +# end of USB-OTG + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager + +# +# DSP Library +# +CONFIG_DSP_OPTIMIZATIONS_SUPPORTED=y +# CONFIG_DSP_ANSI is not set +CONFIG_DSP_OPTIMIZED=y +CONFIG_DSP_OPTIMIZATION=1 +# CONFIG_DSP_MAX_FFT_SIZE_512 is not set +# CONFIG_DSP_MAX_FFT_SIZE_1024 is not set +# CONFIG_DSP_MAX_FFT_SIZE_2048 is not set +CONFIG_DSP_MAX_FFT_SIZE_4096=y +# CONFIG_DSP_MAX_FFT_SIZE_8192 is not set +# CONFIG_DSP_MAX_FFT_SIZE_16384 is not set +# CONFIG_DSP_MAX_FFT_SIZE_32768 is not set +CONFIG_DSP_MAX_FFT_SIZE=4096 +# end of DSP Library + +# +# IoT Button +# +CONFIG_BUTTON_PERIOD_TIME_MS=5 +CONFIG_BUTTON_DEBOUNCE_TICKS=2 +CONFIG_BUTTON_SHORT_PRESS_TIME_MS=180 +CONFIG_BUTTON_LONG_PRESS_TIME_MS=1500 +CONFIG_BUTTON_LONG_PRESS_TOLERANCE_MS=20 +CONFIG_BUTTON_SERIAL_TIME_MS=20 +# CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE is not set +CONFIG_ADC_BUTTON_MAX_CHANNEL=3 +CONFIG_ADC_BUTTON_MAX_BUTTON_PER_CHANNEL=8 +CONFIG_ADC_BUTTON_SAMPLE_TIMES=1 +# end of IoT Button + +# +# CMake Utilities +# +# CONFIG_CU_RELINKER_ENABLE is not set +# CONFIG_CU_DIAGNOSTICS_COLOR_NEVER is not set +CONFIG_CU_DIAGNOSTICS_COLOR_ALWAYS=y +# CONFIG_CU_DIAGNOSTICS_COLOR_AUTO is not set +# CONFIG_CU_GCC_LTO_ENABLE is not set +# CONFIG_CU_GCC_STRING_1BYTE_ALIGN is not set +# end of CMake Utilities + +# +# Audio Codec Device Configuration +# +CONFIG_CODEC_ES8311_SUPPORT=y +CONFIG_CODEC_ES7210_SUPPORT=y +CONFIG_CODEC_ES7243_SUPPORT=y +CONFIG_CODEC_ES7243E_SUPPORT=y +CONFIG_CODEC_ES8156_SUPPORT=y +CONFIG_CODEC_AW88298_SUPPORT=y +CONFIG_CODEC_ES8374_SUPPORT=y +CONFIG_CODEC_ES8388_SUPPORT=y +CONFIG_CODEC_TAS5805M_SUPPORT=y +# CONFIG_CODEC_ZL38063_SUPPORT is not set +# end of Audio Codec Device Configuration + +# +# LVGL configuration +# +CONFIG_LV_CONF_SKIP=y +# CONFIG_LV_CONF_MINIMAL is not set + +# +# Color settings +# +# CONFIG_LV_COLOR_DEPTH_32 is not set +CONFIG_LV_COLOR_DEPTH_16=y +# CONFIG_LV_COLOR_DEPTH_8 is not set +# CONFIG_LV_COLOR_DEPTH_1 is not set +CONFIG_LV_COLOR_DEPTH=16 +# CONFIG_LV_COLOR_16_SWAP is not set +# CONFIG_LV_COLOR_SCREEN_TRANSP is not set +CONFIG_LV_COLOR_MIX_ROUND_OFS=128 +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +# end of Color settings + +# +# Memory settings +# +# CONFIG_LV_MEM_CUSTOM is not set +CONFIG_LV_MEM_SIZE_KILOBYTES=32 +CONFIG_LV_MEM_ADDR=0x0 +CONFIG_LV_MEM_BUF_MAX_NUM=16 +# CONFIG_LV_MEMCPY_MEMSET_STD is not set +# end of Memory settings + +# +# HAL Settings +# +CONFIG_LV_DISP_DEF_REFR_PERIOD=30 +CONFIG_LV_INDEV_DEF_READ_PERIOD=30 +# CONFIG_LV_TICK_CUSTOM is not set +CONFIG_LV_DPI_DEF=130 +# end of HAL Settings + +# +# Feature configuration +# + +# +# Drawing +# +CONFIG_LV_DRAW_COMPLEX=y +CONFIG_LV_SHADOW_CACHE_SIZE=0 +CONFIG_LV_CIRCLE_CACHE_SIZE=4 +CONFIG_LV_LAYER_SIMPLE_BUF_SIZE=24576 +CONFIG_LV_IMG_CACHE_DEF_SIZE=0 +CONFIG_LV_GRADIENT_MAX_STOPS=2 +CONFIG_LV_GRAD_CACHE_DEF_SIZE=0 +# CONFIG_LV_DITHER_GRADIENT is not set +CONFIG_LV_DISP_ROT_MAX_BUF=10240 +# end of Drawing + +# +# GPU +# +# CONFIG_LV_USE_GPU_ARM2D is not set +# CONFIG_LV_USE_GPU_STM32_DMA2D is not set +# CONFIG_LV_USE_GPU_RA6M3_G2D is not set +# CONFIG_LV_USE_GPU_SWM341_DMA2D is not set +# CONFIG_LV_USE_GPU_NXP_PXP is not set +# CONFIG_LV_USE_GPU_NXP_VG_LITE is not set +# CONFIG_LV_USE_GPU_SDL is not set +# end of GPU + +# +# Logging +# +# CONFIG_LV_USE_LOG is not set +# end of Logging + +# +# Asserts +# +CONFIG_LV_USE_ASSERT_NULL=y +CONFIG_LV_USE_ASSERT_MALLOC=y +# CONFIG_LV_USE_ASSERT_STYLE is not set +# CONFIG_LV_USE_ASSERT_MEM_INTEGRITY is not set +# CONFIG_LV_USE_ASSERT_OBJ is not set +CONFIG_LV_ASSERT_HANDLER_INCLUDE="assert.h" +# end of Asserts + +# +# Others +# +# CONFIG_LV_USE_PERF_MONITOR is not set +# CONFIG_LV_USE_MEM_MONITOR is not set +# CONFIG_LV_USE_REFR_DEBUG is not set +# CONFIG_LV_SPRINTF_CUSTOM is not set +# CONFIG_LV_SPRINTF_USE_FLOAT is not set +CONFIG_LV_USE_USER_DATA=y +# CONFIG_LV_ENABLE_GC is not set +# end of Others + +# +# Compiler settings +# +# CONFIG_LV_BIG_ENDIAN_SYSTEM is not set +CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE=1 +# CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM is not set +# CONFIG_LV_USE_LARGE_COORD is not set +# end of Compiler settings +# end of Feature configuration + +# +# Font usage +# + +# +# Enable built-in fonts +# +# CONFIG_LV_FONT_MONTSERRAT_8 is not set +# CONFIG_LV_FONT_MONTSERRAT_10 is not set +# CONFIG_LV_FONT_MONTSERRAT_12 is not set +CONFIG_LV_FONT_MONTSERRAT_14=y +# CONFIG_LV_FONT_MONTSERRAT_16 is not set +# CONFIG_LV_FONT_MONTSERRAT_18 is not set +# CONFIG_LV_FONT_MONTSERRAT_20 is not set +# CONFIG_LV_FONT_MONTSERRAT_22 is not set +# CONFIG_LV_FONT_MONTSERRAT_24 is not set +# CONFIG_LV_FONT_MONTSERRAT_26 is not set +# CONFIG_LV_FONT_MONTSERRAT_28 is not set +# CONFIG_LV_FONT_MONTSERRAT_30 is not set +# CONFIG_LV_FONT_MONTSERRAT_32 is not set +# CONFIG_LV_FONT_MONTSERRAT_34 is not set +# CONFIG_LV_FONT_MONTSERRAT_36 is not set +# CONFIG_LV_FONT_MONTSERRAT_38 is not set +# CONFIG_LV_FONT_MONTSERRAT_40 is not set +# CONFIG_LV_FONT_MONTSERRAT_42 is not set +# CONFIG_LV_FONT_MONTSERRAT_44 is not set +# CONFIG_LV_FONT_MONTSERRAT_46 is not set +# CONFIG_LV_FONT_MONTSERRAT_48 is not set +# CONFIG_LV_FONT_MONTSERRAT_12_SUBPX is not set +# CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED is not set +# CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW is not set +# CONFIG_LV_FONT_SIMSUN_16_CJK is not set +# CONFIG_LV_FONT_UNSCII_8 is not set +# CONFIG_LV_FONT_UNSCII_16 is not set +# CONFIG_LV_FONT_CUSTOM is not set +# end of Enable built-in fonts + +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12 is not set +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14=y +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48 is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX is not set +# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED is not set +# CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW is not set +# CONFIG_LV_FONT_DEFAULT_SIMSUN_16_CJK is not set +# CONFIG_LV_FONT_DEFAULT_UNSCII_8 is not set +# CONFIG_LV_FONT_DEFAULT_UNSCII_16 is not set +# CONFIG_LV_FONT_FMT_TXT_LARGE is not set +# CONFIG_LV_USE_FONT_COMPRESSED is not set +# CONFIG_LV_USE_FONT_SUBPX is not set +CONFIG_LV_USE_FONT_PLACEHOLDER=y +# end of Font usage + +# +# Text Settings +# +CONFIG_LV_TXT_ENC_UTF8=y +# CONFIG_LV_TXT_ENC_ASCII is not set +CONFIG_LV_TXT_BREAK_CHARS=" ,.;:-_" +CONFIG_LV_TXT_LINE_BREAK_LONG_LEN=0 +CONFIG_LV_TXT_COLOR_CMD="#" +# CONFIG_LV_USE_BIDI is not set +# CONFIG_LV_USE_ARABIC_PERSIAN_CHARS is not set +# end of Text Settings + +# +# Widget usage +# +CONFIG_LV_USE_ARC=y +CONFIG_LV_USE_BAR=y +CONFIG_LV_USE_BTN=y +CONFIG_LV_USE_BTNMATRIX=y +CONFIG_LV_USE_CANVAS=y +CONFIG_LV_USE_CHECKBOX=y +CONFIG_LV_USE_DROPDOWN=y +CONFIG_LV_USE_IMG=y +CONFIG_LV_USE_LABEL=y +CONFIG_LV_LABEL_TEXT_SELECTION=y +CONFIG_LV_LABEL_LONG_TXT_HINT=y +CONFIG_LV_USE_LINE=y +CONFIG_LV_USE_ROLLER=y +CONFIG_LV_ROLLER_INF_PAGES=7 +CONFIG_LV_USE_SLIDER=y +CONFIG_LV_USE_SWITCH=y +CONFIG_LV_USE_TEXTAREA=y +CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME=1500 +CONFIG_LV_USE_TABLE=y +# end of Widget usage + +# +# Extra Widgets +# +CONFIG_LV_USE_ANIMIMG=y +CONFIG_LV_USE_CALENDAR=y +# CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY is not set +CONFIG_LV_USE_CALENDAR_HEADER_ARROW=y +CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN=y +CONFIG_LV_USE_CHART=y +CONFIG_LV_USE_COLORWHEEL=y +CONFIG_LV_USE_IMGBTN=y +CONFIG_LV_USE_KEYBOARD=y +CONFIG_LV_USE_LED=y +CONFIG_LV_USE_LIST=y +CONFIG_LV_USE_MENU=y +CONFIG_LV_USE_METER=y +CONFIG_LV_USE_MSGBOX=y +CONFIG_LV_USE_SPAN=y +CONFIG_LV_SPAN_SNIPPET_STACK_SIZE=64 +CONFIG_LV_USE_SPINBOX=y +CONFIG_LV_USE_SPINNER=y +CONFIG_LV_USE_TABVIEW=y +CONFIG_LV_USE_TILEVIEW=y +CONFIG_LV_USE_WIN=y +# end of Extra Widgets + +# +# Themes +# +CONFIG_LV_USE_THEME_DEFAULT=y +# CONFIG_LV_THEME_DEFAULT_DARK is not set +CONFIG_LV_THEME_DEFAULT_GROW=y +CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME=80 +CONFIG_LV_USE_THEME_BASIC=y +# CONFIG_LV_USE_THEME_MONO is not set +# end of Themes + +# +# Layouts +# +CONFIG_LV_USE_FLEX=y +CONFIG_LV_USE_GRID=y +# end of Layouts + +# +# 3rd Party Libraries +# +# CONFIG_LV_USE_FS_STDIO is not set +# CONFIG_LV_USE_FS_POSIX is not set +# CONFIG_LV_USE_FS_WIN32 is not set +# CONFIG_LV_USE_FS_FATFS is not set +# CONFIG_LV_USE_FS_LITTLEFS is not set +# CONFIG_LV_USE_PNG is not set +# CONFIG_LV_USE_BMP is not set +# CONFIG_LV_USE_SJPG is not set +# CONFIG_LV_USE_GIF is not set +# CONFIG_LV_USE_QRCODE is not set +# CONFIG_LV_USE_FREETYPE is not set +# CONFIG_LV_USE_TINY_TTF is not set +# CONFIG_LV_USE_RLOTTIE is not set +# CONFIG_LV_USE_FFMPEG is not set +# end of 3rd Party Libraries + +# +# Others +# +CONFIG_LV_USE_SNAPSHOT=y +# CONFIG_LV_USE_MONKEY is not set +# CONFIG_LV_USE_GRIDNAV is not set +# CONFIG_LV_USE_FRAGMENT is not set +# CONFIG_LV_USE_IMGFONT is not set +# CONFIG_LV_USE_MSG is not set +# CONFIG_LV_USE_IME_PINYIN is not set +# end of Others + +# +# Examples +# +CONFIG_LV_BUILD_EXAMPLES=y +# end of Examples + +# +# Demos +# +# CONFIG_LV_USE_DEMO_WIDGETS is not set +# CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER is not set +# CONFIG_LV_USE_DEMO_BENCHMARK is not set +# CONFIG_LV_USE_DEMO_STRESS is not set +# CONFIG_LV_USE_DEMO_MUSIC is not set +# end of Demos +# end of LVGL configuration +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +CONFIG_LOG_BOOTLOADER_LEVEL_NONE=y +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=0 +CONFIG_APP_ROLLBACK_ENABLE=y +# CONFIG_APP_ANTI_ROLLBACK is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +CONFIG_FLASHMODE_QIO=y +# CONFIG_FLASHMODE_QOUT is not set +# CONFIG_FLASHMODE_DIO is not set +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_MCPWM_ISR_IN_IRAM is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +# CONFIG_OTA_ALLOW_HTTP is not set +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +CONFIG_ESP32S3_SPIRAM_SUPPORT=y +CONFIG_DEFAULT_PSRAM_CLK_IO=30 +CONFIG_DEFAULT_PSRAM_CS_IO=26 +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_IPC_TASK_STACK_SIZE=1280 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=16 +CONFIG_ESP32_WIFI_RX_BA_WIN=16 +# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5760 +CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/versions.py b/versions.py new file mode 100644 index 00000000..95782981 --- /dev/null +++ b/versions.py @@ -0,0 +1,158 @@ +#! /usr/bin/env python3 +from dotenv import load_dotenv +load_dotenv() + +import os +import struct +import zipfile +import oss2 +import json + +def get_chip_id_string(chip_id): + return { + 0x0000: "esp32", + 0x0002: "esp32s2", + 0x0005: "esp32c3", + 0x0009: "esp32s3", + 0x000C: "esp32c2", + 0x000D: "esp32c6", + 0x0010: "esp32h2", + 0x0011: "esp32c5", + 0x0012: "esp32p4", + 0x0017: "esp32c5", + }[chip_id] + +def get_flash_size(flash_size): + MB = 1024 * 1024 + return { + 0x00: 1 * MB, + 0x01: 2 * MB, + 0x02: 4 * MB, + 0x03: 8 * MB, + 0x04: 16 * MB, + 0x05: 32 * MB, + 0x06: 64 * MB, + 0x07: 128 * MB, + }[flash_size] + +def get_app_desc(data): + magic = struct.unpack("> 4) + chip_id = get_chip_id_string(data[0xC]) + # get segments + segment_count = data[0x1] + segments = [] + offset = 0x18 + for i in range(segment_count): + segment_size = struct.unpack("" -- `Device-Id`: 设备 MAC 地址 -- `Protocol-Version`: 协议版本号,当前为 2 - -WebSocket URL: `wss://api.tenclass.net/xiaozhi/v1` - -## 2. 二进制数据 - -客户端发送的二进制数据使用固定头格式的协议,如下: - -```cpp -struct BinaryProtocol { - uint16_t version; // 二进制协议版本,当前为 2 - uint16_t type; // 消息类型(0:音频流数据,1:JSON) - uint32_t reserved; // 保留字段 - uint32_t timestamp; // 时间戳(保留用作回声消除,也可以用于UDP不可靠传输中的排序) - uint32_t payload_size; // 负载大小 - uint8_t payload[]; // 可以是音频数据(Opus 编码或协商的音频格式),也可以封装 JSON -} __attribute__((packed)); -``` - -注意:所有多字节整数字段使用网络字节序(大端序)。 - -目前二进制数据跟 JSON 都是走同一个 WebSocket 连接,未来实时对话模式下,二进制音频数据可能走 UDP,可以扩展 hello 消息进行协商。 - -## 3. 音频数据传输 - -- 客户端到服务器: 使用二进制协议发送 Opus 编码的音频数据 -- 服务器到客户端: 使用二进制协议发送 Opus 编码的音频数据,格式与客户端发送的相同 - -出现 payload_size 为 0 的音频数据包可以用做句子边界标记,可以忽略,但不要报错。 - -## 4. 握手消息 - -连接建立后,客户端发送一个 JSON 格式的 "hello" 消息,初始化服务器端的音频解码器。 -不需要等待服务器响应,随后即可发送音频数据。 - -```json -{ - "type": "hello", - "response_mode": "auto", - "audio_params": { - "format": "opus", - "sample_rate": 16000, - "channels": 1 - } -} -``` - -应答模式 `response_mode` 可以为 `auto` 或 `manual`。 - -`auto`:自动应答模式,服务器实时计算音频 VAD 并自动决定何时开始应答。 - -`manual`:手动应答模式,客户端状态从 `listening` 变为 `idle` 时,服务器可以应答。 - -## 5. 状态更新 - -客户端在状态变化时发送 JSON 消息: - -```json -{ - "type": "state", - "state": "<新状态>" -} -``` - -可能发送的状态值包括: `idle`, `wake_word_detected`, `listening`, `speaking`。 - -示例: - -1、按住说话(`response_mode` 为 `manual`) - -- 当按住说话按钮时,如果未连接服务器,则连接服务器,并编码、缓存当前音频数据,连接成功后,客户端设置状态为 `listening`,并在 hello 消息之后发送缓存的音频数据。 -- 当按住说话按钮时,如果已连接服务器,则客户端设置状态为 `listening`,并发送音频数据。 -- 当释放说话按钮时,状态变为 `idle`,此时服务器开始识别。 -- 服务器开始应答时,推送 `stt` 和 `tts` 消息。 -- 客户端开始播放音频时,状态设为 `speaking`。 -- 客户端结束播放音频时,状态设为 `idle`。 -- 在 `speaking` 状态下,按住说话按钮,会立即停止当前音频播放,状态变为 `listening`。 - -2、语音唤醒,轮流对话(`response_mode` 为 `auto`) - -- 连接服务器,发送 hello 消息,发送唤醒词音频数据,然后发送状态 `wake_word_detected`,服务器开始应答。 -- 客户端开始播放音频时,状态设为 `speaking`,此时客户端不会发送音频数据。 -- 客户端结束播放音频时,状态设为 `listening`,此时客户端发送音频数据。 -- 服务器计算音频 VAD 自动选择时机开始应答时,推送 `stt` 和 `tts` 消息。 -- 客户端收到 `tts`.`start` 时,开始播放音频,状态设为 `speaking`。 -- 客户端收到 `tts`.`stop` 时,停止播放音频,状态设为 `listening`。 - -3、语音唤醒,实时对话(`response_mode` 为 `real_time`) - -- 连接服务器,发送 hello 消息,发送唤醒词音频数据,然后发送状态 `wake_word_detected`,服务器开始应答。 -- 客户端开始播放音频时,状态设为 `speaking`。 -- 客户端结束播放音频时,状态设为 `listening`。 -- 在 `speaking` 和 `listening` 状态下,客户端都会发送音频数据。 -- 服务器计算音频 VAD 自动选择时机开始应答时,推送 `stt` 和 `tts` 消息。 -- 客户端收到 `stt` 时,状态设为 `listening`。如果当前有音频正在播放,则在当前 sentence 结束后停止播放音频。 -- 客户端收到 `tts`.`start` 时,开始播放音频,状态设为 `speaking`。 -- 客户端收到 `tts`.`stop` 时,停止播放音频,状态设为 `listening`。 - -## 6. 服务器到客户端的消息 - -### 6.1 语音识别结果 (STT) - -```json -{ - "type": "stt", - "text": "<识别出的文本>" -} -``` - -### 6.2 文本转语音 (TTS) - -TTS开始: -```json -{ - "type": "tts", - "state": "start", - "sample_rate": 24000 -} -``` - -句子开始: -```json -{ - "type": "tts", - "state": "sentence_start", - "text": "你在干什么呀?" -} -``` - -句子结束: -```json -{ - "type": "tts", - "state": "sentence_end" -} -``` - -TTS结束: -```json -{ - "type": "tts", - "state": "stop" -} -``` - -## 7. 连接管理 - -- 客户端检测到 WebSocket 断开连接时,应该停止音频播放并重置为空闲状态 -- 在断开连接后,客户端按需重新发起连接(比如按钮按下或语音唤醒) - -这个文档概括了 WebSocket 通信协议的主要方面。