tvafe: optimize for electrical perfomance test
authorNian Jing <nian.jing@amlogic.com>
Tue, 5 Jun 2018 10:11:47 +0000 (18:11 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Wed, 6 Jun 2018 06:21:37 +0000 (23:21 -0700)
PD#164844: add hsync adjust for ntscm
   use a fixed vbi threshold 0x30 for vbi

Change-Id: Ia4d79a2b2b785bf86a976c519c44ef42fcb32d1a
Signed-off-by: Nian Jing <nian.jing@amlogic.com>
drivers/amlogic/media/vin/tvin/tvafe/tvafe.c
drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c
drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.h
drivers/amlogic/media/vin/tvin/tvafe/tvafe_vbi.c

index 10612dc..142323d 100644 (file)
@@ -99,7 +99,7 @@ static int cutwindow_val_v_level4 = 24;
 static int cutwindow_val_h_level1 = 10;
 static int cutwindow_val_h_level2 = 18;
 static int cutwindow_val_h_level3 = 20;
-static int cutwindow_val_h_level4 = 48;
+static int cutwindow_val_h_level4 = 62;/*48-->62 for ntsc-m*/
 
 /*1: snow function on;*/
 /*0: off snow function*/
@@ -554,6 +554,8 @@ int tvafe_dec_isr(struct tvin_frontend_s *fe, unsigned int hcnt64)
 #endif
        if (tvafe->parm.info.fmt == TVIN_SIG_FMT_CVBS_PAL_I)
                tvafe_cvd2_adj_hs(&tvafe->cvd2, hcnt64);
+       else if (tvafe->parm.info.fmt == TVIN_SIG_FMT_CVBS_NTSC_M)
+               tvafe_cvd2_adj_hs_ntsc(&tvafe->cvd2, hcnt64);
 
        if ((port >= TVIN_PORT_CVBS0) && (port <= TVIN_PORT_CVBS3)) {
                aspect_ratio = tvafe_cvd2_get_wss();
index 459f497..ceea121 100644 (file)
@@ -371,7 +371,7 @@ static void tvafe_cvd2_write_mode_reg(struct tvafe_cvd2_s *cvd2,
        unsigned int i = 0;
 
        /*disable vbi*/
-       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x14);
+       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x10);
        W_APB_REG(ACD_REG_22, 0x07080000);
        /* manuel reset vbi */
        W_APB_REG(ACD_REG_22, 0x87080000);
@@ -474,7 +474,7 @@ static void tvafe_cvd2_write_mode_reg(struct tvafe_cvd2_s *cvd2,
        W_APB_REG(CVD2_VSYNC_VBI_LOCKOUT_END, 0x00000025);
        W_APB_REG(CVD2_VSYNC_TIME_CONSTANT, 0x0000000a);
        W_APB_REG(CVD2_VBI_CC_START, 0x00000054);
-       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x15);
+       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x11);
        W_APB_REG(ACD_REG_22, 0x82080000); /* manuel reset vbi */
        W_APB_REG(ACD_REG_22, 0x04080000);
        /* vbi reset release, vbi agent enable */
@@ -504,7 +504,7 @@ static void tvafe_cvd2_write_mode_reg(struct tvafe_cvd2_s *cvd2,
                W_APB_REG(CVD2_OUTPUT_CONTROL, CVD_REG07_PAL);
 
        /*disable vbi*/
-       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x14);
+       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x10);
 
        /* 3D comb filter buffer assignment */
        tvafe_cvd2_memory_init(mem, cvd2->config_fmt);
@@ -519,6 +519,9 @@ static void tvafe_cvd2_write_mode_reg(struct tvafe_cvd2_s *cvd2,
        W_APB_REG(CVD2_VBI_WSS_DTO_MSB, 0x20);
        W_APB_REG(CVD2_VBI_WSS_DTO_LSB, 0x66);
 
+       /*0x40[2]=0 Use a fixed vbi threshold 0x30*/
+       W_APB_REG(CVD2_VBI_DATA_HLVL, 0x30);
+
        /* config vbi start line */
        cvd_vbi_config();
 
@@ -528,7 +531,7 @@ static void tvafe_cvd2_write_mode_reg(struct tvafe_cvd2_s *cvd2,
 
        W_APB_REG(ACD_REG_22, 0x04080000);
        /*enable vbi*/
-       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x15);
+       W_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x11);
        pr_info("[tvafe..] %s: enable vbi\n", __func__);
 #endif
        /*for palm moonoscope pattern color flash*/
