refactor(lcd): unify the color conversion API in RGB and DSI driver

Also adopt the FourCC standard to describe color format.
See also
https://developer.espressif.com/blog/2025/04/esp-fourcc-introduction/
This commit is contained in:
morris
2025-11-07 11:08:43 +08:00
parent 3911e65523
commit dff7c452e6
23 changed files with 314 additions and 330 deletions
@@ -224,7 +224,7 @@ static inline void lcd_ll_set_pixel_clock_prescale(lcd_cam_dev_t *dev, uint32_t
* @param dev LCD register base address
* @param en True to enable converter, False to disable converter
*/
static inline void lcd_ll_enable_rgb_yuv_convert(lcd_cam_dev_t *dev, bool en)
static inline void lcd_ll_enable_color_convert(lcd_cam_dev_t *dev, bool en)
{
dev->lcd_rgb_yuv.lcd_conv_enable = en;
}
@@ -287,50 +287,46 @@ static inline void lcd_ll_set_yuv_convert_std(lcd_cam_dev_t *dev, lcd_yuv_conv_s
}
/**
* @brief Set the converter mode: RGB565 to YUV
* @brief Set the converter mode: RGB to YUV
*
* @param dev LCD register base address
* @param yuv_sample YUV sample mode
* @param in_color_format Input color format
* @param out_color_format Output color format
*/
static inline void lcd_ll_set_convert_mode_rgb_to_yuv(lcd_cam_dev_t *dev, lcd_yuv_sample_t yuv_sample)
static inline void lcd_ll_set_rgb2yuv_convert_mode(lcd_cam_dev_t *dev, lcd_color_format_t in_color_format, lcd_color_format_t out_color_format)
{
dev->lcd_rgb_yuv.lcd_conv_trans_mode = 1;
dev->lcd_rgb_yuv.lcd_conv_yuv2yuv_mode = 3;
switch (yuv_sample) {
case LCD_YUV_SAMPLE_422:
switch (out_color_format) {
case LCD_COLOR_FMT_YUV422_UYVY:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 0;
break;
case LCD_YUV_SAMPLE_420:
case LCD_COLOR_FMT_YUV420_OUYY_EVYY:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 1;
break;
case LCD_YUV_SAMPLE_411:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 2;
break;
default:
abort();
}
}
/**
* @brief Set the converter mode: YUV to RGB565
* @brief Set the converter mode: YUV to RGB
*
* @param dev LCD register base address
* @param yuv_sample YUV sample mode
* @param in_color_format Input color format
* @param out_color_format Output color format
*/
static inline void lcd_ll_set_convert_mode_yuv_to_rgb(lcd_cam_dev_t *dev, lcd_yuv_sample_t yuv_sample)
static inline void lcd_ll_set_yuv2rgb_convert_mode(lcd_cam_dev_t *dev, lcd_color_format_t in_color_format, lcd_color_format_t out_color_format)
{
dev->lcd_rgb_yuv.lcd_conv_trans_mode = 0;
dev->lcd_rgb_yuv.lcd_conv_yuv2yuv_mode = 3;
switch (yuv_sample) {
case LCD_YUV_SAMPLE_422:
switch (in_color_format) {
case LCD_COLOR_FMT_YUV422_UYVY:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 0;
break;
case LCD_YUV_SAMPLE_420:
case LCD_COLOR_FMT_YUV420_OUYY_EVYY:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 1;
break;
case LCD_YUV_SAMPLE_411:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 2;
break;
default:
abort();
}
@@ -340,36 +336,29 @@ static inline void lcd_ll_set_convert_mode_yuv_to_rgb(lcd_cam_dev_t *dev, lcd_yu
* @brief Set the converter mode: YUV to YUV
*
* @param dev LCD register base address
* @param src_sample Source YUV sample mode
* @param dst_sample Destination YUV sample mode
* @param in_color_format Input color format
* @param out_color_format Output color format
*/
static inline void lcd_ll_set_convert_mode_yuv_to_yuv(lcd_cam_dev_t *dev, lcd_yuv_sample_t src_sample, lcd_yuv_sample_t dst_sample)
static inline void lcd_ll_set_yuv2yuv_convert_mode(lcd_cam_dev_t *dev, lcd_color_format_t in_color_format, lcd_color_format_t out_color_format)
{
HAL_ASSERT(src_sample != dst_sample);
dev->lcd_rgb_yuv.lcd_conv_trans_mode = 1;
switch (src_sample) {
case LCD_YUV_SAMPLE_422:
switch (in_color_format) {
case LCD_COLOR_FMT_YUV422_UYVY:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 0;
break;
case LCD_YUV_SAMPLE_420:
case LCD_COLOR_FMT_YUV420_OUYY_EVYY:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 1;
break;
case LCD_YUV_SAMPLE_411:
dev->lcd_rgb_yuv.lcd_conv_yuv_mode = 2;
break;
default:
abort();
}
switch (dst_sample) {
case LCD_YUV_SAMPLE_422:
switch (out_color_format) {
case LCD_COLOR_FMT_YUV422_UYVY:
dev->lcd_rgb_yuv.lcd_conv_yuv2yuv_mode = 0;
break;
case LCD_YUV_SAMPLE_420:
case LCD_COLOR_FMT_YUV420_OUYY_EVYY:
dev->lcd_rgb_yuv.lcd_conv_yuv2yuv_mode = 1;
break;
case LCD_YUV_SAMPLE_411:
dev->lcd_rgb_yuv.lcd_conv_yuv2yuv_mode = 2;
break;
default:
abort();
}
@@ -310,24 +310,24 @@ static inline void mipi_dsi_brg_ll_set_yuv_convert_std(dsi_brg_dev_t *dev, lcd_y
* @brief Set the YUV422 packing order
*
* @param dev Pointer to the DSI bridge controller register base address
* @param order YUV422 packing order
* @param color_format Color format
*/
static inline void mipi_dsi_brg_ll_set_yuv422_pack_order(dsi_brg_dev_t *dev, lcd_yuv422_pack_order_t order)
static inline void _mipi_dsi_brg_ll_set_yuv422_pack_order(dsi_brg_dev_t *dev, lcd_color_format_t color_format)
{
switch (order) {
case LCD_YUV422_PACK_ORDER_UYVY:
switch (color_format) {
case LCD_COLOR_FMT_YUV422_UYVY:
dev->yuv_cfg.yuv422_format = 0;
dev->yuv_cfg.yuv_pix_endian = 1;
break;
case LCD_YUV422_PACK_ORDER_VYUY:
case LCD_COLOR_FMT_YUV422_VYUY:
dev->yuv_cfg.yuv422_format = 1;
dev->yuv_cfg.yuv_pix_endian = 1;
break;
case LCD_YUV422_PACK_ORDER_YUYV:
case LCD_COLOR_FMT_YUV422_YUYV:
dev->yuv_cfg.yuv422_format = 2;
dev->yuv_cfg.yuv_pix_endian = 1;
break;
case LCD_YUV422_PACK_ORDER_YVYU:
case LCD_COLOR_FMT_YUV422_YVYU:
dev->yuv_cfg.yuv422_format = 3;
dev->yuv_cfg.yuv_pix_endian = 1;
break;
@@ -349,22 +349,23 @@ static inline void mipi_dsi_brg_ll_set_yuv422_pack_order(dsi_brg_dev_t *dev, lcd
*/
static inline void mipi_dsi_brg_ll_set_input_color_format(dsi_brg_dev_t *dev, lcd_color_format_t color_format)
{
bool is_yuv422 = false;
switch (color_format) {
case LCD_COLOR_FMT_RGB888:
dev->pixel_type.raw_type = 0;
dev->pixel_type.data_in_type = 0;
break;
case LCD_COLOR_FMT_RGB666:
dev->pixel_type.raw_type = 1;
dev->pixel_type.data_in_type = 0;
break;
case LCD_COLOR_FMT_RGB565:
dev->pixel_type.raw_type = 2;
dev->pixel_type.data_in_type = 0;
break;
case LCD_COLOR_FMT_YUV422:
case LCD_COLOR_FMT_YUV422_YUYV:
case LCD_COLOR_FMT_YUV422_YVYU:
case LCD_COLOR_FMT_YUV422_VYUY:
case LCD_COLOR_FMT_YUV422_UYVY:
dev->pixel_type.raw_type = 9;
dev->pixel_type.data_in_type = 1;
is_yuv422 = true;
break;
case LCD_COLOR_FMT_GRAY8:
dev->pixel_type.raw_type = 12;
@@ -373,6 +374,11 @@ static inline void mipi_dsi_brg_ll_set_input_color_format(dsi_brg_dev_t *dev, lc
default:
abort();
}
// set YUV422 packing order
if (is_yuv422) {
_mipi_dsi_brg_ll_set_yuv422_pack_order(dev, color_format);
}
}
/**
@@ -387,9 +393,6 @@ static inline void mipi_dsi_brg_ll_set_output_color_format(dsi_brg_dev_t *dev, l
case LCD_COLOR_FMT_RGB888:
dev->pixel_type.dpi_type = 0;
break;
case LCD_COLOR_FMT_RGB666:
dev->pixel_type.dpi_type = 1;
break;
case LCD_COLOR_FMT_RGB565:
dev->pixel_type.dpi_type = 2;
break;
@@ -435,25 +438,31 @@ static inline void mipi_dsi_brg_ll_set_input_color_range(dsi_brg_dev_t *dev, lcd
*/
static inline void mipi_dsi_brg_ll_set_input_color_format(dsi_brg_dev_t *dev, lcd_color_format_t color_format)
{
bool is_yuv422 = false;
switch (color_format) {
case LCD_COLOR_FMT_RGB888:
dev->pixel_type.raw_type = 0;
dev->pixel_type.data_in_type = 0;
break;
case LCD_COLOR_FMT_RGB666:
dev->pixel_type.raw_type = 1;
dev->pixel_type.data_in_type = 0;
break;
case LCD_COLOR_FMT_RGB565:
dev->pixel_type.raw_type = 2;
dev->pixel_type.data_in_type = 0;
break;
case LCD_COLOR_FMT_YUV422:
case LCD_COLOR_FMT_YUV422_YUYV:
case LCD_COLOR_FMT_YUV422_YVYU:
case LCD_COLOR_FMT_YUV422_VYUY:
case LCD_COLOR_FMT_YUV422_UYVY:
dev->pixel_type.data_in_type = 1;
is_yuv422 = true;
break;
default:
abort();
}
// set YUV422 packing order
if (is_yuv422) {
_mipi_dsi_brg_ll_set_yuv422_pack_order(dev, color_format);
}
}
/**
@@ -468,9 +477,6 @@ static inline void mipi_dsi_brg_ll_set_output_color_format(dsi_brg_dev_t *dev, l
case LCD_COLOR_FMT_RGB565:
dev->pixel_type.raw_type = 2;
break;
case LCD_COLOR_FMT_RGB666:
dev->pixel_type.raw_type = 1;
break;
case LCD_COLOR_FMT_RGB888:
dev->pixel_type.raw_type = 0;
break;
@@ -188,9 +188,6 @@ static inline void mipi_dsi_host_ll_dpi_set_color_coding(dsi_host_dev_t *dev, lc
case LCD_COLOR_FMT_RGB565:
dev->dpi_color_coding.dpi_color_coding = MIPI_DSI_LL_COLOR_CODE_16BIT_CONFIG1 + sub_config;
break;
case LCD_COLOR_FMT_RGB666:
dev->dpi_color_coding.dpi_color_coding = MIPI_DSI_LL_COLOR_CODE_18BIT_CONFIG1 + sub_config;
break;
case LCD_COLOR_FMT_RGB888:
dev->dpi_color_coding.dpi_color_coding = MIPI_DSI_LL_COLOR_CODE_24BIT;
break;