这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【ESP32P4】移植M5StackTAB5小智

共1条 1/1 1 跳转至

【ESP32P4】移植M5StackTAB5小智

高工
2026-07-30 08:12:13     打赏

【前言】

M5Stack TAB5 目前官方只提供了移植好的固件,并没有提供源码,但是有开源的第三方github源码,第三方的源码最后更新为2025年,但是我们目前的开发板的屏更新为ST7121(LCD + 触控一体)。因此源码骗译好后不能成功屏动。

【各种版本屏的区别】

通过豆包查找到各种版本屏的差导如下表。

image.png

【源码下载】

https://github.com/78/xiaozhi-esp32.git

详细的教程可见Windows搭建 ESP IDF开发环境&编译小智 - 飞书云文档

下载的过程不一一展示。

【ESP-IDF准备】

我偿试用最新版本的esp-idf 6.0.x来编译后,发现编通不过,最后选择esp-idf 5.5.4可以成功编译。

【问题】

在我编译下载到开发板后,发现屏的背光亮,小智联网也可以,但是没有显示图像。通过查找发现驱动还是老板本的驱动。因此重点在于屏的驱动的修改。

【屏的驱动】

一、硬件识别

通过日志的分析如下:

image.png

二、修复 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 的差异仅三项:

image.png

其余相同: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" 同根因)。

修改

  1. 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);
       }
  2. 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 一致。

六、为了验证触摸屏可以用还添加了一个按键用于测试,效果如下:

image.png






关键词: ESP32P4     M5Stack     小智    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]