diff --git a/Devices/lilygo-tdisplay-s3/CMakeLists.txt b/Devices/lilygo-tdisplay-s3/CMakeLists.txt index a832a83a2..94b4fdaef 100644 --- a/Devices/lilygo-tdisplay-s3/CMakeLists.txt +++ b/Devices/lilygo-tdisplay-s3/CMakeLists.txt @@ -2,5 +2,5 @@ file(GLOB_RECURSE SOURCE_FILES source/*.c*) idf_component_register( SRCS ${SOURCE_FILES} - REQUIRES TactilityKernel driver + REQUIRES TactilityKernel driver esp_driver_gpio ) diff --git a/Devices/m5stack-stickc-plus2/CMakeLists.txt b/Devices/m5stack-stickc-plus2/CMakeLists.txt index 38c007833..84e79791b 100644 --- a/Devices/m5stack-stickc-plus2/CMakeLists.txt +++ b/Devices/m5stack-stickc-plus2/CMakeLists.txt @@ -3,5 +3,5 @@ file(GLOB_RECURSE SOURCE_FILES source/*.c*) idf_component_register( SRCS ${SOURCE_FILES} INCLUDE_DIRS "source" - REQUIRES TactilityKernel driver + REQUIRES TactilityKernel driver esp_driver_gpio ) diff --git a/Drivers/cst816s-module/source/cst816s.cpp b/Drivers/cst816s-module/source/cst816s.cpp index 04a44ff1c..973305a91 100644 --- a/Drivers/cst816s-module/source/cst816s.cpp +++ b/Drivers/cst816s-module/source/cst816s.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -39,14 +38,10 @@ static esp_err_t create_io_handle(Device* parent, esp_lcd_panel_io_handle_t* out esp_lcd_panel_io_i2c_config_t io_config = ESP_LCD_TOUCH_IO_I2C_CST816S_CONFIG(); auto* parent_driver = device_get_driver(parent); - if (driver_is_compatible(parent_driver, "espressif,esp32-i2c")) { - auto port = static_cast(parent->config)->port; - return esp_lcd_new_panel_io_i2c_v1(port, &io_config, out_handle); - } if (driver_is_compatible(parent_driver, "espressif,esp32-i2c-master")) { auto bus = esp32_i2c_master_get_bus_handle(parent); io_config.scl_speed_hz = esp32_i2c_master_get_clock_frequency(parent); - return esp_lcd_new_panel_io_i2c_v2(bus, &io_config, out_handle); + return esp_lcd_new_panel_io_i2c(bus, &io_config, out_handle); } LOG_E(TAG, "Unsupported I2C driver"); diff --git a/Drivers/ft5x06-module/source/ft5x06.cpp b/Drivers/ft5x06-module/source/ft5x06.cpp index 37fb078a5..f347ecffb 100644 --- a/Drivers/ft5x06-module/source/ft5x06.cpp +++ b/Drivers/ft5x06-module/source/ft5x06.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -71,14 +70,10 @@ static esp_err_t create_io_handle(Device* parent, esp_lcd_panel_io_handle_t* out esp_lcd_panel_io_i2c_config_t io_config = ESP_LCD_TOUCH_IO_I2C_FT5x06_CONFIG(); auto* parent_driver = device_get_driver(parent); - if (driver_is_compatible(parent_driver, "espressif,esp32-i2c")) { - auto port = static_cast(parent->config)->port; - return esp_lcd_new_panel_io_i2c_v1(port, &io_config, out_handle); - } if (driver_is_compatible(parent_driver, "espressif,esp32-i2c-master")) { auto bus = esp32_i2c_master_get_bus_handle(parent); io_config.scl_speed_hz = esp32_i2c_master_get_clock_frequency(parent); - return esp_lcd_new_panel_io_i2c_v2(bus, &io_config, out_handle); + return esp_lcd_new_panel_io_i2c(bus, &io_config, out_handle); } LOG_E(TAG, "Unsupported I2C driver"); diff --git a/Drivers/ft6x36-module/source/ft6x36.cpp b/Drivers/ft6x36-module/source/ft6x36.cpp index 12ad5894c..6f052ba54 100644 --- a/Drivers/ft6x36-module/source/ft6x36.cpp +++ b/Drivers/ft6x36-module/source/ft6x36.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -73,14 +72,10 @@ static esp_err_t create_io_handle(Device* parent, esp_lcd_panel_io_handle_t* out esp_lcd_panel_io_i2c_config_t io_config = ESP_LCD_TOUCH_IO_I2C_FT6x36_CONFIG(); auto* parent_driver = device_get_driver(parent); - if (driver_is_compatible(parent_driver, "espressif,esp32-i2c")) { - auto port = static_cast(parent->config)->port; - return esp_lcd_new_panel_io_i2c_v1(port, &io_config, out_handle); - } if (driver_is_compatible(parent_driver, "espressif,esp32-i2c-master")) { auto bus = esp32_i2c_master_get_bus_handle(parent); io_config.scl_speed_hz = esp32_i2c_master_get_clock_frequency(parent); - return esp_lcd_new_panel_io_i2c_v2(bus, &io_config, out_handle); + return esp_lcd_new_panel_io_i2c(bus, &io_config, out_handle); } LOG_E(TAG, "Unsupported I2C driver"); diff --git a/Drivers/gc9a01-module/source/gc9a01.cpp b/Drivers/gc9a01-module/source/gc9a01.cpp index aa4fbbdab..1f0b823c9 100644 --- a/Drivers/gc9a01-module/source/gc9a01.cpp +++ b/Drivers/gc9a01-module/source/gc9a01.cpp @@ -72,8 +72,8 @@ static error_t start(Device* device) { } esp_lcd_panel_io_spi_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), - .dc_gpio_num = pin_or_unused(config->pin_dc), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), + .dc_gpio_num = static_cast(pin_or_unused(config->pin_dc)), .spi_mode = 0, .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, @@ -104,13 +104,13 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = 16, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = nullptr, // GC9A01's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = nullptr, }; ret = esp_lcd_new_panel_gc9a01(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/ili9341-module/source/ili9341.cpp b/Drivers/ili9341-module/source/ili9341.cpp index 3b30b1338..ab87b7602 100644 --- a/Drivers/ili9341-module/source/ili9341.cpp +++ b/Drivers/ili9341-module/source/ili9341.cpp @@ -129,8 +129,8 @@ static error_t start(Device* device) { } esp_lcd_panel_io_spi_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), - .dc_gpio_num = pin_or_unused(config->pin_dc), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), + .dc_gpio_num = static_cast(pin_or_unused(config->pin_dc)), .spi_mode = 0, .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, @@ -164,14 +164,14 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - // Always -1: pulse_reset() handles the physical pin itself (see its comment for why), and - // esp_lcd_panel_reset() below falls back to a SWRESET command when this is -1. - .reset_gpio_num = -1, .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, - .flags = { .reset_active_high = config->reset_active_high }, + // Always NC: pulse_reset() handles the physical pin itself (see its comment for why), and + // esp_lcd_panel_reset() below falls back to a SWRESET command when this is NC. + .reset_gpio_num = GPIO_NUM_NC, .vendor_config = nullptr, + .flags = { .reset_active_high = config->reset_active_high }, }; ret = esp_lcd_new_panel_ili9341(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/ili9488-module/source/ili9488.cpp b/Drivers/ili9488-module/source/ili9488.cpp index 4d1a707e5..584b008f8 100644 --- a/Drivers/ili9488-module/source/ili9488.cpp +++ b/Drivers/ili9488-module/source/ili9488.cpp @@ -77,8 +77,8 @@ static error_t start(Device* device) { } esp_lcd_panel_io_spi_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), - .dc_gpio_num = pin_or_unused(config->pin_dc), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), + .dc_gpio_num = static_cast(pin_or_unused(config->pin_dc)), .spi_mode = 0, .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, @@ -109,13 +109,13 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = nullptr, // ILI9488's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = nullptr, }; // Unlike st7789/ili9341, ili9488 needs an internal conversion buffer: over SPI the diff --git a/Drivers/ili9881c-module/source/ili9881c.cpp b/Drivers/ili9881c-module/source/ili9881c.cpp index 3a1438c35..59a7e42d7 100644 --- a/Drivers/ili9881c-module/source/ili9881c.cpp +++ b/Drivers/ili9881c-module/source/ili9881c.cpp @@ -251,13 +251,13 @@ static error_t start(Device* device) { }; const esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = &vendor_config, // ILI9881C's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = &vendor_config, }; if (esp_lcd_new_panel_ili9881c(internal->io_handle, &panel_config, &internal->panel_handle) != ESP_OK) { @@ -355,7 +355,7 @@ static error_t start(Device* device) { xSemaphoreGive(internal->color_trans_done_semaphore); esp_lcd_dpi_panel_event_callbacks_t callbacks = {}; - callbacks.on_refresh_done = on_refresh_done; + callbacks.on_frame_buf_complete = on_refresh_done; callbacks.on_color_trans_done = on_color_trans_done; if (esp_lcd_dpi_panel_register_event_callbacks(internal->panel_handle, &callbacks, internal) != ESP_OK) { LOG_E(TAG, "Failed to register panel event callbacks"); diff --git a/Drivers/jd9165-module/source/jd9165.cpp b/Drivers/jd9165-module/source/jd9165.cpp index ca8e6ba44..268757969 100644 --- a/Drivers/jd9165-module/source/jd9165.cpp +++ b/Drivers/jd9165-module/source/jd9165.cpp @@ -221,13 +221,13 @@ static error_t start(Device* device) { }; const esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = &vendor_config, // JD9165's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = &vendor_config, }; if (esp_lcd_new_panel_jd9165(internal->io_handle, &panel_config, &internal->panel_handle) != ESP_OK) { @@ -310,7 +310,7 @@ static error_t start(Device* device) { } esp_lcd_dpi_panel_event_callbacks_t callbacks = {}; - callbacks.on_refresh_done = on_refresh_done; + callbacks.on_frame_buf_complete = on_refresh_done; if (esp_lcd_dpi_panel_register_event_callbacks(internal->panel_handle, &callbacks, internal) != ESP_OK) { LOG_E(TAG, "Failed to register panel event callbacks"); vSemaphoreDelete(internal->frame_complete_semaphore); diff --git a/Drivers/jd9853-module/source/esp_lcd_jd9853.c b/Drivers/jd9853-module/source/esp_lcd_jd9853.c index eb55a1847..0e4a0155d 100644 --- a/Drivers/jd9853-module/source/esp_lcd_jd9853.c +++ b/Drivers/jd9853-module/source/esp_lcd_jd9853.c @@ -76,7 +76,7 @@ esp_err_t esp_lcd_new_panel_jd9853(const esp_lcd_panel_io_handle_t io, const esp ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported color space"); break; } -#else +#elif ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(6, 0, 0) switch (panel_dev_config->rgb_endian) { case LCD_RGB_ENDIAN_RGB: @@ -89,6 +89,19 @@ esp_err_t esp_lcd_new_panel_jd9853(const esp_lcd_panel_io_handle_t io, const esp ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported rgb endian"); break; } +#else + switch (panel_dev_config->rgb_ele_order) + { + case LCD_RGB_ELEMENT_ORDER_RGB: + jd9853->madctl_val = 0; + break; + case LCD_RGB_ELEMENT_ORDER_BGR: + jd9853->madctl_val |= LCD_CMD_BGR_BIT; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported rgb element order"); + break; + } #endif switch (panel_dev_config->bits_per_pixel) diff --git a/Drivers/jd9853-module/source/jd9853.cpp b/Drivers/jd9853-module/source/jd9853.cpp index a1d59d2c6..9afd3d4c8 100644 --- a/Drivers/jd9853-module/source/jd9853.cpp +++ b/Drivers/jd9853-module/source/jd9853.cpp @@ -78,8 +78,8 @@ static error_t start(Device* device) { } esp_lcd_panel_io_spi_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), - .dc_gpio_num = pin_or_unused(config->pin_dc), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), + .dc_gpio_num = static_cast(pin_or_unused(config->pin_dc)), .spi_mode = 0, .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, @@ -115,13 +115,13 @@ static error_t start(Device* device) { }; esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = 16, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = &vendor_config, // JD9853's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = &vendor_config, }; ret = esp_lcd_new_panel_jd9853(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/rgb-display-module/source/rgb_display.cpp b/Drivers/rgb-display-module/source/rgb_display.cpp index 7748af43e..6c03d6296 100644 --- a/Drivers/rgb-display-module/source/rgb_display.cpp +++ b/Drivers/rgb-display-module/source/rgb_display.cpp @@ -70,6 +70,14 @@ static int pin_or_unused(const GpioPinSpec& pin) { return pin.gpio_controller == nullptr ? -1 : static_cast(pin.pin); } +static lcd_color_format_t color_format_from_bpp(uint8_t bits_per_pixel) { + switch (bits_per_pixel) { + case 16: return LCD_COLOR_FMT_RGB565; + case 24: return LCD_COLOR_FMT_RGB888; + default: return static_cast(0); + } +} + // Pulses the panel's own driver-IC reset line, if configured. Transient: the descriptor is // released immediately after, since nothing else needs to touch this pin afterward. static error_t perform_hardware_reset(const RgbDisplayConfig* config) { @@ -166,33 +174,35 @@ static error_t start(Device* device) { } }, .data_width = config->data_width, - .bits_per_pixel = config->bits_per_pixel, + .in_color_format = color_format_from_bpp(config->bits_per_pixel), .num_fbs = config->num_fbs, .bounce_buffer_size_px = config->bounce_buffer_size_px, - .sram_trans_align = config->sram_trans_align, - .psram_trans_align = config->psram_trans_align, - .hsync_gpio_num = pin_or_unused(config->pin_hsync), - .vsync_gpio_num = pin_or_unused(config->pin_vsync), - .de_gpio_num = pin_or_unused(config->pin_de), - .pclk_gpio_num = pin_or_unused(config->pin_pclk), - .disp_gpio_num = pin_or_unused(config->pin_disp), + // No device configures sram-trans-align/psram-trans-align differently from their YAML + // defaults (8/64), so the single dma_burst_size that replaced both can just take the + // larger (PSRAM) alignment - safe for SRAM-only allocations too, just less tightly packed. + .dma_burst_size = config->psram_trans_align, + .hsync_gpio_num = static_cast(pin_or_unused(config->pin_hsync)), + .vsync_gpio_num = static_cast(pin_or_unused(config->pin_vsync)), + .de_gpio_num = static_cast(pin_or_unused(config->pin_de)), + .pclk_gpio_num = static_cast(pin_or_unused(config->pin_pclk)), + .disp_gpio_num = static_cast(pin_or_unused(config->pin_disp)), .data_gpio_nums = { - pin_or_unused(config->pin_data0), - pin_or_unused(config->pin_data1), - pin_or_unused(config->pin_data2), - pin_or_unused(config->pin_data3), - pin_or_unused(config->pin_data4), - pin_or_unused(config->pin_data5), - pin_or_unused(config->pin_data6), - pin_or_unused(config->pin_data7), - pin_or_unused(config->pin_data8), - pin_or_unused(config->pin_data9), - pin_or_unused(config->pin_data10), - pin_or_unused(config->pin_data11), - pin_or_unused(config->pin_data12), - pin_or_unused(config->pin_data13), - pin_or_unused(config->pin_data14), - pin_or_unused(config->pin_data15), + static_cast(pin_or_unused(config->pin_data0)), + static_cast(pin_or_unused(config->pin_data1)), + static_cast(pin_or_unused(config->pin_data2)), + static_cast(pin_or_unused(config->pin_data3)), + static_cast(pin_or_unused(config->pin_data4)), + static_cast(pin_or_unused(config->pin_data5)), + static_cast(pin_or_unused(config->pin_data6)), + static_cast(pin_or_unused(config->pin_data7)), + static_cast(pin_or_unused(config->pin_data8)), + static_cast(pin_or_unused(config->pin_data9)), + static_cast(pin_or_unused(config->pin_data10)), + static_cast(pin_or_unused(config->pin_data11)), + static_cast(pin_or_unused(config->pin_data12)), + static_cast(pin_or_unused(config->pin_data13)), + static_cast(pin_or_unused(config->pin_data14)), + static_cast(pin_or_unused(config->pin_data15)), }, .flags = { .disp_active_low = config->disp_active_low, @@ -209,7 +219,7 @@ static error_t start(Device* device) { // marked unused rather than left as the aggregate-init default of 0 (which would look like // "GPIO0 is wired to this line"). for (size_t i = 16; i < sizeof(panel_config.data_gpio_nums) / sizeof(panel_config.data_gpio_nums[0]); i++) { - panel_config.data_gpio_nums[i] = -1; + panel_config.data_gpio_nums[i] = GPIO_NUM_NC; } esp_err_t ret = esp_lcd_new_rgb_panel(&panel_config, &internal->panel_handle); diff --git a/Drivers/ssd1306-module/source/ssd1306.cpp b/Drivers/ssd1306-module/source/ssd1306.cpp index c39b543a6..17342e78c 100644 --- a/Drivers/ssd1306-module/source/ssd1306.cpp +++ b/Drivers/ssd1306-module/source/ssd1306.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -52,28 +51,24 @@ static esp_err_t create_io_handle(Device* parent, uint8_t address, esp_lcd_panel // with, unlike the multi-byte-per-command SPI/QSPI panels elsewhere in this repo. esp_lcd_panel_io_i2c_config_t io_config = { .dev_addr = address, - .on_color_trans_done = nullptr, - .user_ctx = nullptr, + .scl_speed_hz = 0, .control_phase_bytes = 1, .dc_bit_offset = 6, .lcd_cmd_bits = 0, .lcd_param_bits = 0, + .on_color_trans_done = nullptr, + .user_ctx = nullptr, .flags = { .dc_low_on_data = false, .disable_control_phase = false, }, - .scl_speed_hz = 0, }; auto* parent_driver = device_get_driver(parent); - if (driver_is_compatible(parent_driver, "espressif,esp32-i2c")) { - auto port = static_cast(parent->config)->port; - return esp_lcd_new_panel_io_i2c_v1(port, &io_config, out_handle); - } if (driver_is_compatible(parent_driver, "espressif,esp32-i2c-master")) { auto bus = esp32_i2c_master_get_bus_handle(parent); io_config.scl_speed_hz = esp32_i2c_master_get_clock_frequency(parent); - return esp_lcd_new_panel_io_i2c_v2(bus, &io_config, out_handle); + return esp_lcd_new_panel_io_i2c(bus, &io_config, out_handle); } LOG_E(TAG, "Unsupported I2C driver"); @@ -164,15 +159,14 @@ static error_t start(Device* device) { .height = static_cast(config->vertical_resolution), }; - // color_space (not rgb_ele_order): this deprecated union member is the only one whose type - // can express ESP_LCD_COLOR_SPACE_MONOCHROME - rgb_ele_order's own enum only covers RGB/BGR. + // No rgb_ele_order set: the built-in ssd1306 vendor driver is monochrome and never reads it + // (only bits_per_pixel, checked to be exactly 1 - see esp_lcd_panel_ssd1306.c). esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = -1, // always -1: reset is handled manually above, not by the panel itself - .color_space = ESP_LCD_COLOR_SPACE_MONOCHROME, .data_endian = LCD_RGB_DATA_ENDIAN_BIG, .bits_per_pixel = 1, - .flags = { .reset_active_high = false }, + .reset_gpio_num = GPIO_NUM_NC, // reset is handled manually above, not by the panel itself .vendor_config = &ssd1306_config, + .flags = { .reset_active_high = false }, }; if (esp_lcd_new_panel_ssd1306(internal->io_handle, &panel_config, &internal->panel_handle) != ESP_OK) { diff --git a/Drivers/st7121-module/source/st7121.cpp b/Drivers/st7121-module/source/st7121.cpp index 58d73e4b9..61189a792 100644 --- a/Drivers/st7121-module/source/st7121.cpp +++ b/Drivers/st7121-module/source/st7121.cpp @@ -250,13 +250,13 @@ static error_t start(Device* device) { }; const esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = &vendor_config, // ST7121's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = &vendor_config, }; if (esp_lcd_new_panel_st7121(internal->io_handle, &panel_config, &internal->panel_handle) != ESP_OK) { @@ -354,7 +354,7 @@ static error_t start(Device* device) { xSemaphoreGive(internal->color_trans_done_semaphore); esp_lcd_dpi_panel_event_callbacks_t callbacks = {}; - callbacks.on_refresh_done = on_refresh_done; + callbacks.on_frame_buf_complete = on_refresh_done; callbacks.on_color_trans_done = on_color_trans_done; if (esp_lcd_dpi_panel_register_event_callbacks(internal->panel_handle, &callbacks, internal) != ESP_OK) { LOG_E(TAG, "Failed to register panel event callbacks"); diff --git a/Drivers/st7123-module/source/st7123.cpp b/Drivers/st7123-module/source/st7123.cpp index 583480f4a..7e0a047ac 100644 --- a/Drivers/st7123-module/source/st7123.cpp +++ b/Drivers/st7123-module/source/st7123.cpp @@ -250,13 +250,13 @@ static error_t start(Device* device) { }; const esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = &vendor_config, // ST7123's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = &vendor_config, }; if (esp_lcd_new_panel_st7123(internal->io_handle, &panel_config, &internal->panel_handle) != ESP_OK) { @@ -354,7 +354,7 @@ static error_t start(Device* device) { xSemaphoreGive(internal->color_trans_done_semaphore); esp_lcd_dpi_panel_event_callbacks_t callbacks = {}; - callbacks.on_refresh_done = on_refresh_done; + callbacks.on_frame_buf_complete = on_refresh_done; callbacks.on_color_trans_done = on_color_trans_done; if (esp_lcd_dpi_panel_register_event_callbacks(internal->panel_handle, &callbacks, internal) != ESP_OK) { LOG_E(TAG, "Failed to register panel event callbacks"); diff --git a/Drivers/st7123-module/source/st7123_touch.cpp b/Drivers/st7123-module/source/st7123_touch.cpp index ac35820b8..b7e6c140e 100644 --- a/Drivers/st7123-module/source/st7123_touch.cpp +++ b/Drivers/st7123-module/source/st7123_touch.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -39,14 +38,10 @@ static esp_err_t create_io_handle(Device* parent, esp_lcd_panel_io_handle_t* out esp_lcd_panel_io_i2c_config_t io_config = ESP_LCD_TOUCH_IO_I2C_ST7123_CONFIG(); auto* parent_driver = device_get_driver(parent); - if (driver_is_compatible(parent_driver, "espressif,esp32-i2c")) { - auto port = static_cast(parent->config)->port; - return esp_lcd_new_panel_io_i2c_v1(port, &io_config, out_handle); - } if (driver_is_compatible(parent_driver, "espressif,esp32-i2c-master")) { auto bus = esp32_i2c_master_get_bus_handle(parent); io_config.scl_speed_hz = esp32_i2c_master_get_clock_frequency(parent); - return esp_lcd_new_panel_io_i2c_v2(bus, &io_config, out_handle); + return esp_lcd_new_panel_io_i2c(bus, &io_config, out_handle); } LOG_E(TAG, "Unsupported I2C driver"); diff --git a/Drivers/st7701-module/source/st7701.cpp b/Drivers/st7701-module/source/st7701.cpp index 2d8b5f579..434be14a3 100644 --- a/Drivers/st7701-module/source/st7701.cpp +++ b/Drivers/st7701-module/source/st7701.cpp @@ -69,6 +69,14 @@ static int pin_or_unused(const GpioPinSpec& pin) { return pin.gpio_controller == nullptr ? -1 : static_cast(pin.pin); } +static lcd_color_format_t color_format_from_bpp(uint8_t bits_per_pixel) { + switch (bits_per_pixel) { + case 16: return LCD_COLOR_FMT_RGB565; + case 24: return LCD_COLOR_FMT_RGB888; + default: return static_cast(0); + } +} + // Unpacks the devicetree's flat [cmd, data_len, delay_ms, data_len bytes...] encoding (produced // by the devicetree compiler's "array" property type - see init-sequence in // bindings/sitronix,st7701.yaml) into a heap-allocated st7701_lcd_init_cmd_t array. Each entry's @@ -177,33 +185,35 @@ static error_t start(Device* device) { } }, .data_width = config->data_width, - .bits_per_pixel = config->bits_per_pixel, + .in_color_format = color_format_from_bpp(config->bits_per_pixel), .num_fbs = config->num_fbs, .bounce_buffer_size_px = config->bounce_buffer_size_px, - .sram_trans_align = config->sram_trans_align, - .psram_trans_align = config->psram_trans_align, - .hsync_gpio_num = pin_or_unused(config->pin_hsync), - .vsync_gpio_num = pin_or_unused(config->pin_vsync), - .de_gpio_num = pin_or_unused(config->pin_de), - .pclk_gpio_num = pin_or_unused(config->pin_pclk), - .disp_gpio_num = pin_or_unused(config->pin_disp), + // No device configures sram-trans-align/psram-trans-align differently from their YAML + // defaults (8/64), so the single dma_burst_size that replaced both can just take the + // larger (PSRAM) alignment - safe for SRAM-only allocations too, just less tightly packed. + .dma_burst_size = config->psram_trans_align, + .hsync_gpio_num = static_cast(pin_or_unused(config->pin_hsync)), + .vsync_gpio_num = static_cast(pin_or_unused(config->pin_vsync)), + .de_gpio_num = static_cast(pin_or_unused(config->pin_de)), + .pclk_gpio_num = static_cast(pin_or_unused(config->pin_pclk)), + .disp_gpio_num = static_cast(pin_or_unused(config->pin_disp)), .data_gpio_nums = { - pin_or_unused(config->pin_data0), - pin_or_unused(config->pin_data1), - pin_or_unused(config->pin_data2), - pin_or_unused(config->pin_data3), - pin_or_unused(config->pin_data4), - pin_or_unused(config->pin_data5), - pin_or_unused(config->pin_data6), - pin_or_unused(config->pin_data7), - pin_or_unused(config->pin_data8), - pin_or_unused(config->pin_data9), - pin_or_unused(config->pin_data10), - pin_or_unused(config->pin_data11), - pin_or_unused(config->pin_data12), - pin_or_unused(config->pin_data13), - pin_or_unused(config->pin_data14), - pin_or_unused(config->pin_data15), + static_cast(pin_or_unused(config->pin_data0)), + static_cast(pin_or_unused(config->pin_data1)), + static_cast(pin_or_unused(config->pin_data2)), + static_cast(pin_or_unused(config->pin_data3)), + static_cast(pin_or_unused(config->pin_data4)), + static_cast(pin_or_unused(config->pin_data5)), + static_cast(pin_or_unused(config->pin_data6)), + static_cast(pin_or_unused(config->pin_data7)), + static_cast(pin_or_unused(config->pin_data8)), + static_cast(pin_or_unused(config->pin_data9)), + static_cast(pin_or_unused(config->pin_data10)), + static_cast(pin_or_unused(config->pin_data11)), + static_cast(pin_or_unused(config->pin_data12)), + static_cast(pin_or_unused(config->pin_data13)), + static_cast(pin_or_unused(config->pin_data14)), + static_cast(pin_or_unused(config->pin_data15)), }, .flags = { .disp_active_low = config->disp_active_low, @@ -219,7 +229,7 @@ static error_t start(Device* device) { // more data lines than that, the tail of the array must be explicitly marked unused rather // than left as the aggregate-init default of 0 (which would look like "GPIO0 is wired here"). for (size_t i = 16; i < sizeof(rgb_config.data_gpio_nums) / sizeof(rgb_config.data_gpio_nums[0]); i++) { - rgb_config.data_gpio_nums[i] = -1; + rgb_config.data_gpio_nums[i] = GPIO_NUM_NC; } st7701_vendor_config_t vendor_config = { @@ -234,13 +244,13 @@ static error_t start(Device* device) { }; esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = &vendor_config, // ST7701's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = &vendor_config, }; ret = esp_lcd_new_panel_st7701(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/st7735-module/source/st7735.cpp b/Drivers/st7735-module/source/st7735.cpp index bacaf6b1c..0a73ff9db 100644 --- a/Drivers/st7735-module/source/st7735.cpp +++ b/Drivers/st7735-module/source/st7735.cpp @@ -83,8 +83,8 @@ static error_t start(Device* device) { } esp_lcd_panel_io_spi_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), - .dc_gpio_num = pin_or_unused(config->pin_dc), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), + .dc_gpio_num = static_cast(pin_or_unused(config->pin_dc)), .spi_mode = 0, .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, @@ -115,13 +115,13 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = nullptr, // ST7735's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = nullptr, }; ret = esp_lcd_new_panel_st7735(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/st7789-i8080-module/source/st7789_i8080.cpp b/Drivers/st7789-i8080-module/source/st7789_i8080.cpp index b000e3ec4..07cd28efe 100644 --- a/Drivers/st7789-i8080-module/source/st7789_i8080.cpp +++ b/Drivers/st7789-i8080-module/source/st7789_i8080.cpp @@ -113,7 +113,7 @@ static error_t start(Device* device) { } esp_lcd_panel_io_i80_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, .on_color_trans_done = on_color_trans_done, @@ -144,13 +144,13 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = 16, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = nullptr, // ST7789's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = nullptr, }; ret = esp_lcd_new_panel_st7789(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/st7796-i8080-module/source/st7796_i8080.cpp b/Drivers/st7796-i8080-module/source/st7796_i8080.cpp index 2af77339a..f232b576f 100644 --- a/Drivers/st7796-i8080-module/source/st7796_i8080.cpp +++ b/Drivers/st7796-i8080-module/source/st7796_i8080.cpp @@ -81,7 +81,7 @@ static error_t start(Device* device) { } esp_lcd_panel_io_i80_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, .on_color_trans_done = on_color_trans_done, @@ -112,13 +112,13 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = 16, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = nullptr, // ST7796's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = nullptr, }; ret = esp_lcd_new_panel_st7796(internal->io_handle, &panel_config, &internal->panel_handle); diff --git a/Drivers/st7796-module/source/st7796.cpp b/Drivers/st7796-module/source/st7796.cpp index e070bfb1d..dc6916419 100644 --- a/Drivers/st7796-module/source/st7796.cpp +++ b/Drivers/st7796-module/source/st7796.cpp @@ -83,8 +83,8 @@ static error_t start(Device* device) { } esp_lcd_panel_io_spi_config_t io_config = { - .cs_gpio_num = pin_or_unused(cs_pin), - .dc_gpio_num = pin_or_unused(config->pin_dc), + .cs_gpio_num = static_cast(pin_or_unused(cs_pin)), + .dc_gpio_num = static_cast(pin_or_unused(config->pin_dc)), .spi_mode = 0, .pclk_hz = config->pixel_clock_hz, .trans_queue_depth = config->transaction_queue_depth, @@ -115,13 +115,13 @@ static error_t start(Device* device) { } esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = pin_or_unused(config->pin_reset), .rgb_ele_order = config->bgr_order ? LCD_RGB_ELEMENT_ORDER_BGR : LCD_RGB_ELEMENT_ORDER_RGB, .data_endian = LCD_RGB_DATA_ENDIAN_LITTLE, .bits_per_pixel = config->bits_per_pixel, + .reset_gpio_num = static_cast(pin_or_unused(config->pin_reset)), + .vendor_config = nullptr, // ST7796's reset line is fixed active-low in hardware. .flags = { .reset_active_high = false }, - .vendor_config = nullptr, }; ret = esp_lcd_new_panel_st7796(internal->io_handle, &panel_config, &internal->panel_handle);