From c426f0f0f896cd73658f78cc7b3a836c7e2dae51 Mon Sep 17 00:00:00 2001 From: Yong Qin Date: Tue, 15 Oct 2019 19:37:19 +0800 Subject: [PATCH] vdin: add RGB mode rgb full to yuv full [1/2] PD#SWPL-15366 Problem: HDMI 256 gray will lose data info Solution: RGB full mode vdin matrix use RGB to YUV706F Verify: TL1 Change-Id: Idfcafefcc31cc2fc2a6a21368598eae8a5159ec4 Signed-off-by: Yong Qin --- drivers/amlogic/media/vin/tvin/tvin_global.c | 34 +++ .../amlogic/media/vin/tvin/vdin/vdin_ctl.c | 211 ++++++++++++------ .../amlogic/media/vin/tvin/vdin/vdin_ctl.h | 55 +---- .../amlogic/media/vin/tvin/vdin/vdin_debug.c | 118 +++++++++- .../amlogic/media/vin/tvin/vdin/vdin_drv.h | 55 ++++- .../amlogic/media/frame_provider/tvin/tvin.h | 30 +++ 6 files changed, 378 insertions(+), 125 deletions(-) diff --git a/drivers/amlogic/media/vin/tvin/tvin_global.c b/drivers/amlogic/media/vin/tvin/tvin_global.c index 86ccf4b4900e..8100baf2ebce 100644 --- a/drivers/amlogic/media/vin/tvin/tvin_global.c +++ b/drivers/amlogic/media/vin/tvin/tvin_global.c @@ -196,5 +196,39 @@ const char *tvin_trans_fmt_str(enum tvin_trans_fmt trans_fmt) EXPORT_SYMBOL(tvin_trans_fmt_str); +const char *tvin_trans_color_range_str( + enum tvin_color_fmt_range_e color_range) +{ + switch (color_range) { + case TVIN_RGB_FULL: + return "TVIN_RGB_FULL"; + case TVIN_RGB_LIMIT: + return "TVIN_RGB_LIMIT"; + case TVIN_YUV_FULL: + return "TVIN_YUV_FULL"; + case TVIN_YUV_LIMIT: + return "TVIN_YUV_LIMIT"; + default: + return "TVIN_FMT_RANGE_NULL"; + } +} +EXPORT_SYMBOL(tvin_trans_color_range_str); + +const char *tvin_trans_force_range_str( + enum tvin_force_color_range_e force_range) +{ + switch (force_range) { + case COLOR_RANGE_AUTO: + return "COLOR_RANGE_AUTO"; + case COLOR_RANGE_FULL: + return "COLOR_RANGE_FULL"; + case COLOR_RANGE_LIMIT: + return "COLOR_RANGE_LIMIT"; + default: + return "COLOR_RANGE_NULL"; + } +} +EXPORT_SYMBOL(tvin_trans_force_range_str); + MODULE_LICENSE("GPL"); diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.c b/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.c index 28c274c4e752..b617bd767caf 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.c +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.c @@ -507,6 +507,59 @@ static struct vdin_matrix_lup_s vdin_matrix_lup[] = { }; /***************************Local function**********************************/ + +/*set csc idx conter to ranage + * parameters: + * a.csc_idx + * return + * 0: limit + * 1: full + */ +u32 vdin_matrix_range_chk(enum vdin_matrix_csc_e csc_idx) +{ + switch (csc_idx) { + case VDIN_MATRIX_YUV601F_RGB: + case VDIN_MATRIX_RGBS_YUV601F: + case VDIN_MATRIX_YUV601_YUV601F: + case VDIN_MATRIX_YUV709_RGB: + case VDIN_MATRIX_YUV709_GBR: + case VDIN_MATRIX_YUV709_BRG: + case VDIN_MATRIX_RGB_YUV709F: + case VDIN_MATRIX_YUV709F_RGB: + case VDIN_MATRIX_RGBS_YUV709F: + case VDIN_MATRIX_YUV709_YUV709F: + case VDIN_MATRIX_YUV601_YUV709F: + case VDIN_MATRIX_YUV601F_YUV709F: + case VDIN_MATRIX_YUV709F_YUV601F: + case VDIN_MATRIX_YUV709_YUV601F: + case VDIN_MATRIX_RGBS_RGB: + return 1; + + case VDIN_MATRIX_NULL: + case VDIN_MATRIX_XXX_YUV601_BLACK: + case VDIN_MATRIX_RGB_YUV601: + case VDIN_MATRIX_GBR_YUV601: + case VDIN_MATRIX_BRG_YUV601: + case VDIN_MATRIX_RGBS_YUV601: + case VDIN_MATRIX_YUV601_RGBS: + case VDIN_MATRIX_YUV601F_RGBS: + case VDIN_MATRIX_YUV601F_YUV601: + case VDIN_MATRIX_RGB_YUV709: + case VDIN_MATRIX_RGBS_YUV709: + case VDIN_MATRIX_YUV709_RGBS: + case VDIN_MATRIX_YUV709F_RGBS: + case VDIN_MATRIX_YUV709F_YUV709: + case VDIN_MATRIX_YUV601_YUV709: + case VDIN_MATRIX_YUV709_YUV601: + case VDIN_MATRIX_YUV709F_YUV601: + case VDIN_MATRIX_YUV601F_YUV709: + case VDIN_MATRIX_RGB_RGBS: + case VDIN_MATRIX_RGB2020_YUV2020: + default: + return 0; + } +} + /*set format_convert *base on parameters: * a.color_format @@ -716,7 +769,8 @@ void vdin_prob_set_xy(unsigned int offset, rgb_info_enable = 1; format_convert_matrix0 = vdin_get_format_convert_matrix0(devp); format_convert_matrix1 = vdin_get_format_convert_matrix1(devp); - vdin_set_color_matrix1(devp->addr_offset, devp->fmt_info_p, + devp->csc_idx = vdin_set_color_matrix1(devp->addr_offset, + devp->fmt_info_p, format_convert_matrix1, devp->parm.port, devp->prop.color_fmt_range, @@ -724,7 +778,7 @@ void vdin_prob_set_xy(unsigned int offset, devp->color_range_mode); if (is_meson_g12a_cpu() || is_meson_g12b_cpu() || is_meson_sm1_cpu() || is_meson_tm2_cpu()) - vdin_set_color_matrix0_g12a(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0_g12a(devp->addr_offset, devp->fmt_info_p, devp->format_convert, devp->parm.port, @@ -732,7 +786,8 @@ void vdin_prob_set_xy(unsigned int offset, devp->prop.vdin_hdr_Flag, devp->color_range_mode); else - vdin_set_color_matrix0(devp->addr_offset, devp->fmt_info_p, + devp->csc_idx = vdin_set_color_matrix0(devp->addr_offset, + devp->fmt_info_p, format_convert_matrix0, devp->parm.port, devp->prop.color_fmt_range, @@ -1188,6 +1243,41 @@ void vdin_set_config(struct vdin_dev_s *devp) VDIN_PIXELCLK_4K_60HZ; /* 2160p60hz*/ } +void vdin_change_matrix(unsigned int offset, + unsigned int matrix_csc) +{ + struct vdin_matrix_lup_s *matrix_tbl; + + if (matrix_csc == VDIN_MATRIX_NULL) { + wr_bits(offset, VDIN_MATRIX_CTRL, 0, + VDIN_MATRIX_EN_BIT, VDIN_MATRIX_EN_WID); + } else { + matrix_tbl = &vdin_matrix_lup[matrix_csc - 1]; + + /*coefficient index select matrix0*/ + wr_bits(offset, VDIN_MATRIX_CTRL, 0, + VDIN_MATRIX_COEF_INDEX_BIT, VDIN_MATRIX_COEF_INDEX_WID); + + wr(offset, + VDIN_MATRIX_PRE_OFFSET0_1, matrix_tbl->pre_offset0_1); + wr(offset, + VDIN_MATRIX_PRE_OFFSET2, matrix_tbl->pre_offset2); + wr(offset, VDIN_MATRIX_COEF00_01, matrix_tbl->coef00_01); + wr(offset, VDIN_MATRIX_COEF02_10, matrix_tbl->coef02_10); + wr(offset, VDIN_MATRIX_COEF11_12, matrix_tbl->coef11_12); + wr(offset, VDIN_MATRIX_COEF20_21, matrix_tbl->coef20_21); + wr(offset, VDIN_MATRIX_COEF22, matrix_tbl->coef22); + wr(offset, VDIN_MATRIX_OFFSET0_1, matrix_tbl->post_offset0_1); + wr(offset, VDIN_MATRIX_OFFSET2, matrix_tbl->post_offset2); + wr_bits(offset, VDIN_MATRIX_CTRL, 0, + VDIN_MATRIX0_BYPASS_BIT, VDIN_MATRIX0_BYPASS_WID); + wr_bits(offset, VDIN_MATRIX_CTRL, 1, + VDIN_MATRIX_EN_BIT, VDIN_MATRIX_EN_WID); + } + + pr_info("%s id:%d\n", __func__, matrix_csc); +} + /*set matrix_csc * based on parameters: * a.format_convert @@ -1195,13 +1285,14 @@ void vdin_set_config(struct vdin_dev_s *devp) * c.color_range_mode * d.vdin_hdr_flag */ -static inline void vdin_set_color_matrix1(unsigned int offset, - struct tvin_format_s *tvin_fmt_p, - enum vdin_format_convert_e format_convert, - enum tvin_port_e port, - enum tvin_color_fmt_range_e color_fmt_range, - unsigned int vdin_hdr_flag, - unsigned int color_range_mode) +static enum vdin_matrix_csc_e +vdin_set_color_matrix1(unsigned int offset, + struct tvin_format_s *tvin_fmt_p, + enum vdin_format_convert_e format_convert, + enum tvin_port_e port, + enum tvin_color_fmt_range_e color_fmt_range, + unsigned int vdin_hdr_flag, + unsigned int color_range_mode) { /* unsigned int offset = devp->addr_offset; */ enum vdin_matrix_csc_e matrix_csc = VDIN_MATRIX_NULL; @@ -1275,7 +1366,7 @@ static inline void vdin_set_color_matrix1(unsigned int offset, VDIN_MATRIX_RGB2020_YUV2020; else matrix_csc = - VDIN_MATRIX_RGB_YUV709; + VDIN_MATRIX_RGB_YUV709F; } else matrix_csc = VDIN_MATRIX_RGBS_YUV709; } @@ -1383,18 +1474,20 @@ static inline void vdin_set_color_matrix1(unsigned int offset, VDIN_MATRIX1_EN_BIT, VDIN_MATRIX1_EN_WID); } pr_info("%s id:%d\n", __func__, matrix_csc); + return matrix_csc; } -static inline void vdin_set_color_matrix0(unsigned int offset, - struct tvin_format_s *tvin_fmt_p, - enum vdin_format_convert_e format_convert, - enum tvin_port_e port, - enum tvin_color_fmt_range_e color_fmt_range, - unsigned int vdin_hdr_flag, - unsigned int color_range_mode) +static enum vdin_matrix_csc_e +vdin_set_color_matrix0(unsigned int offset, + struct tvin_format_s *tvin_fmt_p, + enum vdin_format_convert_e format_convert, + enum tvin_port_e port, + enum tvin_color_fmt_range_e color_fmt_range, + unsigned int vdin_hdr_flag, + unsigned int color_range_mode) { enum vdin_matrix_csc_e matrix_csc = VDIN_MATRIX_NULL; - struct vdin_matrix_lup_s *matrix_tbl; + /*struct vdin_matrix_lup_s *matrix_tbl;*/ struct tvin_format_s *fmt_info = tvin_fmt_p; switch (format_convert) { @@ -1465,7 +1558,7 @@ static inline void vdin_set_color_matrix0(unsigned int offset, VDIN_MATRIX_RGB2020_YUV2020; else matrix_csc = - VDIN_MATRIX_RGB_YUV709; + VDIN_MATRIX_RGB_YUV709F; } else matrix_csc = VDIN_MATRIX_RGBS_YUV709; } @@ -1543,41 +1636,20 @@ static inline void vdin_set_color_matrix0(unsigned int offset, break; } - if (matrix_csc == VDIN_MATRIX_NULL) { - wr_bits(offset, VDIN_MATRIX_CTRL, 0, - VDIN_MATRIX_EN_BIT, VDIN_MATRIX_EN_WID); - } else { - matrix_tbl = &vdin_matrix_lup[matrix_csc - 1]; - - /*coefficient index select matrix0*/ - wr_bits(offset, VDIN_MATRIX_CTRL, 0, - VDIN_MATRIX_COEF_INDEX_BIT, VDIN_MATRIX_COEF_INDEX_WID); - - wr(offset, - VDIN_MATRIX_PRE_OFFSET0_1, matrix_tbl->pre_offset0_1); - wr(offset, - VDIN_MATRIX_PRE_OFFSET2, matrix_tbl->pre_offset2); - wr(offset, VDIN_MATRIX_COEF00_01, matrix_tbl->coef00_01); - wr(offset, VDIN_MATRIX_COEF02_10, matrix_tbl->coef02_10); - wr(offset, VDIN_MATRIX_COEF11_12, matrix_tbl->coef11_12); - wr(offset, VDIN_MATRIX_COEF20_21, matrix_tbl->coef20_21); - wr(offset, VDIN_MATRIX_COEF22, matrix_tbl->coef22); - wr(offset, VDIN_MATRIX_OFFSET0_1, matrix_tbl->post_offset0_1); - wr(offset, VDIN_MATRIX_OFFSET2, matrix_tbl->post_offset2); - wr_bits(offset, VDIN_MATRIX_CTRL, 0, - VDIN_MATRIX0_BYPASS_BIT, VDIN_MATRIX0_BYPASS_WID); - wr_bits(offset, VDIN_MATRIX_CTRL, 1, - VDIN_MATRIX_EN_BIT, VDIN_MATRIX_EN_WID); - } - pr_info("%s id:%d\n", __func__, matrix_csc); + vdin_change_matrix(offset, matrix_csc); + return matrix_csc; } -static void vdin_set_color_matrix0_g12a(unsigned int offset, - struct tvin_format_s *tvin_fmt_p, - enum vdin_format_convert_e format_convert, - enum tvin_port_e port, - enum tvin_color_fmt_range_e color_fmt_range, - unsigned int vdin_hdr_flag, - unsigned int color_range_mode) + +static enum vdin_matrix_csc_e +vdin_set_color_matrix0_g12a(unsigned int offset, + struct tvin_format_s *tvin_fmt_p, + enum vdin_format_convert_e + format_convert, + enum tvin_port_e port, + enum tvin_color_fmt_range_e + color_fmt_range, + unsigned int vdin_hdr_flag, + unsigned int color_range_mode) { enum vdin_matrix_csc_e matrix_csc = VDIN_MATRIX_NULL; struct vdin_matrix_lup_s *matrix_tbl; @@ -1651,7 +1723,7 @@ static void vdin_set_color_matrix0_g12a(unsigned int offset, VDIN_MATRIX_RGB2020_YUV2020; else matrix_csc = - VDIN_MATRIX_RGB_YUV709; + VDIN_MATRIX_RGB_YUV709F; } else matrix_csc = VDIN_MATRIX_RGBS_YUV709; } @@ -1766,6 +1838,7 @@ static void vdin_set_color_matrix0_g12a(unsigned int offset, VDIN_MATRIX_EN_BIT, VDIN_MATRIX_EN_WID); } pr_info("%s id:%d\n", __func__, matrix_csc); + return matrix_csc; } /*set matrix based on rgb_info_enable: @@ -1787,7 +1860,8 @@ void vdin_set_matrix(struct vdin_dev_s *devp) VDIN_MATRIX1_EN_BIT, VDIN_MATRIX1_EN_WID); if (is_meson_g12a_cpu() || is_meson_g12b_cpu() || is_meson_sm1_cpu() || is_meson_tm2_cpu()) - vdin_set_color_matrix0_g12a(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0_g12a( + devp->addr_offset, devp->fmt_info_p, devp->format_convert, devp->parm.port, @@ -1795,7 +1869,8 @@ void vdin_set_matrix(struct vdin_dev_s *devp) devp->prop.vdin_hdr_Flag, devp->color_range_mode); else - vdin_set_color_matrix0(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0( + devp->addr_offset, devp->fmt_info_p, devp->format_convert, devp->parm.port, @@ -1814,7 +1889,9 @@ void vdin_set_matrix(struct vdin_dev_s *devp) } else { format_convert_matrix0 = vdin_get_format_convert_matrix0(devp); format_convert_matrix1 = vdin_get_format_convert_matrix1(devp); - vdin_set_color_matrix1(devp->addr_offset, devp->fmt_info_p, + devp->csc_idx = vdin_set_color_matrix1( + devp->addr_offset, + devp->fmt_info_p, format_convert_matrix1, devp->parm.port, devp->prop.color_fmt_range, @@ -1822,7 +1899,8 @@ void vdin_set_matrix(struct vdin_dev_s *devp) devp->color_range_mode); if (is_meson_g12a_cpu() || is_meson_g12b_cpu() || is_meson_sm1_cpu() || is_meson_tm2_cpu()) - vdin_set_color_matrix0_g12a(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0_g12a( + devp->addr_offset, devp->fmt_info_p, devp->format_convert, devp->parm.port, @@ -1830,7 +1908,8 @@ void vdin_set_matrix(struct vdin_dev_s *devp) devp->prop.vdin_hdr_Flag, devp->color_range_mode); else - vdin_set_color_matrix0(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0( + devp->addr_offset, devp->fmt_info_p, format_convert_matrix0, devp->parm.port, @@ -1861,7 +1940,8 @@ void vdin_set_matrixs(struct vdin_dev_s *devp, unsigned char id, case 0: if (is_meson_g12a_cpu() || is_meson_g12b_cpu() || is_meson_sm1_cpu() || is_meson_tm2_cpu()) - vdin_set_color_matrix0_g12a(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0_g12a( + devp->addr_offset, devp->fmt_info_p, devp->format_convert, devp->parm.port, @@ -1869,7 +1949,8 @@ void vdin_set_matrixs(struct vdin_dev_s *devp, unsigned char id, devp->prop.vdin_hdr_Flag, devp->color_range_mode); else - vdin_set_color_matrix0(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix0( + devp->addr_offset, devp->fmt_info_p, csc, devp->parm.port, devp->prop.color_fmt_range, @@ -1877,7 +1958,8 @@ void vdin_set_matrixs(struct vdin_dev_s *devp, unsigned char id, devp->color_range_mode); break; case 1: - vdin_set_color_matrix1(devp->addr_offset, + devp->csc_idx = vdin_set_color_matrix1( + devp->addr_offset, devp->fmt_info_p, csc, devp->parm.port, devp->prop.color_fmt_range, @@ -4377,6 +4459,7 @@ void vdin_set_drm_data(struct vdin_dev_s *devp, { struct vframe_master_display_colour_s *vf_dp = &vf->prop.master_display_colour; + u32 val = 0; if (devp->prop.hdr_info.hdr_state == HDR_STATE_GET) { if (vdin_hdr_sei_error_check(devp) == 1) { @@ -4453,6 +4536,8 @@ void vdin_set_drm_data(struct vdin_dev_s *devp, vf_dp->present_flag = false; vf->signal_type &= ~(1 << 29); vf->signal_type &= ~(1 << 25); + val = vdin_matrix_range_chk(devp->csc_idx); + vf->signal_type |= (val << 25); /*todo;default is bt709,if change need sync*/ vf->signal_type = ((1 << 16) | (vf->signal_type & (~0xFF0000))); diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.h b/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.h index f7cde26de415..4668c2da3e5a 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.h +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.h @@ -45,59 +45,6 @@ enum wr_sel_vdin_e { WR_SEL_VDIN1_SML = 4, }; -/* *********************************************************************** */ -/* *** enum definitions ********************************************* */ -/* *********************************************************************** */ -/* - *YUV601: SDTV BT.601 YCbCr (16~235, 16~240, 16~240) - *YUV601F: SDTV BT.601 Full_Range YCbCr ( 0~255, 0~255, 0~255) - *YUV709: HDTV BT.709 YCbCr (16~235, 16~240, 16~240) - *YUV709F: HDTV BT.709 Full_Range YCbCr ( 0~255, 0~255, 0~255) - *RGBS: StudioRGB (16~235, 16~235, 16~235) - *RGB: RGB ( 0~255, 0~255, 0~255) - */ -enum vdin_matrix_csc_e { - VDIN_MATRIX_NULL = 0, - VDIN_MATRIX_XXX_YUV601_BLACK,/*1*/ - VDIN_MATRIX_RGB_YUV601, - VDIN_MATRIX_GBR_YUV601, - VDIN_MATRIX_BRG_YUV601, - VDIN_MATRIX_YUV601_RGB,/*5*/ - VDIN_MATRIX_YUV601_GBR, - VDIN_MATRIX_YUV601_BRG, - VDIN_MATRIX_RGB_YUV601F, - VDIN_MATRIX_YUV601F_RGB,/*9*/ - VDIN_MATRIX_RGBS_YUV601,/*10*/ - VDIN_MATRIX_YUV601_RGBS, - VDIN_MATRIX_RGBS_YUV601F, - VDIN_MATRIX_YUV601F_RGBS, - VDIN_MATRIX_YUV601F_YUV601, - VDIN_MATRIX_YUV601_YUV601F,/*15*/ - VDIN_MATRIX_RGB_YUV709, - VDIN_MATRIX_YUV709_RGB, - VDIN_MATRIX_YUV709_GBR, - VDIN_MATRIX_YUV709_BRG, - VDIN_MATRIX_RGB_YUV709F,/*20*/ - VDIN_MATRIX_YUV709F_RGB, - VDIN_MATRIX_RGBS_YUV709, - VDIN_MATRIX_YUV709_RGBS, - VDIN_MATRIX_RGBS_YUV709F, - VDIN_MATRIX_YUV709F_RGBS,/*25*/ - VDIN_MATRIX_YUV709F_YUV709, - VDIN_MATRIX_YUV709_YUV709F, - VDIN_MATRIX_YUV601_YUV709, - VDIN_MATRIX_YUV709_YUV601, - VDIN_MATRIX_YUV601_YUV709F,/*30*/ - VDIN_MATRIX_YUV709F_YUV601, - VDIN_MATRIX_YUV601F_YUV709, - VDIN_MATRIX_YUV709_YUV601F, - VDIN_MATRIX_YUV601F_YUV709F, - VDIN_MATRIX_YUV709F_YUV601F,/*35*/ - VDIN_MATRIX_RGBS_RGB, - VDIN_MATRIX_RGB_RGBS, - VDIN_MATRIX_RGB2020_YUV2020, -}; - /* *************************************************** */ /* *** structure definitions ************************* */ /* *************************************************** */ @@ -240,6 +187,8 @@ extern void vdin_prob_get_yuv(unsigned int offset, unsigned int *rgb_yuv2); extern void vdin_prob_matrix_sel(unsigned int offset, unsigned int sel, struct vdin_dev_s *devp); +void vdin_change_matrix(unsigned int offset, + unsigned int matrix_csc); #endif diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_debug.c b/drivers/amlogic/media/vin/tvin/vdin/vdin_debug.c index ee87bb55c45b..c5356908abc1 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_debug.c +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_debug.c @@ -682,6 +682,90 @@ static void vdin_channel_order_status(unsigned int offset) offset, c0, c1, c2); } +const char *vdin_trans_matrix_str(enum vdin_matrix_csc_e csc_idx) +{ + switch (csc_idx) { + case VDIN_MATRIX_XXX_YUV601_BLACK: + return "VDIN_MATRIX_XXX_YUV601_BLACK"; + case VDIN_MATRIX_RGB_YUV601: + return "VDIN_MATRIX_RGB_YUV601"; + case VDIN_MATRIX_GBR_YUV601: + return "VDIN_MATRIX_GBR_YUV601"; + case VDIN_MATRIX_BRG_YUV601: + return "VDIN_MATRIX_BRG_YUV601"; + case VDIN_MATRIX_YUV601_RGB: + return "VDIN_MATRIX_YUV601_RGB"; + case VDIN_MATRIX_YUV601_GBR: + return "VDIN_MATRIX_YUV601_GBR"; + case VDIN_MATRIX_YUV601_BRG: + return "VDIN_MATRIX_YUV601_BRG"; + case VDIN_MATRIX_RGB_YUV601F: + return "VDIN_MATRIX_RGB_YUV601F"; + case VDIN_MATRIX_YUV601F_RGB: + return "VDIN_MATRIX_YUV601F_RGB"; + case VDIN_MATRIX_RGBS_YUV601: + return "VDIN_MATRIX_RGBS_YUV601"; + case VDIN_MATRIX_YUV601_RGBS: + return "VDIN_MATRIX_YUV601_RGBS"; + case VDIN_MATRIX_RGBS_YUV601F: + return "VDIN_MATRIX_RGBS_YUV601F"; + case VDIN_MATRIX_YUV601F_RGBS: + return "VDIN_MATRIX_YUV601F_RGBS"; + case VDIN_MATRIX_YUV601F_YUV601: + return "VDIN_MATRIX_YUV601F_YUV601"; + case VDIN_MATRIX_YUV601_YUV601F: + return "VDIN_MATRIX_YUV601_YUV601F"; + case VDIN_MATRIX_RGB_YUV709: + return "VDIN_MATRIX_RGB_YUV709"; + case VDIN_MATRIX_YUV709_RGB: + return "VDIN_MATRIX_YUV709_RGB"; + case VDIN_MATRIX_YUV709_GBR: + return "VDIN_MATRIX_YUV709_GBR"; + case VDIN_MATRIX_YUV709_BRG: + return "VDIN_MATRIX_YUV709_BRG"; + case VDIN_MATRIX_RGB_YUV709F: + return "VDIN_MATRIX_RGB_YUV709F"; + case VDIN_MATRIX_YUV709F_RGB: + return "VDIN_MATRIX_YUV709F_RGB"; + case VDIN_MATRIX_RGBS_YUV709: + return "VDIN_MATRIX_RGBS_YUV709"; + case VDIN_MATRIX_YUV709_RGBS: + return "VDIN_MATRIX_YUV709_RGBS"; + case VDIN_MATRIX_RGBS_YUV709F: + return "VDIN_MATRIX_RGBS_YUV709F"; + case VDIN_MATRIX_YUV709F_RGBS: + return "VDIN_MATRIX_YUV709F_RGBS"; + case VDIN_MATRIX_YUV709F_YUV709: + return "VDIN_MATRIX_YUV709F_YUV709"; + case VDIN_MATRIX_YUV709_YUV709F: + return "VDIN_MATRIX_YUV709_YUV709F"; + case VDIN_MATRIX_YUV601_YUV709: + return "VDIN_MATRIX_YUV601_YUV709"; + case VDIN_MATRIX_YUV709_YUV601: + return "VDIN_MATRIX_YUV709_YUV601"; + case VDIN_MATRIX_YUV601_YUV709F: + return "VDIN_MATRIX_YUV601_YUV709F"; + case VDIN_MATRIX_YUV709F_YUV601: + return "VDIN_MATRIX_YUV709F_YUV601"; + case VDIN_MATRIX_YUV601F_YUV709: + return "VDIN_MATRIX_YUV601F_YUV709"; + case VDIN_MATRIX_YUV709_YUV601F: + return "VDIN_MATRIX_YUV709_YUV601F"; + case VDIN_MATRIX_YUV601F_YUV709F: + return "VDIN_MATRIX_YUV601F_YUV709F"; + case VDIN_MATRIX_YUV709F_YUV601F: + return "VDIN_MATRIX_YUV709F_YUV601F"; + case VDIN_MATRIX_RGBS_RGB: + return "VDIN_MATRIX_RGBS_RGB"; + case VDIN_MATRIX_RGB_RGBS: + return "VDIN_MATRIX_RGB_RGBS"; + case VDIN_MATRIX_RGB2020_YUV2020: + return "VDIN_MATRIX_RGB2020_YUV2020"; + default: + return "VDIN_MATRIX_NULL"; + } +}; + static void vdin_dump_state(struct vdin_dev_s *devp) { unsigned int i; @@ -706,16 +790,27 @@ static void vdin_dump_state(struct vdin_dev_s *devp) pr_info("signal format = %s(0x%x)\n", tvin_sig_fmt_str(devp->parm.info.fmt), devp->parm.info.fmt); - pr_info("trans_fmt = %s(%d)\n", + pr_info("prop.trans_fmt = %s(%d)\n", tvin_trans_fmt_str(devp->prop.trans_fmt), devp->prop.trans_fmt); - pr_info("color_format = %s(%d)\n", + pr_info("prop.color_format= %s(%d)\n", tvin_color_fmt_str(devp->prop.color_format), devp->prop.color_format); - pr_info("format_convert = %s(%d)\n", + pr_info("prop.dest_cfmt = %s(%d)\n", + tvin_color_fmt_str(devp->prop.dest_cfmt), + devp->prop.dest_cfmt); + pr_info("prop.color_fmt_range = (%s)%d\n", + tvin_trans_color_range_str(devp->prop.color_fmt_range), + devp->prop.color_fmt_range); + pr_info("format_convert = %s(%d)\n", vdin_fmt_convert_str(devp->format_convert), devp->format_convert); - pr_info("aspect_ratio = %s(%d)\ndecimation_ratio/dvi = %u / %u\n", + pr_info("vdin csc_idx = %s(%d)\n", + vdin_trans_matrix_str(devp->csc_idx), + devp->csc_idx); + pr_info("signal_type = 0x%x\n", devp->parm.info.signal_type); + pr_info("color_range_force = %d\n", color_range_force); + pr_info("aspect_ratio = %s(%d)\ndecimation_ratio/dvi = %u / %u\n", tvin_aspect_ratio_str(devp->prop.aspect_ratio), devp->prop.aspect_ratio, devp->prop.decimation_ratio, devp->prop.dvi_info); @@ -1419,6 +1514,7 @@ static ssize_t vdin_attr_store(struct device *dev, struct vdin_dev_s *devp; unsigned int time_start, time_end, time_delta; long val = 0; + unsigned int temp; if (!buf) return len; @@ -2198,12 +2294,12 @@ start_chk: } else { pr_info("vdin_afbce_mode: %d\n", devp->afbce_mode); } - } else if (!strcmp(parm[0], "vdi6_afifo_overflow")) + } else if (!strcmp(parm[0], "vdi6_afifo_overflow")) { pr_info("%d\n", vdin_check_vdi6_afifo_overflow(devp->addr_offset)); - else if (!strcmp(parm[0], "vdi6_afifo_clear")) + } else if (!strcmp(parm[0], "vdi6_afifo_clear")) { vdin_clear_vdi6_afifo_overflow_flg(devp->addr_offset); - else if (!strcmp(parm[0], "skip_frame_check")) { + } else if (!strcmp(parm[0], "skip_frame_check")) { if (parm[1] != NULL) { if (kstrtouint(parm[1], 10, &devp->skip_disp_md_check) == 0) @@ -2212,8 +2308,14 @@ start_chk: } else pr_info("skip frame check para err, ori: %d\n", devp->skip_disp_md_check); - } else + } else if (!strcmp(parm[0], "vdinmtx")) { + if (parm[1]) { + if (kstrtouint(parm[1], 10, &temp) == 0) + vdin_change_matrix(0, temp); + } + } else { pr_info("unknown command\n"); + } kfree(buf_orig); return len; diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h b/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h index 6e010e9573c1..80539ebdb51b 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h @@ -141,6 +141,59 @@ enum vdin_color_deeps_e { VDIN_COLOR_DEEPS_12BIT = 12, }; +/* *********************************************************************** */ +/* *** enum definitions ********************************************* */ +/* *********************************************************************** */ +/* + *YUV601: SDTV BT.601 YCbCr (16~235, 16~240, 16~240) + *YUV601F: SDTV BT.601 Full_Range YCbCr ( 0~255, 0~255, 0~255) + *YUV709: HDTV BT.709 YCbCr (16~235, 16~240, 16~240) + *YUV709F: HDTV BT.709 Full_Range YCbCr ( 0~255, 0~255, 0~255) + *RGBS: StudioRGB (16~235, 16~235, 16~235) + *RGB: RGB ( 0~255, 0~255, 0~255) + */ +enum vdin_matrix_csc_e { + VDIN_MATRIX_NULL = 0, + VDIN_MATRIX_XXX_YUV601_BLACK,/*1*/ + VDIN_MATRIX_RGB_YUV601, + VDIN_MATRIX_GBR_YUV601, + VDIN_MATRIX_BRG_YUV601, + VDIN_MATRIX_YUV601_RGB,/*5*/ + VDIN_MATRIX_YUV601_GBR, + VDIN_MATRIX_YUV601_BRG, + VDIN_MATRIX_RGB_YUV601F, + VDIN_MATRIX_YUV601F_RGB,/*9*/ + VDIN_MATRIX_RGBS_YUV601,/*10*/ + VDIN_MATRIX_YUV601_RGBS, + VDIN_MATRIX_RGBS_YUV601F, + VDIN_MATRIX_YUV601F_RGBS, + VDIN_MATRIX_YUV601F_YUV601, + VDIN_MATRIX_YUV601_YUV601F,/*15*/ + VDIN_MATRIX_RGB_YUV709, + VDIN_MATRIX_YUV709_RGB, + VDIN_MATRIX_YUV709_GBR, + VDIN_MATRIX_YUV709_BRG, + VDIN_MATRIX_RGB_YUV709F,/*20*/ + VDIN_MATRIX_YUV709F_RGB, + VDIN_MATRIX_RGBS_YUV709, + VDIN_MATRIX_YUV709_RGBS, + VDIN_MATRIX_RGBS_YUV709F, + VDIN_MATRIX_YUV709F_RGBS,/*25*/ + VDIN_MATRIX_YUV709F_YUV709, + VDIN_MATRIX_YUV709_YUV709F, + VDIN_MATRIX_YUV601_YUV709, + VDIN_MATRIX_YUV709_YUV601, + VDIN_MATRIX_YUV601_YUV709F,/*30*/ + VDIN_MATRIX_YUV709F_YUV601, + VDIN_MATRIX_YUV601F_YUV709, + VDIN_MATRIX_YUV709_YUV601F, + VDIN_MATRIX_YUV601F_YUV709F, + VDIN_MATRIX_YUV709F_YUV601F,/*35*/ + VDIN_MATRIX_RGBS_RGB, + VDIN_MATRIX_RGB_RGBS, + VDIN_MATRIX_RGB2020_YUV2020, +}; + static inline const char *vdin_fmt_convert_str( enum vdin_format_convert_e fmt_cvt) { @@ -265,7 +318,7 @@ struct vdin_dev_s { struct vdin_debug_s debug; enum vdin_format_convert_e format_convert; enum vdin_color_deeps_e source_bitdepth; - + enum vdin_matrix_csc_e csc_idx; struct vf_entry *curr_wr_vfe; struct vf_entry *last_wr_vfe; unsigned int curr_field_type; diff --git a/include/linux/amlogic/media/frame_provider/tvin/tvin.h b/include/linux/amlogic/media/frame_provider/tvin/tvin.h index 7b573cac015f..cefaab9b420c 100644 --- a/include/linux/amlogic/media/frame_provider/tvin/tvin.h +++ b/include/linux/amlogic/media/frame_provider/tvin/tvin.h @@ -295,11 +295,19 @@ enum tvin_color_fmt_range_e { TVIN_COLOR_FMT_RANGE_MAX, }; +const char *tvin_trans_color_range_str( + enum tvin_color_fmt_range_e color_range); + enum tvin_force_color_range_e { COLOR_RANGE_AUTO = 0, COLOR_RANGE_FULL, COLOR_RANGE_LIMIT, + COLOR_RANGE_NULL, }; + +const char *tvin_trans_force_range_str( + enum tvin_force_color_range_e force_range); + const char *tvin_color_fmt_str(enum tvin_color_fmt_e color_fmt); enum tvin_scan_mode_e { TVIN_SCAN_MODE_NULL = 0, @@ -314,6 +322,28 @@ struct tvin_info_s { enum tvin_color_fmt_e cfmt; unsigned int fps; unsigned int is_dvi; + /* + * bit 29: present_flag + * bit 28-26: video_format + * "component", "PAL", "NTSC", "SECAM", + * "MAC", "unspecified" + * bit 25: range "limited", "full_range" + * bit 24: color_description_present_flag + * bit 23-16: color_primaries + * unknown", "bt709", "undef", "bt601", + * "bt470m", "bt470bg", "smpte170m", "smpte240m", + * "film", "bt2020" + * bit 15-8: transfer_characteristic + * "unknown", "bt709", "undef", "bt601", + * "bt470m", "bt470bg", "smpte170m", "smpte240m", + * "linear", "log100", "log316", "iec61966-2-4", + * "bt1361e", "iec61966-2-1", "bt2020-10", "bt2020-12", + * "smpte-st-2084", "smpte-st-428" + * bit 7-0: matrix_coefficient + * "GBR", "bt709", "undef", "bt601", + * "fcc", "bt470bg", "smpte170m", "smpte240m", + * "YCgCo", "bt2020nc", "bt2020c" + */ unsigned int signal_type; };