fix(esp_lcd): Issue where M5Stack CoreS3 uses GPIO 35 for MISO and LCD D/C

Adopts approach used by M5GFX that enables/diables output during SPI transaction.
This commit is contained in:
Jeremy Boynes
2025-11-19 10:20:59 +08:00
committed by morris
parent 0d8a531a65
commit 1059ee1b5e
+12 -1
View File
@@ -17,6 +17,8 @@
#include "esp_lcd_panel_io.h" #include "esp_lcd_panel_io.h"
#include "driver/spi_master.h" #include "driver/spi_master.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "hal/gpio_ll.h"
#include "hal/gpio_hal.h"
#include "esp_log.h" #include "esp_log.h"
#include "esp_check.h" #include "esp_check.h"
#include "esp_lcd_common.h" #include "esp_lcd_common.h"
@@ -405,7 +407,10 @@ static void lcd_spi_pre_trans_cb(spi_transaction_t *trans)
esp_lcd_panel_io_spi_t *spi_panel_io = trans->user; esp_lcd_panel_io_spi_t *spi_panel_io = trans->user;
lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base); lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base);
if (spi_panel_io->dc_gpio_num >= 0) { // set D/C line level if necessary if (spi_panel_io->dc_gpio_num >= 0) { // set D/C line level if necessary
gpio_set_level(spi_panel_io->dc_gpio_num, lcd_trans->flags.dc_gpio_level); // use ll function to speed up
gpio_ll_set_level(&GPIO, spi_panel_io->dc_gpio_num, lcd_trans->flags.dc_gpio_level);
// ensure the D/C output is enabled
gpio_ll_output_enable(&GPIO, spi_panel_io->dc_gpio_num);
} }
} }
@@ -413,6 +418,12 @@ static void lcd_spi_post_trans_color_cb(spi_transaction_t *trans)
{ {
esp_lcd_panel_io_spi_t *spi_panel_io = trans->user; esp_lcd_panel_io_spi_t *spi_panel_io = trans->user;
lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base); lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base);
// disable the D/C output as we no longer need it
if (spi_panel_io->dc_gpio_num >= 0) {
gpio_ll_output_disable(&GPIO, spi_panel_io->dc_gpio_num);
}
if (lcd_trans->flags.en_trans_done_cb) { if (lcd_trans->flags.en_trans_done_cb) {
if (spi_panel_io->on_color_trans_done) { if (spi_panel_io->on_color_trans_done) {
spi_panel_io->on_color_trans_done(&spi_panel_io->base, NULL, spi_panel_io->user_ctx); spi_panel_io->on_color_trans_done(&spi_panel_io->base, NULL, spi_panel_io->user_ctx);