diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c8764f6..eee0332c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,9 @@ set(COMPONENT_ADD_INCLUDEDIRS ) file(GLOB SRCS src/*.cpp - src/lgfx/Fonts/lvgl/lv_font_*.c src/lgfx/Fonts/efont/*.c src/lgfx/Fonts/IPA/*.c + src/lgfx/Fonts/lvgl/*.c src/lgfx/utility/*.c src/lgfx/v1/*.cpp src/lgfx/v1/lv_font/*.c diff --git a/src/lgfx/utility/result.hpp b/src/lgfx/utility/result.hpp index bcecd9ea..af4545ee 100644 --- a/src/lgfx/utility/result.hpp +++ b/src/lgfx/utility/result.hpp @@ -4242,7 +4242,7 @@ auto RESULT_NS_IMPL::detail::throw_bad_result_access(E&& error) -> void std::abort(); #else std::abort(); -/* // ESP32-S3向けビルドがコンパイルエラーとなるためコメントアウト by lovyan03; +/* // ESP32-S3向けビルドがコンパイルエラーとなるためコメントアウト by lovyan03; using exception_type = bad_result_access< typename std::remove_const< typename std::remove_reference::type diff --git a/src/lgfx/v1/LGFXBase.cpp b/src/lgfx/v1/LGFXBase.cpp index f25424bb..9bb9fe32 100644 --- a/src/lgfx/v1/LGFXBase.cpp +++ b/src/lgfx/v1/LGFXBase.cpp @@ -1093,9 +1093,9 @@ namespace lgfx auto scanline = (rgb888_t*)alloca(w * sizeof(rgb888_t)); startWrite(); - for( int _y=0;_y #include +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + #define LGFX_GPIO_PAD_SELECT(pin) rom_gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig, inv, oen_inv) rom_gpio_matrix_out((gpio_num_t)(pin), (sig), (inv), (oen_inv)) +#else + #define LGFX_GPIO_PAD_SELECT(pin) gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig, inv, oen_inv) gpio_matrix_out((gpio_num_t)(pin), (sig), (inv), (oen_inv)) +#endif + namespace lgfx { inline namespace v1 @@ -122,21 +130,21 @@ namespace lgfx { int32_t pin = _cfg.pin_data[i]; if (pin < 0) { continue; } - gpio_pad_select_gpio(pin); + LGFX_GPIO_PAD_SELECT(pin); gpio_set_direction((gpio_num_t)pin, GPIO_MODE_INPUT_OUTPUT); - gpio_matrix_out(pin, idx_base + i, 0, 0); + LGFX_GPIO_MATRIX_OUT(pin, idx_base + i, 0, 0); } for (size_t i = 0; i < 3; ++i) { int32_t pin = _cfg.pin_ctrl[i]; if (pin < 0) { continue; } - gpio_pad_select_gpio(pin); + LGFX_GPIO_PAD_SELECT(pin); gpio_hi(pin); gpio_set_direction((gpio_num_t)pin, GPIO_MODE_OUTPUT); } - gpio_matrix_out(_cfg.pin_rs, idx_base + 8, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, idx_base + 8, 0, 0); uint32_t dport_clk_en; uint32_t dport_rst; @@ -154,7 +162,7 @@ namespace lgfx dport_rst = DPORT_I2S1_RST; } #endif - gpio_matrix_out(_cfg.pin_wr, idx_base, 1, 0); // WR (Write-strobe in 8080 mode, Active-low) + LGFX_GPIO_MATRIX_OUT(_cfg.pin_wr, idx_base, 1, 0); // WR (Write-strobe in 8080 mode, Active-low) DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, dport_clk_en); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, dport_rst); @@ -534,7 +542,7 @@ namespace lgfx if (_cache_index) { _cache_index = _flush(_cache_index, true); } _wait(); - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100, 0, 0); gpio_lo(_cfg.pin_rd); } @@ -543,7 +551,7 @@ namespace lgfx gpio_hi(_cfg.pin_rd); auto idx_base = (_cfg.i2s_port == I2S_NUM_0) ? I2S0O_DATA_OUT16_IDX : I2S1O_DATA_OUT16_IDX; - gpio_matrix_out(_cfg.pin_rs, idx_base, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, idx_base, 0, 0); } void Bus_Parallel8::_read_bytes(uint8_t* __restrict dst, uint32_t length) diff --git a/src/lgfx/v1/platforms/esp32/Bus_Parallel8.hpp b/src/lgfx/v1/platforms/esp32/Bus_Parallel8.hpp index 96757d93..fedf4960 100644 --- a/src/lgfx/v1/platforms/esp32/Bus_Parallel8.hpp +++ b/src/lgfx/v1/platforms/esp32/Bus_Parallel8.hpp @@ -27,7 +27,9 @@ Original Source: #include #endif -#if __has_include() +#if __has_include() + #include +#elif __has_include() #include #else #include diff --git a/src/lgfx/v1/platforms/esp32/Bus_SPI.cpp b/src/lgfx/v1/platforms/esp32/Bus_SPI.cpp index 6d81dcbe..06fce796 100644 --- a/src/lgfx/v1/platforms/esp32/Bus_SPI.cpp +++ b/src/lgfx/v1/platforms/esp32/Bus_SPI.cpp @@ -18,6 +18,11 @@ Original Source: #if defined (ESP_PLATFORM) #include +#if defined (CONFIG_IDF_TARGET_ESP32P4) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wattributes" +#endif + #include "Bus_SPI.hpp" #if defined ( CONFIG_IDF_TARGET_ESP32 ) || !defined ( CONFIG_IDF_TARGET ) @@ -56,18 +61,26 @@ Original Source: #include #else #include // dispatched by core -#endif +#endif #ifndef SPI_PIN_REG #define SPI_PIN_REG SPI_MISC_REG #endif #if defined (SOC_GDMA_SUPPORTED) // for C3/C6/S3 - #include + #if __has_include() + #include + #elif __has_include() + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wattributes" + #include + #pragma GCC diagnostic pop + #endif #if __has_include() #include #elif __has_include() // ESP32P4 #include + #include #endif #if __has_include() #include @@ -95,8 +108,16 @@ Original Source: #endif #endif +#if !defined(gpio_matrix_out) && defined(rom_gpio_matrix_out) + #define gpio_matrix_out rom_gpio_matrix_out +#endif + #include "common.hpp" +#if defined (CONFIG_IDF_TARGET_ESP32P4) + #pragma GCC diagnostic pop +#endif + #include namespace lgfx @@ -189,6 +210,9 @@ namespace lgfx { // DMAチャンネルが特定できたらそれを使用する; _spi_dma_out_link_reg = reg(DMA_OUT_LINK_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH); _spi_dma_outstatus_reg = reg(DMA_OUTFIFO_STATUS_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH); + #if defined ( CONFIG_IDF_TARGET_ESP32P4 ) + _spi_dma_out_link2_reg = reg(AXI_DMA_OUT_LINK2_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH); + #endif } #elif defined ( CONFIG_IDF_TARGET_ESP32 ) || !defined ( CONFIG_IDF_TARGET ) @@ -206,7 +230,11 @@ namespace lgfx { if (pin >= GPIO_NUM_MAX) return; gpio_reset_pin( (gpio_num_t)pin); +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + rom_gpio_matrix_out((gpio_num_t)pin, SIG_GPIO_OUT_IDX, 0, 0); +#else gpio_matrix_out((gpio_num_t)pin, SIG_GPIO_OUT_IDX, 0, 0); +#endif // gpio_matrix_in には、ArduinoESP32 v1.0.x系では重大なバグがある。(無関係なピンに対して設定変更が行われることがある) // gpio_matrix_in( (gpio_num_t)pin, 0x100, 0 ); } @@ -672,15 +700,28 @@ namespace lgfx if (use_dma) { auto spi_dma_out_link_reg = _spi_dma_out_link_reg; + #if defined ( CONFIG_IDF_TARGET_ESP32P4 ) + auto spi_dma_out_link2_reg = _spi_dma_out_link2_reg; + #endif auto cmd = _spi_cmd_reg; while (*cmd & SPI_USR) {} *spi_dma_out_link_reg = 0; _setup_dma_desc_links(data, length); + + #if defined ( CONFIG_IDF_TARGET_ESP32P4 ) + esp_cache_msync((void*)data, sizeof(uint8_t) * length, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED); + esp_cache_msync(_dmadesc, sizeof(lldesc_t) * _dmadesc_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED); + #endif #if defined ( SOC_GDMA_SUPPORTED ) auto dma = reg(SPI_DMA_CONF_REG(_spi_port)); *dma = 0; /// Clear previous transfer uint32_t len = ((length - 1) & ((SPI_MS_DATA_BITLEN)>>3)) + 1; + #if defined ( CONFIG_IDF_TARGET_ESP32P4 ) + *spi_dma_out_link2_reg = ((uint32_t)(_dmadesc)); + *spi_dma_out_link_reg = DMA_OUTLINK_START_CH0 ; + #else *spi_dma_out_link_reg = DMA_OUTLINK_START_CH0 | ((int)(&_dmadesc[0]) & 0xFFFFF); + #endif *dma = SPI_DMA_TX_ENA; _clear_dma_reg = dma; #else @@ -889,7 +930,12 @@ namespace lgfx *_spi_dma_out_link_reg = 0; #if defined ( SOC_GDMA_SUPPORTED ) + #if defined ( CONFIG_IDF_TARGET_ESP32P4 ) + *_spi_dma_out_link2_reg = ((uint32_t)(_dmadesc)); + *_spi_dma_out_link_reg = DMA_OUTLINK_START_CH0; + #else *_spi_dma_out_link_reg = DMA_OUTLINK_START_CH0 | ((int)(&_dmadesc[0]) & 0xFFFFF); + #endif auto dma = reg(SPI_DMA_CONF_REG(_spi_port)); *dma = SPI_DMA_TX_ENA; _clear_dma_reg = dma; @@ -1173,7 +1219,18 @@ namespace lgfx periph_module_reset( PERIPH_SPI3_DMA_MODULE ); } #elif defined( CONFIG_IDF_TARGET_ESP32 ) || !defined( CONFIG_IDF_TARGET ) + #if defined (PERIPH_SPI_DMA_MODULE) periph_module_reset( PERIPH_SPI_DMA_MODULE ); + #elif defined (PERIPH_HSPI_MODULE) && defined (PERIPH_VSPI_MODULE) + if (_cfg.spi_host == SPI2_HOST) + { + periph_module_reset( PERIPH_HSPI_MODULE ); + } + else + { + periph_module_reset( PERIPH_VSPI_MODULE ); + } + #endif #endif } diff --git a/src/lgfx/v1/platforms/esp32/Bus_SPI.hpp b/src/lgfx/v1/platforms/esp32/Bus_SPI.hpp index 5fc10ef9..ad75255a 100644 --- a/src/lgfx/v1/platforms/esp32/Bus_SPI.hpp +++ b/src/lgfx/v1/platforms/esp32/Bus_SPI.hpp @@ -90,7 +90,13 @@ namespace lgfx bool use_lock = true; uint8_t dma_channel = LGFX_ESP32_SPI_DMA_CH; #if !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32) - spi_host_device_t spi_host = VSPI_HOST; + #if defined (VSPI_HOST) + spi_host_device_t spi_host = VSPI_HOST; + #elif defined (SPI3_HOST) + spi_host_device_t spi_host = SPI3_HOST; + #else + spi_host_device_t spi_host = SPI2_HOST; + #endif #else spi_host_device_t spi_host = SPI2_HOST; #endif @@ -186,6 +192,9 @@ namespace lgfx volatile uint32_t* _spi_cmd_reg = nullptr; volatile uint32_t* _spi_user_reg = nullptr; volatile uint32_t* _spi_dma_out_link_reg = nullptr; + #if defined (CONFIG_IDF_TARGET_ESP32P4) + volatile uint32_t* _spi_dma_out_link2_reg = nullptr; + #endif volatile uint32_t* _spi_dma_outstatus_reg = nullptr; volatile uint32_t* _clear_dma_reg = nullptr; uint32_t _last_freq_apb = 0; diff --git a/src/lgfx/v1/platforms/esp32/Light_PWM.cpp b/src/lgfx/v1/platforms/esp32/Light_PWM.cpp index e2d79f5d..f70bf148 100644 --- a/src/lgfx/v1/platforms/esp32/Light_PWM.cpp +++ b/src/lgfx/v1/platforms/esp32/Light_PWM.cpp @@ -26,6 +26,7 @@ Original Source: #include #endif #else + #include #include #endif @@ -46,11 +47,14 @@ namespace lgfx #if defined ESP_ARDUINO_VERSION #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0) #define LEDC_USE_IDF_V5 // esp32-arduino core 3.x.x uses the new ledC syntax - #endif + #endif + #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(6, 0, 0) + #define LEDC_USE_IDF_V6 // esp32-arduino core 6.x.x + #endif #endif #if defined LEDC_USE_IDF_V5 - ledcAttach(_cfg.pin_bl, _cfg.freq, PWM_BITS); + ledcAttach(_cfg.pin_bl, _cfg.freq, PWM_BITS); setBrightness(brightness); #else ledcSetup(_cfg.pwm_channel, _cfg.freq, PWM_BITS); @@ -68,7 +72,9 @@ namespace lgfx ledc_channel.speed_mode = LEDC_LOW_SPEED_MODE; #endif ledc_channel.channel = (ledc_channel_t)_cfg.pwm_channel; +#if !defined LEDC_USE_IDF_V6 // ledc_channel_config_t.intr_type is deprecated, no need to explicitly configure interrupt, handled in the driver ledc_channel.intr_type = LEDC_INTR_DISABLE; +#endif ledc_channel.timer_sel = (ledc_timer_t)((_cfg.pwm_channel >> 1) & 3); ledc_channel.duty = _cfg.invert ? (1 << PWM_BITS) : 0; ledc_channel.hpoint = 0; diff --git a/src/lgfx/v1/platforms/esp32/common.cpp b/src/lgfx/v1/platforms/esp32/common.cpp index e338601d..ca491ace 100644 --- a/src/lgfx/v1/platforms/esp32/common.cpp +++ b/src/lgfx/v1/platforms/esp32/common.cpp @@ -43,7 +43,7 @@ Original Source: #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)) #if __has_include() #include - #if defined ( i2c_ll_reset_register ) + #if defined ( i2c_ll_reset_register ) || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) #if SOC_PERIPH_CLK_CTRL_SHARED #define I2C_CLOCK_SRC_ATOMIC() PERIPH_RCC_ATOMIC() #else @@ -129,6 +129,9 @@ Original Source: #endif #if defined (SOC_GDMA_SUPPORTED) // for C3/S3 + #if __has_include() + #include + #endif #if __has_include() #include #elif __has_include() // ESP32P4 @@ -153,7 +156,13 @@ Original Source: #endif #if !defined (SOC_GDMA_PAIRS_PER_GROUP_MAX) - #define SOC_GDMA_PAIRS_PER_GROUP_MAX SOC_GDMA_PAIRS_PER_GROUP + #if defined (SOC_GDMA_PAIRS_PER_GROUP) + #define SOC_GDMA_PAIRS_PER_GROUP_MAX SOC_GDMA_PAIRS_PER_GROUP + #elif defined (GDMA_LL_PAIRS_PER_INST) + #define SOC_GDMA_PAIRS_PER_GROUP_MAX GDMA_LL_PAIRS_PER_INST + #else + #define SOC_GDMA_PAIRS_PER_GROUP_MAX 5 + #endif #endif #endif @@ -547,7 +556,13 @@ namespace lgfx #endif #if !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32) - static constexpr int default_spi_host = VSPI_HOST; + #if defined (VSPI_HOST) + static constexpr int default_spi_host = VSPI_HOST; + #elif defined (SPI3_HOST) + static constexpr int default_spi_host = SPI3_HOST; + #else + static constexpr int default_spi_host = SPI2_HOST; + #endif static constexpr int spi_periph_num = 3; #else static constexpr int default_spi_host = SPI2_HOST; @@ -867,8 +882,15 @@ namespace lgfx #define I2C_ACK_ERR_INT_RAW_M I2C_NACK_INT_RAW_M #endif +#if !defined ( I2C_CLOCK_SRC_ATOMIC ) + #if __cplusplus <= 201103L + #define LGFX_PERIPH_MODULE_T periph_module_t + #else + #define LGFX_PERIPH_MODULE_T auto + #endif + __attribute__ ((unused)) - static periph_module_t getPeriphModule(int num) + static LGFX_PERIPH_MODULE_T getPeriphModule(int num) { #if SOC_I2C_NUM == 1 || defined CONFIG_IDF_TARGET_ESP32C6 return PERIPH_I2C0_MODULE; @@ -877,6 +899,9 @@ namespace lgfx #endif } + #undef LGFX_PERIPH_MODULE_T +#endif + static i2c_dev_t* getDev(int num) { #if SOC_I2C_NUM == 1 || defined CONFIG_IDF_TARGET_ESP32C6 @@ -1091,7 +1116,11 @@ namespace lgfx #if __has_include() if ((int8_t)pin_sda >= 0) { gpio_set_level(pin_sda, true); +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + (void)gpio_iomux_output(pin_sda, PIN_FUNC_GPIO); +#else gpio_iomux_out(pin_sda, PIN_FUNC_GPIO, false); +#endif gpio_set_direction(pin_sda, GPIO_MODE_INPUT_OUTPUT_OD); gpio_set_pull_mode(pin_sda, GPIO_PULLUP_ONLY); esp_rom_gpio_connect_out_signal(pin_sda, i2c_periph_signal[i2c_num].sda_out_sig, 0, 0); @@ -1099,7 +1128,11 @@ namespace lgfx } if ((int8_t)pin_scl >= 0) { gpio_set_level(pin_scl, true); +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + (void)gpio_iomux_output(pin_scl, PIN_FUNC_GPIO); +#else gpio_iomux_out(pin_scl, PIN_FUNC_GPIO, false); +#endif gpio_set_direction(pin_scl, GPIO_MODE_INPUT_OUTPUT_OD); esp_rom_gpio_connect_out_signal(pin_scl, i2c_periph_signal[i2c_num].scl_out_sig, 0, 0); esp_rom_gpio_connect_in_signal(pin_scl, i2c_periph_signal[i2c_num].scl_in_sig, 0); diff --git a/src/lgfx/v1/platforms/esp32/common.hpp b/src/lgfx/v1/platforms/esp32/common.hpp index 6a10176b..e7bf0493 100644 --- a/src/lgfx/v1/platforms/esp32/common.hpp +++ b/src/lgfx/v1/platforms/esp32/common.hpp @@ -31,6 +31,8 @@ Original Source: #include #if __has_include() #include +#include +#include #endif #include #include @@ -92,6 +94,13 @@ Original Source: #define LGFX_IDF_V5 #endif + #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0) + #ifndef LGFX_I2S_PORT_T_COMPAT + #define LGFX_I2S_PORT_T_COMPAT 1 + typedef int i2s_port_t; + #endif + #endif + #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0) #if ! defined(CONFIG_IDF_TARGET_ESP32P4) // QSPI support for ESP32P4 still needs to be fixed #define LGFX_USE_QSPI diff --git a/src/lgfx/v1/platforms/esp32c3/Bus_Parallel8.cpp b/src/lgfx/v1/platforms/esp32c3/Bus_Parallel8.cpp index c355de32..c4a6fde8 100644 --- a/src/lgfx/v1/platforms/esp32c3/Bus_Parallel8.cpp +++ b/src/lgfx/v1/platforms/esp32c3/Bus_Parallel8.cpp @@ -25,6 +25,12 @@ Original Source: #include #include +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + #define LGFX_GPIO_PAD_SELECT(pin) rom_gpio_pad_select_gpio((gpio_num_t)(pin)) +#else + #define LGFX_GPIO_PAD_SELECT(pin) gpio_pad_select_gpio((gpio_num_t)(pin)) +#endif + namespace lgfx { inline namespace v1 @@ -64,9 +70,9 @@ namespace lgfx _init_pin(); - gpio_pad_select_gpio(_cfg.pin_rd); - gpio_pad_select_gpio(_cfg.pin_wr); - gpio_pad_select_gpio(_cfg.pin_rs); + LGFX_GPIO_PAD_SELECT(_cfg.pin_rd); + LGFX_GPIO_PAD_SELECT(_cfg.pin_wr); + LGFX_GPIO_PAD_SELECT(_cfg.pin_rs); gpio_hi(_cfg.pin_rd); gpio_hi(_cfg.pin_wr); @@ -85,7 +91,7 @@ namespace lgfx gpio_mode_t gpio_mode = read ? GPIO_MODE_INPUT : GPIO_MODE_OUTPUT; for (size_t i = 0; i < 8; ++i) { - gpio_pad_select_gpio(pins[i]); + LGFX_GPIO_PAD_SELECT(pins[i]); gpio_set_direction((gpio_num_t)pins[i], gpio_mode); } } diff --git a/src/lgfx/v1/platforms/esp32p4/Panel_DSI.cpp b/src/lgfx/v1/platforms/esp32p4/Panel_DSI.cpp index a23a6730..9462adc1 100644 --- a/src/lgfx/v1/platforms/esp32p4/Panel_DSI.cpp +++ b/src/lgfx/v1/platforms/esp32p4/Panel_DSI.cpp @@ -24,6 +24,9 @@ Original Source: #include #include +#if __has_include() + #include +#endif namespace lgfx { @@ -73,7 +76,12 @@ namespace lgfx dpi_config.virtual_channel = 0; dpi_config.dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT; dpi_config.dpi_clock_freq_mhz = _config_detail.dpi_freq_mhz; + #if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + dpi_config.in_color_format = LCD_COLOR_FMT_RGB565; + dpi_config.out_color_format = LCD_COLOR_FMT_RGB565; + #else dpi_config.pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB565; + #endif dpi_config.num_fbs = 1; dpi_config.video_timing.h_size = _cfg.panel_width; dpi_config.video_timing.v_size = _cfg.panel_height; @@ -83,9 +91,17 @@ namespace lgfx dpi_config.video_timing.vsync_back_porch = _config_detail.vsync_back_porch; dpi_config.video_timing.vsync_pulse_width = _config_detail.vsync_pulse_width; dpi_config.video_timing.vsync_front_porch = _config_detail.vsync_front_porch; + #if !defined (ESP_IDF_VERSION_VAL) || (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(6, 0, 0)) dpi_config.flags.use_dma2d = true; - - return ESP_OK == esp_lcd_new_panel_dpi(mipi_dsi_bus, &dpi_config, &_disp_panel_handle); + #endif + auto ret = esp_lcd_new_panel_dpi(mipi_dsi_bus, &dpi_config, &_disp_panel_handle); + #if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + if (ret == ESP_OK) + { + (void)esp_lcd_dpi_panel_enable_dma2d(_disp_panel_handle); + } + #endif + return ret == ESP_OK; } color_depth_t Panel_DSI::setColorDepth(color_depth_t depth) diff --git a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.cpp b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.cpp index fc48a1e4..4e46c2e3 100644 --- a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.cpp +++ b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.cpp @@ -27,6 +27,21 @@ Original Source: #include #include +#if !defined (DPORT_PERIP_CLK_EN_REG) && defined (DPORT_PERIP_CLK_EN0_REG) + #define DPORT_PERIP_CLK_EN_REG DPORT_PERIP_CLK_EN0_REG +#endif +#if !defined (DPORT_PERIP_RST_EN_REG) && defined (DPORT_PERIP_RST_EN0_REG) + #define DPORT_PERIP_RST_EN_REG DPORT_PERIP_RST_EN0_REG +#endif + +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + #define LGFX_GPIO_PAD_SELECT(pin) rom_gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig, inv, oen_inv) rom_gpio_matrix_out((gpio_num_t)(pin), (sig), (inv), (oen_inv)) +#else + #define LGFX_GPIO_PAD_SELECT(pin) gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig, inv, oen_inv) gpio_matrix_out((gpio_num_t)(pin), (sig), (inv), (oen_inv)) +#endif + namespace lgfx { inline namespace v1 @@ -87,14 +102,14 @@ namespace lgfx { int32_t pin = _cfg.pin_ctrl[i]; if (pin < 0) { continue; } - gpio_pad_select_gpio(pin); + LGFX_GPIO_PAD_SELECT(pin); gpio_hi(pin); gpio_set_direction((gpio_num_t)pin, GPIO_MODE_OUTPUT); } auto idx_base = I2S0O_DATA_OUT8_IDX; - gpio_matrix_out(_cfg.pin_rs , I2S0O_DATA_OUT0_IDX, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs , I2S0O_DATA_OUT0_IDX, 0, 0); _direct_dc = false; @@ -114,7 +129,7 @@ namespace lgfx dport_rst = DPORT_I2S1_RST; } #endif - gpio_matrix_out(_cfg.pin_wr, idx_base, 1, 0); // WR (Write-strobe in 8080 mode, Active-low) + LGFX_GPIO_MATRIX_OUT(_cfg.pin_wr, idx_base, 1, 0); // WR (Write-strobe in 8080 mode, Active-low) DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, dport_clk_en); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, dport_rst); @@ -163,10 +178,10 @@ namespace lgfx for (size_t i = 0; i < 8; ++i) { // gpio_set_direction((gpio_num_t)pins[i], GPIO_MODE_INPUT_OUTPUT); - gpio_pad_select_gpio(pins[i ]); - gpio_pad_select_gpio(pins[i+8]); - gpio_matrix_out(pins[i ], I2S0O_DATA_OUT8_IDX + i+8, 0, 0); - gpio_matrix_out(pins[i+8], I2S0O_DATA_OUT8_IDX + i , 0, 0); + LGFX_GPIO_PAD_SELECT(pins[i ]); + LGFX_GPIO_PAD_SELECT(pins[i+8]); + LGFX_GPIO_MATRIX_OUT(pins[i ], I2S0O_DATA_OUT8_IDX + i+8, 0, 0); + LGFX_GPIO_MATRIX_OUT(pins[i+8], I2S0O_DATA_OUT8_IDX + i , 0, 0); } } } @@ -280,7 +295,7 @@ namespace lgfx if (_direct_dc) { _direct_dc = false; - gpio_matrix_out(_cfg.pin_rs, I2S0O_DATA_OUT0_IDX, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, I2S0O_DATA_OUT0_IDX, 0, 0); wait -= 16; } if (wait > 0) @@ -536,7 +551,7 @@ namespace lgfx if (!_direct_dc) { _direct_dc = true; - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100, 0, 0); wait -= 16; } if (wait > 0) @@ -561,7 +576,7 @@ namespace lgfx if (!_direct_dc) { _direct_dc = true; - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100, 0, 0); } gpio_lo(_cfg.pin_rd); diff --git a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.hpp b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.hpp index c085c6fd..959658c0 100644 --- a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.hpp +++ b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel16.hpp @@ -27,7 +27,9 @@ Original Source: #include #endif -#if __has_include() +#if __has_include() + #include +#elif __has_include() #include #else #include diff --git a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.cpp b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.cpp index 6856dc84..5fc1312d 100644 --- a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.cpp +++ b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.cpp @@ -27,6 +27,21 @@ Original Source: #include #include +#if !defined (DPORT_PERIP_CLK_EN_REG) && defined (DPORT_PERIP_CLK_EN0_REG) + #define DPORT_PERIP_CLK_EN_REG DPORT_PERIP_CLK_EN0_REG +#endif +#if !defined (DPORT_PERIP_RST_EN_REG) && defined (DPORT_PERIP_RST_EN0_REG) + #define DPORT_PERIP_RST_EN_REG DPORT_PERIP_RST_EN0_REG +#endif + +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + #define LGFX_GPIO_PAD_SELECT(pin) rom_gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig, inv, oen_inv) rom_gpio_matrix_out((gpio_num_t)(pin), (sig), (inv), (oen_inv)) +#else + #define LGFX_GPIO_PAD_SELECT(pin) gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig, inv, oen_inv) gpio_matrix_out((gpio_num_t)(pin), (sig), (inv), (oen_inv)) +#endif + namespace lgfx { inline namespace v1 @@ -87,14 +102,14 @@ namespace lgfx { int32_t pin = _cfg.pin_ctrl[i]; if (pin < 0) { continue; } - gpio_pad_select_gpio(pin); + LGFX_GPIO_PAD_SELECT(pin); gpio_hi(pin); gpio_set_direction((gpio_num_t)pin, GPIO_MODE_OUTPUT); } auto idx_base = I2S0O_DATA_OUT15_IDX; - gpio_matrix_out(_cfg.pin_rs, idx_base , 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, idx_base , 0, 0); _direct_dc = false; @@ -114,7 +129,7 @@ namespace lgfx dport_rst = DPORT_I2S1_RST; } #endif - gpio_matrix_out(_cfg.pin_wr, idx_base, 1, 0); // WR (Write-strobe in 8080 mode, Active-low) + LGFX_GPIO_MATRIX_OUT(_cfg.pin_wr, idx_base, 1, 0); // WR (Write-strobe in 8080 mode, Active-low) DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, dport_clk_en); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, dport_rst); @@ -164,8 +179,8 @@ namespace lgfx for (size_t i = 0; i < 8; ++i) { // gpio_set_direction((gpio_num_t)pins[i], GPIO_MODE_INPUT_OUTPUT); - gpio_pad_select_gpio(pins[i]); - gpio_matrix_out(pins[i], idx_base + i, 0, 0); + LGFX_GPIO_PAD_SELECT(pins[i]); + LGFX_GPIO_MATRIX_OUT(pins[i], idx_base + i, 0, 0); } } } @@ -280,7 +295,7 @@ namespace lgfx { _direct_dc = false; auto idx_base = I2S0O_DATA_OUT15_IDX; - gpio_matrix_out(_cfg.pin_rs, idx_base, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, idx_base, 0, 0); } else if (_div_num < 4) { /// OUTLINK_START~TX_STARTの時間が短すぎるとデータの先頭を送り損じる事があるのでnopウェイトを入れる; @@ -449,7 +464,7 @@ namespace lgfx if (!_direct_dc) { _direct_dc = true; - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100, 0, 0); } else { @@ -471,7 +486,7 @@ namespace lgfx if (!_direct_dc) { _direct_dc = true; - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100, 0, 0); } gpio_lo(_cfg.pin_rd); diff --git a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.hpp b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.hpp index 00485caa..d0a936b5 100644 --- a/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.hpp +++ b/src/lgfx/v1/platforms/esp32s2/Bus_Parallel8.hpp @@ -27,7 +27,9 @@ Original Source: #include #endif -#if __has_include() +#if __has_include() + #include +#elif __has_include() #include #else #include diff --git a/src/lgfx/v1/platforms/esp32s3/Bus_Parallel16.cpp b/src/lgfx/v1/platforms/esp32s3/Bus_Parallel16.cpp index dc8c59b7..8dd0a399 100644 --- a/src/lgfx/v1/platforms/esp32s3/Bus_Parallel16.cpp +++ b/src/lgfx/v1/platforms/esp32s3/Bus_Parallel16.cpp @@ -31,7 +31,11 @@ Original Source: #include #include -#include +#if __has_include() + #include +#elif __has_include() + #include +#endif #include #if !defined (DMA_OUT_LINK_CH0_REG) #define DMA_OUT_LINK_CH0_REG GDMA_OUT_LINK_CH0_REG @@ -40,6 +44,14 @@ Original Source: #define DMA_OUTFIFO_EMPTY_CH0 GDMA_OUTFIFO_EMPTY_L3_CH0 #endif +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + #define LGFX_GPIO_PAD_SELECT(pin) rom_gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig) rom_gpio_matrix_out((gpio_num_t)(pin), (sig), 0, 0) +#else + #define LGFX_GPIO_PAD_SELECT(pin) gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig) gpio_matrix_out((gpio_num_t)(pin), (sig), 0, 0) +#endif + #if ( ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0) ) #if !defined (LCD_CAM_LCD_UPDATE) #define LCD_CAM_LCD_UPDATE LCD_CAM_LCD_UPDATE_REG @@ -74,23 +86,23 @@ namespace lgfx { int32_t pin = _cfg.pin_ctrl[i]; if (pin < 0) { continue; } - gpio_pad_select_gpio(pin); + LGFX_GPIO_PAD_SELECT(pin); gpio_hi(pin); gpio_set_direction((gpio_num_t)pin, GPIO_MODE_OUTPUT); } - gpio_matrix_out(_cfg.pin_rs, LCD_DC_IDX, 0, 0); - gpio_matrix_out(_cfg.pin_wr, LCD_PCLK_IDX, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, LCD_DC_IDX); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_wr, LCD_PCLK_IDX); esp_lcd_i80_bus_config_t bus_config; memset(&bus_config, 0, sizeof(esp_lcd_i80_bus_config_t)); bus_config.clk_src = lcd_clock_source_t::LCD_CLK_SRC_PLL160M; // IDFのバージョンによってenumの値が異なるので注意 - bus_config.dc_gpio_num = _cfg.pin_rs; - bus_config.wr_gpio_num = _cfg.pin_wr; + bus_config.dc_gpio_num = (gpio_num_t)_cfg.pin_rs; + bus_config.wr_gpio_num = (gpio_num_t)_cfg.pin_wr; for (int i = 0; i < 8; ++i) { - bus_config.data_gpio_nums[i ] = _cfg.pin_data[i+8]; - bus_config.data_gpio_nums[i+8] = _cfg.pin_data[i ]; + bus_config.data_gpio_nums[i ] = (gpio_num_t)_cfg.pin_data[i+8]; + bus_config.data_gpio_nums[i+8] = (gpio_num_t)_cfg.pin_data[i ]; } bus_config.bus_width = 16; bus_config.max_transfer_bytes = 4092; @@ -148,8 +160,8 @@ namespace lgfx auto idx_base = LCD_DATA_OUT0_IDX; for (size_t i = 0; i < 8; ++i) { - gpio_matrix_out(pins[i] , idx_base + i+8, 0, 0); - gpio_matrix_out(pins[i+8], idx_base + i , 0, 0); + LGFX_GPIO_MATRIX_OUT(pins[i] , idx_base + i+8); + LGFX_GPIO_MATRIX_OUT(pins[i+8], idx_base + i ); } } } @@ -435,7 +447,7 @@ namespace lgfx if (_has_align_data) { _send_align_data(); } wait(); _init_pin(true); - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100); gpio_lo(_cfg.pin_rd); } @@ -443,7 +455,7 @@ namespace lgfx { gpio_hi(_cfg.pin_rd); _init_pin(); - gpio_matrix_out(_cfg.pin_rs, LCD_DC_IDX, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, LCD_DC_IDX); } void Bus_Parallel16::_read_bytes(uint8_t* dst, uint32_t length) diff --git a/src/lgfx/v1/platforms/esp32s3/Bus_Parallel8.cpp b/src/lgfx/v1/platforms/esp32s3/Bus_Parallel8.cpp index fa57560b..bdcfa058 100644 --- a/src/lgfx/v1/platforms/esp32s3/Bus_Parallel8.cpp +++ b/src/lgfx/v1/platforms/esp32s3/Bus_Parallel8.cpp @@ -31,7 +31,11 @@ Original Source: #include #include -#include +#if __has_include() + #include +#elif __has_include() + #include +#endif #include #if !defined (DMA_OUT_LINK_CH0_REG) #define DMA_OUT_LINK_CH0_REG GDMA_OUT_LINK_CH0_REG @@ -40,6 +44,14 @@ Original Source: #define DMA_OUTFIFO_EMPTY_CH0 GDMA_OUTFIFO_EMPTY_L3_CH0 #endif +#if defined (ESP_IDF_VERSION_VAL) && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)) + #define LGFX_GPIO_PAD_SELECT(pin) rom_gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig) rom_gpio_matrix_out((gpio_num_t)(pin), (sig), 0, 0) +#else + #define LGFX_GPIO_PAD_SELECT(pin) gpio_pad_select_gpio((gpio_num_t)(pin)) + #define LGFX_GPIO_MATRIX_OUT(pin, sig) gpio_matrix_out((gpio_num_t)(pin), (sig), 0, 0) +#endif + #if ( ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0) ) #if !defined (LCD_CAM_LCD_UPDATE) #define LCD_CAM_LCD_UPDATE LCD_CAM_LCD_UPDATE_REG @@ -74,23 +86,23 @@ namespace lgfx { int32_t pin = _cfg.pin_ctrl[i]; if (pin < 0) { continue; } - gpio_pad_select_gpio(pin); + LGFX_GPIO_PAD_SELECT(pin); gpio_hi(pin); gpio_set_direction((gpio_num_t)pin, GPIO_MODE_OUTPUT); } - gpio_matrix_out(_cfg.pin_rs, LCD_DC_IDX, 0, 0); - gpio_matrix_out(_cfg.pin_wr, LCD_PCLK_IDX, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, LCD_DC_IDX); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_wr, LCD_PCLK_IDX); esp_lcd_i80_bus_config_t bus_config; memset(&bus_config, 0, sizeof(esp_lcd_i80_bus_config_t)); bus_config.clk_src = lcd_clock_source_t::LCD_CLK_SRC_PLL160M; // IDFのバージョンによってenumの値が異なるので注意 - bus_config.dc_gpio_num = _cfg.pin_rs; - bus_config.wr_gpio_num = _cfg.pin_wr; + bus_config.dc_gpio_num = (gpio_num_t)_cfg.pin_rs; + bus_config.wr_gpio_num = (gpio_num_t)_cfg.pin_wr; for (int i = 0; i < 8; ++i) { - bus_config.data_gpio_nums[i] = _cfg.pin_data[i]; - bus_config.data_gpio_nums[i+8] = -1; + bus_config.data_gpio_nums[i] = (gpio_num_t)_cfg.pin_data[i]; + bus_config.data_gpio_nums[i+8] = (gpio_num_t)-1; } bus_config.bus_width = 8; bus_config.max_transfer_bytes = 4092; @@ -148,7 +160,7 @@ namespace lgfx auto idx_base = LCD_DATA_OUT0_IDX; for (size_t i = 0; i < 8; ++i) { - gpio_matrix_out(pins[i], idx_base + i, 0, 0); + LGFX_GPIO_MATRIX_OUT(pins[i], idx_base + i); } } } @@ -393,14 +405,14 @@ namespace lgfx wait(); _init_pin(true); gpio_lo(_cfg.pin_rd); - gpio_matrix_out(_cfg.pin_rs, 0x100, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, 0x100); } void Bus_Parallel8::endRead(void) { gpio_hi(_cfg.pin_rd); _init_pin(); - gpio_matrix_out(_cfg.pin_rs, LCD_DC_IDX, 0, 0); + LGFX_GPIO_MATRIX_OUT(_cfg.pin_rs, LCD_DC_IDX); } void Bus_Parallel8::_read_bytes(uint8_t* dst, uint32_t length)