@@ -1881,7 +1884,9 @@ static void tvafe_cvd2_adj_vs(struct tvafe_cvd2_s *cvd2)
        struct tvafe_cvd2_lines_s *lines = &cvd2->info.vlines;
        unsigned int i = 0, l_ave = 0, l_max = 0, l_min = 0xff;
 
-       if (!cvd2->hw.line625 || (cvd2->config_fmt != TVIN_SIG_FMT_CVBS_PAL_I))
+       if (!cvd2->hw.line625 ||
+               ((cvd2->config_fmt != TVIN_SIG_FMT_CVBS_PAL_I) &&
+               (cvd2->config_fmt != TVIN_SIG_FMT_CVBS_NTSC_M)))
                return;
        if (auto_de_en == 0) {
                lines->val[0] = lines->val[1];
@@ -2191,16 +2196,20 @@ inline void tvafe_cvd2_adj_hs(struct tvafe_cvd2_s *cvd2,
        unsigned int hcnt64_max, hcnt64_min, temp, delta;
        unsigned int diff, hcnt64_ave, i, hcnt64_standard;
 
-       if (tvafe_cpu_type() >= CPU_TYPE_GXTVBB)
-               hcnt64_standard = 0x31380;
-       else
+       if (tvafe_cpu_type() >= CPU_TYPE_GXTVBB) {
+               if (cvd2->config_fmt == TVIN_SIG_FMT_CVBS_PAL_I)
+                       hcnt64_standard = 0x31380;
+               else if (cvd2->config_fmt == TVIN_SIG_FMT_CVBS_NTSC_M)
+                       hcnt64_standard = 0x30e0e;
+       } else
                hcnt64_standard = 0x17a00;
 
        if ((cvd_isr_en & 0x1000) == 0)
                return;
 
        /* only for pal-i adjusment */
-       if (cvd2->config_fmt != TVIN_SIG_FMT_CVBS_PAL_I)
+       if ((cvd2->config_fmt != TVIN_SIG_FMT_CVBS_PAL_I) &&
+               (cvd2->config_fmt != TVIN_SIG_FMT_CVBS_NTSC_M))
                return;
 
        cvd2->info.hcnt64[0] = cvd2->info.hcnt64[1];
@@ -2299,6 +2308,69 @@ inline void tvafe_cvd2_adj_hs(struct tvafe_cvd2_s *cvd2,
                }
        }
 }
+
+inline void tvafe_cvd2_adj_hs_ntsc(struct tvafe_cvd2_s *cvd2,
+                       unsigned int hcnt64)
+{
+       unsigned int hcnt64_max, hcnt64_min;
+       unsigned int diff, hcnt64_ave, i, hcnt64_standard;
+
+       if (cpu_after_eq(MESON_CPU_MAJOR_ID_GXTVBB))
+               hcnt64_standard = 0x30e0e;
+       else
+               hcnt64_standard = 0x17a00;
+
+       if ((cvd_isr_en & 0x1000) == 0)
+               return;
+
+       /* only for ntsc-m adjusment */
+       if (cvd2->config_fmt != TVIN_SIG_FMT_CVBS_NTSC_M)
+               return;
+
+       cvd2->info.hcnt64[0] = cvd2->info.hcnt64[1];
+       cvd2->info.hcnt64[1] = cvd2->info.hcnt64[2];
+       cvd2->info.hcnt64[2] = cvd2->info.hcnt64[3];
+       cvd2->info.hcnt64[3] = hcnt64;
+       hcnt64_ave = 0;
+       hcnt64_max = 0;
+       hcnt64_min = 0xffffffff;
+       for (i = 0; i < 4; i++) {
+               if (hcnt64_max < cvd2->info.hcnt64[i])
+                       hcnt64_max = cvd2->info.hcnt64[i];
+               if (hcnt64_min > cvd2->info.hcnt64[i])
+                       hcnt64_min = cvd2->info.hcnt64[i];
+               hcnt64_ave += cvd2->info.hcnt64[i];
+       }
+       if (++cvd2->info.hcnt64_cnt >= 300)
+               cvd2->info.hcnt64_cnt = 300;
+       if (cvd2->info.hcnt64_cnt == 300) {
+               hcnt64_ave = (hcnt64_ave - hcnt64_max - hcnt64_min + 1) >> 1;
+               if (hcnt64_ave == 0)  /* to avoid kernel crash */
+                       return;
+               diff = abs(hcnt64_ave - hcnt64_standard);
+               if (diff > hs_adj_th_level0) {
+                       cvd2->info.hs_adj_en = 1;
+                       if (diff > hs_adj_th_level4)
+                               cvd2->info.hs_adj_level = 4;
+                       else if (diff > hs_adj_th_level3)
+                               cvd2->info.hs_adj_level = 3;
+                       else if (diff > hs_adj_th_level2)
+                               cvd2->info.hs_adj_level = 2;
+                       else if (diff > hs_adj_th_level1)
+                               cvd2->info.hs_adj_level = 1;
+                       else
+                               cvd2->info.hs_adj_level = 0;
+                       if (hcnt64_ave > hcnt64_standard)
+                               cvd2->info.hs_adj_dir = 1;
+                       else
+                               cvd2->info.hs_adj_dir = 0;
+               } else {
+                       cvd2->info.hs_adj_en = 0;
+                       cvd2->info.hs_adj_level = 0;
+               }
+       }
+}
+
 /*
  * tvafe cvd2 cdto adjustment in vsync interval
  */
