hdmirx: optimize timing format detection

PD#164010: hdmirx: optimize timing format detection

Change-Id: Ibf868664d4fda5fa21d4e80cfcc6575b25acd500
Signed-off-by: Hang Cheng <hang.cheng@amlogic.com>
This commit is contained in:
Hang Cheng
2018-05-09 19:54:15 +08:00
committed by Yixun Lan
parent 1e9ab046a2
commit 27ceb5fe97
4 changed files with 363 additions and 195 deletions

View File

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

View File

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

View File

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

View File

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