M5Stack Tab5 编译M5Tab5-UserDemo完整记录
【前言】
昨开我实现lvgl的完整移植,但是摄像头一直没有驱动好,在官方的M5Tab5-UserDemo上是可以实现的。因此编译这个demo非常有必要。经过一天的偿试终于给编译通过,并跑起来了,特此记录。
适用版本:M5Tab5-UserDemo(github.com/m5stack/M5Tab5-UserDemo) 硬件:M5Stack Tab5(ESP32-P4 主控 + ESP32-C6 无线) IDF 版本:ESP-IDF v5.4.2(实测也兼容 v5.5.3) 编写日期:2026-06-21(项目调试踩坑实录)
目录
1. 硬件环境准备
1.1 板子
M5Stack Tab5 主控板(型号 K145)
主控:ESP32-P4NRW32(RISC-V 双核 360MHz)
无线协处理器:ESP32-C6-MINI-1U(Wi-Fi 6 / BLE 5)
Flash:16MB Octal
PSRAM:32MB Octal(200MHz)
屏幕:5 寸 MIPI-DSI IPS 触控,1280x720
板载摄像头:SC2356 MIPI-CSI(在项目中以 SC202CS 驱动运行)
音频:ES8388 DAC + ES7210 ADC(四麦克风阵列)
传感器:BMI270(IMU)、INA226(电池监测)、RX8130(RTC)
1.2 USB 连接
用 USB-C 数据线把 Tab5 接电脑
串口驱动:Tab5 内置 USB-Serial-JTAG,免驱(CH340/CP210x 等外置 USB 转串芯片不需要)
在 Windows 设备管理器里找到串口(比如 COM3、COM7),烧录/监控时用 idf.py -p COMx flash monitor
1.3 摄像头注意事项
板子出厂就有 SC2356 摄像头
不需要外接任何东西
摄像头通过 io_expander (PI4IOE5V6408) 上电,所以摄像头初始化必须在 IO Expander 初始化之后
2. 软件环境准备
2.1 Windows 安装 ESP-IDF
推荐用 ESP-IDF Windows Installer(C:\Espressif\tools\idf-exe\1.0.3\idf.ps1),它会注册一个 PowerShell 命令:
# 进入项目目录 cd D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5 # 激活 ESP-IDF(每次新开 PowerShell 都要执行) & 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
激活后 idf.py、esptool.py、xtensa-esp-elf-gdb 等命令自动可用。
2.2 ESP-IDF 路径要求
| C:\esp\v5.4.2\esp-idf | ESP-IDF 源码(项目要求的版本) |
| C:\Espressif\tools | ESP-IDF 工具链(ccache、cmake、esp-clang、python venv 等) |
| C:\Espressif\tools\python\v5.4.2\venv\Scripts\python.exe | IDF Python 解释器 |
| C:\Espressif\tools\idf-exe\1.0.3\idf.ps1 | PowerShell 激活脚本 |
2.3 项目要求的 IDF 版本
# platforms/tab5/main/idf_component.yml idf: '>=5.3'
实测可用 IDF v5.4.2(项目原始指定)或 v5.5.3(已验证)。
3. 下载项目与依赖
3.1 下载主项目
cd D:\ git clone --depth 1 https://github.com/m5stack/M5Tab5-UserDemo.git cd M5Tab5-UserDemo
或下载 zip 解压到 D:\M5_Tab5\M5Tab5-UserDemo。
3.2 拉依赖子模块
项目依赖 4 个外部组件,通过 fetch_repos.py 拉取(脚本读取 repos.json):
mooncake(GUI 框架)
mooncake_log(日志)
lvgl(LVGL v9.2.2)
smooth_ui_toolkit
cd D:\M5_Tab5\M5Tab5-UserDemo python fetch_repos.py
依赖会被拉到 dependencies/ 目录:
dependencies/ lvgl/ mooncake/ mooncake_log/ smooth_ui_toolkit/
注意:lvgl 仓库体积大(~50MB),网络不稳定时 git clone 可能超时,可以手动 git clone 后放到该位置。
3.3 目录结构
M5Tab5-UserDemo/ app/ # 桌面 app(launcher、启动动画等) dependencies/ # fetch_repos.py 拉的子组件 platforms/ desktop/ # 桌面模拟构建 tab5/ # 真机编译目录 ← 重点 components/ # 项目自带 ESP-IDF components esp_cam_sensor/ # 摄像头驱动(含 SC202CS = SC2356) esp_video/ # V4L2 视频子系统 esp_ipa/ # 图像处理算法 esp_sccb_intf/ # SCCB 总线 esp_lcd_st7121/ # LCD 驱动 espressif__esp_lvgl_port/ imlib/ # 图像处理库 m5stack_tab5/ # BSP sensor_bmi270/ # IMU sensor_icm20602/ power_monitor_ina226/ keypad_scanner_tca8418/ ... # 还有 wifi_c6_fw/(SDIO slave firmware) main/ # 应用主程序 app_main.cpp hal/ # HAL 抽象层 CMakeLists.txt partitions.csv sdkconfig # 已生成的配置(改这里 → build) sdkconfig.defaults # 默认配置(改这里 → 全员共享) dependencies.lock # component manager 锁文件 fetch_repos.py
4. 关键编译参数修改
这部分是项目能在 ESP-IDF v5.5.3 + ESP32-P4 + ESP32-C6(SDIO2)板上跑通的核心改动。直接编辑 platforms/tab5/sdkconfig.defaults 把以下行追加到文件末尾(或编辑 sdkconfig):
4.1 修 I2C legacy driver 冲突(IDF v5.5+ 必须)
# 跳过新旧 I2C driver 冲突检查 CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y # 关闭 ESP Codec Dev 旧 I2C 兼容 # CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE is not set
作用:不修这个会启动后立即 abort:E i2c: CONFLICT! driver_ng is not allowed to be used with this old driver
4.2 选对音频 Codec(Tab5 板载硬件决定)
Tab5 用 ES8388(喇叭 DAC) + ES7210(麦克风 ADC),其它一律关闭:
# Tab5 实际 codec (audio player + codec_dev 探测用) CONFIG_CODEC_ES8388_SUPPORT=y CONFIG_CODEC_ES7210_SUPPORT=y # 其它 codec 关闭(节省 flash,避免误识别) # CONFIG_CODEC_ES8311_SUPPORT is not set # CONFIG_CODEC_ES7243_SUPPORT is not set # CONFIG_CODEC_ES7243E_SUPPORT is not set # CONFIG_CODEC_ES8156_SUPPORT is not set # CONFIG_CODEC_AW88298_SUPPORT is not set # CONFIG_CODEC_ES8374_SUPPORT is not set # CONFIG_CODEC_TAS5805M_SUPPORT is not set
验证方法:看 m5stack_tab5.c 里实际调用了哪些 *_codec_new():
// components/m5stack_tab5/m5stack_tab5.c:822 const audio_codec_if_t* es8388_dev = es8388_codec_new(&es8388_cfg); // line 860 const audio_codec_if_t* es7210_dev = es7210_codec_new(&es7210_cfg);
4.3 SDIO 引脚(关键:Tab5 用 SDIO2 不用 SDIO1)
ESP-Hosted 用 SDIO 接 ESP32-C6,Tab5 板子的引脚跟 ESP32-P4 Function EV-Board 不一样:
| CLK | 18 | 12 |
| CMD | 19 | 13 |
| D0 | 14 | 11 |
| D1 | 15 | 10 |
| D2 | 16 | 9 |
| D3 | 17 | 8 |
| RESET | 54 | 15 |
CONFIG_ESP_HOSTED_SDIO_PIN_CLK=12 CONFIG_ESP_HOSTED_SDIO_PIN_CMD=13 CONFIG_ESP_HOSTED_SDIO_PIN_D0=11 CONFIG_ESP_HOSTED_SDIO_PIN_D1=10 CONFIG_ESP_HOSTED_SDIO_PIN_D2=9 CONFIG_ESP_HOSTED_SDIO_PIN_D3=8 CONFIG_ESP_HOSTED_GPIO_SLAVE_RESET_SLAVE=15
不改会出现的错误:
E sdmmc_common: sdmmc_init_ocr: send_op_cond (1) returned 0x107 HINT: Please reboot the board and then try again
4.4 ESP-Hosted slave target(必须是 ESP32-C6)
CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET="esp32c6" CONFIG_SLAVE_IDF_TARGET_ESP32C6=y # CONFIG_SLAVE_IDF_TARGET_ESP32 is not set CONFIG_SLAVE_IDF_TARGET_ARCH_RISCV=y # CONFIG_SLAVE_IDF_TARGET_ARCH_XTENSA is not set
不改会出现的错误:
E transport: Identified slave [esp32c6] != Expected [esp32] run 'idf.py menuconfig' at host to reselect the slave? Aborting..
4.5 启用 SC202CS sensor 驱动(支持 SC2356)
重要发现:Tab5 板载摄像头是 SC2356,但 Espressif 没有独立的 SC2356 driver。SC2356 在驱动上等同 SC202CS,README.md 也明确写了:
| SC202CS(SC2356) | 1600 x 1200 | MIPI | 8/10-bit Raw RGB data | 1/5.1" |
# Tab5 板载 SC2356 用 SC202CS 驱动 CONFIG_CAMERA_SC202CS=y
不改会出现的错误:
============= video init ============== ============= video open ============== E camera: Open video failed E camera: video cam open failed Guru Meditation Error: Core 1 panic'ed (Instruction access fault)
4.6 完整 sdkconfig.defaults 改动(汇总)
# 在 platforms/tab5/sdkconfig.defaults 末尾追加 # --- 1. I2C legacy conflict skip --- CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y # CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE is not set # --- 2. Codec 选择 --- CONFIG_CODEC_ES8388_SUPPORT=y CONFIG_CODEC_ES7210_SUPPORT=y # CONFIG_CODEC_ES8311_SUPPORT is not set # CONFIG_CODEC_ES7243_SUPPORT is not set # CONFIG_CODEC_ES7243E_SUPPORT is not set # CONFIG_CODEC_ES8156_SUPPORT is not set # CONFIG_CODEC_AW88298_SUPPORT is not set # CONFIG_CODEC_ES8374_SUPPORT is not set # CONFIG_CODEC_TAS5805M_SUPPORT is not set # --- 3. SDIO 引脚 (Tab5 实际) --- CONFIG_ESP_HOSTED_SDIO_PIN_CLK=12 CONFIG_ESP_HOSTED_SDIO_PIN_CMD=13 CONFIG_ESP_HOSTED_SDIO_PIN_D0=11 CONFIG_ESP_HOSTED_SDIO_PIN_D1=10 CONFIG_ESP_HOSTED_SDIO_PIN_D2=9 CONFIG_ESP_HOSTED_SDIO_PIN_D3=8 CONFIG_ESP_HOSTED_GPIO_SLAVE_RESET_SLAVE=15 # --- 4. ESP-Hosted slave target --- CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET="esp32c6" CONFIG_SLAVE_IDF_TARGET_ESP32C6=y # CONFIG_SLAVE_IDF_TARGET_ESP32 is not set # CONFIG_SLAVE_IDF_TARGET_ARCH_XTENSA is not set CONFIG_SLAVE_IDF_TARGET_ARCH_RISCV=y # --- 5. 摄像头 sensor (SC2356 = SC202CS) --- CONFIG_CAMERA_SC202CS=y
重要:改完 sdkconfig.defaults 后,不要跑 idf.py menuconfig 或 idf.py reconfigure —— 它们会用 Kconfig 的 default 重算,可能覆盖掉上述手动配置。直接 idf.py build 即可。
5. 编译
5.1 激活 ESP-IDF 环境
cd D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5 & 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
提示符变成 (venv) PS D:...\tab5 即激活成功。
5.2 第一次编译(或改了 sdkconfig.defaults 后)
# 第一次必须清 build,否则 set-target 会报 "build/ 存在但不是 CMake build" Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue idf.py set-target esp32p4 idf.py build
首次编译耗时 10-30 分钟(LVGL + mooncake + ESP-Video + 全部 sensor 都进二进制)。
5.3 增量编译(只改了代码,没改 SDK config)
idf.py build
5.4 编译成功标志
输出最后会看到类似:
Project build complete. To flash, run: idf.py -p COMx flash or idf.py -p COMx -b 460800 flash
5.5 编译产物
build/m5stack_tab5.bin —— 主固件
build/m5stack_tab5.elf —— ELF 调试文件
build/bootloader/bootloader.bin —— 2nd stage bootloader
build/partition_table/partition-table.bin —— 分区表
build/flash_project_args —— idf.py flash 自动读这个文件决定烧哪些 bin
5.6 ESP32-C6 WiFi slave firmware(板载已烧,通常不用动)
ESP-Hosted 需要 ESP32-C6 上有匹配的 SDIO slave firmware,项目自带在:
platforms/tab5/wifi_c6_fw/ ESP32C6-WiFi-SDIO-Interface-V1.4.1-96bea3a_0x0.bin flash.sh
板子出厂时这个 firmware 已经烧好,不需要重新烧。如果遇到 SDIO 通信故障排查,可以重烧(需要让 C6 进 download mode,Tab5 板上没有专用按钮)。
6. 烧录与运行
6.1 烧录 + 打开串口监视
idf.py -p COMx flash monitor
-p COMx 改成实际的串口号(设备管理器里查看)
flash 烧录,monitor 烧完后启动串口监视器(看到 boot log + 后续运行 log)
退出 monitor 按 Ctrl + ]
6.2 启动后正常 boot log 关键节点
I (832) boot: Loaded app from partition at offset 0x10000 I (1061) esp_psram: Found 32MB PSRAM device I (1062) esp_psram: Speed: 200MHz I (1676) main_task: Started on CPU0 [info] [hal] init [info] [hal] camera init [info] [hal] i2c init [info] [hal] io expander init [info] [hal] codec init I (2062) ES7210: Work in Slave mode I (2147) ES8388: Start on mode:2 [info] [hal] imu init I (2441) bmi270: Set sensors odr and range [info] [hal] display init I (3873) M5STACK_TAB5: ST7123 Display initialized with resolution 720x1280 [info] [hal] wifi init sdio_wrapper: GPIOs: CLK[12] CMD[13] D0[11] D1[10] D2[9] D3[8] Slave_Reset[15] I (7789) transport: Identified slave [esp32c6] wifi: Wi-Fi AP started. SSID:M5Tab5-UserDemo-WiFi esp_netif_lwip: DHCP server started on interface WIFI_AP_DEF with IP: 192.168.4.1
这些都出现 = 系统启动正常。AP 模式开启后,你可以用手机连 M5Tab5-UserDemo-WiFi(无密码)测 wifi。
7. 常见编译问题
7.1 idf.py set-target 报错 "build/ directory exists but not CMake build"
Directory 'D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\build' doesn't seem to be a CMake build directory. Refusing to automatically delete files in this directory. Delete the directory manually to 'clean' it.
解决:
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue idf.py set-target esp32p4
7.2 fetch_repos.py 时 lvgl clone 超时
fatal: unable to access 'https://github.com/lvgl/lvgl.git/': Failed to connect
解决:多次重试,或者手动 git clone 后放到 dependencies/lvgl/:
git clone --depth 1 -b v9.2.2 https://github.com/lvgl/lvgl.git mv lvgl dependencies/lvgl
7.3 编译时 I2C driver conflict(没修 4.1)
参考 §4.1,加 CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y。
7.4 编译时找不到 esp_video / esp_cam_sensor
这两个 component 是项目自带,如果 git pull 时被覆盖,重新 clone 项目即可。
7.5 idf.py menuconfig 后改动丢失
menuconfig 会按 Kconfig 的 default 重算所有未"显式 set"的值。如果你手动改了 sdkconfig 又跑了 menuconfig,改动可能被覆盖。
解决:重要改动写到 sdkconfig.defaults(持久化),并避免不必要地跑 menuconfig。
8. 常见运行问题
8.1 启动后 Core 1 panic + I2C conflict
参考 §4.1。
8.2 SDIO timeout 0x107
参考 §4.3(SDIO 引脚)和 §4.4(slave target)。也可能是 C6 slave firmware 损坏,但 Tab5 出厂不会坏。
8.3 Camera App 打开后崩
参考 §4.5(SC202CS sensor)。
8.4 WiFi 起不来
检查 §4.3 引脚
检查 §4.4 slave target
确认板载 ESP32-C6 模块没坏(可以靠近路由器,如果其他设备能找到 C6 热点说明 C6 还活着)
8.5 LCD 显示异常(花屏、偏移)
修改屏驱动时区:
// m5stack_tab5.c:1207 esp_lcd_panel_mirror(disp_panel, false, true);
或调整 partitions.csv 里 factory app size。
8.6 触摸不准
修改 esp_lcd_touch_config_t:
// m5stack_tab5.c:1463
const esp_lcd_touch_config_t tp_cfg = {
.x_max = BSP_LCD_H_RES, // 1280
.y_max = BSP_LCD_V_RES, // 720
.rst_gpio_num = -1,
.int_gpio_num = 23,
.mirror_x = false, // 改这两个翻转
.mirror_y = false,
};9. 修改摄像头参数
9.1 改分辨率
platforms/tab5/main/hal/components/hal_camera.cpp:
#define CAMERA_WIDTH 1280 // 改这里 #define CAMERA_HEIGHT 720 // 改这里
要支持的所有分辨率列表在 Kconfig:
CONFIG_CAMERA_SC202CS_MIPI_RAW8_1280x720_30FPS=y ← 默认 CONFIG_CAMERA_SC202CS_MIPI_RAW8_1600x1200_30FPS=y CONFIG_CAMERA_SC202CS_MIPI_RAW10_1600x1200_30FPS=y CONFIG_CAMERA_SC202CS_MIPI_RAW10_1600x900_30FPS=y
9.2 改输出格式
// hal_camera.cpp int video_cam_fd = app_video_open(CAM_DEV_PATH, EXAMPLE_VIDEO_FMT_RGB565); // ↑ 改成其它格式
可选:
typedef enum {
EXAMPLE_VIDEO_FMT_RAW8 = V4L2_PIX_FMT_SBGGR8,
EXAMPLE_VIDEO_FMT_RAW10 = V4L2_PIX_FMT_SBGGR10,
EXAMPLE_VIDEO_FMT_GREY = V4L2_PIX_FMT_GREY,
EXAMPLE_VIDEO_FMT_RGB565 = V4L2_PIX_FMT_RGB565, // ← 默认
EXAMPLE_VIDEO_FMT_RGB888 = V4L2_PIX_FMT_RGB24,
EXAMPLE_VIDEO_FMT_YUV422 = V4L2_PIX_FMT_YUV422P,
EXAMPLE_VIDEO_FMT_YUV420 = V4L2_PIX_FMT_YUV420,
} example_fmt_t;9.3 加摄像头回调(比如拍照存 SD 卡)
修改 app_camera_display 函数,在 ppa_do_scale_rotate_mirror 之后加:
// 拍照保存
if (拍照触发) {
FILE* f = fopen("/sdcard/capture.bmp", "wb");
// 写 BMP header + RGB565 -> BMP888 转换
fwrite(buf, 1, size, f);
fclose(f);
}9.4 改 LCD 显示摄像头画面大小
platforms/tab5/main/hal/components/hal_camera.cpp:
uint16_t screen_width = 1280; uint16_t screen_height = 720; uint8_t* img_show_data = NULL; uint32_t img_show_size = screen_width * screen_height * 2; // RGB565 = 2 bytes/pixel
9.5 加人脸检测
imlib 已经在 components 里,可以用:
#include "imlib.h"
image_t img = { .w=1280, .h=720, .pixfmt=PIXFORMAT_RGB565, .data=img_show->data };
rect_t r = { .x=0, .y=0, .w=1280, .h=720 };
// human_face_detector->detect(&img, &r);10. 项目目录结构(关键文件)
D:\M5_Tab5\M5Tab5-UserDemo\ README.md # 英文原版 readme README_工程使用手册.md # 本文档 fetch_repos.py # 拉 dependencies repos.json # 依赖列表 app/ # 桌面 app app_installer.h app_generator.py apps/ app_launcher/ # 启动器(主桌面) app_startup_anim/ # 开机动画 app_template/ dependencies/ # 4 个子组件(fetch_repos.py 拉) lvgl/ # v9.2.2 mooncake/ # GUI framework mooncake_log/ # log smooth_ui_toolkit/ platforms/ tab5/ # ★ 真机编译目录 CMakeLists.txt # 顶层 CMake sdkconfig # 已生成的配置 sdkconfig.defaults # 默认配置 ← 改这里 partitions.csv # 分区表 dependencies.lock # 组件锁 main/ # 应用代码 app_main.cpp CMakeLists.txt idf_component.yml hal/ # HAL 抽象 hal_esp32.cpp # 初始化顺序总控 hal_esp32.h components/ hal_camera.cpp # 摄像头初始化 hal_wifi.cpp # WiFi components/ # 12 个项目自带 component esp_cam_sensor/ # 摄像头 sensor 驱动 Kconfig # Kconfig 入口 CMakeLists.txt # 条件编译 sensors/ sc202cs/ # ← SC2356 用这个 Kconfig.sc202cs sc202cs.c include/ private_include/ sc202cs_settings.h # ← 有 SC2356 init reglist 注释 sc2336/ ov2640/, ov5645/, ... esp_video/ # V4L2 video subsystem esp_ipa/ # 图像处理算法 esp_sccb_intf/ # SCCB I2C interface esp_lcd_st7121/ # LCD 驱动(ST7121/ST7123) m5stack_tab5/ # BSP m5stack_tab5.c # ← GPIO/I2C/SDIO/Codec/IO Expander esp_lcd_st7123.c Kconfig include/bsp/m5stack_tab5.h # ← GPIO 宏定义 sensor_bmi270/ # IMU sensor_icm20602/ power_monitor_ina226/ # 电池监测 keypad_scanner_tca8418/ # I2C keypad espressif__esp_lvgl_port/ # LVGL port imlib/ # 图像处理 wifi_c6_fw/ # ESP32-C6 SDIO slave firmware ESP32C6-WiFi-SDIO-Interface-V1.4.1-96bea3a_0x0.bin flash.sh # 出厂已烧,不需要重新烧
附录 A:完整编译烧录脚本
保存为 build_and_flash.ps1:
# M5Stack Tab5 编译烧录脚本
# 用法: powershell -ExecutionPolicy Bypass -File build_and_flash.ps1 -Port COM7
param(
[string]$Port = "COM7"
)
$ErrorActionPreference = "Stop"
$ProjectDir = $PSScriptRoot
Write-Host "=== M5Stack Tab5 编译烧录脚本 ===" -ForegroundColor Green
Write-Host "项目目录: $ProjectDir"
Write-Host "目标串口: $Port"
Write-Host ""
# 1. 激活 ESP-IDF 环境
Write-Host "[1/5] 激活 ESP-IDF..." -ForegroundColor Yellow
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
# 2. 检查 fetch_repos
if (-not (Test-Path "$ProjectDir\..\..\dependencies\lvgl")) {
Write-Host "[2/5] 拉 dependencies..." -ForegroundColor Yellow
Push-Location "$ProjectDir\..\.."
python fetch_repos.py
Pop-Location
} else {
Write-Host "[2/5] dependencies 已存在,跳过" -ForegroundColor Gray
}
# 3. 切到编译目录
Set-Location $ProjectDir
# 4. 编译
Write-Host "[3/5] 编译..." -ForegroundColor Yellow
idf.py build
if ($LASTEXITCODE -ne 0) {
Write-Host "编译失败!" -ForegroundColor Red
exit 1
}
# 5. 烧录 + 监控
Write-Host "[4/5] 烧录到 $Port ..." -ForegroundColor Yellow
idf.py -p $Port flash
if ($LASTEXITCODE -ne 0) {
Write-Host "烧录失败!" -ForegroundColor Red
exit 1
}
# 6. 打开 monitor
Write-Host "[5/5] 打开 monitor (Ctrl+] 退出)..." -ForegroundColor Yellow
idf.py -p $Port monitor附录 B:关键文件改对照表
| 屏幕方向 / 镜像 | m5stack_tab5.c esp_lcd_panel_mirror | |
| 摄像头分辨率 | hal_camera.cpp CAMERA_WIDTH/HEIGHT | |
| 摄像头输出格式 | hal_camera.cpp EXAMPLE_VIDEO_FMT_xxx | |
| GPIO 复用 | m5stacktab5.h BSP*_xxx 宏 | |
| WiFi SSID / 密码 | hal_wifi.cpp | |
| SDIO 引脚 | sdkconfig.defaults 或 sdkconfig | 关键 6 个 + RESET |
| Codec 选择 | sdkconfig.defaults | 只留 ES8388 + ES7210 |
| Camera sensor | sdkconfig.defaults | CONFIG_CAMERA_SC202CS=y |
| Slave target | sdkconfig.defaults | esp32c6 |
| 触摸方向 | m5stack_tab5.c esp_lcd_touch_config_t mirror_x/y | |
| LVGL log | sdkconfig.defaults | CONFIG_LV_USE_LOG=y |
附录 C:踩坑记录(本工程调试过程实录)
I2C conflict: ESP-IDF v5.5 启用新 I2C driver_ng,但 esp_cam_sensor 等组件仍编旧 driver。CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y 跳过守卫。
Codec 选错: 默认 sdkconfig 启用了 ES8311/ES8374/... 等 8 个 codec,但 Tab5 实际只用 ES8388 + ES7210。其他 6 个关掉,否则 BSP 找不到匹配的 codec。
SDIO 引脚错配: 项目默认走 ESP32-P4 Function EV-Board 的引脚(CLK=18/CMD=19/D0=14/...),但 Tab5 板子的 P4↔C6 走 SDIO2 复用,实际是 G12/G13/G11/G10/G9/G8。
Slave target 错配: 默认 SDK 期望 ESP32 当 slave,但 Tab5 上是 ESP32-C6。改 SLAVE_IDF_TARGET=ESP32C6。
Camera 识别失败: Tab5 板载 SC2356,但 Espressif 没单独 SC2356 driver;SC2356 复用 SC202CS driver(README.md 表格明确说明)。
SDK config vs menuconfig: Kconfig 有 conditional default,手动改 sdkconfig 会被 menuconfig/reconfigure 重算。改完改 sdkconfig.defaults 持久化,build 前不要再跑 menuconfig。
fetch_repos 网络: lvgl ~50MB clone 不稳定,可手动 git clone 后放到 dependencies/lvgl/。
附录 D:调试快捷命令
# 只看错误和警告
idf.py -p COMx monitor 2>&1 | Select-String "E \(|W \("
# 只看关键子系统日志
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
idf.py -p COMx monitor | Select-String "M5STACK_TAB5|transport|sc202cs|wifi:|sdmmc|esp_psram"
# 烧完直接重启板子(不发 Ctrl+R)
# 在 monitor 里按 Ctrl+T,再按 Ctrl+F 直接 reset
# 看分区表
Get-Content D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\partitions.csv
# 看当前 sdconfig 生效值
Get-Content D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\sdkconfig | Select-String "CAMERA|SDIO|HOSTED|CODEC_ES"
# 单独烧录 ESP32-C6 SDIO slave firmware(慎重,板载已烧好)
cd D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\wifi_c6_fw
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
esptool.py --chip esp32c6 -p COMx write_flash 0x0 ESP32C6-WiFi-SDIO-Interface-V1.4.1-96bea3a_0x0.bin【实验效果】

我要赚赏金
