mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
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:
@@ -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");
|
||||
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user