tvafe: fine tune ntsc-m recurrence [1/1]
authorEvoke Zhang <evoke.zhang@amlogic.com>
Thu, 23 May 2019 05:18:21 +0000 (13:18 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Thu, 30 May 2019 12:34:46 +0000 (05:34 -0700)
PD#TV-6007

Problem:
ATV scan range is not qualified

Solution:
1.change 0x128 from 0x140008 to 0x1f0008 for ntsc-m
2.support cutwindow adjust debug:
    echo h index val >/sys/class/tvafe/tvafe0/cutwin
    echo v index val >/sys/class/tvafe/tvafe0/cutwin
    echo r >/sys/class/tvafe/tvafe0/cutwin
3.support cutwindow config in dts

Verify:
x301

Change-Id: Idc3a3e8857cea2462da6edcbbf4ffefab6d48f7b
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
13 files changed:
arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts
arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts
arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts
arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts
arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts
arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts
arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts
arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts
drivers/amlogic/media/vin/tvin/tvafe/tvafe.c
drivers/amlogic/media/vin/tvin/tvafe/tvafe.h
drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c
drivers/amlogic/media/vin/tvin/tvafe/tvafe_debug.c
drivers/amlogic/media/vin/tvin/tvin_format_table.c

index ce85cf4..f77d66e 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 3af9439..5fab51f 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 8a9a217..b856026 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 8893dee..7a4da04 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index d5f9787..91a8f01 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 23fc06b..5d22bde 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 1ae412f..26e434a 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 85deead..30ef7a2 100644 (file)
                >;
                clocks = <&clkc CLKID_DAC_CLK>;
                clock-names = "vdac_clk_gate";
+
+               cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */
+               cutwindow_val_v = <4  8 14 16 24>;  /* level 0~4 */
        };
 
        vbi {
index 4c54ced..9c24d2e 100644 (file)
@@ -90,16 +90,10 @@ bool tvafe_dbg_enable;
 module_param(tvafe_dbg_enable, bool, 0644);
 MODULE_PARM_DESC(tvafe_dbg_enable, "enable/disable tvafe debug enable");
 
-static int cutwindow_val_v = TVAFE_VS_VE_VAL;
-static int cutwindow_val_v_level0 = 4;
-static int cutwindow_val_v_level1 = 8;
-static int cutwindow_val_v_level2 = 14;
-static int cutwindow_val_v_level3 = 16;
-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 = 62;/*48-->62 for ntsc-m*/
+/*level4: 48-->62 for ntsc-m*/
+unsigned int cutwindow_val_h[5] = {0, 10, 18, 20, 62};
+unsigned int cutwindow_val_v[5] = {4, 8, 14, 16, 24};
+static int cutwindow_val_vs_ve = TVAFE_VS_VE_VAL;
 
 /*tvconfig snow config*/
 static bool snow_cfg;
@@ -745,8 +739,9 @@ void tvafe_get_sig_property(struct tvin_frontend_s *fe,
                                                frontend);
        struct tvafe_info_s *tvafe = &devp->tvafe;
        enum tvin_port_e port = tvafe->parm.port;
-       unsigned int hs_adj_lev = cutwindow_val_h_level1;
-       unsigned int vs_adj_lev = cutwindow_val_v_level1;
+       unsigned int hs_adj_lev = cutwindow_val_h[1];
+       unsigned int vs_adj_lev = cutwindow_val_v[1];
+       unsigned int i;
 
        if (!(devp->flags & TVAFE_FLAG_DEV_OPENED) ||
                (devp->flags & TVAFE_POWERDOWN_IN_IDLE)) {
@@ -761,16 +756,9 @@ void tvafe_get_sig_property(struct tvin_frontend_s *fe,
 #ifdef TVAFE_CVD2_AUTO_DE_ENABLE
        if ((port >= TVIN_PORT_CVBS0) && (port <= TVIN_PORT_CVBS3)) {
                if (tvafe->cvd2.info.vs_adj_en) {
-                       if (tvafe->cvd2.info.vs_adj_level == 0)
-                               vs_adj_lev = cutwindow_val_v_level0;
-                       else if (tvafe->cvd2.info.vs_adj_level == 1)
-                               vs_adj_lev = cutwindow_val_v_level1;
-                       else if (tvafe->cvd2.info.vs_adj_level == 2)
-                               vs_adj_lev = cutwindow_val_v_level2;
-                       else if (tvafe->cvd2.info.vs_adj_level == 3)
-                               vs_adj_lev = cutwindow_val_v_level3;
-                       else if (tvafe->cvd2.info.vs_adj_level == 4)
-                               vs_adj_lev = cutwindow_val_v_level4;
+                       i = tvafe->cvd2.info.vs_adj_level;
+                       if (i < 5)
+                               vs_adj_lev = cutwindow_val_v[i];
                        else
                                vs_adj_lev = 0;
                        prop->vs = vs_adj_lev;
@@ -780,18 +768,16 @@ void tvafe_get_sig_property(struct tvin_frontend_s *fe,
                        prop->ve = 0;
                }
                if (tvafe->cvd2.info.hs_adj_en) {
-                       if (tvafe->cvd2.info.hs_adj_level == 1)
-                               hs_adj_lev = cutwindow_val_h_level1;
-                       else if (tvafe->cvd2.info.hs_adj_level == 2)
-                               hs_adj_lev = cutwindow_val_h_level2;
-                       else if (tvafe->cvd2.info.hs_adj_level == 3)
-                               hs_adj_lev = cutwindow_val_h_level3;
-                       else if (tvafe->cvd2.info.hs_adj_level == 4) {
-                               hs_adj_lev = cutwindow_val_h_level4;
-                               prop->vs = cutwindow_val_v;
-                               prop->ve = cutwindow_val_v;
-                       } else
+                       i = tvafe->cvd2.info.hs_adj_level;
+                       if (i < 4) {
+                               hs_adj_lev = cutwindow_val_h[i];
+                       } else if (i == 4) {
+                               hs_adj_lev = cutwindow_val_h[i];
+                               prop->vs = cutwindow_val_vs_ve;
+                               prop->ve = cutwindow_val_vs_ve;
+                       } else {
                                hs_adj_lev = 0;
+                       }
                        if (tvafe->cvd2.info.hs_adj_dir == true) {
                                prop->hs = 0;
                                prop->he = hs_adj_lev;
@@ -1358,7 +1344,7 @@ static int tvafe_drv_probe(struct platform_device *pdev)
        }
 
        /*reg mem*/
-       tvafe_pr_info("%s:tvafe start get  ioremap .\n", __func__);
+       /*tvafe_pr_info("%s:tvafe start get  ioremap .\n", __func__);*/
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(&pdev->dev, "missing memory resource\n");
@@ -1381,6 +1367,16 @@ static int tvafe_drv_probe(struct platform_device *pdev)
        tvafe_pr_info("%s: tvafe maped reg_base =%p, size=%x\n",
                        __func__, tvafe_reg_base, size_io_reg);
 
+       /* cutwindow config */
+       if (of_property_read_u32_array(pdev->dev.of_node, "cutwindow_val_h",
+                       cutwindow_val_h, 5)) {
+               tvafe_pr_err("Can't get cutwindow_val_h\n");
+       }
+       if (of_property_read_u32_array(pdev->dev.of_node, "cutwindow_val_v",
+                       cutwindow_val_v, 5)) {
+               tvafe_pr_err("Can't get cutwindow_val_v\n");
+       }
+
        /* frontend */
        tvin_frontend_init(&tdevp->frontend, &tvafe_dec_ops,
                                                &tvafe_sm_ops, tdevp->index);
@@ -1543,7 +1539,7 @@ static int __init tvafe_drv_init(void)
                tvafe_pr_err("%s: failed to register driver\n", __func__);
                goto fail_pdrv_register;
        }
-       tvafe_pr_info("tvafe_drv_init.\n");
+       /*tvafe_pr_info("tvafe_drv_init.\n");*/
        return 0;
 
 fail_pdrv_register:
@@ -1606,40 +1602,6 @@ RESERVEDMEM_OF_DECLARE(tvafe, "amlogic, tvafe_memory",
        tvafe_mem_setup);
 
 MODULE_VERSION(TVAFE_VER);
-
-/*only for develop debug*/
-#ifdef TVAFE_DEBUG
-module_param(cutwindow_val_v, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_v, "cutwindow_val_v");
-
-module_param(cutwindow_val_v_level0, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_v_level0, "cutwindow_val_v_level0");
-
-module_param(cutwindow_val_v_level1, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_v_level1, "cutwindow_val_v_level1");
-
-module_param(cutwindow_val_v_level2, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_v_level2, "cutwindow_val_v_level2");
-
-module_param(cutwindow_val_v_level3, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_v_level3, "cutwindow_val_v_level3");
-
-module_param(cutwindow_val_v_level4, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_v_level4, "cutwindow_val_v_level4");
-
-module_param(cutwindow_val_h_level1, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_h_level1, "cutwindow_val_h_level1");
-
-module_param(cutwindow_val_h_level2, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_h_level2, "cutwindow_val_h_level2");
-
-module_param(cutwindow_val_h_level3, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_h_level3, "cutwindow_val_h_level3");
-
-module_param(cutwindow_val_h_level4, int, 0664);
-MODULE_PARM_DESC(cutwindow_val_h_level4, "cutwindow_val_h_level4");
-#endif
-
 MODULE_DESCRIPTION("AMLOGIC TVAFE driver");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Xu Lin <lin.xu@amlogic.com>");
index c1b08ca..79e7429 100644 (file)
@@ -112,5 +112,8 @@ extern void tvafe_remove_device_files(struct device *dev);
 extern bool disableapi;
 extern bool force_stable;
 
+extern unsigned int cutwindow_val_h[5];
+extern unsigned int cutwindow_val_v[5];
+
 #endif  /* _TVAFE_H */
 
index 66e3850..c3f7392 100644 (file)
@@ -2353,12 +2353,7 @@ 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;
+       unsigned int diff, hcnt64_ave, i, hcnt64_standard = 0x30e0e;
 
        if ((cvd_isr_en & 0x1000) == 0)
                return;
index 98a1694..904db5d 100644 (file)
@@ -617,6 +617,88 @@ static ssize_t tvafe_reg_show(struct device *dev,
 
 static DEVICE_ATTR(reg, 0644, tvafe_reg_show, tvafereg_store);
 
+static ssize_t tvafe_cutwindow_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       ssize_t len = 0;
+
+       len += sprintf(buf+len,
+               "echo h index(d) val(d) > /sys/class/tvafe/tvafe0/cutwin;conifg cutwindow_h value\n");
+       len += sprintf(buf+len,
+               "echo v index(d) val(d) > /sys/class/tvafe/tvafe0/cutwin;conifg cutwindow_v value\n");
+       len += sprintf(buf+len,
+               "echo r > /sys/class/tvafe/tvafe0/cutwin;read cutwindow value\n");
+       return len;
+}
+
+static ssize_t tvafe_cutwindow_store(struct device *dev,
+               struct device_attribute *attr, const char *buff, size_t count)
+{
+       char *buf_orig, *parm[20] = {NULL};
+       unsigned int index, val;
+       char *pr_buf;
+       unsigned int pr_len;
+
+       if (!buff)
+               return count;
+       buf_orig = kstrdup(buff, GFP_KERNEL);
+       tvafe_parse_param(buf_orig, (char **)&parm);
+
+       if (!strcmp(parm[0], "h")) {
+               if (kstrtouint(parm[1], 10, &index) < 0)
+                       goto tvafe_cutwindow_store_err;
+               if (index < 5) {
+                       if (kstrtouint(parm[2], 10, &val) < 0)
+                               goto tvafe_cutwindow_store_err;
+                       cutwindow_val_h[index] = val;
+                       pr_info("set cutwindow_h[%d] = %d\n", index, val);
+               } else {
+                       pr_info("error: invalid index %d\n", index);
+               }
+       } else if (!strcmp(parm[0], "v")) {
+               if (kstrtouint(parm[1], 10, &index) < 0)
+                       goto tvafe_cutwindow_store_err;
+               if (index < 5) {
+                       if (kstrtouint(parm[2], 10, &val) < 0)
+                               goto tvafe_cutwindow_store_err;
+                       cutwindow_val_v[index] = val;
+                       pr_info("set cutwindow_v[%d] = %d\n", index, val);
+               } else {
+                       pr_info("error: invalid index %d\n", index);
+               }
+       } else if (!strcmp(parm[0], "r")) {
+               pr_buf = kzalloc(sizeof(char) * 100, GFP_KERNEL);
+               if (!pr_buf) {
+                       pr_info("print buf malloc error\n");
+                       goto tvafe_cutwindow_store_err;
+               }
+               pr_len = 0;
+               pr_len += sprintf(pr_buf+pr_len, "cutwindow_h:");
+               for (index = 0; index < 5; index++) {
+                       pr_len += sprintf(pr_buf+pr_len,
+                                       " %d", cutwindow_val_h[index]);
+               }
+               pr_len += sprintf(pr_buf+pr_len, "\ncutwindow_v:");
+               for (index = 0; index < 5; index++) {
+                       pr_len += sprintf(pr_buf+pr_len,
+                                       " %d", cutwindow_val_v[index]);
+               }
+               pr_info("%s\n", pr_buf);
+               kfree(pr_buf);
+       } else
+               pr_info("error: invaild command\n");
+
+       kfree(buf_orig);
+       return count;
+
+tvafe_cutwindow_store_err:
+       kfree(buf_orig);
+       return -EINVAL;
+}
+
+static DEVICE_ATTR(cutwin, 0644,
+               tvafe_cutwindow_show, tvafe_cutwindow_store);
+
 int tvafe_device_create_file(struct device *dev)
 {
        int ret = 0;
@@ -625,12 +707,14 @@ int tvafe_device_create_file(struct device *dev)
        ret |= device_create_file(dev, &dev_attr_cvd_reg8a);
        ret |= device_create_file(dev, &dev_attr_dumpmem);
        ret |= device_create_file(dev, &dev_attr_reg);
+       ret |= device_create_file(dev, &dev_attr_cutwin);
 
        return ret;
 }
 
 void tvafe_remove_device_files(struct device *dev)
 {
+       device_remove_file(dev, &dev_attr_cutwin);
        device_remove_file(dev, &dev_attr_debug);
        device_remove_file(dev, &dev_attr_dumpmem);
        device_remove_file(dev, &dev_attr_cvd_reg8a);
index 34ced0c..f3b74bf 100644 (file)
@@ -1276,7 +1276,7 @@ const unsigned int cvbs_acd_table[TVIN_SIG_FMT_CVBS_NTSC_50 -
                0xa0461006, 0x70ff0404, 0x0400208c, 0x48484848, 0x00004444,
                0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x02020000,
                0x0209c832, 0x00000000, 0xeafb4e8e, 0x2,       0xe7f14e8e,
-               0x00140008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f,
+               0x001f0008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f,
                0x00880358, 0x00130103, 0x00000000,     0x00000000, 0x00000000,
                0x00000000, 0x00000050, 0x00000000, 0x000003ff, 0x00000000,
                0x00000000,     0x00000000, 0x0004cfb0, 0x00000000, 0x030000f0,
@@ -1716,7 +1716,7 @@ const unsigned int rf_acd_table[TVIN_SIG_FMT_CVBS_NTSC_50 -
                0xa0461006, 0x70ff0404, 0x0400208c, 0x48484848, 0x00004444,
                0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x02020000,
                0x0209c832, 0x00000000, 0xeafb4e8e, 0x2,       0xe7f14e8e,
-               0x00140008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f,
+               0x001f0008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f,
                0x00880358, 0x00130103, 0x00000000,     0x00000000, 0x00000000,
                0x00000000, 0x00000050, 0x00000000, 0x000003ff, 0x00000000,
                0x00000000,     0x00000000, 0x0004cfb0, 0x00000000, 0x030000f0,