hdmirx: improve the snow noise issue during timing switching

PD#166184: hdmirx: improve the snow noise issue during timing switching

Change-Id: If143d418758f3b0d4895a7ecab87cebe98d8c457
Signed-off-by: Lei Yang <lei.yang@amlogic.com>
This commit is contained in:
Lei Yang
2018-05-16 15:11:01 +08:00
committed by Yixun Lan
parent b3751daeec
commit f0328fe5e5
4 changed files with 20 additions and 11 deletions

View File

@@ -119,7 +119,7 @@ bool en_4096_2_3840;
int en_4k_2_2k;
int en_4k_timing = 1;
bool hdmi_cec_en;
int skip_frame_cnt = 1;
int vdin_drop_frame_cnt = 1;
/* suspend_pddq_sel:
* 0: keep phy on when suspend(don't need phy init when
* resume), it doesn't work now because phy VDDIO_3.3V
@@ -811,7 +811,7 @@ void hdmirx_get_sig_property(struct tvin_frontend_s *fe,
hdmirx_set_timing_info(prop);
hdmirx_get_hdr_info(prop);
hdmirx_get_vsi_info(prop);
prop->skip_vf_num = skip_frame_cnt;
prop->skip_vf_num = vdin_drop_frame_cnt;
}
/*

View File

@@ -34,7 +34,7 @@
//#include "hdmi_rx_edid.h"
#define RX_VER0 "ver.2018-05-11"
#define RX_VER0 "ver.2018-05-17"
/*
*
*
@@ -393,6 +393,7 @@ extern struct device *hdmirx_dev;
extern struct rx_s rx;
extern struct reg_map reg_maps[MAP_ADDR_MODULE_NUM];
extern void rx_tasklet_handler(unsigned long arg);
extern void skip_frame(unsigned int cnt);
/* reg */
@@ -421,7 +422,7 @@ extern bool en_4096_2_3840;
extern int en_4k_2_2k;
extern bool hdmi_cec_en;
extern int hdmi_yuv444_enable;
extern int skip_frame_cnt;
extern int vdin_drop_frame_cnt;
/* debug */
extern bool hdcp_enable;
extern int log_level;

View File

@@ -184,7 +184,7 @@ static int stable_check_lvl = 0x7df;
* Compared with other brands TV, delay 1.5S to avoid this noise.
*/
static int edid_update_delay = 150;
int skip_frame_cnt = 1;
static bool hdcp22_reauth_enable;
unsigned int edid_update_flag;
static bool hdcp22_stop_auth_enable;
@@ -291,6 +291,7 @@ static int hdmi_rx_ctrl_irq_handler(void)
if (intr_hdcp22 != 0) {
hdmirx_wr_dwc(DWC_HDMI2_ICLR, intr_hdcp22);
skip_frame(skip_frame_cnt);
if (log_level & HDCP_LOG)
rx_pr("intr=%#x\n", intr_hdcp22);
switch (intr_hdcp22) {
@@ -1503,6 +1504,8 @@ int rx_set_global_variable(const char *buf, int size)
return pr_var(new_hdr_lum, index);
if (set_pr_var(tmpbuf, skip_frame_cnt, value, &index, ret))
return pr_var(skip_frame_cnt, index);
if (set_pr_var(tmpbuf, vdin_drop_frame_cnt, value, &index, ret))
return pr_var(vdin_drop_frame_cnt, index);
#ifndef USE_NEW_FSM_METHODE
if (set_pr_var(tmpbuf, enable_hpd_reset, value, &index, ret))
return pr_var(enable_hpd_reset, index);
@@ -1608,6 +1611,7 @@ void rx_get_global_variable(const char *buf)
pr_var(port_map, i++);
pr_var(new_hdr_lum, i++);
pr_var(skip_frame_cnt, i++);
pr_var(vdin_drop_frame_cnt, i++);
#ifndef USE_NEW_FSM_METHODE
pr_var(enable_hpd_reset, i++);
pr_var(sig_unstable_reset_hpd_max, i++);
@@ -1618,12 +1622,13 @@ void rx_get_global_variable(const char *buf)
pr_var(hdcp_none_wait_max, i++);
}
void skip_frame(void)
void skip_frame(unsigned int cnt)
{
if (rx.state == FSM_SIG_READY)
if (rx.state == FSM_SIG_READY) {
rx.skip = (1000 * 100 / rx.pre.frame_rate / 10) + 1;
if (log_level & VIDEO_LOG)
rx_pr("rx.skip = %d\n", rx.skip);
rx.skip = cnt * rx.skip;
}
rx_pr("rx.skip = %d", rx.skip);
}
/***********************
@@ -1963,7 +1968,7 @@ void rx_main_state_machine(void)
/* video info change */
if ((!is_tmds_valid()) ||
(!rx_is_timing_stable())) {
skip_frame();
skip_frame(skip_frame_cnt);
if (++sig_unready_cnt >= sig_unready_max) {
/*sig_lost_lock_cnt = 0;*/
rx.unready_timestamp = rx.timestamp;
@@ -2266,7 +2271,7 @@ void rx_main_state_machine(void)
/* video info change */
if ((is_tmds_valid() == false) ||
(rx_is_timing_stable() == false)) {
skip_frame();
skip_frame(skip_frame_cnt);
if (++sig_unready_cnt >= sig_unready_max) {
/*sig_lost_lock_cnt = 0;*/
sig_unready_cnt = 0;

View File

@@ -1312,6 +1312,9 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
pre_prop->vdin_hdr_Flag = prop->vdin_hdr_Flag;
pre_prop->color_fmt_range = prop->color_fmt_range;
pre_prop->dest_cfmt = prop->dest_cfmt;
ignore_frames = 0;
vdin_drop_cnt++;
goto irq_handled;
}
/* change cutwindow */
if ((devp->cutwindow_cfg != 0) && (devp->auto_cutwindow_en == 1)) {