diff --git a/components/esp_hal_dma/esp32p4/dma2d_periph.c b/components/esp_hal_dma/esp32p4/dma2d_periph.c index e0fdeeba7b..5cc78a20df 100644 --- a/components/esp_hal_dma/esp32p4/dma2d_periph.c +++ b/components/esp_hal_dma/esp32p4/dma2d_periph.c @@ -1,12 +1,18 @@ /* - * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/dma2d_periph.h" +#include "hal/dma2d_types.h" #include "soc/interrupts.h" +const int dma2d_csc_param_yuv2rgb_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT601; +const int dma2d_csc_param_yuv2rgb_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT709; +const int dma2d_csc_param_rgb2yuv_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT601; +const int dma2d_csc_param_rgb2yuv_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT709; + const dma2d_signal_conn_t dma2d_periph_signals = { .groups = { [0] = { diff --git a/components/esp_hal_dma/esp32p4/include/hal/dma2d_ll.h b/components/esp_hal_dma/esp32p4/include/hal/dma2d_ll.h index e2fb92be95..a524173ff4 100644 --- a/components/esp_hal_dma/esp32p4/include/hal/dma2d_ll.h +++ b/components/esp_hal_dma/esp32p4/include/hal/dma2d_ll.h @@ -8,6 +8,7 @@ #include /* Required for NULL constant */ #include #include +#include "esp_attr.h" #include "hal/dma2d_types.h" #include "soc/dma2d_channel.h" #include "soc/dma2d_struct.h" @@ -96,6 +97,12 @@ typedef enum { DMA2D_LL_MEM_LP_MODE_SHUT_DOWN, // power down memory during low power stage } dma2d_ll_mem_lp_mode_t; +// COLOR SPACE CONVERSION TABLES +extern const int dma2d_csc_param_yuv2rgb_bt601_table[3][4]; +extern const int dma2d_csc_param_yuv2rgb_bt709_table[3][4]; +extern const int dma2d_csc_param_rgb2yuv_bt601_table[3][4]; +extern const int dma2d_csc_param_rgb2yuv_bt709_table[3][4]; + ///////////////////////////////////// Common ///////////////////////////////////////// /** * @brief Enable the bus clock for 2D-DMA module @@ -534,13 +541,10 @@ static inline void dma2d_ll_rx_configure_color_space_conv(dma2d_dev_t *dev, uint uint32_t input_sel = 7; // Disable CSC // L2 bool proc_en = false; // Disable generic color convert module between color input & color output - int (*table)[4] = NULL; + const int (*table)[4] = NULL; // L3 uint32_t output_sel = 1; // Output directly - const int color_space_conv_param_yuv2rgb_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT601; - const int color_space_conv_param_yuv2rgb_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT709; - switch (csc_sel) { case DMA2D_CSC_RX_NONE: input_sel = 7; @@ -571,52 +575,52 @@ static inline void dma2d_ll_rx_configure_color_space_conv(dma2d_dev_t *dev, uint case DMA2D_CSC_RX_YUV422_TO_RGB888_601: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV420_TO_RGB565_601: case DMA2D_CSC_RX_YUV422_TO_RGB565_601: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 0; break; case DMA2D_CSC_RX_YUV420_TO_RGB888_709: case DMA2D_CSC_RX_YUV422_TO_RGB888_709: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV420_TO_RGB565_709: case DMA2D_CSC_RX_YUV422_TO_RGB565_709: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 0; break; case DMA2D_CSC_RX_YUV444_TO_RGB888_601: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV444_TO_RGB565_601: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 0; break; case DMA2D_CSC_RX_YUV444_TO_RGB888_709: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV444_TO_RGB565_709: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 0; break; default: @@ -1040,15 +1044,10 @@ static inline void dma2d_ll_tx_configure_color_space_conv(dma2d_dev_t *dev, uint uint32_t input_sel = 7; // Disable CSC // L2 bool proc_en = false; // Disable generic color convert module between color input & color output - int (*table)[4] = NULL; + const int (*table)[4] = NULL; // L3 uint32_t output_sel = 2; // Output directly - const int color_space_conv_param_rgb2yuv_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT601; - const int color_space_conv_param_rgb2yuv_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT709; - const int color_space_conv_param_yuv2rgb_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT601; - const int color_space_conv_param_yuv2rgb_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT709; - switch (csc_sel) { case DMA2D_CSC_TX_NONE: input_sel = 7; @@ -1071,49 +1070,49 @@ static inline void dma2d_ll_tx_configure_color_space_conv(dma2d_dev_t *dev, uint case DMA2D_CSC_TX_RGB888_TO_YUV444_601: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt601_table; + table = dma2d_csc_param_rgb2yuv_bt601_table; output_sel = 2; break; case DMA2D_CSC_TX_RGB888_TO_YUV444_709: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt709_table; + table = dma2d_csc_param_rgb2yuv_bt709_table; output_sel = 2; break; case DMA2D_CSC_TX_RGB888_TO_YUV422_601: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt601_table; + table = dma2d_csc_param_rgb2yuv_bt601_table; output_sel = 1; break; case DMA2D_CSC_TX_RGB888_TO_YUV422_709: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt709_table; + table = dma2d_csc_param_rgb2yuv_bt709_table; output_sel = 1; break; case DMA2D_CSC_TX_YUV444_TO_RGB888_601: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 2; break; case DMA2D_CSC_TX_YUV444_TO_RGB888_709: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 2; break; case DMA2D_CSC_TX_YUV422_TO_RGB888_601: input_sel = 1; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 2; break; case DMA2D_CSC_TX_YUV422_TO_RGB888_709: input_sel = 1; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 2; break; default: diff --git a/components/esp_hal_dma/esp32s31/dma2d_periph.c b/components/esp_hal_dma/esp32s31/dma2d_periph.c index 0e9d49f0b5..a851e0b330 100644 --- a/components/esp_hal_dma/esp32s31/dma2d_periph.c +++ b/components/esp_hal_dma/esp32s31/dma2d_periph.c @@ -5,8 +5,14 @@ */ #include "hal/dma2d_periph.h" +#include "hal/dma2d_types.h" #include "soc/interrupts.h" +const int dma2d_csc_param_rgb2yuv_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT601; +const int dma2d_csc_param_rgb2yuv_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT709; +const int dma2d_csc_param_yuv2rgb_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT601; +const int dma2d_csc_param_yuv2rgb_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT709; + const dma2d_signal_conn_t dma2d_periph_signals = { .groups = { [0] = { diff --git a/components/esp_hal_dma/esp32s31/include/hal/dma2d_ll.h b/components/esp_hal_dma/esp32s31/include/hal/dma2d_ll.h index 59595e1c0c..04acb948bb 100644 --- a/components/esp_hal_dma/esp32s31/include/hal/dma2d_ll.h +++ b/components/esp_hal_dma/esp32s31/include/hal/dma2d_ll.h @@ -8,6 +8,7 @@ #include /* Required for NULL constant */ #include #include +#include "esp_attr.h" #include "hal/dma2d_types.h" #include "soc/dma2d_channel.h" #include "soc/dma2d_struct.h" @@ -89,6 +90,12 @@ typedef enum { DMA2D_LL_MEM_LP_MODE_DISABLE, // disable the low power stage } dma2d_ll_mem_lp_mode_t; +// COLOR SPACE CONVERSION TABLES +extern const int dma2d_csc_param_rgb2yuv_bt601_table[3][4]; +extern const int dma2d_csc_param_rgb2yuv_bt709_table[3][4]; +extern const int dma2d_csc_param_yuv2rgb_bt601_table[3][4]; +extern const int dma2d_csc_param_yuv2rgb_bt709_table[3][4]; + ///////////////////////////////////// Common ///////////////////////////////////////// /** * @brief Enable the bus clock for 2D-DMA module @@ -515,13 +522,10 @@ static inline void dma2d_ll_rx_configure_color_space_conv(dma2d_dev_t *dev, uint uint32_t input_sel = 7; // Disable CSC // L2 bool proc_en = false; // Disable generic color convert module between color input & color output - int (*table)[4] = NULL; + const int (*table)[4] = NULL; // L3 uint32_t output_sel = 1; // Output directly - const int color_space_conv_param_yuv2rgb_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT601; - const int color_space_conv_param_yuv2rgb_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT709; - switch (csc_sel) { case DMA2D_CSC_RX_NONE: input_sel = 7; @@ -552,52 +556,52 @@ static inline void dma2d_ll_rx_configure_color_space_conv(dma2d_dev_t *dev, uint case DMA2D_CSC_RX_YUV422_TO_RGB888_601: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV420_TO_RGB565_601: case DMA2D_CSC_RX_YUV422_TO_RGB565_601: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 0; break; case DMA2D_CSC_RX_YUV420_TO_RGB888_709: case DMA2D_CSC_RX_YUV422_TO_RGB888_709: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV420_TO_RGB565_709: case DMA2D_CSC_RX_YUV422_TO_RGB565_709: input_sel = 0; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 0; break; case DMA2D_CSC_RX_YUV444_TO_RGB888_601: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV444_TO_RGB565_601: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 0; break; case DMA2D_CSC_RX_YUV444_TO_RGB888_709: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 1; break; case DMA2D_CSC_RX_YUV444_TO_RGB565_709: input_sel = 2; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 0; break; default: @@ -1017,15 +1021,10 @@ static inline void dma2d_ll_tx_configure_color_space_conv(dma2d_dev_t *dev, uint uint32_t input_sel = 7; // Disable CSC // L2 bool proc_en = false; // Disable generic color convert module between color input & color output - int (*table)[4] = NULL; + const int (*table)[4] = NULL; // L3 uint32_t output_sel = 2; // Output directly - const int color_space_conv_param_rgb2yuv_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT601; - const int color_space_conv_param_rgb2yuv_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_RGB2YUV_BT709; - const int color_space_conv_param_yuv2rgb_bt601_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT601; - const int color_space_conv_param_yuv2rgb_bt709_table[3][4] = DMA2D_COLOR_SPACE_CONV_PARAM_YUV2RGB_BT709; - switch (csc_sel) { case DMA2D_CSC_TX_NONE: input_sel = 7; @@ -1048,49 +1047,49 @@ static inline void dma2d_ll_tx_configure_color_space_conv(dma2d_dev_t *dev, uint case DMA2D_CSC_TX_RGB888_TO_YUV444_601: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt601_table; + table = dma2d_csc_param_rgb2yuv_bt601_table; output_sel = 2; break; case DMA2D_CSC_TX_RGB888_TO_YUV444_709: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt709_table; + table = dma2d_csc_param_rgb2yuv_bt709_table; output_sel = 2; break; case DMA2D_CSC_TX_RGB888_TO_YUV422_601: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt601_table; + table = dma2d_csc_param_rgb2yuv_bt601_table; output_sel = 1; break; case DMA2D_CSC_TX_RGB888_TO_YUV422_709: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_rgb2yuv_bt709_table; + table = dma2d_csc_param_rgb2yuv_bt709_table; output_sel = 1; break; case DMA2D_CSC_TX_YUV444_TO_RGB888_601: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 2; break; case DMA2D_CSC_TX_YUV444_TO_RGB888_709: input_sel = 3; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 2; break; case DMA2D_CSC_TX_YUV422_TO_RGB888_601: input_sel = 1; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt601_table; + table = dma2d_csc_param_yuv2rgb_bt601_table; output_sel = 2; break; case DMA2D_CSC_TX_YUV422_TO_RGB888_709: input_sel = 1; proc_en = true; - table = (int (*)[4])color_space_conv_param_yuv2rgb_bt709_table; + table = dma2d_csc_param_yuv2rgb_bt709_table; output_sel = 2; break; default: