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 <yong.qin@amlogic.com>
This commit is contained in:
Yong Qin
2019-10-15 19:37:19 +08:00
parent b7b3ee7403
commit c426f0f0f8
6 changed files with 378 additions and 125 deletions

View File

@@ -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");

View File

@@ -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)));

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
};