index 4e7b9c2..c69af51 100644 (file)
@@ -183,6 +183,8 @@ extern void tvafe_cvd2_adj_cdto(struct tvafe_cvd2_s *cvd2,
 #endif
 extern void tvafe_cvd2_adj_hs(struct tvafe_cvd2_s *cvd2,
                        unsigned int hcnt64);
+extern void tvafe_cvd2_adj_hs_ntsc(struct tvafe_cvd2_s *cvd2,
+                       unsigned int hcnt64);
 
 extern void tvafe_cvd2_set_default_cdto(struct tvafe_cvd2_s *cvd2);
 extern void tvafe_cvd2_set_default_de(struct tvafe_cvd2_s *cvd2);
index ed50ccd..b8edaf0 100644 (file)
@@ -275,10 +275,10 @@ static void vbi_hw_init(struct vbi_dev_s *devp)
        memset(devp->pac_addr_start, 0, devp->mem_size);
        cvd_vbi_mem_set(devp->mem_start >> 4, devp->mem_size >> 4);
        /*disable vbi*/
-       W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL,   0x14);
+       W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL,   0x10);
        cvd_vbi_config();
        /*enable vbi*/
-       W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL,   0x15);
+       W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL,   0x11);
        tvafe_pr_info("%s: vbi hw init done.\n", __func__);
 }
 
@@ -1090,7 +1090,7 @@ static int vbi_release(struct inode *inode, struct file *file)
        if (tvafe_clk_status) {
                /* vbi reset release, vbi agent enable */
                /*W_VBI_APB_REG(ACD_REG_22, 0x06080000);*/
-               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x14);
+               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x10);
        }
        tvafe_pr_info("[vbi..]%s: device release OK.\n", __func__);
        return ret;
@@ -1163,7 +1163,7 @@ static long vbi_ioctl(struct file *file,
                /* vbi reset release, vbi agent enable*/
                        /*W_VBI_APB_REG(ACD_REG_22, 0x06080000);*/
                /*WAPB_REG(CVD2_VBI_CC_START, 0x00000054);*/
-               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x14);
+               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x10);
                }
                mutex_unlock(&vbi_slicer->mutex);
                tvafe_pr_info("%s: stop slicer state:%d\n",
@@ -1444,7 +1444,7 @@ static ssize_t vbi_store(struct device *dev,
                /* manuel reset vbi */
                /* vbi reset release, vbi agent enable*/
                W_VBI_APB_REG(ACD_REG_22, 0x06080000);
-               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x14);
+               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x10);
                tvafe_pr_info(" disable vbi function\n");
                tvafe_pr_info("stop done!!!\n");
        } else if (!strncmp(parm[0], "set_size", strlen("set_size"))) {
@@ -1485,7 +1485,7 @@ static ssize_t vbi_store(struct device *dev,
                devp->irq_free_status = 0;
                /* vbi reset release, vbi agent enable */
                W_VBI_APB_REG(ACD_REG_22, 0x06080000);
-               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x14);
+               W_VBI_APB_REG(CVD2_VBI_FRAME_CODE_CTL, 0x10);
                tvafe_pr_info("[vbi..]device release OK.\n");
        } else {
                tvafe_pr_info("[vbi..]unsupport cmd!!!\n");