diff --git a/.codewhale/instructions.md b/.codewhale/instructions.md new file mode 100644 index 0000000..7fb0e54 --- /dev/null +++ b/.codewhale/instructions.md @@ -0,0 +1,29 @@ +# Project Structure (Auto-generated) + +> This file was automatically generated by CodeWhale. +> You can edit or delete it at any time. + +**Summary:** Unknown project type + +**Tree:** +``` +FILE: .gitignore +DIR: .pio + DIR: build +DIR: .vscode + FILE: c_cpp_properties.json + FILE: extensions.json + FILE: launch.json +FILE: CMakeLists.txt +DIR: include + FILE: README +DIR: lib + FILE: README +FILE: platformio.ini +FILE: sdkconfig.seeed_xiao_esp32s3 +DIR: src + FILE: CMakeLists.txt + FILE: main.c +DIR: test + FILE: README +``` \ No newline at end of file diff --git a/.gitignore b/.gitignore index acf5dd9..db8752b 100644 --- a/.gitignore +++ b/.gitignore @@ -86,3 +86,10 @@ dkms.conf *.out *.app +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch + + diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f425116 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16.0) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ESP32_Dass2) diff --git a/docs/ota_callbacks.md b/docs/ota_callbacks.md new file mode 100644 index 0000000..ebee0a4 --- /dev/null +++ b/docs/ota_callbacks.md @@ -0,0 +1,357 @@ +# OTA Manager 回调文档 + +> 版本: 1.0 +> 目标芯片: ESP32-S3 +> 框架: ESP-IDF 5.1.x +> 模块: `ota_manager.h` / `ota_manager.c` + +--- + +## 1. 架构概览 + +``` +┌──────────────────────────────────────────────────────────┐ +│ 传输层(USB / 串口 / 蓝牙 / SD / HTTP) │ +│ ↓ │ +│ ota_begin(size) → ota_write(chunk)×N → ota_end() │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ OTA Manager(本模块) │ │ +│ │ · 状态机管理(IDLE → PROGRESS → VERIFY → DONE)│ │ +│ │ · esp_ota_ops 封装(分区选择 / 擦除 / 写入) │ │ +│ │ · 回调触发(进度 / 状态 / 完成 / 错误) │ │ +│ │ · LED 反馈 │ │ +│ └──────────────┬──────────────────────────────────┘ │ +│ │ 回调(可注册 4 种) │ +│ ┌───────────┼───────────┬──────────────┐ │ +│ ▼ ▼ ▼ ▼ │ +│ progress state complete error │ +│ (进度条) (状态灯) (重启逻辑) (告警/日志) │ +└──────────────────────────────────────────────────────────┘ +``` + +**设计原则**:OTA Manager 只负责底层固件写入与分区切换,**不关心**固件数据从哪里来。传输层代码只需顺序调用三个 API,并通过回调感知进度。 + +--- + +## 2. 状态机 + +``` + ota_begin() + IDLE ──────────────────────────→ IN_PROGRESS + ↑ │ + │ │ ota_write() + │ ▼ (循环) + │ IN_PROGRESS + │ │ + │ ┌─────────────┼──────────────┐ + │ │ ota_end() │ (写入失败) │ + │ ▼ ▼ │ + │ VERIFYING ERROR │ + │ │ │ │ + │ ┌───────────┤ │ ota_abort() │ + │ │ 成功 │ 失败 ▼ │ + │ ▼ ▼ IDLE │ + │ COMPLETE ERROR │ + │ │ │ + │ │ esp_restart() │ + │ ▼ │ + │ (重启) │ + └────────────────────────────────────────────────────┘ +``` + +**状态枚举** (`ota_state_t`): + +| 状态 | 含义 | 允许的操作 | +|------|------|-----------| +| `OTA_STATE_IDLE` | 空闲,就绪 | `ota_begin()` | +| `OTA_STATE_IN_PROGRESS` | 正在接收固件 | `ota_write()`, `ota_end()`, `ota_abort()` | +| `OTA_STATE_VERIFYING` | 正在校验固件 | 无(内部过程) | +| `OTA_STATE_COMPLETE` | 更新成功 | 重启设备 | +| `OTA_STATE_ERROR` | 发生错误 | `ota_abort()` | + +--- + +## 3. 回调详解 + +### 3.1 进度回调 — `ota_progress_cb_t` + +```c +typedef void (*ota_progress_cb_t)(int percent, size_t bytes_written, size_t total_size); +``` + +**触发时机**:每次 `ota_write()` 成功返回后。 + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| `percent` | `int` | 完成百分比 (0–100)。若 `ota_begin()` 传入 `total_size=0`,则始终为 0 | +| `bytes_written` | `size_t` | 累计已写入字节数 | +| `total_size` | `size_t` | 声明的固件总字节数(即 `ota_begin` 的参数,0=未知) | + +**用途**:驱动进度条 UI、串口日志输出。 + +**示例**: +```c +static void on_progress(int percent, size_t written, size_t total) +{ + printf("\rOTA: %d%% (%zu/%zu bytes)", percent, written, total); + // 或通过 LVGL 更新进度条: + // lv_bar_set_value(bar, percent, LV_ANIM_OFF); +} +``` + +--- + +### 3.2 状态变化回调 — `ota_state_cb_t` + +```c +typedef void (*ota_state_cb_t)(ota_state_t old_state, ota_state_t new_state); +``` + +**触发时机**:状态机每次发生转换时。 + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| `old_state` | `ota_state_t` | 变化前的状态 | +| `new_state` | `ota_state_t` | 变化后的状态 | + +**典型用法**: + +| 场景 | 检查条件 | 操作 | +|------|---------|------| +| 更新成功 | `new_state == OTA_STATE_COMPLETE` | 自动重启 `esp_restart()` | +| 更新失败 | `new_state == OTA_STATE_ERROR` | 显示错误提示、记录日志 | +| 开始更新 | `new_state == OTA_STATE_IN_PROGRESS` | 禁用用户交互、显示进度 UI | +| 恢复空闲 | `new_state == OTA_STATE_IDLE` | 恢复用户交互 | + +**示例**: +```c +static void on_state_change(ota_state_t old, ota_state_t new_state) +{ + ESP_LOGI("app", "OTA state: %d → %d", old, new_state); + + if (new_state == OTA_STATE_COMPLETE) { + ESP_LOGI("app", "Update OK, restarting in 3s..."); + vTaskDelay(pdMS_TO_TICKS(3000)); + esp_restart(); + } else if (new_state == OTA_STATE_ERROR) { + ESP_LOGE("app", "OTA failed, back to idle"); + } +} +``` + +--- + +### 3.3 完成回调 — `ota_complete_cb_t` + +```c +typedef void (*ota_complete_cb_t)(bool success, ota_error_t error_code); +``` + +**触发时机**: +- `ota_end()` 处理完毕后 +- `ota_abort()` 处理完毕后 + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| `success` | `bool` | `true` = 更新成功,`false` = 失败或被中止 | +| `error_code` | `ota_error_t` | 失败时的错误码(`success=true` 时始终为 `OTA_ERR_NONE`) | + +**与状态变化回调的区别**: +- `ota_state_cb_t` 关注「状态发生了什么变化」 +- `ota_complete_cb_t` 关注「这次 OTA 最终成功了还是失败了」+ 失败原因 + +两者可同时使用,但建议至少注册一个来处理重启逻辑。 + +**示例**: +```c +static void on_complete(bool success, ota_error_t err) +{ + if (success) { + ESP_LOGI("app", "OTA complete, rebooting..."); + esp_restart(); + } else { + ESP_LOGW("app", "OTA failed, err=%d", err); + // 返回主界面 + } +} +``` + +--- + +### 3.4 错误回调 — `ota_error_cb_t` + +```c +typedef void (*ota_error_cb_t)(ota_error_t error_code, const char *message); +``` + +**触发时机**:每当发生可恢复或不致命的错误时(写入失败、校验失败等)。 + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| `error_code` | `ota_error_t` | 错误码枚举值 | +| `message` | `const char *` | 人类可读的错误描述(静态字符串,无需释放) | + +**错误码一览**: + +| 错误码 | 值 | 含义 | +|-------|---|------| +| `OTA_ERR_NONE` | 0 | 无错误 | +| `OTA_ERR_NOT_INITIALIZED` | 1 | 未调用 `ota_begin()` | +| `OTA_ERR_ALREADY_IN_PROGRESS` | 2 | 已有进行中的 OTA | +| `OTA_ERR_BEGIN_FAILED` | 3 | `ota_begin()` 失败(分区擦除失败等) | +| `OTA_ERR_WRITE_FAILED` | 4 | 写入 flash 失败 | +| `OTA_ERR_END_FAILED` | 5 | `ota_end()` 失败 | +| `OTA_ERR_ABORT_FAILED` | 6 | `ota_abort()` 失败 | +| `OTA_ERR_SIZE_MISMATCH` | 7 | 实写大小与声明不符 | +| `OTA_ERR_NO_OTA_PARTITION` | 8 | 分区表无可用 OTA 分区 | +| `OTA_ERR_STATE_ERROR` | 9 | 当前状态不允许该操作 | +| `OTA_ERR_VERIFY_FAILED` | 10 | 固件校验失败 | + +--- + +## 4. 完整注册示例 + +```c +#include "ota_manager.h" +#include "esp_system.h" + +/* ---- 回调实现 ---- */ + +static void on_progress(int pct, size_t written, size_t total) +{ + printf("\rOTA %d%% (%zu/%zu)", pct, written, total); +} + +static void on_state_change(ota_state_t old, ota_state_t new_state) +{ + if (new_state == OTA_STATE_COMPLETE) { + printf("\nUpdate OK. Rebooting...\n"); + esp_restart(); + } +} + +static void on_complete(bool ok, ota_error_t err) +{ + if (!ok) printf("\nOTA failed: %d\n", err); +} + +static void on_error(ota_error_t code, const char *msg) +{ + ESP_LOGE("app", "OTA error %d: %s", code, msg); +} + +/* ---- 注册(在 app_main 初始化阶段调用一次) ---- */ + +void ota_callbacks_init(void) +{ + ota_set_progress_callback(on_progress); + ota_set_state_callback(on_state_change); + ota_set_complete_callback(on_complete); + ota_set_error_callback(on_error); +} +``` + +--- + +## 5. 与 LVGL UI 集成要点 + +### 5.1 FreeRTOS 线程安全 + +LVGL 对象操作**必须在 UI Task 中进行**。OTA 的调用方通常运行在另一个 Task 中,回调在调用线程中触发。因此: + +```c +// ❌ 错误:在进度回调中直接操作 LVGL +static void on_progress(int pct, ...) { + lv_bar_set_value(ui_bar, pct, LV_ANIM_OFF); // 非 UI 线程! +} + +// ✅ 正确:通过全局变量 + LVGL Timer 轮询 +static volatile int g_ota_pct = 0; + +static void on_progress(int pct, ...) { + g_ota_pct = pct; +} + +// 在 LVGL Timer(10Hz)中: +static void lv_timer_update_ota(lv_timer_t *timer) { + lv_bar_set_value(ui_bar, g_ota_pct, LV_ANIM_ON); +} +``` + +### 5.2 建议的 UI 状态映射 + +| OTA 状态 | UI 行为 | +|---------|--------| +| IDLE | 显示「固件升级」入口 | +| IN_PROGRESS | 显示进度条 + 「正在更新…」 | +| VERIFYING | 进度条 100%,文字改为「正在校验…」 | +| COMPLETE | 「更新成功,3 秒后重启」+ 倒计时 | +| ERROR | 红色警告 + 错误描述 + «重试»按钮 | + +--- + +## 6. LED 反馈模式 + +OTA Manager 内置了 LED 反馈(通过 `hw_led_set()`),无需额外配置。 + +| 阶段 | LED 行为 | 含义 | +|------|---------|------| +| `begin` 调用后 | 常亮 | OTA 进行中 | +| 每次 `write` | 短暂熄灭→亮起 | 数据写入闪烁(约 2ms) | +| `end` 成功 | 常亮 | 更新完成,等待重启 | +| `end` 失败 / `abort` | 熄灭 | 回到空闲 | + +--- + +## 7. 错误处理建议 + +``` +ota_begin() 返回非 ESP_OK? + ├─ OTA_ERR_ALREADY_IN_PROGRESS → 先调 ota_abort(),再重试 begin + ├─ OTA_ERR_NO_OTA_PARTITION → 检查分区表是否正确烧录 + └─ OTA_ERR_BEGIN_FAILED → 检查 flash 是否正常 + +ota_write() 返回非 ESP_OK? + └─ 调 ota_abort(),提示用户重试 + +ota_end() 返回非 ESP_OK? + └─ 调 ota_abort(),固件未切换,设备仍运行旧版本 +``` + +--- + +## 8. 平台兼容性 + +| 特性 | 要求 | +|------|------| +| ESP-IDF 版本 | ≥ 5.0(本模块使用 v5.1.x API) | +| 分区表 | 必须含 `factory` + 至少一个 `ota_0` 类型分区 | +| Flash 大小 | ≥ 2MB(推荐 8MB,双 OTA 槽位) | +| `hw_led_set()` | 需由项目提供(当前在 `hw_init.h` 中定义) | + +--- + +## 9. API 快速参考 + +| 函数 | 返回值 | 副作用 | +|------|-------|--------| +| `ota_begin(size)` | `esp_err_t` | 擦除 OTA 分区,LED 亮 | +| `ota_write(data, len)` | `esp_err_t` | 写入 flash,触发进度回调,LED 闪烁 | +| `ota_end()` | `esp_err_t` | 校验固件,切换启动分区,触发完成回调 | +| `ota_abort()` | `esp_err_t` | 放弃更新,LED 灭,回到 IDLE | +| `ota_get_state()` | `ota_state_t` | 无 | +| `ota_get_bytes_written()` | `size_t` | 无 | +| `ota_get_firmware_size()` | `size_t` | 无 | +| `ota_get_running_partition()` | `const esp_partition_t *` | 无 | +| `ota_get_update_partition()` | `const esp_partition_t *` | 无 | +| `ota_set_progress_callback(cb)` | `void` | 覆盖之前的回调 | +| `ota_set_complete_callback(cb)` | `void` | 覆盖之前的回调 | +| `ota_set_state_callback(cb)` | `void` | 覆盖之前的回调 | +| `ota_set_error_callback(cb)` | `void` | 覆盖之前的回调 | +| `ota_clear_callbacks()` | `void` | 注销所有回调 | diff --git a/error.txt b/error.txt new file mode 100644 index 0000000..4f4fea3 --- /dev/null +++ b/error.txt @@ -0,0 +1,1018 @@ +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\led\lv_led.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\list\lv_list.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\menu\lv_menu.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\meter\lv_meter.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\msgbox\lv_msgbox.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/led/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/led/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/led/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/led/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/led/lv_led.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/led/lv_led.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\span\lv_span.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/list/../../../core/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/list/../../../core/lv_obj.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/list/lv_list.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/list/lv_list.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/meter/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/meter/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/meter/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/meter/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/meter/lv_meter.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/meter/lv_meter.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/menu/../../../core/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/menu/../../../core/lv_obj.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/menu/lv_menu.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/menu/lv_menu.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/msgbox/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/msgbox/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/msgbox/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/msgbox/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/msgbox/lv_msgbox.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/msgbox/lv_msgbox.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\spinbox\lv_spinbox.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\spinner\lv_spinner.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/span/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/span/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/span/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/span/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/span/lv_span.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/span/lv_span.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\tabview\lv_tabview.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinbox/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinbox/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinbox/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinbox/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinbox/lv_spinbox.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinbox/lv_spinbox.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinner/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinner/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinner/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinner/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinner/lv_spinner.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/spinner/lv_spinner.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\tileview\lv_tileview.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tabview/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tabview/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tabview/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tabview/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tabview/lv_tabview.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tabview/lv_tabview.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\extra\widgets\win\lv_win.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tileview/../../../core/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tileview/../../../core/lv_obj.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tileview/lv_tileview.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/tileview/lv_tileview.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/win/../../../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/win/../../../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/win/../../../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/win/../../../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/win/lv_win.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/extra/widgets/win/lv_win.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_dejavu_16_persian_hebrew.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_fmt_txt.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_loader.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_10.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_12.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_12_subpx.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../lvgl.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_loader.c:13: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_14.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_10.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_fmt_txt.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_16.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_18.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_20.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_22.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_12_subpx.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_14.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_12.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_16.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_20.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_18.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_22.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_24.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_26.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_28.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_28_compressed.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_24.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_26.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_30.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_28.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_32.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_34.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_36.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_28_compressed.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_38.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_30.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_40.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_42.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_44.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_32.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_34.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_46.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_36.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_38.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_40.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_42.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_48.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_44.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_montserrat_8.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_46.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_simsun_16_cjk.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_unscii_16.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_48.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_montserrat_8.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_simsun_16_cjk.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\font\lv_font_unscii_8.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_unscii_16.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\hal\lv_hal_disp.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\hal\lv_hal_indev.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\hal\lv_hal_tick.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_anim.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_anim_timeline.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_area.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_async.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/../../lvgl.h:25, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/font/lv_font_unscii_8.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/../misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/../misc/lv_assert.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/lv_hal_indev.c:11: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_bidi.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/../draw/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/../draw/lv_draw.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/lv_hal_disp.h:21, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/lv_hal.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/lv_hal_disp.c:13: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_color.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/lv_hal_tick.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/hal/lv_hal_tick.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_anim.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_anim.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_fs.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_anim.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_anim_timeline.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_anim_timeline.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_area.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_mem.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_async.c:11: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_bidi.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_bidi.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_gc.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_color.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_color.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_ll.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_fs.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_fs.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_log.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_gc.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_gc.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_lru.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_math.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_mem.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_ll.c:11: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_mem.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_printf.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_log.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_log.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_style.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_style_gen.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_templ.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_lru.h:17, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_lru.c:11: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_timer.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_math.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_math.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_tlsf.o + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_mem.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_mem.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../font/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../font/lv_font.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_style.h:18, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_style_gen.c:1: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../font/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../font/lv_font.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_style.h:18, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_style.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_printf.h:63, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_printf.c:35: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_txt.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_timer.h:15, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_timer.c:8: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_txt_ap.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\misc\lv_utils.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_tlsf.c:1: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_arc.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_bar.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_btn.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_txt.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_txt.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_bidi.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/misc/lv_txt_ap.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_btnmatrix.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_arc.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_arc.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_canvas.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_bar.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_bar.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_btn.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_btn.c:10: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_checkbox.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_dropdown.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_img.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_label.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_btnmatrix.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_btnmatrix.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_line.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_canvas.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_canvas.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_objx_templ.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_checkbox.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_checkbox.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_img.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_img.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../core/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../core/lv_obj.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_dropdown.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_label.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_label.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_roller.o + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_line.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_line.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_slider.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_roller.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_roller.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_switch.o +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_table.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_slider.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_slider.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Compiling .pio\build\seeed_xiao_esp32s3\libd21\lvgl\widgets\lv_textarea.o +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_switch.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_switch.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_table.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_table.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +In file included from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/../lv_conf_internal.h:39, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_textarea.h:16, + from .pio/libdeps/seeed_xiao_esp32s3/lvgl/src/widgets/lv_textarea.c:9: +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:368: warning: "LV_FONT_MONTSERRAT_16" redefined + 368 | #define LV_FONT_MONTSERRAT_16 0 + | +: note: this is the location of the previous definition +.pio/libdeps/seeed_xiao_esp32s3/lvgl/lv_conf.h:372: warning: "LV_FONT_MONTSERRAT_24" redefined + 372 | #define LV_FONT_MONTSERRAT_24 0 + | +: note: this is the location of the previous definition +Archiving .pio\build\seeed_xiao_esp32s3\libd21\liblvgl.a +Indexing .pio\build\seeed_xiao_esp32s3\libd21\liblvgl.a +Linking .pio\build\seeed_xiao_esp32s3\firmware.elf +c:/users/small09/.platformio/packages/toolchain-xtensa-esp32s3/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/bin/ld.exe: .pio\build\seeed_xiao_esp32s3\src\lvgl_demo.o:(.literal.create_demo_container+0xc): undefined reference to `lv_font_montserrat_24' +c:/users/small09/.platformio/packages/toolchain-xtensa-esp32s3/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/bin/ld.exe: .pio\build\seeed_xiao_esp32s3\src\lvgl_demo.o:(.literal.create_demo_container+0x18): undefined reference to `lv_font_montserrat_16' +collect2.exe: error: ld returned 1 exit status +*** [.pio\build\seeed_xiao_esp32s3\firmware.elf] Error 1 \ No newline at end of file diff --git a/include/README b/include/README new file mode 100644 index 0000000..49819c0 --- /dev/null +++ b/include/README @@ -0,0 +1,37 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the convention is to give header files names that end with `.h'. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/include/hw_config.h b/include/hw_config.h new file mode 100644 index 0000000..83d9c44 --- /dev/null +++ b/include/hw_config.h @@ -0,0 +1,65 @@ +#ifndef HW_CONFIG_H +#define HW_CONFIG_H + +/* ============================================================ + * ESP32 DASS2 – 引脚宏定义 + * 来源: pin.txt + * ============================================================ */ + +/* ---------- 电源 / 电池 ---------- */ +#define BAT_VOLTAGE_GPIO GPIO_NUM_6 /* ADC1_CH5 – 读取电池电压 */ +#define ADC_CTL_GPIO GPIO_NUM_7 /* 开关读取电压的MOS管 */ +#define POW_CTL_GPIO GPIO_NUM_15 /* 开关各种外围芯片电源 */ +#define USB_PLUGIN_DETECT_GPIO GPIO_NUM_18 /* 检测USB是否插入(高=插入) */ + +/* ---------- 按钮 ---------- */ +#define BUTTON0_GPIO GPIO_NUM_19 +#define BUTTON1_GPIO GPIO_NUM_20 +/* 两个按钮状态编码: + * 00 = 无按键 ; 10 = 左键 ; 01 = 右键 ; 11 = 中键 + */ + +/* ---------- LED ---------- */ +#define LED_CTL_GPIO GPIO_NUM_42 /* 状态指示灯 */ + +/* ---------- I2C ---------- */ +#define I2C_SDA_GPIO GPIO_NUM_8 +#define I2C_SCL_GPIO GPIO_NUM_9 +#define I2C_PORT I2C_NUM_0 + +/* ---------- SPI (TFT 专用总线) ---------- */ +#define SPI_MOSI_GPIO GPIO_NUM_11 +#define SPI_MISO_GPIO GPIO_NUM_12 +#define SPI_SCLK_GPIO GPIO_NUM_21 +#define SPI_HOST SPI2_HOST + +/* TFT 片选 / 数据命令 / 复位 / 背光 */ +#define TFT_CS_GPIO GPIO_NUM_13 +#define TFT_DC_GPIO GPIO_NUM_14 +#define TFT_RST_GPIO GPIO_NUM_47 +#define TFT_PWM_GPIO GPIO_NUM_10 + +/* ---------- SDMMC (4-bit 模式, 独立于 SPI) ---------- */ +#define SDMMC_CLK_GPIO GPIO_NUM_5 +#define SDMMC_CMD_GPIO GPIO_NUM_4 +#define SDMMC_D0_GPIO GPIO_NUM_41 +#define SDMMC_D1_GPIO GPIO_NUM_40 +#define SDMMC_D2_GPIO GPIO_NUM_39 +#define SDMMC_D3_GPIO GPIO_NUM_38 +#define SDMMC_CD_GPIO GPIO_NUM_48 /* 卡检测, 有卡=低电平 */ + +/* ---------- SHT30 温湿度传感器 (I2C) ---------- */ +#define SHT30_I2C_ADDR 0x44 /* ADDR 引脚接地 */ + +/* ---------- UART2 (Arduino Serial2, 用于温湿度数据输出) ---------- */ +#define UART2_TX_GPIO 16 +#define UART2_RX_GPIO 17 +#define UART2_BAUD_RATE 115200 + +/* ---------- 显示参数 ---------- */ +/* 按实际 TFT 型号修改 – 下面以 ST7789 240×240 为例 */ +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 +#define TFT_MADCTL_ROTATION 0x00 /* MADCTL – 无旋转(竖屏) */ + +#endif /* HW_CONFIG_H */ diff --git a/include/hw_init.h b/include/hw_init.h new file mode 100644 index 0000000..4e7208e --- /dev/null +++ b/include/hw_init.h @@ -0,0 +1,44 @@ +#ifndef HW_INIT_H +#define HW_INIT_H + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------- 基本 GPIO ---------- */ +esp_err_t hw_gpio_init(void); + +/* ---------- 电源控制 ---------- */ +esp_err_t hw_power_init(void); /* 开启外围电源 (POW_CTL) */ +esp_err_t hw_battery_adc_init(void); /* 初始化电池电压 ADC */ +uint32_t hw_battery_read_mv(void); /* 读取电池电压 (mV),内部自动开关MOS */ + +/* ---------- 按钮 ---------- */ +esp_err_t hw_button_init(void); +uint8_t hw_button_read(void); /* 返回编码: 0=none, 1=left, 2=right, 3=mid */ + +/* ---------- LED ---------- */ +esp_err_t hw_led_init(void); +void hw_led_set(bool on); + +/* ---------- I2C ---------- */ +esp_err_t hw_i2c_init(void); + +/* ---------- SPI ---------- */ +esp_err_t hw_spi_init(void); + +/* ---------- TFT 背光 PWM ---------- */ +esp_err_t hw_tft_backlight_init(void); +void hw_tft_backlight_set(uint8_t duty); /* 0–100 */ + +/* ---------- 一键初始化所有外设 ---------- */ +esp_err_t hw_all_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HW_INIT_H */ diff --git a/include/lv_conf.h b/include/lv_conf.h new file mode 100644 index 0000000..a7ffccd --- /dev/null +++ b/include/lv_conf.h @@ -0,0 +1,784 @@ +/** + * @file lv_conf.h + * Configuration file for v8.4.0 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ +#define LV_COLOR_16_SWAP 1 + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#define LV_COLOR_SCREEN_TRANSP 0 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + +/*========================= + MEMORY SETTINGS + *=========================*/ + +/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ +#define LV_MEM_CUSTOM 0 +#if LV_MEM_CUSTOM == 0 + /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (64U * 1024U) /*[bytes]*/ + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif + +#else /*LV_MEM_CUSTOM*/ + #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ + #define LV_MEM_CUSTOM_ALLOC malloc + #define LV_MEM_CUSTOM_FREE free + #define LV_MEM_CUSTOM_REALLOC realloc +#endif /*LV_MEM_CUSTOM*/ + +/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. + *You will see an error log message if there wasn't enough buffers. */ +#define LV_MEM_BUF_MAX_NUM 16 + +/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ +#define LV_MEMCPY_MEMSET_STD 0 + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 1 +#if LV_TICK_CUSTOM + // #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Drawing + *-----------*/ + +/*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ +#define LV_DRAW_COMPLEX 1 +#if LV_DRAW_COMPLEX != 0 + + /*Allow buffering some shadow calculation. + *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_CIRCLE_CACHE_SIZE 4 +#endif /*LV_DRAW_COMPLEX*/ + +/** + * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer + * and blend it as an image with the given opacity. + * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) + * The widget can be buffered in smaller chunks to avoid using large buffers. + * + * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it + * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. + * + * Both buffer sizes are in bytes. + * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers + * and can't be drawn in chunks. So these settings affects only widgets with opacity. + */ +#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) +#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) + +/*Default image cache size. Image caching keeps the images opened. + *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) + *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. + *However the opened images might consume additional RAM. + *0: to disable caching*/ +#define LV_IMG_CACHE_DEF_SIZE 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ +#define LV_GRAD_CACHE_DEF_SIZE 0 + +/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ +#define LV_DITHER_GRADIENT 0 +#if LV_DITHER_GRADIENT + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #define LV_DITHER_ERROR_DIFFUSION 0 +#endif + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#define LV_DISP_ROT_MAX_BUF (10*1024) + +/*------------- + * GPU + *-----------*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#define LV_USE_GPU_ARM2D 0 + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#define LV_USE_GPU_STM32_DMA2D 0 +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ + #define LV_GPU_DMA2D_CMSIS_INCLUDE +#endif + +/*Enable RA6M3 G2D GPU*/ +#define LV_USE_GPU_RA6M3_G2D 0 +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + +/*Use SWM341's DMA2D GPU*/ +#define LV_USE_GPU_SWM341_DMA2D 0 +#if LV_USE_GPU_SWM341_DMA2D + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" +#endif + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_PXP 0 +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/*Use SDL renderer API*/ +#define LV_USE_GPU_SDL 0 +#if LV_USE_GPU_SDL + #define LV_GPU_SDL_INCLUDE_PATH + /*Texture cache size, 8MB by default*/ + #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 0 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#define LV_USE_MEM_MONITOR 0 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM + #define LV_SPRINTF_INCLUDE + #define lv_snprintf snprintf + #define lv_vsnprintf vsnprintf +#else /*LV_SPRINTF_CUSTOM*/ + #define LV_SPRINTF_USE_FLOAT 0 +#endif /*LV_SPRINTF_CUSTOM*/ + +#define LV_USE_USER_DATA 1 + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#define LV_ENABLE_GC 0 +#if LV_ENABLE_GC != 0 + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ +#endif /*LV_ENABLE_GC*/ + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ +#define LV_ATTRIBUTE_DMA + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#define LV_USE_LARGE_COORD 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 1 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_12_SUBPX 0 +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_16 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable subpixel rendering*/ +#define LV_USE_FONT_SUBPX 0 +#if LV_USE_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*The control character to use for signalling text recoloring.*/ +#define LV_TXT_COLOR_CMD "#" + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGET USAGE + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BTN 1 + +#define LV_USE_BTNMATRIX 1 + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMG 1 /*Requires: lv_label*/ + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ +#endif + +#define LV_USE_LINE 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ +#if LV_USE_ROLLER + #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ +#endif + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +/*================== + * EXTRA COMPONENTS + *==================*/ + +/*----------- + * Widgets + *----------*/ +#define LV_USE_ANIMIMG 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CHART 1 + +#define LV_USE_COLORWHEEL 1 + +#define LV_USE_IMGBTN 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LED 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_METER 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*----------- + * Themes + *----------*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_BASIC 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*----------- + * Layouts + *----------*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*PNG decoder library*/ +#define LV_USE_PNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_SJPG 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Tiny TTF library*/ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable a published subscriber based messaging system */ +#define LV_USE_MSG 0 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#define LV_DEMO_BENCHMARK_RGB565A8 0 +#endif + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/include/lvgl_demo.h b/include/lvgl_demo.h new file mode 100644 index 0000000..1cdc1e8 --- /dev/null +++ b/include/lvgl_demo.h @@ -0,0 +1,26 @@ +#ifndef LVGL_DEMO_H +#define LVGL_DEMO_H + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief 初始化 LVGL + TFT 显示驱动,并启动 Demo UI + * + * 内部步骤: + * 1. lv_init() + * 2. 添加 SPI TFT 设备 (ST7789 / ST7735) + * 3. 注册 LVGL flush 回调 + * 4. 创建 Demo UI 对象 + * 5. 启动周期性 LVGL 刷新 Task + */ +esp_err_t lvgl_demo_start(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LVGL_DEMO_H */ diff --git a/include/ota_manager.h b/include/ota_manager.h new file mode 100644 index 0000000..a02eab2 --- /dev/null +++ b/include/ota_manager.h @@ -0,0 +1,209 @@ +/** + * @file ota_manager.h + * @brief 固件 OTA(Over-The-Air)底层管理器 + * + * 提供与传输层无关的固件更新基础设施。 + * 上层(USB / 串口 / 蓝牙 / SD 卡 / HTTP)只需: + * 1. 调用 ota_begin(total_size) 开始更新 + * 2. 循环调用 ota_write(chunk, len) 写入固件数据 + * 3. 调用 ota_end() 完成更新(验证 + 切换启动分区) + * 4. 异常时调用 ota_abort() 放弃更新 + * + * 回调机制: + * 注册回调后,在 OTA 各阶段自动触发,用于 UI 更新 / 日志 / 错误处理。 + * + * 框架: ESP-IDF 5.1.x + * 依赖: hw_led_set()(状态 LED 反馈) + */ + +#ifndef OTA_MANAGER_H +#define OTA_MANAGER_H + +#include +#include +#include +#include "esp_err.h" +#include "esp_partition.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ================================================================ + * 类型定义 + * ================================================================ */ + +/** OTA 状态机 */ +typedef enum { + OTA_STATE_IDLE, /**< 空闲,等待开始 */ + OTA_STATE_IN_PROGRESS, /**< 固件写入中 */ + OTA_STATE_VERIFYING, /**< 固件校验中(end 阶段) */ + OTA_STATE_COMPLETE, /**< 更新成功,准备重启 */ + OTA_STATE_ERROR, /**< 发生错误,需 abort 或重试 */ +} ota_state_t; + +/** OTA 错误码(扩展 esp_err_t,负值为 ESP-IDF 错误,正值为自定义错误) */ +typedef enum { + OTA_ERR_NONE = 0, /**< 无错误 */ + OTA_ERR_NOT_INITIALIZED = 1, /**< 未调用 begin */ + OTA_ERR_ALREADY_IN_PROGRESS = 2, /**< 已有进行中的 OTA */ + OTA_ERR_BEGIN_FAILED = 3, /**< begin 阶段失败 */ + OTA_ERR_WRITE_FAILED = 4, /**< 写入 flash 失败 */ + OTA_ERR_END_FAILED = 5, /**< end 阶段失败 */ + OTA_ERR_ABORT_FAILED = 6, /**< abort 失败 */ + OTA_ERR_SIZE_MISMATCH = 7, /**< 写入长度与声明的 total 不符 */ + OTA_ERR_NO_OTA_PARTITION = 8, /**< 无可用 OTA 分区 */ + OTA_ERR_STATE_ERROR = 9, /**< 当前状态不允许该操作 */ + OTA_ERR_VERIFY_FAILED = 10, /**< 固件校验失败 */ +} ota_error_t; + +/* ================================================================ + * 回调函数类型 + * ================================================================ */ + +/** + * @brief 进度回调 + * @param percent 完成百分比 (0–100) + * @param bytes_written 已写入字节数 + * @param total_size 固件总字节数 + * + * 调用频率: 每完成一个 ota_write() 调用后触发一次(约 1–4KB 一次)。 + * 上层可在此回调中更新进度条或打印日志。 + */ +typedef void (*ota_progress_cb_t)(int percent, size_t bytes_written, size_t total_size); + +/** + * @brief 完成回调 + * @param success true=更新成功, false=更新失败 + * @param error_code 失败时的错误码(success 为 true 时无效) + * + * 调用时机: ota_end() 处理完毕后触发。 + * 若 success=true,设备应在适当时机重启以加载新固件。 + */ +typedef void (*ota_complete_cb_t)(bool success, ota_error_t error_code); + +/** + * @brief 状态变化回调 + * @param old_state 变化前的状态 + * @param new_state 变化后的状态 + * + * 每次 OTA 状态机发生转换时触发。 + * 上层可在 OTA_STATE_COMPLETE 时自动重启,或在 OTA_STATE_ERROR 时告警。 + */ +typedef void (*ota_state_cb_t)(ota_state_t old_state, ota_state_t new_state); + +/** + * @brief 错误回调(颗粒度更细) + * @param error_code 错误码 + * @param message 可读错误描述 + * + * 在 ota_write 失败、end 失败等场景触发,先于状态变化回调。 + * 可用于日志记录、错误提示等。 + */ +typedef void (*ota_error_cb_t)(ota_error_t error_code, const char *message); + +/* ================================================================ + * 回调注册 + * ================================================================ */ + +/** 注册进度回调(最多一个,后注册的覆盖前面的) */ +void ota_set_progress_callback(ota_progress_cb_t cb); + +/** 注册完成回调 */ +void ota_set_complete_callback(ota_complete_cb_t cb); + +/** 注册状态变化回调 */ +void ota_set_state_callback(ota_state_cb_t cb); + +/** 注册错误回调 */ +void ota_set_error_callback(ota_error_cb_t cb); + +/** 一次性注销所有回调 */ +void ota_clear_callbacks(void); + +/* ================================================================ + * 底层 OTA API + * + * 调用顺序: + * 正常流程: ota_begin() → ota_write()×N → ota_end() → 重启设备 + * 错误处理: ota_begin() → ota_write()×N → ota_abort() + * ================================================================ */ + +/** + * @brief 开始 OTA 更新 + * + * 内部自动选择下一个可用的 OTA 分区,擦除分区空间。 + * + * @param firmware_size 固件总大小(字节)。 + * 传入 0 表示大小未知:跳过长度校验,progress 百分比始终为 0。 + * @return + * - ESP_OK: 开始成功,可调用 ota_write + * - OTA_ERR_ALREADY_IN_PROGRESS: 上次 OTA 未结束 + * - OTA_ERR_NO_OTA_PARTITION: 分区表无可用 OTA 分区 + * - OTA_ERR_BEGIN_FAILED: ESP-IDF OTA begin 失败 + */ +esp_err_t ota_begin(size_t firmware_size); + +/** + * @brief 写入固件数据块 + * + * 阻塞调用,写入 flash 前先进行必要的擦除。 + * 建议每次写入 1024–4096 字节以获得最佳吞吐量。 + * + * @param data 数据指针 + * @param len 数据长度(字节) + * @return + * - ESP_OK: 写入成功 + * - OTA_ERR_NOT_INITIALIZED: 未调用 ota_begin + * - OTA_ERR_STATE_ERROR: 当前状态不允许写入 + * - OTA_ERR_WRITE_FAILED: 写入 flash 失败 + */ +esp_err_t ota_write(const uint8_t *data, size_t len); + +/** + * @brief 完成 OTA 更新 + * + * 校验已写入数据的完整性,验证固件镜像,切换启动分区。 + * 成功返回后,设备应在适当时机调用 esp_restart() 重启。 + * + * @return + * - ESP_OK: 更新完成,可重启 + * - OTA_ERR_END_FAILED: 校验或切换失败 + * - OTA_ERR_SIZE_MISMATCH: 实写大小与声明不符 + */ +esp_err_t ota_end(void); + +/** + * @brief 中止 OTA 更新 + * + * 放弃当前写入的固件,恢复状态机到 IDLE。 + * 调用后目标 OTA 分区数据不可靠,下次 begin 会重新擦除。 + * + * @return ESP_OK 或错误码 + */ +esp_err_t ota_abort(void); + +/* ================================================================ + * 状态查询 + * ================================================================ */ + +/** 获取当前 OTA 状态 */ +ota_state_t ota_get_state(void); + +/** 获取当前运行的固件分区(const 指针,不可修改) */ +const esp_partition_t *ota_get_running_partition(void); + +/** 获取正在更新的目标分区(仅在 IN_PROGRESS 或 VERIFYING 时有效) */ +const esp_partition_t *ota_get_update_partition(void); + +/** 获取已写入字节数 */ +size_t ota_get_bytes_written(void); + +/** 获取声明的固件总大小 */ +size_t ota_get_firmware_size(void); + +#ifdef __cplusplus +} +#endif + +#endif /* OTA_MANAGER_H */ diff --git a/include/sd_card.h b/include/sd_card.h new file mode 100644 index 0000000..e7d0064 --- /dev/null +++ b/include/sd_card.h @@ -0,0 +1,102 @@ +/** + * @file sd_card.h + * @brief SD 卡驱动 (SDMMC 4-bit 模式 + FATFS) + * + * 硬件接口: SDMMC1, 4-bit 模式 + * 引脚定义: 见 hw_config.h (SDMMC_CLK/CMD/D0-D3/CD_GPIO) + * 框架: ESP-IDF 5.1.x + */ + +#ifndef SD_CARD_H +#define SD_CARD_H + +#include +#include +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ================================================================ + * 类型定义 + * ================================================================ */ + +/** SD 卡文件系统类型 */ +typedef enum { + SD_FS_NONE = 0, /* 未挂载 / 无卡 */ + SD_FS_FAT32, /* FAT32 格式 */ + SD_FS_OTHER, /* 其他文件系统(需要格式化) */ +} sd_fs_type_t; + +/** SD 卡文件信息 */ +typedef struct { + char name[64]; + size_t size; + bool is_dir; +} sd_file_info_t; + +/* ================================================================ + * 挂载 / 卸载 / 格式化 + * ================================================================ */ + +/** 初始化 SDMMC 主机并尝试挂载 FAT 文件系统到 /sdcard */ +esp_err_t sd_card_init(void); + +/** 卸载文件系统并释放 SDMMC 资源 */ +esp_err_t sd_card_deinit(void); + +/** 获取当前 SD 卡的文件系统类型 */ +sd_fs_type_t sd_card_get_fs_type(void); + +/** 检测 SD 卡是否物理插入 (读取 CD 引脚) */ +bool sd_card_is_inserted(void); + +/** 将 SD 卡格式化为 FAT32 并重新挂载 */ +esp_err_t sd_card_format(void); + +/* ================================================================ + * 文件枚举 + * ================================================================ */ + +/** 枚举 SD 卡根目录下的文件和目录 + * @param list 输出缓冲区 + * @param max_files 最多返回的文件数 + * @return 实际枚举到的文件数量 (≤ max_files) + */ +int sd_card_list_files(sd_file_info_t *list, int max_files); + +/* ================================================================ + * 文件读取 + * ================================================================ */ + +/** 读取文本文件全部内容到字符串缓冲区 + * @param path 文件路径 (相对于 /sdcard, 如 "readme.txt") + * @param buf 输出缓冲区 (会以 '\0' 结尾) + * @param max_len 缓冲区最大字节数 (含结尾 '\0') + * @return ESP_OK 成功, 否则失败 + * + * 注意: 文件超过 max_len-1 时会被截断。 + */ +esp_err_t sd_card_read_text(const char *path, char *buf, size_t max_len); + +/** 读取图片文件到内存缓冲区 (二进制原始数据) + * @param path 文件路径 (相对于 /sdcard, 如 "photo.bmp") + * @param buf 输出缓冲区 (调用者负责分配) + * @param max_len 缓冲区最大字节数 + * @param out_len [输出] 实际读取的字节数 + * @return ESP_OK 成功, 否则失败 + * + * 注意: 此函数只负责读取原始二进制数据, + * 图片解析和显示由上层实现。 + */ +esp_err_t sd_card_read_image(const char *path, + uint8_t *buf, size_t max_len, + size_t *out_len); + +#ifdef __cplusplus +} +#endif + +#endif /* SD_CARD_H */ diff --git a/include/sht30.h b/include/sht30.h new file mode 100644 index 0000000..1988463 --- /dev/null +++ b/include/sht30.h @@ -0,0 +1,48 @@ +/** + * @file sht30.h + * @brief SHT30 温湿度传感器驱动 (I2C) + * + * 硬件接口: I2C (复用 hw_init 中已初始化的 I2C_PORT) + * I2C 地址: 0x44 (ADDR 接地) 或 0x45 (ADDR 接 VDD) + * 框架: ESP-IDF 5.1.x + */ + +#ifndef SHT30_H +#define SHT30_H + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** 单次测量结果 */ +typedef struct { + float temperature; /* 摄氏度 */ + float humidity; /* 相对湿度 % */ +} sht30_data_t; + +/** + * @brief 初始化 SHT30 传感器 (验证 I2C 通信) + * @return ESP_OK 成功, 否则失败 + * + * 注意: 调用前需确保 I2C 总线已初始化 (hw_i2c_init)。 + */ +esp_err_t sht30_init(void); + +/** + * @brief 执行单次测量 (高重复性、时钟拉伸模式) + * @param data [输出] 温湿度结果 + * @return ESP_OK 成功, 否则失败 + * + * 内部等待约 15 ms 后读取 6 字节原始数据, + * 经 CRC-8 校验后转换为物理量。 + */ +esp_err_t sht30_read(sht30_data_t *data); + +#ifdef __cplusplus +} +#endif + +#endif /* SHT30_H */ diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..9379397 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into the executable file. + +The source code of each library should be placed in a separate directory +("lib/your_library_name/[Code]"). + +For example, see the structure of the following example libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +Example contents of `src/main.c` using Foo and Bar: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +The PlatformIO Library Dependency Finder will find automatically dependent +libraries by scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/partitions_2mb.csv b/partitions_2mb.csv new file mode 100644 index 0000000..3b5af5a --- /dev/null +++ b/partitions_2mb.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x4000, +otadata, data, ota, 0xD000, 0x2000, +phy_init, data, phy, 0xF000, 0x1000, +factory, app, factory, 0x10000, 0xE0000, +ota_0, app, ota_0, 0xF0000, 0xE0000, diff --git a/partitions_4mb.csv b/partitions_4mb.csv new file mode 100644 index 0000000..6ca84a7 --- /dev/null +++ b/partitions_4mb.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x6000, +otadata, data, ota, 0xF000, 0x2000, +phy_init, data, phy, 0x11000, 0x1000, +factory, app, factory, 0x20000, 0x180000, +ota_0, app, ota_0, 0x1A0000, 0x180000, +ota_1, app, ota_1, 0x320000, 0xE0000, diff --git a/partitions_8mb.csv b/partitions_8mb.csv new file mode 100644 index 0000000..8ddedaa --- /dev/null +++ b/partitions_8mb.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x6000, +otadata, data, ota, 0xF000, 0x2000, +phy_init, data, phy, 0x11000, 0x1000, +factory, app, factory, 0x20000, 0x300000, +ota_0, app, ota_0, 0x320000, 0x300000, +ota_1, app, ota_1, 0x620000, 0x1E0000, diff --git a/pin.txt b/pin.txt new file mode 100644 index 0000000..a06db1d --- /dev/null +++ b/pin.txt @@ -0,0 +1,30 @@ +IO6 = BAT_VOLTAGE 读取电池电压,作为电量的粗略判断 +IO7 = ADC_CTL 开关读取电压的MOS管,防止电池电量跑光 +IO15 = POW_CTL 开关各种外围芯片的电源 +IO8 = I2C_SDA +IO19 = Button0 按钮信号0 +IO20 = Button1 按钮信号1,两个按钮的状态:00无按键;10左键;01右键;11中键 +~~IO41 = LED_CTL 控制状态LED灯 +~~IO46 = SD_CS sd卡片选 +IO9 = I2C_SCL +IO10 = TFT_PWM TFT显示屏背光亮度控制 +IO11 = SPI_SDO(MISO) +IO12 = SPI_SDI(MOSI) +IO13 = SPI_CS +IO14 = SPI_DC +IO21 = SPI_SCL +IO47 = TFE_RST TFT显示屏复位引脚 +~~IO45 = USB_PLUGIN_DETECT 检测USB是否插入,高电平有usb + +新增或修改的IO口 +IO4 = SD_CMD +IO5 = SD_CLK +IO16 = ESP_TX +IO17 = ESP_RX +IO18 = USB_PLUGIN_DETECT +IO42 = LED_CTL +IO41 = SD_DATA0 +IO40 = SD_DATA1 +IO39 = SD_DATA2 +IO38 = SD_DATA3 +IO48 = SD_CON diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..cadbb35 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,28 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_xiao_esp32s3] +platform = espressif32 +board = seeed_xiao_esp32s3 +framework = espidf + +; OTA 分区表(与 sdkconfig.defaults 中的 flash 大小保持一致) +board_build.partitions = partitions_8mb.csv + +; LVGL 显示框架 +lib_deps = + lvgl/lvgl@^8.4.0 + +; 确保 LVGL 找到 lv_conf.h (include/ 目录 + 项目根目录) +; 字体宏直接定义兜底,防止配置未生效 +build_flags = + -D LV_CONF_INCLUDE_SIMPLE + -I include + diff --git a/sdkconfig.defaults b/sdkconfig.defaults new file mode 100644 index 0000000..b18f901 --- /dev/null +++ b/sdkconfig.defaults @@ -0,0 +1,9 @@ +# FATFS + SD card through VFS +CONFIG_FATFS_VFS_FAT_SDCARD=y + +CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y +CONFIG_ESPTOOLPY_FLASHSIZE="8MB" + +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_8mb.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_8mb.csv" diff --git a/sdkconfig.seeed_xiao_esp32s3 b/sdkconfig.seeed_xiao_esp32s3 new file mode 100644 index 0000000..3d90b62 --- /dev/null +++ b/sdkconfig.seeed_xiao_esp32s3 @@ -0,0 +1,1951 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.1.2 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_WIFI_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_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_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_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_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_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_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_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_GDMA_GROUPS=y +CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 +CONFIG_SOC_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_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 +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_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_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_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_VERSION_2=y +CONFIG_SOC_TOUCH_SENSOR_NUM=15 +CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 +CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y +CONFIG_SOC_TOUCH_PAD_THRESHOLD_MAX=0x1FFFFF +CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF +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_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_UART_REQUIRE_CORE_RESET=y +CONFIG_SOC_USB_PERIPH_NUM=y +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_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_TIME_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=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_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_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_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32s3" +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 +# +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 +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 is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=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=16 +# 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_SERIAL_DEVICE_NUM=4 +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=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_NANO_FORMAT=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 + +# +# 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 is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# 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=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# 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=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=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_DUMP_RTL_FILES is not set +# 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 +# end of Bluetooth + +# +# Driver Configurations +# + +# +# Legacy ADC 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 Configuration + +# +# SPI Configuration +# +# 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 SPI Configuration + +# +# TWAI Configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of TWAI Configuration + +# +# Temperature sensor Configuration +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of Temperature sensor Configuration + +# +# UART Configuration +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of UART Configuration + +# +# GPIO Configuration +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of GPIO Configuration + +# +# Sigma Delta Modulator Configuration +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of Sigma Delta Modulator Configuration + +# +# GPTimer Configuration +# +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_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of GPTimer Configuration + +# +# PCNT Configuration +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of PCNT Configuration + +# +# RMT Configuration +# +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of RMT Configuration + +# +# MCPWM Configuration +# +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of MCPWM Configuration + +# +# I2S Configuration +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of I2S Configuration + +# +# USB Serial/JTAG Configuration +# +# end of USB Serial/JTAG Configuration +# 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 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 +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +# 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 + +# +# 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 +# +# 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 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +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_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_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_DEEP_SLEEP_WAKEUP_DELAY=2000 +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 Configuration +# +# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configuration + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config +# 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_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 +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP PSRAM +# +# CONFIG_SPIRAM is not set +# 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=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# 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_16B is not set +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=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# 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_16B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y +# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 +# 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_GDBSTUB_RUNTIME 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_MULTIPLE_UART=y +CONFIG_ESP_CONSOLE_UART_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 +# 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) + +# +# High resolution timer (esp_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=0x1 +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 High resolution timer (esp_timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_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=6 +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_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 is not set +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 +# 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_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# 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_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 is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS 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_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_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +# end of Port + +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +# 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_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +CONFIG_IEEE802154_CCA_THRESHOLD=-60 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 + +# +# 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_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +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_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_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 +# 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=5744 +CONFIG_LWIP_TCP_WND_DEFAULT=5744 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +# 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_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 +# end of SNTP + +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=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_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_HARDWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +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_LARGE_KEY_SOFTWARE_MPI is not set +# 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 + +# +# NVS +# +# CONFIG_NVS_ASSERT_ERROR_CHECK 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 +# 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 + +# +# 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 + +# +# 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 + +# +# 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 +# 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_OTG_SUPPORTED=y +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 +# 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_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 +# 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 is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=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_MCPWM_ISR_IN_IRAM is not set +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32S3_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_ESP32S3_SPIRAM_SUPPORT is not set +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=160 +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=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_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=6 +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +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=5744 +CONFIG_TCP_WND_DEFAULT=5744 +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/sdkconfig_不同分区大小.defaults b/sdkconfig_不同分区大小.defaults new file mode 100644 index 0000000..a205294 --- /dev/null +++ b/sdkconfig_不同分区大小.defaults @@ -0,0 +1,26 @@ +# ================================================================ +# ESP32 DASS2 – SDK 默认配置覆盖 +# +# 此文件中的设置会覆盖 sdkconfig 中的对应值。 +# 删除 .pio/build 目录后重新编译生效。 +# ================================================================ + +# FATFS + SD card through VFS +CONFIG_FATFS_VFS_FAT_SDCARD=y + +# ================================================================ +# Flash 大小 – Seeed XIAO ESP32S3 板载 8MB +# 如果你的硬件实际为 4MB/2MB,请修改此值 +# ================================================================ +# 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=y +CONFIG_ESPTOOLPY_FLASHSIZE="8MB" + +# ================================================================ +# 分区表 – 自定义 OTA 分区表 +# ================================================================ +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_8mb.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_8mb.csv" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..483bc0c --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,6 @@ +# This file was automatically generated for projects +# without default 'CMakeLists.txt' file. + +FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) + +idf_component_register(SRCS ${app_sources}) diff --git a/src/hw_init.c b/src/hw_init.c new file mode 100644 index 0000000..ae56301 --- /dev/null +++ b/src/hw_init.c @@ -0,0 +1,305 @@ +/** + * @file hw_init.c + * @brief 外设初始化实现 + * + * 基于 pin.txt 引脚定义,初始化 ESP32S3 各外设。 + * 适用框架: ESP-IDF 5.1.x + */ + +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "driver/gpio.h" +#include "driver/i2c.h" +#include "driver/spi_master.h" +#include "driver/ledc.h" +#include "esp_adc/adc_oneshot.h" +#include "esp_adc/adc_cali.h" +#include "esp_adc/adc_cali_scheme.h" + +#include "hw_config.h" +#include "hw_init.h" +#include "sd_card.h" + +static const char *TAG = "hw_init"; + +/* ================================================================ + * 内部状态 – ADC 句柄 + * ================================================================ */ +static adc_oneshot_unit_handle_t s_adc1_handle = NULL; +static adc_cali_handle_t s_adc_cali_handle = NULL; +static bool s_adc_cali_done = false; + +/* 电池电压分压比 – 按实际硬件修改 + * 假设: 电池通过 100k+100k 分压 => 2:1, 即 ADC 读数 ×2 = 实际电压 + * 若直接 1:1 接电池, 设 1.0 */ +static const float BAT_DIVIDER_RATIO = 2.0f; +static const uint32_t BAT_REF_MV = 3300; /* 内部参考 3.3V (已含 ADC 校准) */ + +/* ================================================================ + * GPIO – 通用初始化 + * ================================================================ */ +esp_err_t hw_gpio_init(void) +{ + /* USB 检测 + SD 卡检测 – 输入 */ + gpio_config_t io_conf = { + .pin_bit_mask = BIT64(USB_PLUGIN_DETECT_GPIO) | BIT64(SDMMC_CD_GPIO), + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_ENABLE, /* CD 需要上拉, 卡插入时接地 */ + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + ESP_LOGI(TAG, "GPIO init done (USB_DET=IO%d, SD_CD=IO%d)", + USB_PLUGIN_DETECT_GPIO, SDMMC_CD_GPIO); + return ESP_OK; +} + +/* ================================================================ + * 电源控制 + * ================================================================ */ +esp_err_t hw_power_init(void) +{ + /* POW_CTL – 输出, 初始拉高使外围芯片上电 */ + gpio_config_t io_conf = { + .pin_bit_mask = BIT64(POW_CTL_GPIO) | BIT64(ADC_CTL_GPIO), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + gpio_set_level(POW_CTL_GPIO, 1); /* 开启外围电源 */ + gpio_set_level(ADC_CTL_GPIO, 0); /* ADC MOS 默认关闭(低功耗) */ + + ESP_LOGI(TAG, "Power control init done (POW_CTL=ON, ADC_CTL=OFF)"); + return ESP_OK; +} + +/* ================================================================ + * 电池电压 ADC + * ================================================================ */ +esp_err_t hw_battery_adc_init(void) +{ + /* 1) 创建 ADC1 单次采集单元 */ + adc_oneshot_unit_init_cfg_t unit_cfg = { + .unit_id = ADC_UNIT_1, + .clk_src = ADC_RTC_CLK_SRC_DEFAULT, + }; + ESP_ERROR_CHECK(adc_oneshot_new_unit(&unit_cfg, &s_adc1_handle)); + + /* 2) 配置通道 – GPIO6 = ADC1_CH5 */ + adc_oneshot_chan_cfg_t chan_cfg = { + .atten = ADC_ATTEN_DB_11, /* 0–3.3V 量程 */ + .bitwidth = ADC_BITWIDTH_DEFAULT, /* 12-bit */ + }; + ESP_ERROR_CHECK(adc_oneshot_config_channel(s_adc1_handle, ADC_CHANNEL_5, &chan_cfg)); + + /* 3) 尝试创建校准曲线 (curve-fitting / eFuse Vref) */ + adc_cali_curve_fitting_config_t cali_cfg = { + .unit_id = ADC_UNIT_1, + .atten = ADC_ATTEN_DB_11, + .bitwidth = ADC_BITWIDTH_DEFAULT, + }; + esp_err_t ret = adc_cali_create_scheme_curve_fitting(&cali_cfg, &s_adc_cali_handle); + if (ret == ESP_OK) { + s_adc_cali_done = true; + ESP_LOGI(TAG, "ADC calibration ready (curve_fitting)"); + } else { + s_adc_cali_done = false; + ESP_LOGW(TAG, "ADC calibration not available, using raw*multipler fallback"); + } + + ESP_LOGI(TAG, "Battery ADC init done (GPIO6 / ADC1_CH5)"); + return ESP_OK; +} + +uint32_t hw_battery_read_mv(void) +{ + int raw = 0; + + /* 开启 MOS 管让 ADC 采样电池电压 */ + gpio_set_level(ADC_CTL_GPIO, 1); + vTaskDelay(pdMS_TO_TICKS(10)); /* 等待电压稳定 */ + + if (adc_oneshot_read(s_adc1_handle, ADC_CHANNEL_5, &raw) != ESP_OK) { + gpio_set_level(ADC_CTL_GPIO, 0); + return 0; + } + + /* 关闭 MOS */ + gpio_set_level(ADC_CTL_GPIO, 0); + + /* 计算电压 */ + uint32_t mv = 0; + if (s_adc_cali_done) { + adc_cali_raw_to_voltage(s_adc_cali_handle, raw, (int *)&mv); + } else { + /* 无校准时粗略估算: raw * 3300 / 4096 */ + mv = (uint32_t)(raw * BAT_REF_MV / 4096); + } + + /* 应用分压比 */ + mv = (uint32_t)(mv * BAT_DIVIDER_RATIO); + + ESP_LOGD(TAG, "Battery: raw=%d, mv=%" PRIu32, raw, mv); + return mv; +} + +/* ================================================================ + * 按钮 + * ================================================================ */ +esp_err_t hw_button_init(void) +{ + gpio_config_t io_conf = { + .pin_bit_mask = BIT64(BUTTON0_GPIO) | BIT64(BUTTON1_GPIO), + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_ENABLE, /* 默认上拉, 按下接地 */ + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + ESP_LOGI(TAG, "Button init done (GPIO19, GPIO20, pull-up)"); + return ESP_OK; +} + +uint8_t hw_button_read(void) +{ + uint8_t b0 = gpio_get_level(BUTTON0_GPIO) ? 0 : 1; /* 低有效 -> 取反 */ + uint8_t b1 = gpio_get_level(BUTTON1_GPIO) ? 0 : 1; + return (b1 << 1) | b0; /* 编码: 00=none, 01=left(B0), 10=right(B1), 11=mid */ +} + +/* ================================================================ + * LED + * ================================================================ */ +esp_err_t hw_led_init(void) +{ + gpio_config_t io_conf = { + .pin_bit_mask = BIT64(LED_CTL_GPIO), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + gpio_set_level(LED_CTL_GPIO, 0); /* 默认关 */ + + ESP_LOGI(TAG, "LED init done (GPIO42)"); + return ESP_OK; +} + +void hw_led_set(bool on) +{ + gpio_set_level(LED_CTL_GPIO, on ? 1 : 0); +} + +/* ================================================================ + * I2C + * ================================================================ */ +esp_err_t hw_i2c_init(void) +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_SDA_GPIO, + .scl_io_num = I2C_SCL_GPIO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = 100000, /* 100 kHz, 需要更高改 400000 */ + }; + ESP_ERROR_CHECK(i2c_param_config(I2C_PORT, &conf)); + ESP_ERROR_CHECK(i2c_driver_install(I2C_PORT, conf.mode, 0, 0, 0)); + + ESP_LOGI(TAG, "I2C init done (SDA=GPIO8, SCL=GPIO9, %" PRIu32 " Hz)", conf.master.clk_speed); + return ESP_OK; +} + +/* ================================================================ + * SPI (TFT + SD 卡共用总线) + * ================================================================ */ +esp_err_t hw_spi_init(void) +{ + spi_bus_config_t bus_cfg = { + .mosi_io_num = SPI_MOSI_GPIO, + .miso_io_num = SPI_MISO_GPIO, + .sclk_io_num = SPI_SCLK_GPIO, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, /* 最大一帧+余量 */ + }; + ESP_ERROR_CHECK(spi_bus_initialize(SPI_HOST, &bus_cfg, SPI_DMA_CH_AUTO)); + + ESP_LOGI(TAG, "SPI init done (MOSI=GPIO11, MISO=GPIO12, SCLK=GPIO21)"); + return ESP_OK; +} + +/* ================================================================ + * TFT 背光 PWM (LEDC) + * ================================================================ */ +esp_err_t hw_tft_backlight_init(void) +{ + ledc_timer_config_t timer_cfg = { + .speed_mode = LEDC_LOW_SPEED_MODE, + .duty_resolution = LEDC_TIMER_10_BIT, /* 10-bit = 0–1023 */ + .timer_num = LEDC_TIMER_0, + .freq_hz = 5000, /* 5 kHz PWM */ + .clk_cfg = LEDC_AUTO_CLK, + }; + ESP_ERROR_CHECK(ledc_timer_config(&timer_cfg)); + + ledc_channel_config_t ch_cfg = { + .gpio_num = TFT_PWM_GPIO, + .speed_mode = LEDC_LOW_SPEED_MODE, + .channel = LEDC_CHANNEL_0, + .intr_type = LEDC_INTR_DISABLE, + .timer_sel = LEDC_TIMER_0, + .duty = 0, /* 默认关 */ + .hpoint = 0, + }; + ESP_ERROR_CHECK(ledc_channel_config(&ch_cfg)); + + ESP_LOGI(TAG, "TFT backlight PWM init done (GPIO10, 5 kHz, 10-bit)"); + return ESP_OK; +} + +void hw_tft_backlight_set(uint8_t duty) +{ + /* duty: 0–100 */ + if (duty > 100) duty = 100; + uint32_t max_duty = (1 << 10) - 1; /* 10-bit: 1023 */ + uint32_t val = (uint32_t)duty * max_duty / 100; + ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, val); + ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0); +} + +/* ================================================================ + * 一键初始化所有外设 + * ================================================================ */ +esp_err_t hw_all_init(void) +{ + ESP_LOGI(TAG, "=== HW All Init Start ==="); + + ESP_ERROR_CHECK(hw_gpio_init()); + ESP_ERROR_CHECK(hw_power_init()); + ESP_ERROR_CHECK(hw_battery_adc_init()); + ESP_ERROR_CHECK(hw_button_init()); + ESP_ERROR_CHECK(hw_led_init()); + ESP_ERROR_CHECK(hw_i2c_init()); + ESP_ERROR_CHECK(hw_spi_init()); + ESP_ERROR_CHECK(hw_tft_backlight_init()); + + /* SD 卡初始化 (不阻塞启动,失败也继续) */ + esp_err_t sd_ret = sd_card_init(); + if (sd_ret != ESP_OK) { + ESP_LOGW(TAG, "SD card init returned 0x%x (will retry later)", sd_ret); + } + + ESP_LOGI(TAG, "=== HW All Init Done ==="); + return ESP_OK; +} diff --git a/src/lvgl_demo.c b/src/lvgl_demo.c new file mode 100644 index 0000000..04b15be --- /dev/null +++ b/src/lvgl_demo.c @@ -0,0 +1,747 @@ +/** + * @file lvgl_demo.c + * @brief LVGL TFT 显示驱动 (ST7789) + SD 卡交互 Demo + * + * 硬件接口: SPI 四线 (CS/DC/RST/PWM) + 背光 PWM + * 适用芯片: ST7789 (也可适配 ST7735 / GC9A01, 改初始化数组即可) + * 框架: ESP-IDF 5.1.x + LVGL 8.4 + * + * 交互流程: + * 1. 启动后显示原始 demo 界面 + * 2. 检测到 SD 卡插入后: + * - 非 FAT32 → 对话框"是否格式化?" [左=否] [右=格式化] + * - FAT32 → 对话框"是否浏览文件?" [左=否] [右=浏览] + * 3. 文件列表界面: 左键上翻 / 右键下翻 / 中键返回 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "driver/spi_master.h" +#include "driver/gpio.h" + +#include "lvgl.h" +#include "hw_config.h" +#include "hw_init.h" +#include "sd_card.h" + +static const char *TAG = "lvgl_demo"; + +/* ================================================================ + * 显示参数 (按实际 TFT 修改) + * ================================================================ */ +#define TFT_SPI_CLOCK_HZ (40 * 1000 * 1000) /* 40 MHz SPI */ +#define LVGL_TASK_INTERVAL_MS 5 /* 5 ms 刷新循环 */ +#define DISP_BUF_LINES 60 /* 每次刷新行数 */ + +/* ================================================================ + * 文件列表参数 + * ================================================================ */ +#define FILE_LIST_MAX 64 /* 最多枚举文件数 */ +#define FILE_LIST_PAGE_SIZE 6 /* 每页显示文件数 */ + +/* ================================================================ + * UI 状态机 + * ================================================================ */ +typedef enum { + UI_STATE_DEMO, /* 显示原始 demo 界面 */ + UI_STATE_DIALOG, /* 显示对话框 (格式化 / 浏览确认) */ + UI_STATE_FILE_LIST, /* 显示 SD 卡文件列表 */ +} ui_state_t; + +typedef enum { + DIALOG_FORMAT = 0, /* "是否格式化 SD 卡?" 对话框 */ + DIALOG_BROWSE, /* "是否浏览 SD 卡文件?" 对话框 */ + DIALOG_FORMATTING, /* "格式化中,请稍候..." */ +} dialog_type_t; + +/* ================================================================ + * SPI 设备句柄 (TFT) + * ================================================================ */ +static spi_device_handle_t s_spi_tft = NULL; + +/* ================================================================ + * LVGL 显示缓存 + * ================================================================ */ +static lv_disp_draw_buf_t s_draw_buf; +static lv_disp_drv_t s_disp_drv; +static lv_color_t *s_buf1; +static lv_color_t *s_buf2; + +/* ================================================================ + * UI 全局句柄 + * ================================================================ */ + +/* -------- Demo 界面 -------- */ +static lv_obj_t *s_cont_demo = NULL; /* demo 主容器 */ +static lv_obj_t *s_label_title = NULL; +static lv_obj_t *s_label_bat = NULL; +static lv_obj_t *s_label_btn = NULL; +static lv_obj_t *s_bar = NULL; +static lv_obj_t *s_label_sd_status = NULL; /* SD 卡状态标签 */ + +/* -------- 对话框界面 -------- */ +static lv_obj_t *s_cont_dialog = NULL; +static lv_obj_t *s_label_dialog = NULL; + +/* -------- 文件列表界面 -------- */ +static lv_obj_t *s_cont_files = NULL; +static lv_obj_t *s_list_files = NULL; +static lv_obj_t *s_label_page = NULL; /* 页码指示 */ + +/* -------- 状态变量 -------- */ +static ui_state_t s_ui_state = UI_STATE_DEMO; +static dialog_type_t s_dialog_type = DIALOG_FORMAT; +static sd_fs_type_t s_last_fs_type = SD_FS_NONE; +static bool s_dialog_shown = false; /* 防止重复弹出 */ + +/* 文件列表分页 */ +static sd_file_info_t s_files[FILE_LIST_MAX]; +static int s_file_count = 0; +static int s_file_page = 0; + +/* 按钮去抖动 */ +static uint8_t s_last_btn = 0; +static uint32_t s_btn_press_ms = 0; + +/* ================================================================ + * TFT 基本操作 – SPI 发送命令 / 数据 + * ================================================================ */ + +/** 写一个字节的命令 */ +static void tft_write_cmd(uint8_t cmd) +{ + spi_transaction_t t = { + .length = 8, + .tx_buffer = &cmd, + .user = (void *)0, /* DC = 0: 命令 */ + }; + gpio_set_level(TFT_DC_GPIO, 0); + spi_device_transmit(s_spi_tft, &t); +} + +/** 写多个字节的数据 */ +static void tft_write_data(const uint8_t *data, size_t len) +{ + spi_transaction_t t = { + .length = len * 8, + .tx_buffer = data, + .user = (void *)1, /* DC = 1: 数据 */ + }; + gpio_set_level(TFT_DC_GPIO, 1); + spi_device_transmit(s_spi_tft, &t); +} + +/** 写单个字节的数据 (便捷封装) */ +static inline void tft_write_data_byte(uint8_t data) +{ + tft_write_data(&data, 1); +} + +/* ================================================================ + * TFT 初始化序列 – ST7789 + * ================================================================ */ + +typedef struct { uint8_t cmd; uint8_t len; const uint8_t *data; } tft_cmd_t; + +/* ST7789 初始化命令表 (常见 240×240 / 240×280 面板) */ +static const uint8_t ST7789_DATA_SWRESET[] = {}; +static const uint8_t ST7789_DATA_SLPOUT[] = {}; +static const uint8_t ST7789_DATA_COLMOD[] = {0x55}; /* 16-bit 565 */ +static const uint8_t ST7789_DATA_MADCTL[] = {TFT_MADCTL_ROTATION}; +static const uint8_t ST7789_DATA_CASET[] = {0x00, 0x00, + (TFT_WIDTH-1)>>8, + (TFT_WIDTH-1)&0xFF}; +static const uint8_t ST7789_DATA_RASET[] = {0x00, 0x00, + (TFT_HEIGHT-1)>>8, + (TFT_HEIGHT-1)&0xFF}; +static const uint8_t ST7789_DATA_INVON[] = {}; +static const uint8_t ST7789_DATA_NORON[] = {}; +static const uint8_t ST7789_DATA_DISPON[] = {}; + +static const tft_cmd_t s_st7789_init[] = { + {0x01, sizeof(ST7789_DATA_SWRESET), ST7789_DATA_SWRESET}, /* SWRESET */ + {0x11, sizeof(ST7789_DATA_SLPOUT), ST7789_DATA_SLPOUT}, /* SLPOUT */ + {0x3A, sizeof(ST7789_DATA_COLMOD), ST7789_DATA_COLMOD}, /* COLMOD */ + {0x36, sizeof(ST7789_DATA_MADCTL), ST7789_DATA_MADCTL}, /* MADCTL */ + {0x2A, sizeof(ST7789_DATA_CASET), ST7789_DATA_CASET}, /* CASET */ + {0x2B, sizeof(ST7789_DATA_RASET), ST7789_DATA_RASET}, /* RASET */ + {0x21, sizeof(ST7789_DATA_INVON), ST7789_DATA_INVON}, /* INVON */ + {0x13, sizeof(ST7789_DATA_NORON), ST7789_DATA_NORON}, /* NORON */ + {0x29, sizeof(ST7789_DATA_DISPON), ST7789_DATA_DISPON}, /* DISPON */ +}; + +#define ST7789_INIT_LEN (sizeof(s_st7789_init) / sizeof(s_st7789_init[0])) + +/** 硬件复位 TFT */ +static void tft_hard_reset(void) +{ + gpio_set_level(TFT_RST_GPIO, 0); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(TFT_RST_GPIO, 1); + vTaskDelay(pdMS_TO_TICKS(120)); +} + +/** 发送初始化命令序列 */ +static void tft_init_sequence(const tft_cmd_t *cmds, size_t count) +{ + for (size_t i = 0; i < count; i++) { + tft_write_cmd(cmds[i].cmd); + if (cmds[i].len > 0) + tft_write_data(cmds[i].data, cmds[i].len); + + switch (cmds[i].cmd) { + case 0x01: vTaskDelay(pdMS_TO_TICKS(120)); break; /* SWRESET */ + case 0x11: vTaskDelay(pdMS_TO_TICKS(120)); break; /* SLPOUT */ + case 0x29: vTaskDelay(pdMS_TO_TICKS(10)); break; /* DISPON */ + default: break; + } + } +} + +/** 设置显示窗口 (用于局部刷新) */ +static void tft_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) +{ + uint8_t caset[4] = {x0 >> 8, x0 & 0xFF, x1 >> 8, x1 & 0xFF}; + uint8_t raset[4] = {y0 >> 8, y0 & 0xFF, y1 >> 8, y1 & 0xFF}; + + tft_write_cmd(0x2A); /* CASET */ + tft_write_data(caset, 4); + tft_write_cmd(0x2B); /* RASET */ + tft_write_data(raset, 4); + tft_write_cmd(0x2C); /* RAMWR */ +} + +/* ================================================================ + * LVGL flush 回调 + * ================================================================ */ +static void disp_flush(lv_disp_drv_t *drv, const lv_area_t *area, + lv_color_t *color_map) +{ + tft_set_window(area->x1, area->y1, area->x2, area->y2); + + size_t pixel_cnt = (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1); + tft_write_data((const uint8_t *)color_map, pixel_cnt * 2); + + lv_disp_flush_ready(drv); +} + +/* ================================================================ + * 初始化 SPI TFT 设备 + * ================================================================ */ +static esp_err_t tft_spi_add_device(void) +{ + spi_device_interface_config_t dev_cfg = { + .clock_speed_hz = TFT_SPI_CLOCK_HZ, + .mode = 0, /* SPI mode 0: CPOL=0 CPHA=0 */ + .spics_io_num = TFT_CS_GPIO, + .queue_size = 1, + .flags = SPI_DEVICE_NO_DUMMY, + }; + return spi_bus_add_device(SPI_HOST, &dev_cfg, &s_spi_tft); +} + +/* ================================================================ + * 工具函数 – 格式化文件大小 + * ================================================================ */ +static void fmt_file_size(char *buf, size_t buf_size, size_t size) +{ + if (size < 1024) { + snprintf(buf, buf_size, "%u B", (unsigned)size); + } else if (size < 1024 * 1024) { + snprintf(buf, buf_size, "%.1f KB", (float)size / 1024); + } else { + snprintf(buf, buf_size, "%.1f MB", (float)size / (1024 * 1024)); + } +} + +/* ================================================================ + * Demo 界面切换 – 显示/隐藏各容器 + * ================================================================ */ +static void ui_show_demo(void) +{ + if (s_cont_demo) lv_obj_clear_flag(s_cont_demo, LV_OBJ_FLAG_HIDDEN); + if (s_cont_dialog) lv_obj_add_flag(s_cont_dialog, LV_OBJ_FLAG_HIDDEN); + if (s_cont_files) lv_obj_add_flag(s_cont_files, LV_OBJ_FLAG_HIDDEN); +} + +static void ui_show_dialog(void) +{ + if (s_cont_demo) lv_obj_add_flag(s_cont_demo, LV_OBJ_FLAG_HIDDEN); + if (s_cont_dialog) lv_obj_clear_flag(s_cont_dialog, LV_OBJ_FLAG_HIDDEN); + if (s_cont_files) lv_obj_add_flag(s_cont_files, LV_OBJ_FLAG_HIDDEN); +} + +static void ui_show_filelist(void) +{ + if (s_cont_demo) lv_obj_add_flag(s_cont_demo, LV_OBJ_FLAG_HIDDEN); + if (s_cont_dialog) lv_obj_add_flag(s_cont_dialog, LV_OBJ_FLAG_HIDDEN); + if (s_cont_files) lv_obj_clear_flag(s_cont_files, LV_OBJ_FLAG_HIDDEN); +} + +/* ================================================================ + * 对话框内容更新 + * ================================================================ */ +static void dialog_set_content(dialog_type_t dtype) +{ + if (!s_label_dialog) return; + s_dialog_type = dtype; + + switch (dtype) { + case DIALOG_FORMAT: + lv_label_set_text(s_label_dialog, + "SD卡不是FAT32格式\n\n" + "是否格式化?\n\n" + "[左键] 否 [右键] 是"); + break; + case DIALOG_BROWSE: + lv_label_set_text(s_label_dialog, + "检测到SD卡\n" + "是否浏览文件?\n\n" + "[左键] 否 [右键] 是"); + break; + case DIALOG_FORMATTING: + lv_label_set_text(s_label_dialog, + "格式化中\n请稍候..."); + break; + } +} + +/* ================================================================ + * 文件列表刷新 + * ================================================================ */ +static void file_list_update_page(void) +{ + if (!s_list_files || !s_label_page) return; + + lv_obj_t *list = s_list_files; + lv_obj_clean(list); /* 清空所有子项 */ + + int total_pages = (s_file_count + FILE_LIST_PAGE_SIZE - 1) + / FILE_LIST_PAGE_SIZE; + if (total_pages < 1) total_pages = 1; + if (s_file_page >= total_pages) s_file_page = total_pages - 1; + if (s_file_page < 0) s_file_page = 0; + + int start = s_file_page * FILE_LIST_PAGE_SIZE; + int end = start + FILE_LIST_PAGE_SIZE; + if (end > s_file_count) end = s_file_count; + + if (s_file_count == 0) { + lv_obj_t *btn = lv_list_add_btn(list, NULL, "(空)"); + lv_obj_set_style_text_font(btn, &lv_font_montserrat_14, 0); + } else { + for (int i = start; i < end; i++) { + char label[128]; + char size_str[32]; + fmt_file_size(size_str, sizeof(size_str), s_files[i].size); + + if (s_files[i].is_dir) { + snprintf(label, sizeof(label), + LV_SYMBOL_DIRECTORY " %s", + s_files[i].name); + } else { + snprintf(label, sizeof(label), + LV_SYMBOL_FILE " %s %s", + s_files[i].name, size_str); + } + + lv_obj_t *btn = lv_list_add_btn(list, NULL, label); + lv_obj_set_style_text_font(btn, &lv_font_montserrat_14, 0); + } + } + + /* 更新页码 */ + char page_buf[32]; + snprintf(page_buf, sizeof(page_buf), "%d/%d", + s_file_page + 1, total_pages); + lv_label_set_text(s_label_page, page_buf); +} + +/* ================================================================ + * 按钮读取 & 交互处理 + * ================================================================ */ + +/** 读取按钮, 带 200ms 去抖动 */ +static uint8_t read_button(void) +{ + uint8_t raw = hw_button_read(); + if (raw != s_last_btn) { + s_last_btn = raw; + s_btn_press_ms = (raw != 0) ? lv_tick_get() : 0; + return raw; + } + /* 同一状态持续 200ms 后才确认 */ + if (raw != 0 && s_btn_press_ms != 0) { + if (lv_tick_get() - s_btn_press_ms >= 200) { + s_btn_press_ms = 0; /* 只触发一次, 直到释放再重新计时 */ + return raw; + } + } + return 0; /* 无有效按键 */ +} + +/** 处理按键事件 */ +static void handle_button(uint8_t btn) +{ + if (btn == 0) return; + + switch (s_ui_state) { + + case UI_STATE_DEMO: { + /* 在 demo 界面: 左键切换 LED */ + if (btn == 1) { + static bool led_on = false; + led_on = !led_on; + hw_led_set(led_on); + if (s_label_btn) { + lv_label_set_text(s_label_btn, led_on ? "LED: ON" : "LED: OFF"); + } + } + break; + } + + case UI_STATE_DIALOG: { + if (s_dialog_type == DIALOG_FORMATTING) { + /* 格式化进行中, 不接受按键 */ + break; + } + + if (btn == 1) { + /* 左键 = 否 → 回到 demo */ + ESP_LOGI(TAG, "Dialog: user chose NO"); + s_ui_state = UI_STATE_DEMO; + ui_show_demo(); + s_dialog_shown = true; /* 标记已处理, 不再弹出 */ + } else if (btn == 2) { + /* 右键 = 是 → 格式化 或 浏览文件 */ + ESP_LOGI(TAG, "Dialog: user chose YES"); + if (s_dialog_type == DIALOG_FORMAT) { + /* 显示格式化中 */ + dialog_set_content(DIALOG_FORMATTING); + lv_timer_handler(); /* 立即刷新一次 */ + vTaskDelay(pdMS_TO_TICKS(500)); + + esp_err_t ret = sd_card_format(); + if (ret == ESP_OK) { + ESP_LOGI(TAG, "SD format OK, switching to file list"); + s_file_count = sd_card_list_files(s_files, FILE_LIST_MAX); + s_file_page = 0; + s_dialog_shown = true; + s_ui_state = UI_STATE_FILE_LIST; + file_list_update_page(); + ui_show_filelist(); + } else { + ESP_LOGE(TAG, "SD format failed: 0x%x", ret); + dialog_set_content(DIALOG_FORMAT); + lv_label_set_text(s_label_dialog, + "格式化失败!\n\n" + "[左键] 返回"); + s_dialog_type = DIALOG_FORMAT; + } + } else { + /* DIALOG_BROWSE → 显示文件列表 */ + s_file_count = sd_card_list_files(s_files, FILE_LIST_MAX); + s_file_page = 0; + s_dialog_shown = true; + s_ui_state = UI_STATE_FILE_LIST; + file_list_update_page(); + ui_show_filelist(); + } + } + break; + } + + case UI_STATE_FILE_LIST: { + if (btn == 1) { + /* 左键 = 上翻页 */ + if (s_file_page > 0) { + s_file_page--; + file_list_update_page(); + } + } else if (btn == 2) { + /* 右键 = 下翻页 */ + int total_pages = (s_file_count + FILE_LIST_PAGE_SIZE - 1) + / FILE_LIST_PAGE_SIZE; + if (total_pages < 1) total_pages = 1; + if (s_file_page < total_pages - 1) { + s_file_page++; + file_list_update_page(); + } + } else if (btn == 3) { + /* 中键 = 返回 demo */ + s_ui_state = UI_STATE_DEMO; + ui_show_demo(); + } + break; + } + } +} + +/* ================================================================ + * UI 创建函数 + * ================================================================ */ + +/** LED 切换回调 (demo 界面触摸按钮) */ +static void btn_cb(lv_event_t *e) +{ + static bool led_on = false; + led_on = !led_on; + hw_led_set(led_on); + if (s_label_btn) + lv_label_set_text(s_label_btn, led_on ? "LED: ON" : "LED: OFF"); +} + +/** 创建 Demo 界面容器 */ +static void create_demo_container(void) +{ + s_cont_demo = lv_obj_create(lv_scr_act()); + lv_obj_set_size(s_cont_demo, lv_pct(100), lv_pct(100)); + lv_obj_set_flex_flow(s_cont_demo, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(s_cont_demo, LV_FLEX_ALIGN_CENTER, + LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_row(s_cont_demo, 8, 0); + lv_obj_clear_flag(s_cont_demo, LV_OBJ_FLAG_SCROLLABLE); + + /* 标题 */ + s_label_title = lv_label_create(s_cont_demo); + lv_label_set_text(s_label_title, "ESP32 DASS2"); + lv_obj_set_style_text_font(s_label_title, &lv_font_montserrat_24, 0); + + /* SD 卡状态 */ + s_label_sd_status = lv_label_create(s_cont_demo); + lv_label_set_text(s_label_sd_status, "SD: --"); + lv_obj_set_style_text_font(s_label_sd_status, &lv_font_montserrat_14, 0); + + /* 电池电压 */ + s_label_bat = lv_label_create(s_cont_demo); + lv_label_set_text(s_label_bat, "Battery: -- mV"); + lv_obj_set_style_text_font(s_label_bat, &lv_font_montserrat_16, 0); + + /* 进度条-模拟电量 */ + s_bar = lv_bar_create(s_cont_demo); + lv_obj_set_size(s_bar, lv_pct(60), 20); + lv_bar_set_range(s_bar, 0, 100); + lv_bar_set_value(s_bar, 50, LV_ANIM_ON); + + /* 按钮 – 切换 LED */ + lv_obj_t *btn = lv_btn_create(s_cont_demo); + lv_obj_set_size(btn, 120, 40); + lv_obj_add_event_cb(btn, btn_cb, LV_EVENT_CLICKED, NULL); + + s_label_btn = lv_label_create(btn); + lv_label_set_text(s_label_btn, "Toggle LED"); + lv_obj_center(s_label_btn); +} + +/** 创建对话框容器 */ +static void create_dialog_container(void) +{ + s_cont_dialog = lv_obj_create(lv_scr_act()); + lv_obj_set_size(s_cont_dialog, lv_pct(100), lv_pct(100)); + lv_obj_set_flex_flow(s_cont_dialog, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(s_cont_dialog, LV_FLEX_ALIGN_CENTER, + LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_clear_flag(s_cont_dialog, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(s_cont_dialog, LV_OBJ_FLAG_HIDDEN); + + s_label_dialog = lv_label_create(s_cont_dialog); + lv_obj_set_style_text_font(s_label_dialog, &lv_font_montserrat_16, 0); + lv_label_set_text(s_label_dialog, "SD卡检测中..."); + lv_obj_set_style_text_align(s_label_dialog, LV_TEXT_ALIGN_CENTER, 0); +} + +/** 创建文件列表容器 */ +static void create_filelist_container(void) +{ + s_cont_files = lv_obj_create(lv_scr_act()); + lv_obj_set_size(s_cont_files, lv_pct(100), lv_pct(100)); + lv_obj_set_flex_flow(s_cont_files, LV_FLEX_FLOW_COLUMN); + lv_obj_clear_flag(s_cont_files, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(s_cont_files, LV_OBJ_FLAG_HIDDEN); + + /* 标题 */ + lv_obj_t *title = lv_label_create(s_cont_files); + lv_label_set_text(title, "SD Card Files"); + lv_obj_set_style_text_font(title, &lv_font_montserrat_16, 0); + + /* 文件列表 */ + s_list_files = lv_list_create(s_cont_files); + lv_obj_set_size(s_list_files, lv_pct(100), lv_pct(65)); + lv_obj_set_style_text_font(s_list_files, &lv_font_montserrat_14, 0); + + /* 页码 + 操作提示 */ + s_label_page = lv_label_create(s_cont_files); + lv_label_set_text(s_label_page, "0/0"); + lv_obj_set_style_text_font(s_label_page, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_align(s_label_page, LV_TEXT_ALIGN_CENTER, 0); + + lv_obj_t *hint = lv_label_create(s_cont_files); + lv_label_set_text(hint, + "[左]上翻 [右]下翻 [中]返回"); + lv_obj_set_style_text_font(hint, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_align(hint, LV_TEXT_ALIGN_CENTER, 0); +} + +/* ================================================================ + * 周期性定时器回调 + * ================================================================ */ + +/** 电池电压更新 – 每 2 秒 */ +static void battery_timer_cb(lv_timer_t *timer) +{ + uint32_t mv = hw_battery_read_mv(); + + if (s_label_bat) { + char buf[32]; + snprintf(buf, sizeof(buf), "Battery: %lu mV", (unsigned long)mv); + lv_label_set_text(s_label_bat, buf); + } + + if (s_bar) { + int pct = (int)((mv - 3000) * 100 / (4200 - 3000)); + if (pct < 0) pct = 0; + if (pct > 100) pct = 100; + lv_bar_set_value(s_bar, pct, LV_ANIM_ON); + } +} + +/** SD 卡检测 + 按钮轮询 – 每 500ms */ +static void sd_and_button_timer_cb(lv_timer_t *timer) +{ + /* --- 按钮轮询 --- */ + uint8_t btn = read_button(); + if (btn != 0) { + handle_button(btn); + } + + /* --- SD 卡状态检测 --- */ + sd_fs_type_t current_fs = sd_card_get_fs_type(); + + /* 更新 demo 界面的 SD 状态标签 */ + if (s_label_sd_status && s_ui_state == UI_STATE_DEMO) { + const char *status; + switch (current_fs) { + case SD_FS_NONE: status = "SD: 无卡"; break; + case SD_FS_FAT32: status = "SD: FAT32 (就绪)"; break; + case SD_FS_OTHER: status = "SD: 非FAT32"; break; + default: status = "SD: ??"; break; + } + lv_label_set_text(s_label_sd_status, status); + } + + /* 只在 demo 状态下弹出对话框 */ + if (s_ui_state != UI_STATE_DEMO) { + s_last_fs_type = current_fs; + return; + } + + /* SD 卡状态变化检测 */ + if (current_fs != s_last_fs_type) { + s_last_fs_type = current_fs; + s_dialog_shown = false; /* 新状态, 允许弹出 */ + } + + if (s_dialog_shown) return; + + /* 根据 SD 卡状态决定是否弹出对话框 */ + if (current_fs == SD_FS_OTHER) { + s_ui_state = UI_STATE_DIALOG; + dialog_set_content(DIALOG_FORMAT); + ui_show_dialog(); + } else if (current_fs == SD_FS_FAT32) { + s_ui_state = UI_STATE_DIALOG; + dialog_set_content(DIALOG_BROWSE); + ui_show_dialog(); + } + /* SD_FS_NONE: 不弹对话框,显示 demo */ +} + +/* ================================================================ + * LVGL 周期性刷新 Task (FreeRTOS) + * ================================================================ */ +static void lvgl_task(void *arg) +{ + ESP_LOGI(TAG, "LVGL task started"); + + while (1) { + lv_timer_handler(); + vTaskDelay(pdMS_TO_TICKS(LVGL_TASK_INTERVAL_MS)); + } +} + +/* ================================================================ + * 公开接口 + * ================================================================ */ +esp_err_t lvgl_demo_start(void) +{ + ESP_LOGI(TAG, "Starting LVGL demo..."); + + /* 1. 初始化 LVGL 核心 */ + lv_init(); + + /* 2. 将 TFT 作为 SPI 设备添加到总线 */ + ESP_ERROR_CHECK(tft_spi_add_device()); + + /* 3. TFT 硬件复位 + 初始化序列 */ + gpio_config_t io_conf = { + .pin_bit_mask = BIT64(TFT_DC_GPIO) | BIT64(TFT_RST_GPIO), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + tft_hard_reset(); + tft_init_sequence(s_st7789_init, ST7789_INIT_LEN); + + /* 4. 分配 LVGL 显示缓存 */ + size_t buf_size = TFT_WIDTH * DISP_BUF_LINES * sizeof(lv_color_t); + s_buf1 = heap_caps_malloc(buf_size, MALLOC_CAP_DMA); + s_buf2 = heap_caps_malloc(buf_size, MALLOC_CAP_DMA); + if (!s_buf1 || !s_buf2) { + ESP_LOGE(TAG, "Failed to allocate LVGL draw buffers"); + return ESP_ERR_NO_MEM; + } + + lv_disp_draw_buf_init(&s_draw_buf, s_buf1, s_buf2, + TFT_WIDTH * DISP_BUF_LINES); + + /* 5. 注册显示驱动 */ + lv_disp_drv_init(&s_disp_drv); + s_disp_drv.hor_res = TFT_WIDTH; + s_disp_drv.ver_res = TFT_HEIGHT; + s_disp_drv.flush_cb = disp_flush; + s_disp_drv.draw_buf = &s_draw_buf; + lv_disp_drv_register(&s_disp_drv); + + /* 6. 创建所有 UI 容器 */ + create_demo_container(); + create_dialog_container(); + create_filelist_container(); + + /* 初始状态: 显示 demo */ + s_ui_state = UI_STATE_DEMO; + ui_show_demo(); + + /* 7. 创建定时器 */ + lv_timer_create(battery_timer_cb, 2000, NULL); /* 电池: 2s */ + lv_timer_create(sd_and_button_timer_cb, 500, NULL); /* SD+按键: 500ms */ + + /* 8. 启动背光 */ + hw_tft_backlight_set(80); + + /* 9. 创建 LVGL 刷新 Task */ + TaskHandle_t task_handle = NULL; + xTaskCreatePinnedToCore(lvgl_task, "lvgl", 4096, NULL, 5, &task_handle, 1); + if (!task_handle) { + ESP_LOGE(TAG, "Failed to create LVGL task"); + return ESP_ERR_NO_MEM; + } + + ESP_LOGI(TAG, "LVGL demo started (TFT %dx%d)", TFT_WIDTH, TFT_HEIGHT); + return ESP_OK; +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..43106bb --- /dev/null +++ b/src/main.c @@ -0,0 +1,118 @@ +/** + * @file main.c + * @brief ESP32 DASS2 – 主程序入口 + * + * 启动流程: + * 1. hw_all_init() – 初始化所有硬件外设 (含 SD 卡) + * 2. lvgl_demo_start() – 启动 LVGL + TFT Demo (含 SD 卡交互 UI) + * 3. sht30_uart_task – 每 30 秒通过 UART2 输出温湿度 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_system.h" +#include "driver/uart.h" + +#include "hw_config.h" +#include "hw_init.h" +#include "lvgl_demo.h" +#include "sht30.h" + +static const char *TAG = "main"; + +/* ================================================================ + * UART2 初始化 (Arduino Serial2 – GPIO16 TX, GPIO17 RX) + * ================================================================ */ +static void uart2_init(void) +{ + uart_config_t uart_cfg = { + .baud_rate = UART2_BAUD_RATE, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .source_clk = UART_SCLK_DEFAULT, + }; + + ESP_ERROR_CHECK(uart_param_config(UART_NUM_2, &uart_cfg)); + ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, + UART2_TX_GPIO, UART2_RX_GPIO, + UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); + ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, 256, 0, 0, NULL, 0)); + + ESP_LOGI(TAG, "UART2 init done (TX=IO%d, RX=IO%d, %d baud)", + UART2_TX_GPIO, UART2_RX_GPIO, UART2_BAUD_RATE); +} + +/* ================================================================ + * SHT30 温湿度采集 Task – 每 30 秒通过 UART2 输出 + * ================================================================ */ +static void sht30_uart_task(void *arg) +{ + ESP_LOGI(TAG, "SHT30-UART task started"); + + /* 初始化 UART2 */ + uart2_init(); + + /* 初始化 SHT30 传感器 */ + esp_err_t ret = sht30_init(); + if (ret != ESP_OK) { + ESP_LOGW(TAG, "SHT30 init failed (0x%x), task will retry on each cycle", ret); + } + + /* 输出启动消息 */ + const char *banner = "\r\n=== ESP32 DASS2 SHT30 ===\r\n"; + uart_write_bytes(UART_NUM_2, banner, strlen(banner)); + + while (1) { + sht30_data_t data; + ret = sht30_read(&data); + + char buf[96]; + if (ret == ESP_OK) { + snprintf(buf, sizeof(buf), + "T=%.1f C H=%.1f %%\r\n", + data.temperature, data.humidity); + } else { + snprintf(buf, sizeof(buf), + "SHT30 read error: 0x%x\r\n", ret); + } + + uart_write_bytes(UART_NUM_2, buf, strlen(buf)); + ESP_LOGI(TAG, "SHT30 -> UART2: %s", buf); + + vTaskDelay(pdMS_TO_TICKS(30000)); + } +} + +/* ================================================================ + * app_main + * ================================================================ */ +void app_main(void) +{ + ESP_LOGI(TAG, "======================================"); + ESP_LOGI(TAG, " ESP32 DASS2 – Starting..."); + ESP_LOGI(TAG, "======================================"); + + /* 1. 初始化所有硬件外设 */ + ESP_ERROR_CHECK(hw_all_init()); + + /* 2. 启动 LVGL + TFT Demo */ + ESP_ERROR_CHECK(lvgl_demo_start()); + + /* 3. 创建 SHT30 + UART2 输出 Task */ + TaskHandle_t sht30_handle = NULL; + xTaskCreatePinnedToCore(sht30_uart_task, "sht30_uart", + 3072, NULL, 3, &sht30_handle, 1); + + ESP_LOGI(TAG, "System ready. Free heap: %lu", + (unsigned long)esp_get_free_heap_size()); + + /* 4. 主循环 – 空闲 */ + while (1) { + vTaskDelay(pdMS_TO_TICKS(1000)); + } +} diff --git a/src/ota_manager.c b/src/ota_manager.c new file mode 100644 index 0000000..e03230f --- /dev/null +++ b/src/ota_manager.c @@ -0,0 +1,399 @@ +/** + * @file ota_manager.c + * @brief 固件 OTA 底层管理器实现 + * + * 基于 ESP-IDF 5.1.x 的 esp_ota_ops API, + * 提供状态机管理、回调触发、LED 反馈。 + * + * 线程安全说明: + * 本模块不含互斥锁,假定只从一个 Task 中调用。 + * 如需多任务并发访问,调用者应自行加锁。 + */ + +#include +#include +#include "esp_log.h" +#include "esp_ota_ops.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "hw_init.h" +#include "ota_manager.h" + +static const char *TAG = "ota_mgr"; + +/* ================================================================ + * 内部状态 + * ================================================================ */ + +static ota_state_t s_state = OTA_STATE_IDLE; +static esp_ota_handle_t s_ota_handle = 0; +static const esp_partition_t *s_update_partition = NULL; +static const esp_partition_t *s_running_partition = NULL; +static size_t s_firmware_size = 0; /* 声明的固件总大小,0 = 未知 */ +static size_t s_bytes_written = 0; + +/* 回调指针 */ +static ota_progress_cb_t s_progress_cb = NULL; +static ota_complete_cb_t s_complete_cb = NULL; +static ota_state_cb_t s_state_cb = NULL; +static ota_error_cb_t s_error_cb = NULL; + +/* ================================================================ + * 内部辅助函数 + * ================================================================ */ + +/** 更新状态机并触发回调 */ +static void change_state(ota_state_t new_state) +{ + if (s_state == new_state) return; + + ota_state_t old = s_state; + s_state = new_state; + + ESP_LOGI(TAG, "State: %d → %d", (int)old, (int)new_state); + + if (s_state_cb) { + s_state_cb(old, new_state); + } +} + +/** 触发错误回调 */ +static void trigger_error(ota_error_t code, const char *msg) +{ + ESP_LOGE(TAG, "Error %d: %s", (int)code, msg); + if (s_error_cb) { + s_error_cb(code, msg); + } +} + +/** 触发进度回调 */ +static void trigger_progress(void) +{ + if (!s_progress_cb) return; + + int percent = 0; + if (s_firmware_size > 0 && s_bytes_written <= s_firmware_size) { + percent = (int)(s_bytes_written * 100 / s_firmware_size); + if (percent > 100) percent = 100; + } + + s_progress_cb(percent, s_bytes_written, s_firmware_size); +} + +/** 触发完成回调 */ +static void trigger_complete(bool success, ota_error_t err) +{ + if (s_complete_cb) { + s_complete_cb(success, err); + } +} + +/** 将 esp_err_t 映射为 ota_error_t 日志字符串 */ +static const char *error_string(ota_error_t code) +{ + switch (code) { + case OTA_ERR_NONE: return "No error"; + case OTA_ERR_NOT_INITIALIZED: return "OTA not initialized"; + case OTA_ERR_ALREADY_IN_PROGRESS: return "OTA already in progress"; + case OTA_ERR_BEGIN_FAILED: return "OTA begin failed"; + case OTA_ERR_WRITE_FAILED: return "OTA write failed"; + case OTA_ERR_END_FAILED: return "OTA end failed"; + case OTA_ERR_ABORT_FAILED: return "OTA abort failed"; + case OTA_ERR_SIZE_MISMATCH: return "Firmware size mismatch"; + case OTA_ERR_NO_OTA_PARTITION: return "No OTA partition available"; + case OTA_ERR_STATE_ERROR: return "Invalid state for operation"; + case OTA_ERR_VERIFY_FAILED: return "Firmware verification failed"; + default: return "Unknown error"; + } +} + +/* ================================================================ + * 回调注册 + * ================================================================ */ + +void ota_set_progress_callback(ota_progress_cb_t cb) { s_progress_cb = cb; } +void ota_set_complete_callback(ota_complete_cb_t cb) { s_complete_cb = cb; } +void ota_set_state_callback(ota_state_cb_t cb) { s_state_cb = cb; } +void ota_set_error_callback(ota_error_cb_t cb) { s_error_cb = cb; } + +void ota_clear_callbacks(void) +{ + s_progress_cb = NULL; + s_complete_cb = NULL; + s_state_cb = NULL; + s_error_cb = NULL; +} + +/* ================================================================ + * 状态查询 + * ================================================================ */ + +ota_state_t ota_get_state(void) { return s_state; } +size_t ota_get_bytes_written(void) { return s_bytes_written; } +size_t ota_get_firmware_size(void) { return s_firmware_size; } + +const esp_partition_t *ota_get_running_partition(void) +{ + if (s_running_partition == NULL) { + s_running_partition = esp_ota_get_running_partition(); + } + return s_running_partition; +} + +const esp_partition_t *ota_get_update_partition(void) +{ + return s_update_partition; +} + +/* ================================================================ + * ota_begin – 开始 OTA 更新 + * ================================================================ */ +esp_err_t ota_begin(size_t firmware_size) +{ + ESP_LOGI(TAG, "ota_begin: size=%zu bytes", firmware_size); + + /* 状态检查 */ + if (s_state != OTA_STATE_IDLE) { + trigger_error(OTA_ERR_ALREADY_IN_PROGRESS, + error_string(OTA_ERR_ALREADY_IN_PROGRESS)); + return OTA_ERR_ALREADY_IN_PROGRESS; + } + + /* 获取运行分区(缓存) */ + s_running_partition = esp_ota_get_running_partition(); + if (s_running_partition == NULL) { + ESP_LOGE(TAG, "Failed to get running partition"); + change_state(OTA_STATE_ERROR); + trigger_error(OTA_ERR_NO_OTA_PARTITION, + error_string(OTA_ERR_NO_OTA_PARTITION)); + return OTA_ERR_NO_OTA_PARTITION; + } + ESP_LOGI(TAG, "Running partition: %s (subtype=%d)", + s_running_partition->label, (int)s_running_partition->subtype); + + /* 获取下一个 OTA 分区 */ + s_update_partition = esp_ota_get_next_update_partition(NULL); + if (s_update_partition == NULL) { + ESP_LOGE(TAG, "No next OTA partition found"); + change_state(OTA_STATE_ERROR); + trigger_error(OTA_ERR_NO_OTA_PARTITION, + error_string(OTA_ERR_NO_OTA_PARTITION)); + return OTA_ERR_NO_OTA_PARTITION; + } + ESP_LOGI(TAG, "Update partition: %s (subtype=%d, size=%" PRIu32 ")", + s_update_partition->label, (int)s_update_partition->subtype, + s_update_partition->size); + + /* 大小检查:固件不能超过目标分区 */ + if (firmware_size > 0 && firmware_size > s_update_partition->size) { + ESP_LOGE(TAG, "Firmware (%zu) exceeds partition size (%" PRIu32 ")", + firmware_size, s_update_partition->size); + change_state(OTA_STATE_ERROR); + trigger_error(OTA_ERR_BEGIN_FAILED, + "Firmware size exceeds partition capacity"); + return OTA_ERR_BEGIN_FAILED; + } + + /* 调用 ESP-IDF OTA begin */ + esp_err_t ret = esp_ota_begin(s_update_partition, firmware_size, &s_ota_handle); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_ota_begin failed: 0x%x", ret); + s_ota_handle = 0; + s_update_partition = NULL; + change_state(OTA_STATE_ERROR); + trigger_error(OTA_ERR_BEGIN_FAILED, error_string(OTA_ERR_BEGIN_FAILED)); + return OTA_ERR_BEGIN_FAILED; + } + + /* 初始化内部计数器 */ + s_firmware_size = firmware_size; + s_bytes_written = 0; + + /* LED 亮起,指示 OTA 进行中 */ + hw_led_set(true); + + change_state(OTA_STATE_IN_PROGRESS); + + /* 触发初始进度(0%) */ + trigger_progress(); + + ESP_LOGI(TAG, "OTA begin OK, ready to receive data"); + return ESP_OK; +} + +/* ================================================================ + * ota_write – 写入固件数据块 + * ================================================================ */ +esp_err_t ota_write(const uint8_t *data, size_t len) +{ + if (data == NULL || len == 0) { + return ESP_ERR_INVALID_ARG; + } + + /* 状态检查 */ + if (s_state != OTA_STATE_IN_PROGRESS) { + trigger_error(OTA_ERR_STATE_ERROR, error_string(OTA_ERR_STATE_ERROR)); + return OTA_ERR_STATE_ERROR; + } + + /* 大小检查(仅在声明了固件大小时校验) */ + if (s_firmware_size > 0 && (s_bytes_written + len) > s_firmware_size) { + ESP_LOGE(TAG, "Size overflow: %zu + %zu > %zu", + s_bytes_written, len, s_firmware_size); + trigger_error(OTA_ERR_SIZE_MISMATCH, + error_string(OTA_ERR_SIZE_MISMATCH)); + return OTA_ERR_SIZE_MISMATCH; + } + + /* 写入 flash */ + esp_err_t ret = esp_ota_write(s_ota_handle, data, len); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_ota_write failed: 0x%x", ret); + trigger_error(OTA_ERR_WRITE_FAILED, + error_string(OTA_ERR_WRITE_FAILED)); + return OTA_ERR_WRITE_FAILED; + } + + s_bytes_written += len; + ESP_LOGD(TAG, "Write %zu bytes, total %zu/%zu", + len, s_bytes_written, s_firmware_size); + + /* 触发进度回调 */ + trigger_progress(); + + /* 写入时的 LED 反馈 —— 短暂翻转 */ + hw_led_set(false); + vTaskDelay(pdMS_TO_TICKS(2)); + hw_led_set(true); + + return ESP_OK; +} + +/* ================================================================ + * ota_end – 完成 OTA 更新 + * ================================================================ */ +esp_err_t ota_end(void) +{ + ESP_LOGI(TAG, "ota_end: finalizing..."); + + /* 状态检查 */ + if (s_state != OTA_STATE_IN_PROGRESS) { + trigger_error(OTA_ERR_STATE_ERROR, error_string(OTA_ERR_STATE_ERROR)); + return OTA_ERR_STATE_ERROR; + } + + /* 大小校验 */ + if (s_firmware_size > 0 && s_bytes_written != s_firmware_size) { + ESP_LOGE(TAG, "Size mismatch: written=%zu, declared=%zu", + s_bytes_written, s_firmware_size); + trigger_error(OTA_ERR_SIZE_MISMATCH, + error_string(OTA_ERR_SIZE_MISMATCH)); + change_state(OTA_STATE_ERROR); + hw_led_set(false); + return OTA_ERR_SIZE_MISMATCH; + } + + change_state(OTA_STATE_VERIFYING); + + /* 调用 ESP-IDF OTA end(内部校验镜像头、SHA256 等) */ + esp_err_t ret = esp_ota_end(s_ota_handle); + s_ota_handle = 0; + + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_ota_end failed: 0x%x", ret); + trigger_error(OTA_ERR_END_FAILED, error_string(OTA_ERR_END_FAILED)); + change_state(OTA_STATE_ERROR); + hw_led_set(false); + s_update_partition = NULL; + return OTA_ERR_END_FAILED; + } + + /* 设置启动分区 */ + ret = esp_ota_set_boot_partition(s_update_partition); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_ota_set_boot_partition failed: 0x%x", ret); + trigger_error(OTA_ERR_END_FAILED, + "Failed to set boot partition"); + change_state(OTA_STATE_ERROR); + hw_led_set(false); + s_update_partition = NULL; + return OTA_ERR_END_FAILED; + } + + /* 验证启动分区切换是否生效 */ + const esp_partition_t *new_boot = esp_ota_get_boot_partition(); + if (new_boot != s_update_partition) { + ESP_LOGW(TAG, "Boot partition not updated as expected"); + trigger_error(OTA_ERR_VERIFY_FAILED, + "Boot partition switch verification failed"); + change_state(OTA_STATE_ERROR); + hw_led_set(false); + s_update_partition = NULL; + return OTA_ERR_VERIFY_FAILED; + } + + ESP_LOGI(TAG, "OTA complete! New boot partition: %s", s_update_partition->label); + + /* LED 常亮表示更新成功 */ + hw_led_set(true); + + change_state(OTA_STATE_COMPLETE); + + /* 触发进度 100% */ + s_bytes_written = s_firmware_size; + trigger_progress(); + + /* 触发完成回调 */ + trigger_complete(true, OTA_ERR_NONE); + + /* 不清除 s_update_partition,便于上层读取信息 */ + + return ESP_OK; +} + +/* ================================================================ + * ota_abort – 中止 OTA 更新 + * ================================================================ */ +esp_err_t ota_abort(void) +{ + ESP_LOGI(TAG, "ota_abort: aborting..."); + + /* IDLE 状态下 abort 是合法的空操作 */ + if (s_state == OTA_STATE_IDLE) { + ESP_LOGI(TAG, "Already idle, nothing to abort"); + return ESP_OK; + } + + /* COMPLETE 状态下 abort 无意义 */ + if (s_state == OTA_STATE_COMPLETE) { + ESP_LOGW(TAG, "OTA already complete, cannot abort"); + return OTA_ERR_STATE_ERROR; + } + + /* 调用 ESP-IDF abort(若句柄仍有效) */ + if (s_ota_handle != 0) { + esp_err_t ret = esp_ota_abort(s_ota_handle); + s_ota_handle = 0; + if (ret != ESP_OK) { + ESP_LOGW(TAG, "esp_ota_abort warning: 0x%x", ret); + } + } + + /* 清理内部状态 */ + s_update_partition = NULL; + s_firmware_size = 0; + s_bytes_written = 0; + + /* LED 关闭 */ + hw_led_set(false); + + /* 触发完成回调(失败) */ + trigger_complete(false, OTA_ERR_ABORT_FAILED); + + change_state(OTA_STATE_IDLE); + + ESP_LOGI(TAG, "OTA aborted, back to idle"); + return ESP_OK; +} diff --git a/src/sd_card.c b/src/sd_card.c new file mode 100644 index 0000000..b7111f3 --- /dev/null +++ b/src/sd_card.c @@ -0,0 +1,272 @@ +/** + * @file sd_card.c + * @brief SD 卡驱动实现 (SDMMC 4-bit 模式 + FATFS) + * + * 提供 SD 卡挂载/卸载/格式化/文件枚举/文件读取。 + * 挂载点固定为 /sdcard。 + * 框架: ESP-IDF 5.1.x + */ + +#include +#include +#include +#include +#include "esp_log.h" +#include "driver/gpio.h" +#include "driver/sdmmc_host.h" +#include "sdmmc_cmd.h" +#include "esp_vfs_fat.h" + +#include "hw_config.h" +#include "sd_card.h" + +static const char *TAG = "sd_card"; + +/* ================================================================ + * 内部状态 + * ================================================================ */ +static sdmmc_card_t *s_card = NULL; +static sd_fs_type_t s_fs_type = SD_FS_NONE; +static const char *SD_MOUNT_POINT = "/sdcard"; + +/* ================================================================ + * 卡检测 + * ================================================================ */ +bool sd_card_is_inserted(void) +{ + return gpio_get_level(SDMMC_CD_GPIO) == 0; /* 低电平 = 卡插入 */ +} + +/* ================================================================ + * 辅助 – 构建 slot 配置 (避免重复代码) + * ================================================================ */ +static void fill_slot_config(sdmmc_slot_config_t *slot) +{ + *slot = (sdmmc_slot_config_t)SDMMC_SLOT_CONFIG_DEFAULT(); + slot->clk = SDMMC_CLK_GPIO; + slot->cmd = SDMMC_CMD_GPIO; + slot->d0 = SDMMC_D0_GPIO; + slot->d1 = SDMMC_D1_GPIO; + slot->d2 = SDMMC_D2_GPIO; + slot->d3 = SDMMC_D3_GPIO; + slot->cd = SDMMC_CD_GPIO; + slot->flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP; +} + +/* ================================================================ + * 构建完整路径 + * ================================================================ */ +static void make_path(char *out, size_t size, const char *path) +{ + if (path[0] == '/') { + snprintf(out, size, "%s%s", SD_MOUNT_POINT, path); + } else { + snprintf(out, size, "%s/%s", SD_MOUNT_POINT, path); + } +} + +/* ================================================================ + * 挂载 + * ================================================================ */ +esp_err_t sd_card_init(void) +{ + /* 如果已经挂载,先卸载 */ + if (s_card != NULL || s_fs_type != SD_FS_NONE) { + sd_card_deinit(); + } + + if (!sd_card_is_inserted()) { + s_fs_type = SD_FS_NONE; + ESP_LOGI(TAG, "SD card not inserted"); + return ESP_ERR_NOT_FOUND; + } + + ESP_LOGI(TAG, "SD card detected, mounting..."); + + sdmmc_host_t host = SDMMC_HOST_DEFAULT(); + host.flags = SDMMC_HOST_FLAG_4BIT; + host.max_freq_khz = SDMMC_FREQ_DEFAULT; + + sdmmc_slot_config_t slot; + fill_slot_config(&slot); + + esp_vfs_fat_mount_config_t mount_cfg = { + .format_if_mount_failed = false, + .max_files = 5, + .allocation_unit_size = 16 * 1024, + }; + + sdmmc_card_t *card = NULL; + esp_err_t ret = esp_vfs_fat_sdmmc_mount(SD_MOUNT_POINT, &host, &slot, + &mount_cfg, &card); + + if (ret == ESP_OK) { + s_card = card; + s_fs_type = SD_FS_FAT32; + ESP_LOGI(TAG, "Mounted at %s (FAT32)", SD_MOUNT_POINT); + return ESP_OK; + } + + /* 挂载失败但 CD 显示有卡 → 文件系统不是 FAT32 + * (esp_vfs_fat_sdmmc_mount 失败后 host 已被内部清理, 无需额外操作) */ + ESP_LOGW(TAG, "Mount failed (err 0x%x), card present but not FAT32", ret); + s_fs_type = SD_FS_OTHER; + return ESP_FAIL; +} + +/* ================================================================ + * 卸载 + * ================================================================ */ +esp_err_t sd_card_deinit(void) +{ + if (s_card != NULL) { + esp_err_t ret = esp_vfs_fat_sdcard_unmount(SD_MOUNT_POINT, s_card); + s_card = NULL; + if (ret != ESP_OK) { + ESP_LOGW(TAG, "Unmount warning: 0x%x", ret); + } + } + s_fs_type = SD_FS_NONE; + ESP_LOGI(TAG, "Deinitialized"); + return ESP_OK; +} + +/* ================================================================ + * 状态查询 + * ================================================================ */ +sd_fs_type_t sd_card_get_fs_type(void) +{ + return s_fs_type; +} + +/* ================================================================ + * 格式化 + * + * 使用 esp_vfs_fat_sdmmc_mount 的 format_if_mount_failed 选项: + * 挂载失败时自动格式化为 FAT32 然后重新挂载。 + * 避免直接调用 sdmmc_card_init (该 API 在不同 ESP-IDF 版本中签名不同)。 + * ================================================================ */ +esp_err_t sd_card_format(void) +{ + ESP_LOGI(TAG, "Formatting as FAT32..."); + + if (s_card != NULL) { + esp_vfs_fat_sdcard_unmount(SD_MOUNT_POINT, s_card); + s_card = NULL; + } + s_fs_type = SD_FS_NONE; + + sdmmc_host_t host = SDMMC_HOST_DEFAULT(); + host.flags = SDMMC_HOST_FLAG_4BIT; + host.max_freq_khz = SDMMC_FREQ_DEFAULT; + + sdmmc_slot_config_t slot; + fill_slot_config(&slot); + + esp_vfs_fat_mount_config_t mount_cfg = { + .format_if_mount_failed = true, /* 挂载失败时自动格式化 */ + .max_files = 5, + .allocation_unit_size = 16 * 1024, + }; + + sdmmc_card_t *card = NULL; + esp_err_t ret = esp_vfs_fat_sdmmc_mount(SD_MOUNT_POINT, &host, &slot, + &mount_cfg, &card); + if (ret == ESP_OK) { + s_card = card; + s_fs_type = SD_FS_FAT32; + ESP_LOGI(TAG, "Format/Mount OK at %s", SD_MOUNT_POINT); + } else { + ESP_LOGE(TAG, "Format/Mount failed: 0x%x", ret); + s_fs_type = SD_FS_NONE; + } + + return ret; +} + +/* ================================================================ + * 文件枚举 + * ================================================================ */ +int sd_card_list_files(sd_file_info_t *list, int max_files) +{ + if (s_fs_type != SD_FS_FAT32 || list == NULL || max_files <= 0) return 0; + + DIR *dir = opendir(SD_MOUNT_POINT); + if (!dir) { ESP_LOGW(TAG, "opendir failed"); return 0; } + + int count = 0; + struct dirent *entry; + while ((entry = readdir(dir)) != NULL && count < max_files) { + if (strcmp(entry->d_name, ".") == 0 || + strcmp(entry->d_name, "..") == 0) continue; + + strncpy(list[count].name, entry->d_name, sizeof(list[count].name) - 1); + list[count].name[sizeof(list[count].name) - 1] = '\0'; + + char full[256]; + make_path(full, sizeof(full), entry->d_name); + + struct stat st; + if (stat(full, &st) == 0) { + list[count].size = st.st_size; + list[count].is_dir = S_ISDIR(st.st_mode); + } else { + list[count].size = 0; + list[count].is_dir = (entry->d_type == DT_DIR); + } + count++; + } + closedir(dir); + ESP_LOGI(TAG, "Listed %d files", count); + return count; +} + +/* ================================================================ + * 文件读取 + * ================================================================ */ + +esp_err_t sd_card_read_text(const char *path, char *buf, size_t max_len) +{ + if (s_fs_type != SD_FS_FAT32 || path == NULL || buf == NULL || max_len == 0) + return ESP_ERR_INVALID_ARG; + + char full[256]; + make_path(full, sizeof(full), path); + + FILE *fp = fopen(full, "r"); + if (!fp) { + ESP_LOGW(TAG, "fopen(%s) failed", full); + return ESP_ERR_NOT_FOUND; + } + + size_t read = fread(buf, 1, max_len - 1, fp); + buf[read] = '\0'; + fclose(fp); + + ESP_LOGI(TAG, "Read text: %s (%u bytes)", path, (unsigned)read); + return ESP_OK; +} + +esp_err_t sd_card_read_image(const char *path, + uint8_t *buf, size_t max_len, + size_t *out_len) +{ + if (s_fs_type != SD_FS_FAT32 || path == NULL || buf == NULL || + max_len == 0 || out_len == NULL) + return ESP_ERR_INVALID_ARG; + + char full[256]; + make_path(full, sizeof(full), path); + + FILE *fp = fopen(full, "rb"); + if (!fp) { + ESP_LOGW(TAG, "fopen(%s) failed", full); + return ESP_ERR_NOT_FOUND; + } + + *out_len = fread(buf, 1, max_len, fp); + fclose(fp); + + ESP_LOGI(TAG, "Read image: %s (%u bytes)", path, (unsigned)(*out_len)); + return ESP_OK; +} diff --git a/src/sht30.c b/src/sht30.c new file mode 100644 index 0000000..8cb1f98 --- /dev/null +++ b/src/sht30.c @@ -0,0 +1,122 @@ +/** + * @file sht30.c + * @brief SHT30 温湿度传感器驱动实现 (I2C) + * + * 通信协议: + * 1. 发送 2 字节命令 0x2C 0x06 (单次测量, 高重复性, 时钟拉伸) + * 2. 等待测量完成 (时钟拉伸由传感器控制, 约 15 ms) + * 3. 读取 6 字节: [T_MSB, T_LSB, T_CRC, H_MSB, H_LSB, H_CRC] + * 4. CRC-8 校验 (多项式 0x31, 初始值 0xFF) + * 5. 转换为物理量 + * + * 框架: ESP-IDF 5.1.x + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "driver/i2c.h" + +#include "hw_config.h" +#include "sht30.h" + +static const char *TAG = "sht30"; + +/* ================================================================ + * CRC-8 (多项式 0x31, 初始值 0xFF) + * SHT30 数据手册 §4.12 Checksum Calculation + * ================================================================ */ +static uint8_t sht30_crc8(const uint8_t *data, size_t len) +{ + uint8_t crc = 0xFF; + for (size_t i = 0; i < len; i++) { + crc ^= data[i]; + for (int b = 0; b < 8; b++) { + if (crc & 0x80) + crc = (uint8_t)((crc << 1) ^ 0x31); + else + crc <<= 1; + } + } + return crc; +} + +/* ================================================================ + * 初始化 + * ================================================================ */ +esp_err_t sht30_init(void) +{ + /* 发送软复位命令, 将传感器置于已知状态 */ + uint8_t cmd[2] = {0x30, 0xA2}; + esp_err_t ret = i2c_master_write_to_device(I2C_PORT, SHT30_I2C_ADDR, + cmd, sizeof(cmd), + pdMS_TO_TICKS(100)); + if (ret != ESP_OK) { + ESP_LOGW(TAG, "Soft reset failed (0x%x), sensor may not be present", ret); + return ret; + } + + vTaskDelay(pdMS_TO_TICKS(2)); /* 复位后等待 */ + ESP_LOGI(TAG, "SHT30 initialized (addr=0x%02X)", SHT30_I2C_ADDR); + return ESP_OK; +} + +/* ================================================================ + * 单次测量 + * ================================================================ */ +esp_err_t sht30_read(sht30_data_t *data) +{ + if (data == NULL) return ESP_ERR_INVALID_ARG; + + /* 1. 发送测量命令: 高重复性 + 时钟拉伸 */ + uint8_t cmd[2] = {0x2C, 0x06}; + esp_err_t ret = i2c_master_write_to_device(I2C_PORT, SHT30_I2C_ADDR, + cmd, sizeof(cmd), + pdMS_TO_TICKS(100)); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Write command failed: 0x%x", ret); + return ret; + } + + /* 2. 等待测量完成 (时钟拉伸模式下传感器会拉低 SCL, + * 这里额外等待确保数据就绪, 约 15 ms) */ + vTaskDelay(pdMS_TO_TICKS(20)); + + /* 3. 读取 6 字节原始数据 */ + uint8_t raw[6] = {0}; + ret = i2c_master_read_from_device(I2C_PORT, SHT30_I2C_ADDR, + raw, sizeof(raw), + pdMS_TO_TICKS(100)); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Read data failed: 0x%x", ret); + return ret; + } + + /* 4. CRC-8 校验 */ + if (sht30_crc8(raw, 2) != raw[2]) { + ESP_LOGE(TAG, "Temperature CRC mismatch"); + return ESP_ERR_INVALID_CRC; + } + if (sht30_crc8(raw + 3, 2) != raw[5]) { + ESP_LOGE(TAG, "Humidity CRC mismatch"); + return ESP_ERR_INVALID_CRC; + } + + /* 5. 转换为物理量 + * T[°C] = -45 + 175 * (S_T / (2^16 - 1)) + * RH[%] = 100 * (S_H / (2^16 - 1)) + */ + uint16_t raw_t = ((uint16_t)raw[0] << 8) | raw[1]; + uint16_t raw_h = ((uint16_t)raw[3] << 8) | raw[4]; + + data->temperature = -45.0f + 175.0f * ((float)raw_t / 65535.0f); + data->humidity = 100.0f * ((float)raw_h / 65535.0f); + + if (data->humidity > 100.0f) data->humidity = 100.0f; + if (data->humidity < 0.0f) data->humidity = 0.0f; + + ESP_LOGD(TAG, "T=%.1f C H=%.1f %%", data->temperature, data->humidity); + return ESP_OK; +} diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html