From f8f829e66bcf5f1bb92282ecf48ca51495a86e56 Mon Sep 17 00:00:00 2001 From: Hang Cheng Date: Thu, 21 Jun 2018 12:20:25 +0800 Subject: [PATCH] hdmirx: optimize for devices which send signal slowly PD#168494: hdmirx: optimize for devices which send signal slowly 1.avoid rapid phy reset interference signal recognition 2.add 3d information parse of edid Change-Id: Iafa38bad6907f287c0e021d5fb32d11e43c489a0 Signed-off-by: Hang Cheng --- .../amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h | 2 +- .../amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c | 427 +++++++++++++++++---- .../amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h | 11 + .../media/vin/tvin/hdmirx/hdmi_rx_wrapper.c | 2 +- 4 files changed, 366 insertions(+), 76 deletions(-) diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h index ec16d84..791e483 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h @@ -34,7 +34,7 @@ #include "hdmi_rx_edid.h" -#define RX_VER0 "ver.2018-06-13" +#define RX_VER0 "ver.2018/06/21" /* * * diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c index 367b9d6..fe7cf77 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c @@ -353,6 +353,51 @@ const char *hdmi_fmt[] = { "HDMI_RESERVED", }; +const char *_3d_structure[] = { + /* hdmi1.4 spec, Table H-7 */ + /* value: 0x0000 */ + "Frame packing", + "Field alternative", + "Line alternative", + "Side-by-Side(Full)", + "L + depth", + "L + depth + graphics + graphics-depth", + "Top-and-Bottom", + /* value 0x0111: Reserved for future use */ + "Resvrd", + /* value 0x1000 */ + "Side-by-Side(Half) with horizontal sub-sampling", + /* value 0x1001-0x1110:Reserved for future use */ + "Resvrd", + "Resvrd", + "Resvrd", + "Resvrd", + "Resvrd", + "Resvrd", + "Side-by-Side(Half) with all quincunx sub-sampling", +}; + +const char *_3d_detail_x[] = { + /* hdmi1.4 spec, Table H-8 */ + /* value: 0x0000 */ + "All horizontal sub-sampling and quincunx matrix", + "Horizontal sub-sampling", + "Not_in_Use1", + "Not_in_Use2", + "Not_in_Use3", + "Not_in_Use4", + "All_Quincunx", + "ODD_left_ODD_right", + "ODD_left_EVEN_right", + "EVEN_left_ODD_right", + "EVEN_left_EVEN_right", + "Resvrd1", + "Resvrd2", + "Resvrd3", + "Resvrd4", + "Resvrd5", +}; + const char *aud_fmt[] = { "HEADER", "L-PCM", @@ -846,6 +891,28 @@ unsigned int hdmi_rx_top_edid_update(void) return true; } +void rx_edid_print_vic_fmt(unsigned char i, + unsigned char hdmi_vic) +{ + /* CTA-861-G: Table-18 */ + /* SVD = 128, 254, 255 are reserved */ + if ((hdmi_vic >= 1) && (hdmi_vic <= 64)) { + rx_pr("\tSVD#%2d: vic(%3d), format: %s\n", + i+1, hdmi_vic, hdmi_fmt[hdmi_vic]); + } else if ((hdmi_vic >= 65) && (hdmi_vic <= 107)) { + /* from first new set */ + rx_pr("\tSVD#%2d: vic(%3d), format: %s\n", + i+1, hdmi_vic, hdmi_fmt[hdmi_vic]); + } else if ((hdmi_vic >= 108) && (hdmi_vic <= 127)) { + /* from first new set: 8bit VIC */ + } else if ((hdmi_vic >= 129) && (hdmi_vic <= 192)) { + hdmi_vic &= 0x7F; + rx_pr("\tSVD#%2d: vic(%3d), native format: %s\n", + i+1, hdmi_vic, hdmi_fmt[hdmi_vic]); + } else if ((hdmi_vic >= 193) && (hdmi_vic <= 253)) { + /* from second new set: 8bit VIC */ + } +} /* edid header of base block * offset 0x00 ~ 0x07 @@ -980,11 +1047,11 @@ static void get_edid_established_timings(unsigned char *buff, rx_pr("established timing:\n"); /* each bit for an established timing */ if (buff[start] & (1 << 5)) - rx_pr("640*480p60hz is supported\n"); + rx_pr("\t640*480p60hz\n"); if (buff[start] & (1 << 0)) - rx_pr("800*600p60hz is supported\n"); + rx_pr("\t800*600p60hz\n"); if (buff[start+1] & (1 << 3)) - rx_pr("1024*768p60hz is supported\n"); + rx_pr("\t1024*768p60hz\n"); } /* Standard timings are those either recognized by VESA @@ -1019,7 +1086,7 @@ static void get_edid_standard_timing(unsigned char *buff, unsigned char start, vactive_pixel = hactive_pixel*asp_ratio[img_aspect_ratio]/80; refresh_rate = (int)(buff[start+i+1] & 0x3F) + 60; - rx_pr("%d*%dP%dHz\n", hactive_pixel, + rx_pr("\t%d*%dP%dHz\n", hactive_pixel, vactive_pixel, refresh_rate); } } @@ -1317,8 +1384,14 @@ static void get_edid_vsdb(unsigned char *buff, unsigned char start, unsigned char _3d_present_offset; unsigned char hdmi_vic_len; unsigned char hdmi_vic_offset; - unsigned char i; + unsigned char i, j; unsigned int ieee_oui; + unsigned char _3d_struct_all_offset; + unsigned char hdmi_3d_len; + unsigned char _3d_struct; + unsigned char _2d_vic_order_offset; + unsigned char temp_3d_len; + /* basic 5 bytes; others: extension fields */ if (len < 5) { rx_pr("invalid VSDB length: %d!\n", len); @@ -1404,6 +1477,10 @@ static void get_edid_vsdb(unsigned char *buff, unsigned char start, if (edid_info->vsdb.hdmi_video_present) { /* if hdmi video present, * 2 additonal bytes at least will present + * 1 byte containing the 3D_present flag and other flags + * 1 byte with length fields HDMI_VIC_LEN and HDMI_3D_LEN + * 0 or more bytes for info about HDMI_VIC formats supported + * 0 or more bytes for info about 3D formats supported */ if (len < _3d_present_offset + 2) { rx_pr("invalid vsdb length for hdmi video: %d\n", len); @@ -1422,10 +1499,16 @@ static void get_edid_vsdb(unsigned char *buff, unsigned char start, /* parse 4k2k video format, 4 4k2k format maximum*/ hdmi_vic_offset = _3d_present_offset + 2; hdmi_vic_len = edid_info->vsdb.hdmi_vic_len; - if ((hdmi_vic_len > 4) || (hdmi_vic_len == 0)) { + if (hdmi_vic_len > 4) { rx_pr("invalid hdmi vic len: %d\n", edid_info->vsdb.hdmi_vic_len); + return; } else { + /* HDMI_VIC_LEN may be 0 */ + if (len < hdmi_vic_offset + hdmi_vic_len) { + rx_pr("invalid length for 4k2k: %d\n", len); + return; + } for (i = 0; i < hdmi_vic_len; i++) { if (buff[start+hdmi_vic_offset+i] == 1) edid_info->vsdb.hdmi_4k2k_30hz_sup = 1; @@ -1437,7 +1520,82 @@ static void get_edid_vsdb(unsigned char *buff, unsigned char start, edid_info->vsdb.hdmi_smpte_sup = 1; } } - /* 3D:todo */ + + /* 3D info parse */ + _3d_struct_all_offset = + hdmi_vic_offset + hdmi_vic_len; + hdmi_3d_len = edid_info->vsdb.hdmi_3d_len; + /* there may be additional 0 present after 3D info */ + if (len < _3d_struct_all_offset + hdmi_3d_len) { + rx_pr("invalid vsdb length for 3d: %d\n", len); + return; + } + /* 3d_multi_present: hdmi1.4 spec page155: + * 0: neither structure or mask present, + * 1: only 3D_Structure_ALL_15¡­0 is present + * and assigns 3D formats to all of the + * VICs listed in the first 16 entries + * in the EDID + * 2: 3D_Structure_ALL_15¡­0 and 3D_MASK_15¡­0 + * are present and assign 3D formats to + * some of the VICs listed in the first + * 16 entries in the EDID. + * 3: neither structure or mask present, + * Reserved for future use. + */ + if (edid_info->vsdb._3d_multi_present == 1) { + edid_info->vsdb._3d_struct_all = + (buff[start+_3d_struct_all_offset] << 8) + + buff[start+_3d_struct_all_offset+1]; + _2d_vic_order_offset = + _3d_struct_all_offset + 2; + temp_3d_len = 2; + } else if (edid_info->vsdb._3d_multi_present == 2) { + edid_info->vsdb._3d_struct_all = + (buff[start+_3d_struct_all_offset] << 8) + + buff[start+_3d_struct_all_offset+1]; + edid_info->vsdb._3d_mask_15_0 = + (buff[start+_3d_struct_all_offset+2] << 8) + + buff[start+_3d_struct_all_offset+3]; + _2d_vic_order_offset = + _3d_struct_all_offset + 4; + temp_3d_len = 4; + } else { + _2d_vic_order_offset = + _3d_struct_all_offset; + temp_3d_len = 0; + } + i = _2d_vic_order_offset; + for (j = 0; (temp_3d_len < hdmi_3d_len) + && (j < 16); j++) { + edid_info->vsdb._2d_vic[j]._2d_vic_order = + (buff[start+i] >> 4) & 0xF; + edid_info->vsdb._2d_vic[j]._3d_struct = + buff[start+i] & 0xF; + _3d_struct = + edid_info->vsdb._2d_vic[j]._3d_struct; + /* hdmi1.4 spec page156 + * if 3D_Structure_X is 0000~0111, + * 3D_Detail_X shall not be present, + * otherwise shall be present + */ + if ((_3d_struct >= 0x8) && + (_3d_struct <= 0xF)) { + edid_info->vsdb._2d_vic[j]._3d_detail = + (buff[start+i+1] >> 4) & 0xF; + i += 2; + temp_3d_len += 2; + if (temp_3d_len > hdmi_3d_len) { + rx_pr("invalid len for 3d_detail: %d\n", + len); + break; + } + } else { + i++; + temp_3d_len++; + } + } + edid_info->vsdb._2d_vic_num = j; return; } hf_vsdb: @@ -1769,10 +1927,14 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) unsigned char hdmi_vic; enum edid_audio_format_e fmt; union bit_rate_u *bit_rate; + unsigned char svd_num; + unsigned char _2d_vic_order; + unsigned char _3d_struct; + unsigned char _3d_detail; if (!edid_info) return; - rx_pr("----EDID Basic Block----\n"); + rx_pr("****EDID Basic Block****\n"); rx_pr("manufacturer_name: %s\n", edid_info->manufacturer_name); rx_pr("product code: 0x%04x\n", edid_info->product_code); rx_pr("serial_number: 0x%08x\n", edid_info->serial_number); @@ -1788,37 +1950,22 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) rx_pr("extension_flag: %d\n", edid_info->extension_flag); rx_pr("block0_chk_sum: 0x%x\n", edid_info->block0_chk_sum); - rx_pr("----CEA block header----\n"); + rx_pr("****CEA block header****\n"); rx_pr("underscan_sup: %d\n", edid_info->underscan_sup); rx_pr("basic_aud_sup: %d\n", edid_info->basic_aud_sup); rx_pr("ycc444_sup: %d\n", edid_info->ycc444_sup); rx_pr("ycc422_sup: %d\n", edid_info->ycc422_sup); rx_pr("native_dtd_num: %d\n", edid_info->native_dtd_num); - rx_pr("----Video Data Block----\n"); + rx_pr("****Video Data Block****\n"); rx_pr("support SVD list:\n"); + svd_num = edid_info->video_db.svd_num; for (i = 0; i < edid_info->video_db.svd_num; i++) { hdmi_vic = edid_info->video_db.hdmi_vic[i]; - /* SVD = 128, 254, 255 are reserved*/ - if ((hdmi_vic >= 1) && (hdmi_vic <= 64)) { - rx_pr("vic: %3d, format: %s\n", - hdmi_vic, hdmi_fmt[hdmi_vic]); - } else if ((hdmi_vic >= 65) && (hdmi_vic <= 107)) { - /* from first new set */ - rx_pr("vic: %3d, format: %s\n", - hdmi_vic, hdmi_fmt[hdmi_vic]); - } else if ((hdmi_vic >= 108) && (hdmi_vic <= 127)) { - /* from first new set: 8bit VIC */ - } else if ((hdmi_vic >= 129) && (hdmi_vic <= 192)) { - hdmi_vic &= 0x7F; - rx_pr("vic: %3d, native format: %s\n", - hdmi_vic, hdmi_fmt[hdmi_vic]); - } else if ((hdmi_vic >= 193) && (hdmi_vic <= 253)) { - /* from second new set */ - } + rx_edid_print_vic_fmt(i, hdmi_vic); } - rx_pr("----Audio Data Block----\n"); + rx_pr("****Audio Data Block****\n"); for (fmt = AUDIO_FORMAT_LPCM; fmt <= AUDIO_FORMAT_WMAPRO; fmt++) { if (edid_info->audio_db.aud_fmt_sup[fmt]) { rx_pr("audio fmt: %s\n", aud_fmt[fmt]); @@ -1849,16 +1996,16 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) rx_pr("\t24bit\n"); } else if ((fmt >= AUDIO_FORMAT_AC3) && (fmt <= AUDIO_FORMAT_ATRAC)) { - rx_pr("max bit rate: %dkHz\n", + rx_pr("\tmax bit rate: %dkHz\n", bit_rate->others*8); } else { - rx_pr("format dependent value: 0x%x\n", + rx_pr("\tformat dependent value: 0x%x\n", bit_rate->others); } } } - rx_pr("----Speaker Allocation Data Block----\n"); + rx_pr("****Speaker Allocation Data Block****\n"); if (edid_info->speaker_alloc.flw_frw) rx_pr("FLW/FRW\n"); if (edid_info->speaker_alloc.rlc_rrc) @@ -1882,7 +2029,7 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) if (edid_info->speaker_alloc.flh_frh) rx_pr("FLH_FRH\n"); - rx_pr("----Vender Specific Data Block----\n"); + rx_pr("****Vender Specific Data Block****\n"); rx_pr("IEEE OUI: %06X\n", edid_info->vsdb.ieee_oui); rx_pr("phy addr: %d.%d.%d.%d\n", @@ -1904,25 +2051,102 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) edid_info->vsdb.max_tmds_clk*5); rx_pr("hdmi_video_present: %d\n", edid_info->vsdb.hdmi_video_present); - rx_pr("cnc3=%d,cnc2=%d,cnc1=%d,cnc0=%d\n", - edid_info->vsdb.cnc3, - edid_info->vsdb.cnc2, - edid_info->vsdb.cnc1, - edid_info->vsdb.cnc0); - rx_pr("supproted hdmi vic:\n"); + rx_pr("Content types:\n"); + if (edid_info->vsdb.cnc3) + rx_pr("\tcnc3: Game\n"); + if (edid_info->vsdb.cnc2) + rx_pr("\tcnc2: Cinema\n"); + if (edid_info->vsdb.cnc1) + rx_pr("\tcnc1: Photo\n"); + if (edid_info->vsdb.cnc0) + rx_pr("\tcnc0: Grahpics(text)\n"); + + if (edid_info->vsdb.hdmi_vic_len > 0) + rx_pr("Supproted 4k2k format:\n"); if (edid_info->vsdb.hdmi_4k2k_30hz_sup) - rx_pr("hdmi vic1: 4k30hz\n"); + rx_pr("\thdmi vic1: 4k30hz\n"); if (edid_info->vsdb.hdmi_4k2k_25hz_sup) - rx_pr("hdmi vic2: 4k25hz\n"); + rx_pr("\thdmi vic2: 4k25hz\n"); if (edid_info->vsdb.hdmi_4k2k_24hz_sup) - rx_pr("hdmi vic3: 4k24hz\n"); + rx_pr("\thdmi vic3: 4k24hz\n"); if (edid_info->vsdb.hdmi_smpte_sup) - rx_pr("hdmi vic4: smpte\n"); - rx_pr("3D present: %d\n", - edid_info->vsdb._3d_present); + rx_pr("\thdmi vic4: smpte\n"); + /* Mandatory 3D format: HDMI1.4 spec page157 */ + if (edid_info->vsdb._3d_present) { + rx_pr("Basic(Mandatory) 3D formats supported\n"); + rx_pr("Image Size:\n"); + switch (edid_info->vsdb.image_size) { + case 0: + rx_pr("\tNo additional information\n"); + break; + case 1: + rx_pr("\tOnly indicate correct aspect ratio\n"); + break; + case 2: + rx_pr("\tCorrect size: Accurate to 1(cm)\n"); + break; + case 3: + rx_pr("\tCorrect size: multiply by 5(cm)\n"); + break; + default: + break; + } + } else + rx_pr("No 3D support\n"); + if (edid_info->vsdb._3d_multi_present == 1) { + /* For each bit in _3d_struct which is set (=1), + * Sink supports the corresponding 3D_Structure + * for all of the VICs listed in the first 16 + * entries in the EDID. + */ + rx_pr("General 3D format, on the first 16 SVDs:\n"); + for (i = 0; i < 16; i++) { + if ((edid_info->vsdb._3d_struct_all >> i) & 0x1) + rx_pr("\t%s\n", _3d_structure[i]); + } + } else if (edid_info->vsdb._3d_multi_present == 2) { + /* Where a bit is set (=1), for the corresponding + * VIC within the first 16 entries in the EDID, + * the Sink indicates 3D support as designate + * by the 3D_Structure_ALL_15¡­0 field. + */ + rx_pr("General 3D format, on the SVDs below:\n"); + for (i = 0; i < 16; i++) { + if ((edid_info->vsdb._3d_struct_all >> i) & 0x1) + rx_pr("\t%s\n", _3d_structure[i]); + } + rx_pr("For SVDs:\n"); + for (i = 0; (i < svd_num) && (i < 16); i++) { + hdmi_vic = edid_info->video_db.hdmi_vic[i]; + if ((edid_info->vsdb._3d_mask_15_0 >> i) & 0x1) + rx_edid_print_vic_fmt(i, hdmi_vic); + } + } + + if (edid_info->vsdb._2d_vic_num > 0) + rx_pr("Specific VIC 3D information:\n"); + for (i = 0; (i < edid_info->vsdb._2d_vic_num) + && (i < svd_num) && (i < 16); i++) { + _2d_vic_order = + edid_info->vsdb._2d_vic[i]._2d_vic_order; + _3d_struct = + edid_info->vsdb._2d_vic[i]._3d_struct; + hdmi_vic = + edid_info->video_db.hdmi_vic[_2d_vic_order]; + rx_edid_print_vic_fmt(_2d_vic_order, hdmi_vic); + rx_pr("\t\t3d format: %s\n", + _3d_structure[_3d_struct]); + if ((_3d_struct >= 0x8) && + (_3d_struct <= 0xF)) { + _3d_detail = + edid_info->vsdb._2d_vic[i]._3d_detail; + rx_pr("\t\t3d_detail: %s\n", + _3d_detail_x[_3d_detail]); + } + } if (edid_info->contain_hf_vsdb) { - rx_pr("----HF-VSDB----\n"); + rx_pr("****HF-VSDB****\n"); rx_pr("IEEE OUI: %06X\n", edid_info->hf_vsdb.ieee_oui); rx_pr("hf-vsdb version: %d\n", @@ -1951,18 +2175,74 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) } if (edid_info->contain_vcdb) { - rx_pr("----Video Cap Data Block----\n"); - rx_pr("quant_range selectable ycc:%d, rgb:%d\n", - edid_info->vcdb.quanti_range_ycc, - edid_info->vcdb.quanti_range_rgb); - rx_pr("scan mode for PT:%d, IT:%d, CE:%d\n", - edid_info->vcdb.s_PT, - edid_info->vcdb.s_IT, - edid_info->vcdb.s_CE); + rx_pr("****Video Cap Data Block****\n"); + rx_pr("YCC Quant Range:\n"); + if (edid_info->vcdb.quanti_range_ycc) + rx_pr("\tSelectable(via AVI YQ)\n"); + else + rx_pr("\tNo Data\n"); + + rx_pr("RGB Quant Range:\n"); + if (edid_info->vcdb.quanti_range_rgb) + rx_pr("\tSelectable(via AVI Q)\n"); + else + rx_pr("\tNo Data\n"); + + rx_pr("PT Scan behavior:\n"); + switch (edid_info->vcdb.s_PT) { + case 0: + rx_pr("\trefer to CE/IT fields\n"); + break; + case 1: + rx_pr("\tAlways Overscanned\n"); + break; + case 2: + rx_pr("\tAlways Underscanned\n"); + break; + case 3: + rx_pr("\tSupport both over and underscan\n"); + break; + default: + break; + } + rx_pr("IT Scan behavior:\n"); + switch (edid_info->vcdb.s_IT) { + case 0: + rx_pr("\tIT video format not support\n"); + break; + case 1: + rx_pr("\tAlways Overscanned\n"); + break; + case 2: + rx_pr("\tAlways Underscanned\n"); + break; + case 3: + rx_pr("\tSupport both over and underscan\n"); + break; + default: + break; + } + rx_pr("CE Scan behavior:\n"); + switch (edid_info->vcdb.s_CE) { + case 0: + rx_pr("\tCE video format not support\n"); + break; + case 1: + rx_pr("\tAlways Overscanned\n"); + break; + case 2: + rx_pr("\tAlways Underscanned\n"); + break; + case 3: + rx_pr("\tSupport both over and underscan\n"); + break; + default: + break; + } } if (edid_info->contain_vsvdb) { - rx_pr("----VSVDB(dolby vision)----\n"); + rx_pr("****VSVDB(dolby vision)****\n"); rx_pr("IEEE_OUI: %06X\n", edid_info->dv_vsvdb.ieee_oui); rx_pr("vsvdb version: %d\n", @@ -2001,38 +2281,38 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) } if (edid_info->contain_cdb) { - rx_pr("----Colorimetry Data Block----\n"); + rx_pr("****Colorimetry Data Block****\n"); rx_pr("supported colorimetry:\n"); if (edid_info->color_db.BT2020_RGB) - rx_pr("BT2020_RGB\n"); + rx_pr("\tBT2020_RGB\n"); if (edid_info->color_db.BT2020_YCC) - rx_pr("BT2020_YCC\n"); + rx_pr("\tBT2020_YCC\n"); if (edid_info->color_db.BT2020_cYCC) - rx_pr("BT2020_cYCC\n"); + rx_pr("\tBT2020_cYCC\n"); if (edid_info->color_db.Adobe_RGB) - rx_pr("Adobe_RGB\n"); + rx_pr("\tAdobe_RGB\n"); if (edid_info->color_db.Adobe_YCC601) - rx_pr("Adobe_YCC601\n"); + rx_pr("\tAdobe_YCC601\n"); if (edid_info->color_db.sYCC601) - rx_pr("sYCC601\n"); + rx_pr("\tsYCC601\n"); if (edid_info->color_db.xvYCC709) - rx_pr("xvYCC709\n"); + rx_pr("\txvYCC709\n"); if (edid_info->color_db.xvYCC601) - rx_pr("xvYCC601\n"); + rx_pr("\txvYCC601\n"); rx_pr("supported colorimetry metadata:\n"); if (edid_info->color_db.MD3) - rx_pr("MD3\n"); + rx_pr("\tMD3\n"); if (edid_info->color_db.MD2) - rx_pr("MD2\n"); + rx_pr("\tMD2\n"); if (edid_info->color_db.MD1) - rx_pr("MD1\n"); + rx_pr("\tMD1\n"); if (edid_info->color_db.MD0) - rx_pr("MD0\n"); + rx_pr("\tMD0\n"); } if (edid_info->contain_hdr_db) { - rx_pr("----HDR Static Metadata Data Block----\n"); + rx_pr("****HDR Static Metadata Data Block****\n"); rx_pr("eotf_hlg: %d\n", edid_info->hdr_db.eotf_hlg); rx_pr("eotf_smpte_st_2084: %d\n", @@ -2046,22 +2326,21 @@ void rx_edid_parse_print(struct edid_info_s *edid_info) } if (edid_info->contain_y420_vdb) { - rx_pr("----Y420 Video Data Block----\n"); + rx_pr("****Y420 Video Data Block****\n"); for (i = 0; i < edid_info->y420_vic_len; i++) - rx_pr("y420 vic: %3d\n", - edid_info->y420_vdb_vic[i]); + rx_edid_print_vic_fmt(i, + edid_info->y420_vdb_vic[i]); } if (edid_info->contain_y420_cmdb) { - rx_pr("----Yc420 capability map----\n"); + rx_pr("****Yc420 capability map****\n"); if (edid_info->y420_all_vic) rx_pr("all vic support y420\n"); else { for (i = 0; i < 31; i++) { hdmi_vic = edid_info->y420_cmdb_vic[i]; if (hdmi_vic) { - rx_pr("y420cmdb vic:%3d, format: %s\n", - hdmi_vic, hdmi_fmt[hdmi_vic]); + rx_edid_print_vic_fmt(i, hdmi_vic); } } } diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h index 8725470..3160a2c 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h @@ -167,6 +167,13 @@ struct speaker_alloc_db_s { unsigned char resvd2; }; +struct specific_vic_3d { + unsigned char _2d_vic_order:4; + unsigned char _3d_struct:4; + unsigned char _3d_detail:4; + unsigned char resvrd:4; +}; + struct vsdb_s { unsigned int ieee_oui; /* phy addr 2 bytes */ @@ -226,6 +233,10 @@ struct vsdb_s { unsigned char hdmi_smpte_sup; /*3D*/ + uint16_t _3d_struct_all; + uint16_t _3d_mask_15_0; + struct specific_vic_3d _2d_vic[16]; + unsigned char _2d_vic_num; }; struct hf_vsdb_s { diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c index 8633360..c6bf35d 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c @@ -111,7 +111,7 @@ int log_level = LOG_EN;/*| HDCP_LOG;*/ static bool auto_switch_off; /* only for hardware test */ int clk_unstable_cnt; -static int clk_unstable_max = 100; +static int clk_unstable_max = 200; int clk_stable_cnt; static int clk_stable_max = 3; -- 2.7.4