mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 11:50:43 +09:00
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:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>");
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user