refactor(dma2d): move csc param table to dma2d_periph.c

This commit is contained in:
Song Ruo Jing
2026-04-01 20:50:04 +08:00
parent b40257aed2
commit ce1d910965
4 changed files with 63 additions and 53 deletions
@@ -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] = {
@@ -8,6 +8,7 @@
#include <stddef.h> /* Required for NULL constant */
#include <stdint.h>
#include <stdbool.h>
#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:
@@ -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] = {
@@ -8,6 +8,7 @@
#include <stddef.h> /* Required for NULL constant */
#include <stdint.h>
#include <stdbool.h>
#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: