Skip to content

Commit

Permalink
PD#130826: hdmitx: add 3D/FramePacking function
Browse files Browse the repository at this point in the history
1) FP function under: 720p50/60, 1080p24/25/30/50/60
2) add new modes for /sys/class/display/mode
720fp60hz, 720fp50hz, 1080fp24hz, 1080fp25hz, 1080fp30hz,
1080fp50hz, 1080fp60hz.
Here, fp stands for frame packing.
3) rewrite SYSFS:
> # cat /sys/class/amhdmitx/amhdmitx0/disp_cap_3d
3D support lists:
480p60hz TopBottom SidebySide
576p50hz
720p60hz FramePacking TopBottom SidebySide
1080i60hz TopBottom SidebySide
1080p60hz FramePacking TopBottom SidebySide
720p50hz FramePacking TopBottom SidebySide
1080i50hz TopBottom SidebySide
1080p30hz FramePacking TopBottom SidebySide
1080p50hz FramePacking TopBottom SidebySide
1080p25hz
1080p24hz FramePacking TopBottom SidebySide

Change-Id: I6295209820abaa0073073b7bda09b06d6136d2c1
Signed-off-by: Zongdong Jiao <zongdong.jiao@amlogic.com>
  • Loading branch information
Zongdong Jiao authored and Victor Wan committed Jan 6, 2017
1 parent ca80538 commit ed832db
Show file tree
Hide file tree
Showing 12 changed files with 674 additions and 181 deletions.
93 changes: 93 additions & 0 deletions drivers/amlogic/display/vout/tv_vout.h
Expand Up @@ -1246,6 +1246,99 @@ static struct vinfo_s tv_info[] = {
.video_clk = 148500000,
.viu_color_fmt = TVIN_YUV444,
},
/* VMODE for 3D Frame Packing */
{ /* VMODE_1080FP60HZ */
.name = "1080fp60hz",
.mode = VMODE_1080FP60HZ,
.width = 1920,
.height = 1080 + 1125,
.field_height = 1080 + 1125,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 60,
.sync_duration_den = 1,
.video_clk = 297000000,
.viu_color_fmt = TVIN_YUV444,
},
{ /* VMODE_1080FP50HZ */
.name = "1080fp50hz",
.mode = VMODE_1080FP50HZ,
.width = 1920,
.height = 1080 + 1125,
.field_height = 1080 + 1125,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 50,
.sync_duration_den = 1,
.video_clk = 297000000,
.viu_color_fmt = TVIN_YUV444,
},
{ /* VMODE_1080FP30HZ */
.name = "1080fp30hz",
.mode = VMODE_1080FP30HZ,
.width = 1920,
.height = 1080 + 1125,
.field_height = 1080 + 1125,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 30,
.sync_duration_den = 1,
.video_clk = 148500000,
.viu_color_fmt = TVIN_YUV444,
},
{ /* VMODE_1080FP25HZ */
.name = "1080fp25hz",
.mode = VMODE_1080FP25HZ,
.width = 1920,
.height = 1080 + 1125,
.field_height = 1080 + 1125,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 25,
.sync_duration_den = 1,
.video_clk = 148500000,
.viu_color_fmt = TVIN_YUV444,
},
{ /* VMODE_1080FP24HZ */
.name = "1080fp24hz",
.mode = VMODE_1080FP24HZ,
.width = 1920,
.height = 1080 + 1125,
.field_height = 1080 + 1125,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 24,
.sync_duration_den = 1,
.video_clk = 148500000,
.viu_color_fmt = TVIN_YUV444,
},
{ /* VMODE_720FP60HZ */
.name = "720fp60hz",
.mode = VMODE_720FP60HZ,
.width = 1280,
.height = 720 + 750,
.field_height = 720 + 750,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 60,
.sync_duration_den = 1,
.video_clk = 148500000,
.viu_color_fmt = TVIN_YUV444,
},
{ /* VMODE_720FP50HZ */
.name = "720fp50hz",
.mode = VMODE_720FP50HZ,
.width = 1280,
.height = 720 + 750,
.field_height = 720 + 750,
.aspect_ratio_num = 16,
.aspect_ratio_den = 9,
.sync_duration_num = 50,
.sync_duration_den = 1,
.video_clk = 148500000,
.viu_color_fmt = TVIN_YUV444,
},
/* VMODE for 3D Frame Packing END */
{ /* NULL mode, used as temporary witch mode state */
.name = "null",
.mode = VMODE_NULL,
Expand Down
104 changes: 59 additions & 45 deletions drivers/amlogic/hdmi/hdmi_tx_20/hdmi_tx_edid.c
Expand Up @@ -1187,70 +1187,84 @@ static int hdmitx_edid_3d_parse(struct rx_cap *pRXCap, unsigned char *dat,
unsigned size)
{
int j = 0;
int bit = 16;
unsigned int base = 0;
unsigned int pos = base + 1;

if (dat[base] & (1<<7))
if (dat[base] & (1 << 7))
pos += 2;
if (dat[base] & (1<<6))
if (dat[base] & (1 << 6))
pos += 2;
if (dat[base] & (1<<5)) {
if (dat[base] & (1 << 5)) {
pRXCap->threeD_present = dat[pos] >> 7;
pRXCap->threeD_Multi_present = (dat[pos] >> 5) & 0x3;
pos += 1;
pRXCap->hdmi_vic_LEN = (dat[pos]) >> 5;
pRXCap->HDMI_3D_LEN = (dat[pos]) & 0x1f;
pRXCap->hdmi_vic_LEN = dat[pos] >> 5;
pRXCap->HDMI_3D_LEN = dat[pos] & 0x1f;
pos += pRXCap->hdmi_vic_LEN + 1;
if ((pRXCap->threeD_Multi_present == 0x01) ||
(pRXCap->threeD_Multi_present == 0x2)) {

if (pRXCap->threeD_Multi_present == 0x01) {
pRXCap->threeD_Structure_ALL_15_0 =
(dat[pos] << 8) + dat[pos+1];
pRXCap->threeD_MASK_15_0 = 0;
pos += 2;
}
if (pRXCap->threeD_Multi_present == 0x2) {
pRXCap->threeD_MASK_15_0 = (dat[pos] << 8)
+ dat[pos+1];
if (pRXCap->threeD_Multi_present == 0x02) {
pRXCap->threeD_Structure_ALL_15_0 =
(dat[pos] << 8) + dat[pos+1];
pos += 2;
pRXCap->threeD_MASK_15_0 = (dat[pos] << 8) + dat[pos+1];
pos += 2;
}
}
while (pos < size) {
if ((dat[pos] & 0xf) == 0x0) { /* frame packing */
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos]
& 0xf0) >> 4)]].frame_packing = 1;
pRXCap->support_3d_format[pRXCap->VIC[((
dat[pos+1] & 0xf0) >> 4)]].frame_packing = 1;
}
if ((dat[pos] & 0xf) == 0x6) { /* top and bottom */
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos]
& 0xf0) >> 4)]].top_and_bottom = 1;
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos+1]
& 0xf0) >> 4)]].top_and_bottom = 1;
}
if ((dat[pos] & 0xf) == 0x8) { /* top and bottom */
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos]
& 0xf0) >> 4)]].side_by_side = 1;
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos+1]
& 0xf0) >> 4)]].side_by_side = 1;
}
pos += 2;
}

while (bit--) {
if (((pRXCap->threeD_MASK_15_0) >> j) & 0x1) {
if ((dat[pos] & 0xf) < 0x8) {
/* frame packing */
if (pRXCap->threeD_Structure_ALL_15_0 & (1 << 0))
pRXCap->support_3d_format[pRXCap->VIC[j]].
frame_packing = 1;
/* top and bottom */
if (pRXCap->threeD_Structure_ALL_15_0 & (1 << 6))
pRXCap->support_3d_format[pRXCap->VIC[j]].
top_and_bottom = 1;
if ((dat[pos] & 0xf) == T3D_FRAME_PACKING)
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos]
& 0xf0) >> 4)]].frame_packing = 1;
/* top and bottom */
if (pRXCap->threeD_Structure_ALL_15_0 & (1 << 8))
pRXCap->support_3d_format[pRXCap->VIC[j]].
side_by_side = 1;
j++;
if ((dat[pos] & 0xf) == T3D_TAB)
pRXCap->support_3d_format[pRXCap->VIC[((dat[pos]
& 0xf0) >> 4)]].top_and_bottom = 1;
pos += 1;
} else {
/* SidebySide */
if ((dat[pos] & 0xf) == T3D_SBS_HALF)
if ((dat[pos+1] >> 4) < 0xb)
pRXCap->support_3d_format[pRXCap->VIC[
((dat[pos] & 0xf0) >> 4)]]
.side_by_side = 1;
pos += 2;
}
}
if (pRXCap->threeD_MASK_15_0 == 0) {
for (j = 0; (j < 16) && (j < pRXCap->VIC_count); j++) {
pRXCap->support_3d_format[pRXCap->VIC[j]].frame_packing
= 1;
pRXCap->support_3d_format[pRXCap->VIC[j]].top_and_bottom
= 1;
pRXCap->support_3d_format[pRXCap->VIC[j]].side_by_side
= 1;
}
} else {
for (j = 0; j < 16; j++) {
if (((pRXCap->threeD_MASK_15_0) >> j) & 0x1) {
/* frame packing */
if (pRXCap->threeD_Structure_ALL_15_0
& (1 << 0))
pRXCap->support_3d_format[pRXCap->
VIC[j]].frame_packing = 1;
/* top and bottom */
if (pRXCap->threeD_Structure_ALL_15_0
& (1 << 6))
pRXCap->support_3d_format[pRXCap->
VIC[j]].top_and_bottom = 1;
/* top and bottom */
if (pRXCap->threeD_Structure_ALL_15_0
& (1 << 8))
pRXCap->support_3d_format[pRXCap->
VIC[j]].side_by_side = 1;
}
}
}
return 1;
Expand Down

0 comments on commit ed832db

Please sign in to comment.