From 27ceb5fe974bc4a5b9d7298248eba396eb54334b Mon Sep 17 00:00:00 2001 From: Hang Cheng Date: Wed, 9 May 2018 19:54:15 +0800 Subject: [PATCH] hdmirx: optimize timing format detection PD#164010: hdmirx: optimize timing format detection Change-Id: Ibf868664d4fda5fa21d4e80cfcc6575b25acd500 Signed-off-by: Hang Cheng --- .../media/vin/tvin/hdmirx/hdmi_rx_drv.h | 8 +- .../media/vin/tvin/hdmirx/hdmi_rx_edid.h | 240 +++++++++++------ .../media/vin/tvin/hdmirx/hdmi_rx_wrapper.c | 251 ++++++++++++++---- .../media/vin/tvin/hdmirx/hdmi_rx_wrapper.h | 59 +--- 4 files changed, 363 insertions(+), 195 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 1c95c140f175..00813f78adff 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h @@ -31,7 +31,7 @@ #include "../tvin_frontend.h" //#include "hdmirx_repeater.h" //#include "hdmi_rx_pktinfo.h" -//#include "hdmi_rx_edid.h" +#include "hdmi_rx_edid.h" #define RX_VER0 "ver.2018-05-17" @@ -41,7 +41,7 @@ * * */ -#define RX_VER1 "ver.2018/05/10" +#define RX_VER1 "ver.2018/05/11" @@ -214,11 +214,11 @@ struct rx_video_info { /** AVI Y1-0, video format */ uint8_t colorspace; /** AVI VIC6-0, video identification code */ - uint8_t hw_vic; + enum hdmi_vic_e hw_vic; /** AVI PR3-0, pixel repetition factor */ uint8_t repeat; /* for sw info */ - uint8_t sw_vic; + enum hdmi_vic_e sw_vic; uint8_t sw_dvi; unsigned int it_content; /** AVI Q1-0, RGB quantization range */ 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 104dc79dd83c..8725470389d6 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h @@ -14,6 +14,8 @@ * more details. * */ +#ifndef _HDMI_RX_EDID_H_ +#define _HDMI_RX_EDID_H_ #define EDID_SIZE 256 #define EDID_HDR_SIZE 7 @@ -47,6 +49,9 @@ #define VSADB_TAG 17 /* Vendor-Specific Audio Data Block */ /* extend tag code 18~31: Reserved */ #define IFDB_TAG 32 /* infoframe data block */ +#define HDMI_VIC420_OFFSET 0x100 +#define HDMI_3D_OFFSET 0x180 +#define HDMI_VESA_OFFSET 0x200 enum edid_audio_format_e { @@ -419,86 +424,94 @@ struct edid_data_s { enum hdmi_vic_e { /* Refer to CEA 861-D */ - HDMI_Unknown = 0, - HDMI_640x480p60_4x3 = 1, - HDMI_720x480p60_4x3 = 2, - HDMI_720x480p60_16x9 = 3, - HDMI_1280x720p60_16x9 = 4, - HDMI_1920x1080i60_16x9 = 5, - HDMI_720x480i60_4x3 = 6, - HDMI_720x480i60_16x9 = 7, - HDMI_720x240p60_4x3 = 8, - HDMI_720x240p60_16x9 = 9, - HDMI_2880x480i60_4x3 = 10, + HDMI_UNKNOWN = 0, + HDMI_640x480p60 = 1, + /* for video format which have two different + * aspect ratios, VICs list below that don't + * indicate aspect ratio, its aspect ratio + * is default. e.g: + * HDMI_480p60, means 480p60_4x3 + * HDMI_720p60, means 720p60_16x9 + * HDMI_1080p50, means 1080p50_16x9 + */ + HDMI_480p60 = 2, + HDMI_480p60_16x9 = 3, + HDMI_720p60 = 4, + HDMI_1080i60 = 5, + HDMI_480i60 = 6, + HDMI_480i60_16x9 = 7, + HDMI_1440x240p60 = 8, + HDMI_1440x240p60_16x9 = 9, + HDMI_2880x480i60 = 10, HDMI_2880x480i60_16x9 = 11, - HDMI_2880x240p60_4x3 = 12, + HDMI_2880x240p60 = 12, HDMI_2880x240p60_16x9 = 13, - HDMI_1440x480p60_4x3 = 14, + HDMI_1440x480p60 = 14, HDMI_1440x480p60_16x9 = 15, - HDMI_1920x1080p60_16x9 = 16, - HDMI_720x576p50_4x3 = 17, - HDMI_720x576p50_16x9 = 18, - HDMI_1280x720p50_16x9 = 19, - HDMI_1920x1080i50_16x9 = 20, - HDMI_720x576i50_4x3 = 21, - HDMI_720x576i50_16x9 = 22, - HDMI_720x288p_4x3 = 23, - HDMI_720x288p_16x9 = 24, - HDMI_2880x576i50_4x3 = 25, + HDMI_1080p60 = 16, + HDMI_576p50 = 17, + HDMI_576p50_16x9 = 18, + HDMI_720p50 = 19, + HDMI_1080i50 = 20, + HDMI_576i50 = 21, + HDMI_576i50_16x9 = 22, + HDMI_1440x288p50 = 23, + HDMI_1440x288p50_16x9 = 24, + HDMI_2880x576i50 = 25, HDMI_2880x576i50_16x9 = 26, - HDMI_2880x288p50_4x3 = 27, + HDMI_2880x288p50 = 27, HDMI_2880x288p50_16x9 = 28, - HDMI_1440x576p_4x3 = 29, - HDMI_1440x576p_16x9 = 30, - HDMI_1920x1080p50_16x9 = 31, - HDMI_1920x1080p24_16x9 = 32, - HDMI_1920x1080p25_16x9 = 33, - HDMI_1920x1080p30_16x9 = 34, - HDMI_2880x480p60_4x3 = 35, + HDMI_1440x576p50 = 29, + HDMI_1440x576p50_16x9 = 30, + HDMI_1080p50 = 31, + HDMI_1080p24 = 32, + HDMI_1080p25 = 33, + HDMI_1080p30 = 34, + HDMI_2880x480p60 = 35, HDMI_2880x480p60_16x9 = 36, - HDMI_2880x576p50_4x3 = 37, + HDMI_2880x576p50 = 37, HDMI_2880x576p50_16x9 = 38, - HDMI_1920x1080i_t1250_50_16x9 = 39, - HDMI_1920x1080i100_16x9 = 40, - HDMI_1280x720p100_16x9 = 41, - HDMI_720x576p100_4x3 = 42, - HDMI_720x576p100_16x9 = 43, - HDMI_720x576i100_4x3 = 44, - HDMI_720x576i100_16x9 = 45, - HDMI_1920x1080i120_16x9 = 46, - HDMI_1280x720p120_16x9 = 47, - HDMI_720x480p120_4x3 = 48, - HDMI_720x480p120_16x9 = 49, - HDMI_720x480i120_4x3 = 50, - HDMI_720x480i120_16x9 = 51, - HDMI_720x576p200_4x3 = 52, - HDMI_720x576p200_16x9 = 53, - HDMI_720x576i200_4x3 = 54, - HDMI_720x576i200_16x9 = 55, - HDMI_720x480p240_4x3 = 56, - HDMI_720x480p240_16x9 = 57, - HDMI_720x480i240_4x3 = 58, - HDMI_720x480i240_16x9 = 59, + HDMI_1080i50_1250 = 39, + HDMI_1080i100 = 40, + HDMI_720p100 = 41, + HDMI_576p100 = 42, + HDMI_576p100_16x9 = 43, + HDMI_576i100 = 44, + HDMI_576i100_16x9 = 45, + HDMI_1080i120 = 46, + HDMI_720p120 = 47, + HDMI_480p120 = 48, + HDMI_480p120_16x9 = 49, + HDMI_480i120 = 50, + HDMI_480i120_16x9 = 51, + HDMI_576p200 = 52, + HDMI_576p200_16x9 = 53, + HDMI_576i200 = 54, + HDMI_576i200_16x9 = 55, + HDMI_480p240 = 56, + HDMI_480p240_16x9 = 57, + HDMI_480i240 = 58, + HDMI_480i240_16x9 = 59, /* Refet to CEA 861-F */ - HDMI_1280x720p24_16x9 = 60, - HDMI_1280x720p25_16x9 = 61, - HDMI_1280x720p30_16x9 = 62, - HDMI_1920x1080p120_16x9 = 63, - HDMI_1920x1080p100_16x9 = 64, - HDMI_1280x720p24_64x27 = 65, - HDMI_1280x720p25_64x27 = 66, - HDMI_1280x720p30_64x27 = 67, - HDMI_1280x720p50_64x27 = 68, - HDMI_1280x720p60_64x27 = 69, - HDMI_1280x720p100_64x27 = 70, - HDMI_1280x720p120_64x27 = 71, - HDMI_1920x1080p24_64x27 = 72, - HDMI_1920x1080p25_64x27 = 73, - HDMI_1920x1080p30_64x27 = 74, - HDMI_1920x1080p50_64x27 = 75, - HDMI_1920x1080p60_64x27 = 76, - HDMI_1920x1080p100_64x27 = 77, - HDMI_1920x1080p120_64x27 = 78, + HDMI_720p24 = 60, + HDMI_720p25 = 61, + HDMI_720p30 = 62, + HDMI_1080p120 = 63, + HDMI_1080p100 = 64, + HDMI_720p24_64x27 = 65, + HDMI_720p25_64x27 = 66, + HDMI_720p30_64x27 = 67, + HDMI_720p50_64x27 = 68, + HDMI_720p60_64x27 = 69, + HDMI_720p100_64x27 = 70, + HDMI_720p120_64x27 = 71, + HDMI_1080p24_64x27 = 72, + HDMI_1080p25_64x27 = 73, + HDMI_1080p30_64x27 = 74, + HDMI_1080p50_64x27 = 75, + HDMI_1080p60_64x27 = 76, + HDMI_1080p100_64x27 = 77, + HDMI_1080p120_64x27 = 78, HDMI_1680x720p24_64x27 = 79, HDMI_1680x720p25_64x27 = 80, HDMI_1680x720p30_64x27 = 81, @@ -513,23 +526,75 @@ enum hdmi_vic_e { HDMI_2560x1080p60_64x27 = 90, HDMI_2560x1080p100_64x27 = 91, HDMI_2560x1080p120_64x27 = 92, - HDMI_3840x2160p24_16x9 = 93, - HDMI_3840x2160p25_16x9 = 94, - HDMI_3840x2160p30_16x9 = 95, - HDMI_3840x2160p50_16x9 = 96, - HDMI_3840x2160p60_16x9 = 97, - HDMI_4096x2160p24_256x135 = 98, - HDMI_4096x2160p25_256x135 = 99, - HDMI_4096x2160p30_256x135 = 100, - HDMI_4096x2160p50_256x135 = 101, - HDMI_4096x2160p60_256x135 = 102, - HDMI_3840x2160p24_64x27 = 103, - HDMI_3840x2160p25_64x27 = 104, - HDMI_3840x2160p30_64x27 = 105, - HDMI_3840x2160p50_64x27 = 106, - HDMI_3840x2160p60_64x27 = 107, + /* 3840*2160 */ + HDMI_2160p24_16x9 = 93, + HDMI_2160p25_16x9 = 94, + HDMI_2160p30_16x9 = 95, + HDMI_2160p50_16x9 = 96, + HDMI_2160p60_16x9 = 97, + /* 4096*2160 */ + HDMI_4096p24_256x135 = 98, + HDMI_4096p25_256x135 = 99, + HDMI_4096p30_256x135 = 100, + HDMI_4096p50_256x135 = 101, + HDMI_4096p60_256x135 = 102, + /* 3840*2160 */ + HDMI_2160p24_64x27 = 103, + HDMI_2160p25_64x27 = 104, + HDMI_2160p30_64x27 = 105, + HDMI_2160p50_64x27 = 106, + HDMI_2160p60_64x27 = 107, HDMI_RESERVED = 108, /* VIC 108~255: Reserved for the Future */ + + /* the following VICs are for y420 mode, + * they are fake VICs that used to diff + * from non-y420 mode, and have same VIC + * with normal VIC in the lower bytes. + */ + HDMI_VIC_Y420 = HDMI_VIC420_OFFSET, + HDMI_2160p50_16x9_Y420 = + HDMI_VIC420_OFFSET + HDMI_2160p50_16x9, + HDMI_2160p60_16x9_Y420 = + HDMI_VIC420_OFFSET + HDMI_2160p60_16x9, + HDMI_4096p50_256x135_Y420 = + HDMI_VIC420_OFFSET + HDMI_4096p50_256x135, + HDMI_4096p60_256x135_Y420 = + HDMI_VIC420_OFFSET + HDMI_4096p60_256x135, + HDMI_2160p50_64x27_Y420 = + HDMI_VIC420_OFFSET + HDMI_2160p50_64x27, + HDMI_2160p60_64x27_Y420 = + HDMI_VIC420_OFFSET + HDMI_2160p60_64x27, + HDMI_1080p_420, + HDMI_VIC_Y420_MAX, + + HDMI_VIC_3D = HDMI_3D_OFFSET, + HDMI_480p_FRAMEPACKING, + HDMI_576p_FRAMEPACKING, + HDMI_720p_FRAMEPACKING, + HDMI_1080i_ALTERNATIVE, + HDMI_1080i_FRAMEPACKING, + HDMI_1080p_ALTERNATIVE, + HDMI_1080p_FRAMEPACKING, + + HDMI_800_600 = HDMI_VESA_OFFSET, + HDMI_1024_768, + HDMI_720_400, + HDMI_1280_768, + HDMI_1280_800, + HDMI_1280_960, + HDMI_1280_1024, + HDMI_1360_768, + HDMI_1366_768, + HDMI_1600_900, + HDMI_1600_1200, + HDMI_1920_1200, + HDMI_1440_900, + HDMI_1400_1050, + HDMI_1680_1050, + HDMI_1152_864, + HDMI_2560_1440, + HDMI_UNSUPPORT, }; extern int edid_mode; @@ -545,3 +610,4 @@ unsigned char *rx_get_edid(int edid_index); void edid_parse_block0(uint8_t *p_edid, struct edid_info_s *edid_info); void edid_parse_cea_block(uint8_t *p_edid, struct edid_info_s *edid_info); void rx_edid_parse_print(struct edid_info_s *edid_info); +#endif 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 13db3d6b6cac..e392ec07d942 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c @@ -67,6 +67,9 @@ static int hpd_wait_max = 20; static int sig_unstable_cnt; static int sig_unstable_max = 80; +bool vic_check_en; +bool dvi_check_en; + static int sig_unready_cnt; static int sig_unready_max = 5;/* 10; */ @@ -559,40 +562,44 @@ static unsigned char is_aud_ch_map_change(int pre, int cur) static const struct freq_ref_s freq_ref[] = { /* interlace 420 3d hac vac index */ /* 420mode */ - {0, 3, 0, 1920, 2160, HDMI_3840x2160_420}, - {0, 3, 0, 2048, 2160, HDMI_4096x2160_420}, + {0, 3, 0, 1920, 2160, HDMI_2160p50_16x9_Y420}, + {0, 3, 0, 2048, 2160, HDMI_4096p50_256x135_Y420}, {0, 3, 0, 960, 1080, HDMI_1080p_420}, /* interlace */ - {1, 0, 0, 720, 240, HDMI_720x480i}, - {1, 0, 0, 1440, 240, HDMI_1440x480i}, - {1, 0, 0, 720, 288, HDMI_720x576i}, - {1, 0, 0, 1440, 288, HDMI_1440x576i}, - {1, 0, 0, 1920, 540, HDMI_1080i}, + /* {1, 0, 0, 720, 240, HDMI_720x480i}, */ + {1, 0, 0, 1440, 240, HDMI_480i60}, + /* {1, 0, 0, 720, 288, HDMI_720x576i}, */ + {1, 0, 0, 1440, 288, HDMI_576i50}, + {1, 0, 0, 1920, 540, HDMI_1080i50}, {1, 0, 2, 1920, 1103, HDMI_1080i_ALTERNATIVE}, {1, 0, 1, 1920, 2228, HDMI_1080i_FRAMEPACKING}, - {0, 0, 0, 1440, 240, HDMI_1440x240p}, - {0, 0, 0, 2880, 240, HDMI_2880x240p}, - {0, 0, 0, 1440, 288, HDMI_1440x288p}, - {0, 0, 0, 2880, 288, HDMI_2880x288p}, + {0, 0, 0, 1440, 240, HDMI_1440x240p60}, + {0, 0, 0, 2880, 240, HDMI_2880x240p60}, + {0, 0, 0, 1440, 288, HDMI_1440x288p50}, + {0, 0, 0, 2880, 288, HDMI_2880x288p50}, - {0, 0, 0, 720, 480, HDMI_720x480p}, - {0, 0, 0, 1440, 480, HDMI_1440x480p}, + {0, 0, 0, 720, 480, HDMI_480p60}, + {0, 0, 0, 1440, 480, HDMI_1440x480p60}, {0, 0, 1, 720, 1005, HDMI_480p_FRAMEPACKING}, - {0, 0, 0, 720, 576, HDMI_720x576p}, - {0, 0, 0, 1440, 576, HDMI_1440x576p}, + {0, 0, 0, 720, 576, HDMI_576p50}, + {0, 0, 0, 1440, 576, HDMI_1440x576p50}, {0, 0, 1, 720, 1201, HDMI_576p_FRAMEPACKING}, - {0, 0, 0, 1280, 720, HDMI_720p}, + {0, 0, 0, 1280, 720, HDMI_720p50}, {0, 0, 1, 1280, 1470, HDMI_720p_FRAMEPACKING}, - {0, 0, 0, 1920, 1080, HDMI_1080p}, + {0, 0, 0, 1920, 1080, HDMI_1080p50}, {0, 0, 2, 1920, 2160, HDMI_1080p_ALTERNATIVE}, {0, 0, 1, 1920, 2205, HDMI_1080p_FRAMEPACKING}, + {1, 0, 0, 2880, 240, HDMI_2880x480i60}, + {1, 0, 0, 2880, 288, HDMI_2880x576i50}, + {0, 0, 0, 2880, 480, HDMI_2880x480p60}, + {0, 0, 0, 2880, 576, HDMI_2880x576p50}, /* vesa format*/ - {0, 0, 0, 640, 480, HDMI_640_480}, + {0, 0, 0, 640, 480, HDMI_640x480p60}, {0, 0, 0, 720, 400, HDMI_720_400}, {0, 0, 0, 800, 600, HDMI_800_600}, {0, 0, 0, 1024, 768, HDMI_1024_768}, @@ -610,45 +617,85 @@ static const struct freq_ref_s freq_ref[] = { {0, 0, 0, 1920, 1200, HDMI_1920_1200}, /* 4k2k mode */ - {0, 0, 0, 3840, 2160, HDMI_3840x2160}, - {0, 0, 0, 4096, 2160, HDMI_4096x2160}, + {0, 0, 0, 3840, 2160, HDMI_2160p24_16x9}, + {0, 0, 0, 4096, 2160, HDMI_4096p24_256x135}, {0, 0, 0, 2560, 1440, HDMI_2560_1440}, {0, 0, 1, 2560, 3488, HDMI_2560_1440}, {0, 0, 2, 2560, 2986, HDMI_2560_1440}, /* for AG-506 */ - {0, 0, 0, 720, 483, HDMI_720x480p}, + {0, 0, 0, 720, 483, HDMI_480p60}, {0, 0, 0, 0, 0, HDMI_UNKNOWN} }; +static bool fmt_vic_abnormal(void) +{ + /* if format is unknown or unsupported after + * timing match, but TX send normal VIC, then + * abnormal format is detected. + */ + if (((rx.pre.sw_vic == HDMI_UNKNOWN) || + (rx.pre.sw_vic == HDMI_UNSUPPORT)) && + (rx.pre.hw_vic != HDMI_UNKNOWN)) + return true; + else + return false; +} + enum tvin_sig_fmt_e hdmirx_hw_get_fmt(void) { enum tvin_sig_fmt_e fmt = TVIN_SIG_FMT_NULL; - unsigned int vic = rx.pre.sw_vic; + enum hdmi_vic_e vic = HDMI_UNKNOWN; + if (fmt_vic_abnormal()) + vic = rx.pre.hw_vic; + else + vic = rx.pre.sw_vic; if (force_vic) vic = force_vic; switch (vic) { - case HDMI_640_480: + case HDMI_640x480p60: fmt = TVIN_SIG_FMT_HDMI_640X480P_60HZ; break; - case HDMI_720x480p: + case HDMI_480p60: /*2 */ + case HDMI_480p60_16x9: /*3 */ + case HDMI_480p120: /* 48 */ + case HDMI_480p120_16x9: /* 49 */ + case HDMI_480p240: /* 56 */ + case HDMI_480p240_16x9: /* 57 */ fmt = TVIN_SIG_FMT_HDMI_720X480P_60HZ; break; - case HDMI_1440x480p: + case HDMI_1440x480p60: /* 14 */ + case HDMI_1440x480p60_16x9: /* 15 */ fmt = TVIN_SIG_FMT_HDMI_1440X480P_60HZ; break; case HDMI_480p_FRAMEPACKING: fmt = TVIN_SIG_FMT_HDMI_720X480P_60HZ_FRAME_PACKING; break; - case HDMI_720p: + case HDMI_720p24: /* 60 */ + case HDMI_720p25: /* 61 */ + case HDMI_720p30: /* 62 */ + case HDMI_720p50: /* 19 */ + case HDMI_720p60: /* 4 */ + case HDMI_720p100: /* 41 */ + case HDMI_720p120: /* 47 */ + case HDMI_720p24_64x27: /* 65 */ + case HDMI_720p25_64x27: /* 66 */ + case HDMI_720p30_64x27: /* 67 */ + case HDMI_720p50_64x27: /* 68 */ + case HDMI_720p60_64x27: /* 69 */ + case HDMI_720p100_64x27: /* 70 */ + case HDMI_720p120_64x27: /* 71 */ fmt = TVIN_SIG_FMT_HDMI_1280X720P_60HZ; break; case HDMI_720p_FRAMEPACKING: fmt = TVIN_SIG_FMT_HDMI_1280X720P_60HZ_FRAME_PACKING; break; - case HDMI_1080i: + case HDMI_1080i50: /* 20 */ + case HDMI_1080i100: /* 40 */ + case HDMI_1080i60: /* 5 */ + case HDMI_1080i120: /* 46 */ fmt = TVIN_SIG_FMT_HDMI_1920X1080I_60HZ; break; case HDMI_1080i_FRAMEPACKING: @@ -657,11 +704,28 @@ enum tvin_sig_fmt_e hdmirx_hw_get_fmt(void) case HDMI_1080i_ALTERNATIVE: fmt = TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_ALTERNATIVE; break; - case HDMI_720x480i: - case HDMI_1440x480i: + case HDMI_480i60: /* 6 */ + case HDMI_480i60_16x9: /* 7 */ + case HDMI_480i120: /* 50 */ + case HDMI_480i120_16x9: /* 51 */ + case HDMI_480i240: /* 58 */ + case HDMI_480i240_16x9: /* 59 */ fmt = TVIN_SIG_FMT_HDMI_1440X480I_60HZ; break; - case HDMI_1080p: + case HDMI_1080p24: /* 32 */ + case HDMI_1080p24_64x27: /* 72 */ + case HDMI_1080p25: /* 33 */ + case HDMI_1080p25_64x27: /* 73 */ + case HDMI_1080p30: /* 34 */ + case HDMI_1080p30_64x27: /* 74 */ + case HDMI_1080p50: /* 31 */ + case HDMI_1080p60: /* 16 */ + case HDMI_1080p50_64x27: /* 75 */ + case HDMI_1080p60_64x27: /* 76 */ + case HDMI_1080p100: /* 64 */ + case HDMI_1080p120: /* 63 */ + case HDMI_1080p100_64x27: /* 77 */ + case HDMI_1080p120_64x27: /* 78 */ case HDMI_1080p_420: fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ; break; @@ -671,29 +735,66 @@ enum tvin_sig_fmt_e hdmirx_hw_get_fmt(void) case HDMI_1080p_ALTERNATIVE: fmt = TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_ALTERNATIVE; break; - case HDMI_720x576p: - case HDMI_1440x576p: + case HDMI_576p50: /* 17 */ + case HDMI_576p50_16x9: /* 18 */ + case HDMI_576p100: /* 42 */ + case HDMI_576p100_16x9: /* 43 */ + case HDMI_576p200: /* 52 */ + case HDMI_576p200_16x9: /* 53 */ fmt = TVIN_SIG_FMT_HDMI_720X576P_50HZ; break; + case HDMI_1440x576p50: /* 29 */ + case HDMI_1440x576p50_16x9: /* 30 */ + fmt = TVIN_SIG_FMT_HDMI_1440X576P_50HZ; + break; case HDMI_576p_FRAMEPACKING: fmt = TVIN_SIG_FMT_HDMI_720X576P_50HZ_FRAME_PACKING; break; - case HDMI_720x576i: - case HDMI_1440x576i: + case HDMI_576i50: /* 21 */ + case HDMI_576i50_16x9: /* 22 */ + case HDMI_576i100: /* 44 */ + case HDMI_576i100_16x9: /* 45 */ + case HDMI_576i200: /* 54 */ + case HDMI_576i200_16x9: /* 55 */ fmt = TVIN_SIG_FMT_HDMI_1440X576I_50HZ; break; - case HDMI_1440x240p: + case HDMI_1440x240p60: /* 8 */ + case HDMI_1440x240p60_16x9: /* 9 */ fmt = TVIN_SIG_FMT_HDMI_1440X240P_60HZ; break; - case HDMI_2880x240p: + case HDMI_2880x240p60: /* 12 */ + case HDMI_2880x240p60_16x9: /* 13 */ fmt = TVIN_SIG_FMT_HDMI_2880X240P_60HZ; break; - case HDMI_1440x288p: + case HDMI_1440x288p50: /* 23 */ + case HDMI_1440x288p50_16x9: /* 24 */ fmt = TVIN_SIG_FMT_HDMI_1440X288P_50HZ; break; - case HDMI_2880x288p: + case HDMI_2880x288p50: /* 27 */ + case HDMI_2880x288p50_16x9: /* 28 */ fmt = TVIN_SIG_FMT_HDMI_2880X288P_50HZ; break; + case HDMI_2880x480i60: /* 10 */ + case HDMI_2880x480i60_16x9: /* 11 */ + fmt = TVIN_SIG_FMT_HDMI_2880X480I_60HZ; + break; + case HDMI_2880x576i50: /* 25 */ + case HDMI_2880x576i50_16x9: /* 26 */ + fmt = TVIN_SIG_FMT_HDMI_2880X576I_50HZ; + break; + case HDMI_2880x480p60: /* 35 */ + case HDMI_2880x480p60_16x9: /* 36 */ + fmt = TVIN_SIG_FMT_HDMI_2880X480P_60HZ; + break; + case HDMI_2880x576p50: /* 37 */ + case HDMI_2880x576p50_16x9: /* 38 */ + fmt = TVIN_SIG_FMT_HDMI_2880X576P_50HZ; + break; + case HDMI_1080i50_1250: /* 39 */ + fmt = TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B; + break; + + /* VESA mode*/ case HDMI_800_600: fmt = TVIN_SIG_FMT_HDMI_800X600_00HZ; break; @@ -739,15 +840,32 @@ enum tvin_sig_fmt_e hdmirx_hw_get_fmt(void) case HDMI_1680_1050: fmt = TVIN_SIG_FMT_HDMI_1680X1050_00HZ; break; - case HDMI_3840x2160: - case HDMI_3840x2160_420: + case HDMI_2160p24_16x9: + case HDMI_2160p25_16x9: + case HDMI_2160p30_16x9: + case HDMI_2160p50_16x9: + case HDMI_2160p60_16x9: + case HDMI_2160p24_64x27: + case HDMI_2160p25_64x27: + case HDMI_2160p30_64x27: + case HDMI_2160p50_64x27: + case HDMI_2160p60_64x27: + case HDMI_2160p50_16x9_Y420: + case HDMI_2160p60_16x9_Y420: + case HDMI_2160p50_64x27_Y420: + case HDMI_2160p60_64x27_Y420: if (en_4k_timing) fmt = TVIN_SIG_FMT_HDMI_3840_2160_00HZ; else fmt = TVIN_SIG_FMT_NULL; break; - case HDMI_4096x2160: - case HDMI_4096x2160_420: + case HDMI_4096p24_256x135: + case HDMI_4096p25_256x135: + case HDMI_4096p30_256x135: + case HDMI_4096p50_256x135: + case HDMI_4096p60_256x135: + case HDMI_4096p50_256x135_Y420: + case HDMI_4096p60_256x135_Y420: if (en_4k_timing) fmt = TVIN_SIG_FMT_HDMI_4096_2160_00HZ; else @@ -897,7 +1015,7 @@ static int get_timing_fmt(void) int i; int size = sizeof(freq_ref)/sizeof(struct freq_ref_s); - rx.pre.sw_vic = 0; + rx.pre.sw_vic = HDMI_UNKNOWN; rx.pre.sw_dvi = 0; rx.pre.sw_fp = 0; rx.pre.sw_alternative = 0; @@ -914,8 +1032,11 @@ static int get_timing_fmt(void) continue; break; } - if (i == size) + if (i == size) { + /* if format is not matched, sw_vic will be UNSUPPORT */ + rx.pre.sw_vic = HDMI_UNSUPPORT; return i; + } rx.pre.sw_vic = freq_ref[i].vic; rx.pre.sw_dvi = rx.pre.hw_dvi; @@ -935,7 +1056,6 @@ static void signal_status_init(void) pll_lock_cnt = 0; sig_unstable_cnt = 0; sig_stable_cnt = 0; - sig_stable_cnt = 0; sig_unstable_cnt = 0; sig_unready_cnt = 0; /*rx.wait_no_sig_cnt = 0;*/ @@ -1173,6 +1293,8 @@ void fsm_restart(void) esm_set_stable(false); } set_scdc_cfg(1, 0); + vic_check_en = true; + dvi_check_en = true; rx.state = FSM_INIT; rx_pr("force_fsm_init\n"); } @@ -1639,6 +1761,8 @@ void hdmirx_open_port(enum tvin_port_e port) rx.port = (port - TVIN_PORT_HDMI0) & 0xf; //rx.no_signal = false; //rx.wait_no_sig_cnt = 0; + vic_check_en = true; + dvi_check_en = true; if (hdmirx_repeat_support()) rx.hdcp.repeat = repeat_plug; else @@ -1737,6 +1861,8 @@ void rx_5v_monitor(void) #else set_fsm_state(FSM_HPD_LOW); #endif + vic_check_en = true; + dvi_check_en = true; } } rx.cur_5v_sts = (pwr_sts >> rx.port) & 1; @@ -1927,7 +2053,26 @@ void rx_main_state_machine(void) get_timing_fmt(); if (is_unnormal_format(sig_stable_cnt)) break; + /* if format vic is abnormal, do hw + * reset once to try to recover. + */ + if (fmt_vic_abnormal() && + (vic_check_en == true)) { + hdmirx_hw_config(); + rx.state = FSM_HPD_LOW; + vic_check_en = false; + break; + } sig_unready_cnt = 0; + /* if DVI signal is detected, then try + * hpd reset once to recovery, to avoid + * recognition to DVI of low probability + */ + if (rx.pre.sw_dvi && dvi_check_en) { + rx.state = FSM_HPD_LOW; + dvi_check_en = false; + break; + } rx.skip = 0; rx.state = FSM_SIG_READY; rx.aud_sr_stable_cnt = 0; @@ -1984,6 +2129,7 @@ void rx_main_state_machine(void) rx.hdcp.hdcp_version = HDCP_VER_NONE; rx.state = FSM_WAIT_CLK_STABLE; /* rx.pre_state = FSM_SIG_READY; */ + vic_check_en = true; rx.skip = 0; rx.aud_sr_stable_cnt = 0; rx.aud_sr_unstable_cnt = 0; @@ -2216,8 +2362,20 @@ void rx_main_state_machine(void) get_timing_fmt(); if (is_unnormal_format(sig_stable_cnt)) break; + if (fmt_vic_abnormal() && + (vic_check_en == true)) { + hdmirx_hw_config(); + rx.state = FSM_HPD_LOW; + vic_check_en = false; + break; + } sig_stable_cnt = 0; sig_unstable_cnt = 0; + if (rx.pre.sw_dvi && dvi_check_en) { + rx.state = FSM_HPD_LOW; + dvi_check_en = false; + break; + } rx.skip = 0; if ((rx.pre.hdcp14_state == 0) || (rx.pre.hdcp14_state == 2)) @@ -2281,6 +2439,7 @@ void rx_main_state_machine(void) rx.state = FSM_WAIT_CLK_STABLE; rx.pre_state = FSM_SIG_READY; rx.skip = 0; + vic_check_en = true; rx.aud_sr_stable_cnt = 0; rx.aud_sr_unstable_cnt = 0; if (hdcp22_on) { @@ -2733,8 +2892,8 @@ void hdmirx_timer_handler(unsigned long arg) rx_pkt_check_content(); #ifdef USE_NEW_FSM_METHODE rx_err_monitor(); - #endif rx_clkrate_monitor(); + #endif } devp->timer.expires = jiffies + TIMER_STATE_CHECK; add_timer(&devp->timer); diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h index 358b4e49e0bf..d91c1d56e2f7 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h @@ -55,64 +55,7 @@ struct freq_ref_s { uint8_t type_3d; unsigned int hactive; unsigned int vactive; - uint8_t vic; -}; - -enum video_format_e { - - HDMI_UNKNOWN = 0, - HDMI_720x480i, - HDMI_1440x480i, - HDMI_720x576i, - HDMI_1440x576i, - - HDMI_720x480p = 5, - HDMI_1440x480p, - HDMI_720x576p, - HDMI_1440x576p, - - HDMI_1440x240p = 9, - HDMI_2880x240p, - HDMI_1440x288p, - HDMI_2880x288p, - - HDMI_720p = 13, - HDMI_1080i, - HDMI_1080p, - - HDMI_3840x2160 = 16, - HDMI_4096x2160, - HDMI_3840x2160_420, - HDMI_4096x2160_420, - HDMI_1080p_420, - - HDMI_640_480 = 21, - HDMI_800_600, - HDMI_1024_768, - HDMI_720_400, - HDMI_1280_768, - HDMI_1280_800 = 26, - HDMI_1280_960, - HDMI_1280_1024, - HDMI_1360_768, - HDMI_1366_768, - HDMI_1600_900 = 31, - HDMI_1600_1200, - HDMI_1920_1200, - HDMI_1440_900, - HDMI_1400_1050, - HDMI_1680_1050 = 36, - HDMI_2560_1440, - - HDMI_480p_FRAMEPACKING, - HDMI_576p_FRAMEPACKING, - HDMI_720p_FRAMEPACKING, - HDMI_1080i_FRAMEPACKING, - HDMI_1080i_ALTERNATIVE, - HDMI_1080p_ALTERNATIVE, - HDMI_1080p_FRAMEPACKING, - - HDMI_UNSUPPORT + enum hdmi_vic_e vic; }; enum fsm_states_e {