tvafe: fine tune ntsc-m recurrence [1/1]

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>
This commit is contained in:
Evoke Zhang
2019-05-23 13:18:21 +08:00
committed by Jianxin Pan
parent 06a33222b0
commit e24625d384
13 changed files with 145 additions and 77 deletions

View File

@@ -607,6 +607,9 @@
>;
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 {

View File

@@ -602,6 +602,9 @@
>;
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 {

View File

@@ -623,6 +623,9 @@
>;
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 {

View File

@@ -623,6 +623,9 @@
>;
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 {

View File

@@ -603,6 +603,9 @@
>;
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 {

View File

@@ -597,6 +597,9 @@
>;
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 {

View File

@@ -619,6 +619,9 @@
>;
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 {

View File

@@ -621,6 +621,9 @@
>;
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 {

View 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>");

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

View 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;

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

View 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,