Merge branch 'refactor/ppa_dma2d_fourcc_v6.0' into 'release/v6.0'

refactor(ppa): use fourcc for dma2d and ppa color formats (v6.0)

See merge request espressif/esp-idf!44128
This commit is contained in:
morris
2025-12-12 12:23:22 +08:00
24 changed files with 387 additions and 329 deletions
+121 -74
View File
@@ -205,6 +205,38 @@ static inline void ppa_ll_srm_start(ppa_dev_t *dev)
dev->sr_scal_rotate.scal_rotate_start = 1;
}
/**
* @brief Set PPA SRM input side YUV422 data format packing order
*
* @param dev Peripheral instance address
* @param color_mode One of the values in ppa_srm_color_mode_t
*/
static inline void ppa_ll_srm_set_rx_yuv422_pack_order(ppa_dev_t *dev, ppa_srm_color_mode_t color_mode)
{
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
switch (color_mode) {
case PPA_SRM_COLOR_MODE_YUV422_YVYU:
dev->sr_color_mode.yuv422_rx_byte_order = 3;
break;
case PPA_SRM_COLOR_MODE_YUV422_YUYV:
dev->sr_color_mode.yuv422_rx_byte_order = 2;
break;
case PPA_SRM_COLOR_MODE_YUV422_VYUY:
dev->sr_color_mode.yuv422_rx_byte_order = 1;
break;
case PPA_SRM_COLOR_MODE_YUV422_UYVY:
dev->sr_color_mode.yuv422_rx_byte_order = 0;
break;
default:
// Unsupported YUV422 pack order
abort();
}
#else
// YUV422 not supported by PPA SRM hardware before P4 ECO5
abort();
#endif
}
/**
* @brief Check if the given color mode is supported by PPA SRM engine
*
@@ -218,9 +250,12 @@ static inline bool ppa_ll_srm_is_color_mode_supported(ppa_srm_color_mode_t color
case PPA_SRM_COLOR_MODE_RGB888:
case PPA_SRM_COLOR_MODE_RGB565:
case PPA_SRM_COLOR_MODE_YUV420:
case PPA_SRM_COLOR_MODE_YUV444: // YUV444 not supported by PPA hardware, but can be converted by 2D-DMA before/after PPA
case PPA_SRM_COLOR_MODE_YUV444: // YUV444 not supported by PPA hardware, but can be converted by 2D-DMA before PPA, and not supported as output color mode
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
case PPA_SRM_COLOR_MODE_YUV422:
case PPA_SRM_COLOR_MODE_YUV422_UYVY:
case PPA_SRM_COLOR_MODE_YUV422_VYUY:
case PPA_SRM_COLOR_MODE_YUV422_YUYV:
case PPA_SRM_COLOR_MODE_YUV422_YVYU:
case PPA_SRM_COLOR_MODE_GRAY8:
#endif
return true;
@@ -238,6 +273,7 @@ static inline bool ppa_ll_srm_is_color_mode_supported(ppa_srm_color_mode_t color
static inline void ppa_ll_srm_set_rx_color_mode(ppa_dev_t *dev, ppa_srm_color_mode_t color_mode)
{
uint32_t val = 0;
bool is_yuv422 __attribute__ ((unused)) = false;
switch (color_mode) {
case PPA_SRM_COLOR_MODE_ARGB8888:
val = 0;
@@ -252,8 +288,12 @@ static inline void ppa_ll_srm_set_rx_color_mode(ppa_dev_t *dev, ppa_srm_color_mo
val = 8;
break;
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
case PPA_SRM_COLOR_MODE_YUV422:
case PPA_SRM_COLOR_MODE_YUV422_UYVY:
case PPA_SRM_COLOR_MODE_YUV422_VYUY:
case PPA_SRM_COLOR_MODE_YUV422_YUYV:
case PPA_SRM_COLOR_MODE_YUV422_YVYU:
val = 9;
is_yuv422 = true;
break;
case PPA_SRM_COLOR_MODE_GRAY8:
val = 12;
@@ -264,6 +304,13 @@ static inline void ppa_ll_srm_set_rx_color_mode(ppa_dev_t *dev, ppa_srm_color_mo
abort();
}
dev->sr_color_mode.sr_rx_cm = val;
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
// set YUV422 packing order
if (is_yuv422) {
ppa_ll_srm_set_rx_yuv422_pack_order(dev, color_mode);
}
#endif
}
/**
@@ -289,7 +336,7 @@ static inline void ppa_ll_srm_set_tx_color_mode(ppa_dev_t *dev, ppa_srm_color_mo
val = 8;
break;
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
case PPA_SRM_COLOR_MODE_YUV422:
case PPA_SRM_COLOR_MODE_YUV422_UYVY:
val = 9;
break;
case PPA_SRM_COLOR_MODE_GRAY8:
@@ -387,38 +434,6 @@ static inline void ppa_ll_srm_set_tx_yuv_range(ppa_dev_t *dev, ppa_color_range_t
}
}
/**
* @brief Set PPA SRM input side YUV422 data format packing order
*
* @param dev Peripheral instance address
* @param pack_order One of the pack order options in color_yuv422_pack_order_t
*/
static inline void ppa_ll_srm_set_rx_yuv422_pack_order(ppa_dev_t *dev, color_yuv422_pack_order_t pack_order)
{
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
switch (pack_order) {
case COLOR_YUV422_PACK_ORDER_YVYU:
dev->sr_color_mode.yuv422_rx_byte_order = 0;
break;
case COLOR_YUV422_PACK_ORDER_YUYV:
dev->sr_color_mode.yuv422_rx_byte_order = 1;
break;
case COLOR_YUV422_PACK_ORDER_VYUY:
dev->sr_color_mode.yuv422_rx_byte_order = 2;
break;
case COLOR_YUV422_PACK_ORDER_UYVY:
dev->sr_color_mode.yuv422_rx_byte_order = 3;
break;
default:
// Unsupported YUV422 pack order
abort();
}
#else
// YUV422 not supported by PPA SRM hardware before P4 ECO5
abort();
#endif
}
/**
* @brief Enable PPA SRM input data swap in RGB (e.g. ARGB becomes BGRA, RGB becomes BGR)
*
@@ -543,7 +558,10 @@ static inline void ppa_ll_srm_get_dma_dscr_port_mode_block_size(ppa_dev_t *dev,
*block_h = 20;
*block_v = 18;
break;
case PPA_SRM_COLOR_MODE_YUV422:
case PPA_SRM_COLOR_MODE_YUV422_UYVY:
case PPA_SRM_COLOR_MODE_YUV422_VYUY:
case PPA_SRM_COLOR_MODE_YUV422_YUYV:
case PPA_SRM_COLOR_MODE_YUV422_YVYU:
*block_h = 20;
*block_v = 20;
break;
@@ -567,7 +585,10 @@ static inline void ppa_ll_srm_get_dma_dscr_port_mode_block_size(ppa_dev_t *dev,
*block_h = 36;
*block_v = 34;
break;
case PPA_SRM_COLOR_MODE_YUV422:
case PPA_SRM_COLOR_MODE_YUV422_UYVY:
case PPA_SRM_COLOR_MODE_YUV422_VYUY:
case PPA_SRM_COLOR_MODE_YUV422_YUYV:
case PPA_SRM_COLOR_MODE_YUV422_YVYU:
*block_h = 36;
*block_v = 36;
break;
@@ -585,6 +606,17 @@ static inline void ppa_ll_srm_get_dma_dscr_port_mode_block_size(ppa_dev_t *dev,
}
}
/**
* @brief Whether to bypass the macro block order function in PPA SRM
*
* @param dev Peripheral instance address
* @param enable True to bypass; False to not bypass
*/
static inline void ppa_ll_srm_bypass_mb_order(ppa_dev_t *dev, bool enable)
{
dev->sr_byte_order.sr_macro_bk_ro_bypass = enable;
}
//////////////////////////////////// Blending ////////////////////////////////////////
/*
* Alpha Blending Calculation:
@@ -634,6 +666,38 @@ static inline void ppa_ll_blend_start(ppa_dev_t *dev, ppa_ll_blend_trans_mode_t
dev->blend_trans_mode.blend_trans_mode_update = 1;
}
/**
* @brief Set PPA blending source image background YUV422 data format packing order
*
* @param dev Peripheral instance address
* @param color_mode One of the values in ppa_blend_color_mode_t
*/
static inline void ppa_ll_blend_set_rx_bg_yuv422_pack_order(ppa_dev_t *dev, ppa_blend_color_mode_t color_mode)
{
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
switch (color_mode) {
case PPA_BLEND_COLOR_MODE_YUV422_YVYU:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 3;
break;
case PPA_BLEND_COLOR_MODE_YUV422_YUYV:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 2;
break;
case PPA_BLEND_COLOR_MODE_YUV422_VYUY:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 1;
break;
case PPA_BLEND_COLOR_MODE_YUV422_UYVY:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 0;
break;
default:
// Unsupported YUV422 pack order
abort();
}
#else
// YUV422 not supported by PPA blending hardware before P4 ECO5
abort();
#endif
}
/**
* @brief Check if the given color mode is supported by PPA blending engine
*
@@ -652,7 +716,10 @@ static inline bool ppa_ll_blend_is_color_mode_supported(ppa_blend_color_mode_t c
// case PPA_BLEND_COLOR_MODE_L4:
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
case PPA_BLEND_COLOR_MODE_YUV420:
case PPA_BLEND_COLOR_MODE_YUV422:
case PPA_BLEND_COLOR_MODE_YUV422_UYVY:
case PPA_BLEND_COLOR_MODE_YUV422_VYUY:
case PPA_BLEND_COLOR_MODE_YUV422_YUYV:
case PPA_BLEND_COLOR_MODE_YUV422_YVYU:
case PPA_BLEND_COLOR_MODE_GRAY8:
#endif
return true;
@@ -670,6 +737,7 @@ static inline bool ppa_ll_blend_is_color_mode_supported(ppa_blend_color_mode_t c
static inline void ppa_ll_blend_set_rx_bg_color_mode(ppa_dev_t *dev, ppa_blend_color_mode_t color_mode)
{
uint32_t val = 0;
bool is_yuv422 __attribute__ ((unused)) = false;
switch (color_mode) {
case PPA_BLEND_COLOR_MODE_ARGB8888:
val = 0;
@@ -690,8 +758,12 @@ static inline void ppa_ll_blend_set_rx_bg_color_mode(ppa_dev_t *dev, ppa_blend_c
case PPA_BLEND_COLOR_MODE_YUV420:
val = 8;
break;
case PPA_BLEND_COLOR_MODE_YUV422:
case PPA_BLEND_COLOR_MODE_YUV422_UYVY:
case PPA_BLEND_COLOR_MODE_YUV422_VYUY:
case PPA_BLEND_COLOR_MODE_YUV422_YUYV:
case PPA_BLEND_COLOR_MODE_YUV422_YVYU:
val = 9;
is_yuv422 = true;
break;
case PPA_BLEND_COLOR_MODE_GRAY8:
val = 12;
@@ -702,6 +774,13 @@ static inline void ppa_ll_blend_set_rx_bg_color_mode(ppa_dev_t *dev, ppa_blend_c
abort();
}
dev->blend_color_mode.blend0_rx_cm = val;
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
// set YUV422 packing order
if (is_yuv422) {
ppa_ll_blend_set_rx_bg_yuv422_pack_order(dev, color_mode);
}
#endif
}
/**
@@ -765,7 +844,7 @@ static inline void ppa_ll_blend_set_tx_color_mode(ppa_dev_t *dev, ppa_blend_colo
case PPA_BLEND_COLOR_MODE_YUV420:
val = 8;
break;
case PPA_BLEND_COLOR_MODE_YUV422:
case PPA_BLEND_COLOR_MODE_YUV422_UYVY:
val = 9;
break;
case PPA_BLEND_COLOR_MODE_GRAY8:
@@ -883,38 +962,6 @@ static inline void ppa_ll_blend_set_tx_yuv_range(ppa_dev_t *dev, ppa_color_range
#endif
}
/**
* @brief Set PPA blending source image background YUV422 data format packing order
*
* @param dev Peripheral instance address
* @param pack_order One of the pack order options in color_yuv422_pack_order_t
*/
static inline void ppa_ll_blend_set_rx_bg_yuv422_pack_order(ppa_dev_t *dev, color_yuv422_pack_order_t pack_order)
{
#if HAL_CONFIG(CHIP_SUPPORT_MIN_REV) >= 300
switch (pack_order) {
case COLOR_YUV422_PACK_ORDER_YVYU:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 0;
break;
case COLOR_YUV422_PACK_ORDER_YUYV:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 1;
break;
case COLOR_YUV422_PACK_ORDER_VYUY:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 2;
break;
case COLOR_YUV422_PACK_ORDER_UYVY:
dev->blend_color_mode.blend0_rx_yuv422_byte_order = 3;
break;
default:
// Unsupported YUV422 pack order
abort();
}
#else
// YUV422 not supported by PPA blending hardware before P4 ECO5
abort();
#endif
}
/**
* @brief Enable PPA blending input background data wrap in RGB (e.g. ARGB becomes BGRA, RGB becomes BGR)
*
@@ -1058,7 +1105,7 @@ static inline void ppa_ll_blend_configure_filling_block(ppa_dev_t *dev, ppa_fill
case PPA_FILL_COLOR_MODE_GRAY8:
fill_color_data = *(uint32_t *)data;
break;
case PPA_FILL_COLOR_MODE_YUV422: {
case PPA_FILL_COLOR_MODE_YUV422_UYVY: {
color_macroblock_yuv_data_t *yuv_data = (color_macroblock_yuv_data_t *)data;
fill_color_data = ((yuv_data->y) << 24) | ((yuv_data->v) << 16) | ((yuv_data->y) << 8) | (yuv_data->u);
break;