mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 11:50:43 +09:00
deinterlace: pq: add scene change detection for tl1 [1/1]
PD#TV-1361 Problem: Add scene change detection for DM (read part), start from TL1 by VLSI(Zheng.Bao). Solution: 1. add control in function noise_meter_process; 2. add debug information: cat /sys/class/deinterlace/di0/nr4_param 3. set NR2_CUE_MODE[11:10] as 3; (by feijun) Verify: tl1 Change-Id: Ib34d1b403539ba5fe5135d6608bfa2cf27490826 Signed-off-by: Jihong Sui <jihong.sui@amlogic.com>
This commit is contained in:
@@ -6222,6 +6222,7 @@ static void di_reg_process_irq(void)
|
||||
vframe->sig_fmt);
|
||||
|
||||
di_patch_post_update_mc_sw(DI_MC_SW_REG, true);
|
||||
cue_int();
|
||||
if (de_devp->flags & DI_LOAD_REG_FLAG)
|
||||
up(&di_sema);
|
||||
init_flag = 1;
|
||||
|
||||
@@ -509,6 +509,18 @@ static void noise_meter_process(struct NR4_PARM_s *nr4_param_p,
|
||||
} else
|
||||
val1 = 64;
|
||||
DI_Wr_reg_bits(NR4_MCNR_MV_CTRL_REG, val1, 4, 8);
|
||||
/*add for TL1------*/
|
||||
if (nr4_param_p->sw_nr4_noise_ctrl_dm_en == 1) {
|
||||
if (nr4_param_p->sw_nr4_noise_sel == 0) {
|
||||
val2 = val1 >= nr4_param_p->sw_nr4_noise_thd ? 1 : 0;
|
||||
} else {
|
||||
val2 =
|
||||
field_sad >= nr4_param_p->sw_nr4_noise_thd ? 1 : 0;
|
||||
}
|
||||
|
||||
DI_Wr_reg_bits(DNR_DM_NR_BLND, val2, 24, 1);
|
||||
}
|
||||
/*------------------*/
|
||||
/* scene change processing */
|
||||
nr4_param_p->sw_nr4_scene_change_flg[0] =
|
||||
nr4_param_p->sw_nr4_scene_change_flg[1];
|
||||
@@ -529,6 +541,16 @@ static void noise_meter_process(struct NR4_PARM_s *nr4_param_p,
|
||||
DI_Wr_reg_bits(NR4_TOP_CTRL, 1, 0, 1);
|
||||
else
|
||||
DI_Wr_reg_bits(NR4_TOP_CTRL, 0, 0, 1);
|
||||
|
||||
/*fot TL1 **************/
|
||||
if (nr4_param_p->sw_dm_scene_change_en == 1) {
|
||||
val = field_sad >= nr4_param_p->sw_nr4_scene_change_thd2
|
||||
&& nr4_param_p->sw_nr4_field_sad[1]
|
||||
>= nr4_param_p->sw_nr4_scene_change_thd2;
|
||||
|
||||
DI_Wr_reg_bits(DNR_DM_CTRL, val, 12, 1);
|
||||
}
|
||||
/***********************/
|
||||
nr4_param_p->sw_nr4_field_sad[0] = nr4_param_p->sw_nr4_field_sad[1];
|
||||
nr4_param_p->sw_nr4_field_sad[1] = field_sad;
|
||||
}
|
||||
@@ -572,15 +594,24 @@ static void dnr_process(struct DNR_PARM_s *pDnrPrm)
|
||||
#ifdef DNR_HV_SHIFT
|
||||
int ro_hbof_stat_cnt[32], ro_vbof_stat_cnt[32], i = 0;
|
||||
#endif
|
||||
int ll, lr;
|
||||
|
||||
if (ro_gbs_stat_lr != Rd(DNR_RO_GBS_STAT_LR) ||
|
||||
ro_gbs_stat_ll != Rd(DNR_RO_GBS_STAT_LL) ||
|
||||
if (is_meson_tl1_cpu()) {
|
||||
ll = Rd(DNR_RO_GBS_STAT_LR);
|
||||
lr = Rd(DNR_RO_GBS_STAT_LL);
|
||||
} else {
|
||||
ll = Rd(DNR_RO_GBS_STAT_LL);
|
||||
lr = Rd(DNR_RO_GBS_STAT_LR);
|
||||
|
||||
}
|
||||
if (ro_gbs_stat_lr != lr ||
|
||||
ro_gbs_stat_ll != ll ||
|
||||
ro_gbs_stat_rr != Rd(DNR_RO_GBS_STAT_RR) ||
|
||||
ro_gbs_stat_dif != Rd(DNR_RO_GBS_STAT_DIF) ||
|
||||
ro_gbs_stat_cnt != Rd(DNR_RO_GBS_STAT_CNT)) {
|
||||
|
||||
ro_gbs_stat_lr = Rd(DNR_RO_GBS_STAT_LR);
|
||||
ro_gbs_stat_ll = Rd(DNR_RO_GBS_STAT_LL);
|
||||
ro_gbs_stat_lr = lr;
|
||||
ro_gbs_stat_ll = ll;
|
||||
ro_gbs_stat_rr = Rd(DNR_RO_GBS_STAT_RR);
|
||||
ro_gbs_stat_dif = Rd(DNR_RO_GBS_STAT_DIF);
|
||||
ro_gbs_stat_cnt = Rd(DNR_RO_GBS_STAT_CNT);
|
||||
@@ -693,7 +724,13 @@ static void cue_process_irq(void)
|
||||
if (nr_param.frame_count == 5)
|
||||
Wr_reg_bits(NR2_CUE_MODE, 7, 0, 4);
|
||||
}
|
||||
|
||||
void cue_int(void)
|
||||
{
|
||||
if (cpu_after_eq(MESON_CPU_MAJOR_ID_G12A)) {
|
||||
if (cue_en)
|
||||
Wr_reg_bits(NR2_CUE_MODE, 3, 10, 2);
|
||||
}
|
||||
}
|
||||
static bool glb_fieldck_en = true;
|
||||
module_param_named(glb_fieldck_en, glb_fieldck_en, bool, 0644);
|
||||
|
||||
@@ -932,6 +969,17 @@ static void nr4_params_init(struct NR4_PARM_s *nr4_parm_p)
|
||||
nr4_params[24].name = "nr4_debug";
|
||||
nr4_params[24].addr = &(nr4_parm_p->nr4_debug);
|
||||
|
||||
nr4_params[25].name = "sw_nr4_noise_thd";
|
||||
nr4_params[25].addr = &(nr4_parm_p->sw_nr4_noise_thd);
|
||||
nr4_params[26].name = "sw_nr4_noise_sel";
|
||||
nr4_params[26].addr = &(nr4_parm_p->sw_nr4_noise_sel);
|
||||
nr4_params[27].name = "sw_nr4_noise_ctrl_dm_en";
|
||||
nr4_params[27].addr = &(nr4_parm_p->sw_nr4_noise_ctrl_dm_en);
|
||||
nr4_params[28].name = "sw_nr4_scene_change_thd2";
|
||||
nr4_params[28].addr = &(nr4_parm_p->sw_nr4_scene_change_thd2);
|
||||
nr4_params[29].name = "sw_dm_scene_change_en";
|
||||
nr4_params[29].addr = &(nr4_parm_p->sw_dm_scene_change_en);
|
||||
|
||||
};
|
||||
|
||||
static ssize_t nr4_param_store(struct device *dev,
|
||||
@@ -1010,6 +1058,20 @@ static void nr4_param_init(struct NR4_PARM_s *nr4_parm_p)
|
||||
nr4_parm_p->sw_nr4_sad2gain_lut[13] = 16;
|
||||
nr4_parm_p->sw_nr4_sad2gain_lut[14] = 14;
|
||||
nr4_parm_p->sw_nr4_sad2gain_lut[15] = 9;
|
||||
|
||||
if (is_meson_tl1_cpu()) {
|
||||
nr4_parm_p->sw_nr4_noise_thd = 32;
|
||||
nr4_parm_p->sw_nr4_noise_sel = 0;
|
||||
nr4_parm_p->sw_nr4_noise_ctrl_dm_en = 0;
|
||||
nr4_parm_p->sw_nr4_scene_change_thd2 = 80;
|
||||
nr4_parm_p->sw_dm_scene_change_en = 0;
|
||||
} else {
|
||||
nr4_parm_p->sw_nr4_noise_thd = 32;
|
||||
nr4_parm_p->sw_nr4_noise_sel = 0;
|
||||
nr4_parm_p->sw_nr4_noise_ctrl_dm_en = 0;
|
||||
nr4_parm_p->sw_nr4_scene_change_thd2 = 80;
|
||||
nr4_parm_p->sw_dm_scene_change_en = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void cue_param_init(struct CUE_PARM_s *cue_parm_p)
|
||||
|
||||
@@ -24,7 +24,7 @@ struct nr_param_s {
|
||||
int *addr;
|
||||
};
|
||||
|
||||
#define NR4_PARAMS_NUM 25
|
||||
#define NR4_PARAMS_NUM (30) //25
|
||||
#define dnr_param_t struct nr_param_s
|
||||
#define nr4_param_t struct nr_param_s
|
||||
|
||||
@@ -68,6 +68,16 @@ struct NR4_PARM_s {
|
||||
unsigned short width;
|
||||
unsigned short height;
|
||||
unsigned short border_offset;
|
||||
|
||||
unsigned int sw_nr4_noise_thd;//u8
|
||||
/*u1, 0: use nr4 global gain, 1: use field sad;*/
|
||||
unsigned int sw_nr4_noise_sel;
|
||||
unsigned int sw_nr4_noise_ctrl_dm_en;//u1
|
||||
|
||||
/*u8, threshold for scene change*/
|
||||
unsigned int sw_nr4_scene_change_thd2;
|
||||
/*u1, enable dm scene change check*/
|
||||
unsigned int sw_dm_scene_change_en;
|
||||
};
|
||||
|
||||
struct CUE_PARM_s {
|
||||
@@ -170,5 +180,8 @@ void nr_process_in_irq(void);
|
||||
void nr_all_config(unsigned short nCol, unsigned short nRow,
|
||||
unsigned short type);
|
||||
bool set_nr_ctrl_reg_table(unsigned int addr, unsigned int value);
|
||||
|
||||
extern void cue_int(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user