【前言】
M5Stack TAB5 目前官方只提供了移植好的固件,并没有提供源码,但是有开源的第三方github源码,第三方的源码最后更新为2025年,但是我们目前的开发板的屏更新为ST7121(LCD + 触控一体)。因此源码骗译好后不能成功屏动。
【各种版本屏的区别】
通过豆包查找到各种版本屏的差导如下表。

【源码下载】
https://github.com/78/xiaozhi-esp32.git
详细的教程可见Windows搭建 ESP IDF开发环境&编译小智 - 飞书云文档
下载的过程不一一展示。
【ESP-IDF准备】
我偿试用最新版本的esp-idf 6.0.x来编译后,发现编通不过,最后选择esp-idf 5.5.4可以成功编译。
【问题】
在我编译下载到开发板后,发现屏的背光亮,小智联网也可以,但是没有显示图像。通过查找发现驱动还是老板本的驱动。因此重点在于屏的驱动的修改。
【屏的驱动】
一、硬件识别
通过日志的分析如下:

二、修复 ESP32-P4 rev1 构建配置
问题
1. v2.1.0 的 main/boards/m5stack-tab5/config.json 没有任何芯片版本选择项,在 IDF 5.5.4 上 默认按 rev 3.1 / CPU 400MHz 构建。rev1.x 芯片最高 360MHz,刷入后二级 bootloader 入口即 Illegal instruction 死循环。
2. 上游 v2.4.0 的 config.json 虽然追加了 CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y,但 release.py 的流程是先 idf.py set-target(此时已按默认 400MHz 生成 sdkconfig) 再追加配置;ESP_DEFAULT_CPU_FREQ_MHZ_400 是已生效的用户值,kconfig olddefconfig 不会因 REV 选项变化而改回 360MHz,导致 rev1 变体实际仍以 400MHz 构建, 启动时 esp_clk_init clk.c:104 assert(res)。
修改(main/boards/m5stack-tab5/config.json)
"CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y", "CONFIG_ESP32P4_REV_MIN_100=y", "# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_400 is not set", "CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_360=y"
要点:必须显式写出 360MHz 的选择,不能依赖 Kconfig 默认值(原因见上)。 改 config.json 后必须删除 sdkconfig 和 build/ 做干净构建,旧 sdkconfig 里的 400MHz 用户值会污染结果。
三、ST7121 显示驱动移植
问题
v2.1.0 只支持 ST7123(以及 ILI9881C+GT911 备选),检测逻辑是"I2C 0x55 有应答就当 ST7123"。ST7121 与 ST7123 触摸控制器同地址,会被误判,用错误的 DSI 时序初始化 → 背光亮、无图像。
移植内容
1. 新增驱动文件(来自 M5Stack 官方 Tab5 BSP):
◦ main/boards/m5stack-tab5/esp_lcd_st7121.c
◦ main/boards/m5stack-tab5/esp_lcd_st7121.h
板级目录的 *.c 会被 main/CMakeLists.txt 的 GLOB 自动编译,无需改构建脚本。 驱动 init_cmds 传 NULL 时使用内置默认初始化序列。
2. 按触摸固件版本区分屏幕(m5stack_tab5.cc):
// 与触摸驱动一致的协议:16 位寄存器地址,控制相禁用esp_lcd_panel_io_i2c_config_t tp_io_config = {
.dev_addr = 0x55,
.control_phase_bytes = 1,
.dc_bit_offset = 0,
.lcd_cmd_bits = 16,
.lcd_param_bits = 8,
.flags = { .disable_control_phase = 1 },
.scl_speed_hz = 100000,
};esp_lcd_new_panel_io_i2c(i2c_bus_, &tp_io_config, &tp_io_handle);esp_lcd_panel_io_rx_param(tp_io_handle, 0x0000, &fw_version, 1);// fw_version == 1 → ST7121;3 → ST7123注意:直接用 i2c_master_transmit_receive 写单字节 0x00 读到的值是错的 (本机读到 2),必须用上述 16 位寄存器协议。
3. ST7121 专属 DPI 时序(InitializeSt7121Display()),与 ST7123 的差异仅三项:

其余相同:MIPI DSI 2-lane、lane_bit_rate 965Mbps、DPI 70MHz、RGB565、 720×1280、hsync 2/40/40、use_dma2d。
4. 触摸初始化两种屏共用 esp_lcd_touch_new_i2c_st7123,无需区分。
四、触摸接入 LVGL
问题
v2.1.0 初始化了触摸芯片,但从未把触摸注册为 LVGL 输入设备,界面上任何 可点击元素都不会响应(与上游 issue #1990 "Touch to listen not working on Tab5" 同根因)。
修改
main/display/lcd_display.h/.cc:MipiLcdDisplay 新增:
void MipiLcdDisplay::AddTouch(esp_lcd_touch_handle_t touch) { const lvgl_port_touch_cfg_t touch_cfg = { .disp = display_, .handle = touch }; lvgl_port_add_touch(&touch_cfg); }m5stack_tab5.cc InitializeDisplay() 末尾(ST712x 与 GT911 两个分支共用):
if (display_ != nullptr && touch_ != nullptr) { static_cast<MipiLcdDisplay*>(display_)->AddTouch(touch_); }
验证方式:lcd_display.cc 中临时加了右下角 "Touch Test" 按钮(点击变色、计数、 串口输出坐标)。
验证通过后可将按钮代码删除(搜索 TouchTestBtnEventHandler)。
五、 背光极性修复
驱动后,我让小智调节亮度,但是是反的,因此需要如下修复
`config.h` 中 `DISPLAY_BACKLIGHT_OUTPUT_INVERT` 应为 **`false`**(v2.1.0 误为 `true`,
亮度调节反向/不生效)。与上游 PR #1764 一致。
六、为了验证触摸屏可以用还添加了一个按键用于测试,效果如下:

我要赚赏金
