mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user