
esp-iot-solution LCD Touch 触控组件支持汇总与接入指南基于 esp_lcd_touch 抽象层的驱动生态【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution触摸屏是智能交互设备的核心输入通道。本文以 esp-iot-solution 仓库的 LCD Touch 支持汇总文档 为骨架系统梳理该仓库维护的全部触摸控制器组件及其与esp_lcd_touch抽象层的关系并结合仓库源码给出从 I2C 总线初始化、控制器注册到 LVGL 输入设备接入的完整实战链路。读完本文你将能够根据硬件选型快速找到对应组件、正确配置并接入触摸数据读取流程。背景一切驱动都建立在 esp_lcd_touch 抽象层之上ESP LCD Touch 驱动并非从零实现而是统一构建在esp_lcd_touch抽象层之上。该抽象层屏蔽了不同触摸控制器touch controller的寄存器差异统一了三个核心环节初始化创建触摸控制器句柄数据读取通过esp_lcd_touch_read_data()将控制器原始数据读入内存坐标获取通过esp_lcd_touch_get_data()从内存中取出解析后的触摸点坐标。应用侧的标准用法是先调用esp_lcd_touch_read_data()读取控制器数据再调用esp_lcd_touch_get_data()获取触摸点。这种读数据 / 取数据分离的设计使得上层 GUI如 LVGL可以按自己的节奏轮询而底层驱动只负责把最新一次扫描结果缓存起来。在 esp-iot-solution 中这一抽象由仓库内的esp_lcd_touch_*组件实现每个组件都遵循同一套接口约定esp_lcd_touch_new_i2c_xxx()创建句柄因此应用代码可以一处编写、多处换芯。已维护组件全景下表完整列出文档中维护的触摸控制器组件覆盖 I2C 与 SPI 两种接口来源分为 esp-bsp 与 esp-iot-solution 两处触摸控制器接口组件来源CST816SI2Cesp_lcd_touch_cst816sesp-bspFT5x06I2Cesp_lcd_touch_ft5x06esp-bspFT6336UI2Cesp_lcd_touch_ft6336uesp-iot-solutionGT1151I2Cesp_lcd_touch_gt1151esp-bspGT911I2Cesp_lcd_touch_gt911esp-bspILI2118I2Cesp_lcd_touch_ili2118esp-iot-solutionSPD2010I2Cesp_lcd_touch_spd2010esp-iot-solutionST7123I2Cesp_lcd_touch_st7123esp-iot-solutionST77926I2Cesp_lcd_touch_st77926esp-iot-solutionSTMPE610SPIesp_lcd_touch_stmpe610esp-bspTT21100I2Cesp_lcd_touch_tt21100esp-bsp其中esp-iot-solution 仓库自身维护的组件位于 components/display/lcd_touch 目录下共 5 个FT6336U、ILI2118、SPD2010、ST7123、ST77926每个组件都包含完整的头文件、实现、README、CHANGELOG 以及 test_apps 测试工程。其余来自 esp-bsp 的组件CST816S、FT5x06、GT1151、GT911、STMPE610、TT21100通过组件管理器作为依赖引入。五个仓库原生维护组件速览以 esp_lcd_touch_ft6336u 为例其 README 明确了关键硬件参数默认 I2C 地址为0x38若模块为0x48地址则使用ESP_LCD_TOUCH_IO_I2C_FT6336U_ADDRESS_ALT。从 esp_lcd_touch_ft6336u.h 可以看到地址与 IO 配置都封装成了宏#define ESP_LCD_TOUCH_IO_I2C_FT6336U_ADDRESS (0x38) /*! Standard FT6336U hardware default */ #define ESP_LCD_TOUCH_IO_I2C_FT6336U_ADDRESS_ALT (0x48) /*! Alternate FT6336U module address */ #define ESP_LCD_TOUCH_IO_I2C_FT6336U_CONFIG_WITH_ADDR(i2c_addr) \ { \ .scl_speed_hz 400000, \ .dev_addr (i2c_addr), \ .control_phase_bytes 1, \ .lcd_cmd_bits 8, \ .flags \ { \ .disable_control_phase 1, \ }, \ } #define ESP_LCD_TOUCH_IO_I2C_FT6336U_CONFIG() \ ESP_LCD_TOUCH_IO_I2C_FT6336U_CONFIG_WITH_ADDR(ESP_LCD_TOUCH_IO_I2C_FT6336U_ADDRESS)每个组件都遵循同样的结构include/下提供esp_lcd_touch_new_i2c_xxx()创建函数与 I2C 配置宏test_apps/下提供基于 Unity 的测试用例便于在真实硬件上验证驱动行为。例如 esp_lcd_touch_ft6336u 测试 展示了完整的建 I2C 总线 → 建 panel IO → 建触摸句柄三步流程并针对0x48地址模块专门使用了ESP_LCD_TOUCH_IO_I2C_FT6336U_CONFIG_WITH_ADDR(ESP_LCD_TOUCH_IO_I2C_FT6336U_ADDRESS_ALT)。添加组件到工程组件已发布到 Espressif 组件服务Component Registry可通过idf.py add-dependency一条命令引入idf.py add-dependency espressif/esp_lcd_touch_ft6336u其余四个仓库维护组件同理将名称替换为esp_lcd_touch_ili2118、esp_lcd_touch_spd2010、esp_lcd_touch_st7123、esp_lcd_touch_st77926即可。也可以直接在工程main/idf_component.yml中声明依赖由组件管理器统一拉取。若项目使用 ESP-IDF 5.x 的组件管理机制这是推荐方式它同时会自动解析esp_lcd_touch抽象层等传递依赖。从零接入完整初始化流程以仓库示例 touch_init.c 为参照触摸接入分为三层初始化下面拆解每一步。第一步创建 I2C 主总线所有 I2C 触摸控制器都挂在 I2C 总线上先创建 master busi2c_master_bus_config_t i2c_bus_conf { .clk_source I2C_CLK_SRC_DEFAULT, .sda_io_num HW_I2C_SDA, .scl_io_num HW_I2C_SCL, .i2c_port HW_I2C_NUM, }; ESP_ERROR_CHECK(i2c_new_master_bus(i2c_bus_conf, s_touch_i2c_bus));示例中HW_I2C_NUM取I2C_NUM_0SCL 速率按 400 kHz 运行HW_I2C_CLK_SPEED_HZ定义为 400000与 FT6336U 配置宏中的scl_speed_hz 400000保持一致。注意触摸与显示面板若共用总线需要评估总线上拉与负载400 kHz 是常见的折中值。第二步创建 panel IO 与触摸句柄在总线上为触摸控制器创建esp_lcd_panel_io_i2c然后调用对应组件的esp_lcd_touch_new_i2c_xxx()创建触摸句柄。示例代码针对不同 LCD 接口RGB、MIPI-DSI、QSPI、SPIPSRAM通过条件编译选择不同控制器其核心模式是const esp_lcd_touch_config_t tp_cfg { .x_max HW_LCD_H_RES, .y_max HW_LCD_V_RES, .rst_gpio_num HW_LCD_TOUCH_RST, .int_gpio_num HW_LCD_TOUCH_INT, .levels { .reset 0, .interrupt 0, }, .flags { .swap_xy swap_xy, .mirror_x mirror_x, .mirror_y mirror_y, }, }; esp_lcd_panel_io_i2c_config_t tp_io_config ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG(); tp_io_config.scl_speed_hz HW_I2C_CLK_SPEED_HZ; ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c(s_touch_i2c_bus, tp_io_config, tp_io_handle)); ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_gt911(tp_io_handle, tp_cfg, ret_touch));其中esp_lcd_touch_config_t是抽象层统一配置结构重点参数说明x_max/y_max触摸面板分辨率应与 LCD 分辨率对应驱动据此做坐标映射rst_gpio_num/int_gpio_num复位与中断引脚无连接时填GPIO_NUM_NClevels.reset/levels.interrupt复位/中断信号的有效电平示例中reset 0表示低电平复位flags.swap_xy/mirror_x/mirror_y坐标旋转/镜像变换用于触摸方向与屏幕方向不一致时校正示例通过touch_get_rotation_flags()依据旋转类型自动计算。以 FT6336U 为例README 中的最小化示例与此模式完全一致其中esp_lcd_touch_new_i2c_ft6336u(io_handle, tp_cfg, tp)即创建句柄。创建成功后驱动内部会完成复位时序与芯片 ID 校验FT6336U 从寄存器0xA3读取芯片 ID与期望值0x64比对见 esp_lcd_touch_ft6336u.c校验失败会返回ESP_ERR_NOT_SUPPORTED并自动释放资源。数据读取与坐标获取read_data / get_data 工作流esp_lcd_touch_read_data()与esp_lcd_touch_get_data()是抽象层对外暴露的两个核心 API二者配合实现了驱动缓存 应用消费的解耦。仓库中 lvgl_port.c 的 LVGL 触摸回调是教科书式用法static void touchpad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) { esp_lcd_touch_handle_t tp (esp_lcd_touch_handle_t)indev_drv-user_data; assert(tp); uint8_t touchpad_cnt 0; /* Read data from touch controller into memory */ if (touch_isr_mux NULL || xSemaphoreTake(touch_isr_mux, 0) pdTRUE) { esp_lcd_touch_read_data(tp); } /* Read data from touch controller */ esp_lcd_touch_point_data_t touch_points[1] {0}; esp_err_t ret esp_lcd_touch_get_data(tp, touch_points, touchpad_cnt, 1); if (ret ESP_OK touchpad_cnt 0) { >touch-io io; touch-read_data ft6336u_read_data; touch-get_xy ft6336u_get_xy; touch-del ft6336u_del;随后初始化中断/复位 GPIO 并做上电复位时序复位低电平保持 10 ms、释放后等待 500 ms见ft6336u_reset最后读取芯片 ID 验证。ft6336u_read_data的核心逻辑体现了典型电容触摸控制器的数据格式从寄存器0x02TD_STATUS读触点数量 0x0F后得到有效点数上限为FT6336U_MAX_TOUCH_POINTS2 点并受CONFIG_ESP_LCD_TOUCH_MAX_POINTSKconfig 约束从寄存器0x03起连续读取点数 × 6字节每 6 字节描述一个触点每个触点第 0 字节的高 2 位是事件类型0x00按下 /0x80持续接触低 4 位与第 1 字节组成 12 位 X 坐标第 2 字节低 4 位与第 3 字节组成 12 位 Y 坐标有效触点写入tp-data.coords[]全程用portENTER_CRITICAL保护共享数据。ft6336u_get_xy则在临界区内把缓存坐标拷贝到调用者数组并清零计数返回是否有触点。类似地esp_lcd_touch_ili2118.c 展示了另一种协议风格它通过命令0x11读取 53 字节数据帧以魔数0x5A单点/0x99多点判断帧类型并将原始 12 位坐标按raw * config-x_max / 2048映射到面板分辨率。两者对比可见抽象层正是靠驱动内做协议解析应用层只见统一坐标来抹平差异的。接入 LVGL 的完整注册流程除了数据读取回调还需注册输入设备。仓库示例中的注册代码lvgl_port.c如下static lv_indev_t *indev_init(esp_lcd_touch_handle_t tp) { assert(tp); static lv_indev_drv_t indev_drv_tp; lv_indev_drv_init(indev_drv_tp); indev_drv_tp.type LV_INDEV_TYPE_POINTER; indev_drv_tp.read_cb touchpad_read; indev_drv_tp.user_data tp; return lv_indev_drv_register(indev_drv_tp); }将read_cb指向上述touchpad_read、user_data携带触摸句柄后LVGL 便会在每次事件循环中自动轮询触摸状态应用层只需处理lv_indev_data_t中的坐标与按压状态即可。若要支持多点触控如双指缩放可将esp_lcd_touch_get_data的max_point_num调大并扩展touch_points数组。测试与验证每个仓库维护的组件都带 test_apps可在真实硬件上验证驱动。以 esp_lcd_touch_ft6336u 测试工程 为例测试固定使用 I2C0、SDAGPIO8、SCLGPIO18并开启内部上拉TEST_CASE(test ft6336u to read touch point with polling, ...)在 3 秒内以 30 ms 周期轮询读取验证esp_lcd_touch_read_data()/esp_lcd_touch_get_data()返回真实触点坐标测试配置的x_max/y_max为 480×480rst/int均为GPIO_NUM_NC无连线覆盖仅 I2C、无中断/复位的简化接线场景。其余组件ili2118、spd2010、st7123、st77926的 test_apps 结构一致其中 st77926 还附带pytest_esp_lcd_touch_st77926.py自动化测试脚本。这些测试同时验证了esp_lcd_touch抽象层 API 的通用性同一套read_data/get_data调用可无缝替换五种控制器。小结esp-iot-solution 的 LCD Touch 方案以esp_lcd_touch抽象层为统一底座向应用暴露一致的两阶段 APIesp_lcd_touch_read_data()读控制器、esp_lcd_touch_get_data()取坐标。仓库原生维护 FT6336U、ILI2118、SPD2010、ST7123、ST77926 五个 I2C 控制器组件每个组件都自带 README、Kconfig 配置、实现源码与 test_apps配合 esp-bsp 的六个组件共同覆盖主流触控芯片。接入时只需三步创建 I2C 总线 → 创建 panel IO 并调用esp_lcd_touch_new_i2c_xxx()生成句柄 → 在 LVGL 的read_cb中调用 read/get 两个 API 并注册LV_INDEV_TYPE_POINTER输入设备。坐标方向问题通过esp_lcd_touch_config_t的swap_xy/mirror_x/mirror_y标志解决分辨率映射则由驱动依据x_max/y_max自动完成。后续若需支持新的触摸芯片参照 components/display/lcd_touch 下现有组件的实现与测试范式即可快速完成接入。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考