tp2825 video decode with cvbs

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

tp2825 video decode with cvbs

13,940 次查看
xiaojunye
Contributor I

1: Now i  use tp2825 on imx6q with android. The kenel version is 3.0.35.

2: 720p cvbs camera is ok  on  the same board with tp2825 

3: For the tp2825, the input   single is  cvbs camera with NTSC ,which is interlaced and resolution is 720*480,The output is BT656 with 8 bits.

4:  In decode ic  tp2825 driver, i  get the BT656 data and output it to LCD.,but the image id scrolling. Is it wrong with tp2825 register in driver or drawing data to LCD in mxc_v4l2_tvin.c ?

 thanks!

in driver file tp2825.c

static video_fmt_t video_fmts[] = {
{ /*! NTSC */
.v4l2_id = V4L2_STD_NTSC,
.name = "NTSC",
.raw_width = 720, /* SENS_FRM_WIDTH */
.raw_height = 525, /* SENS_FRM_HEIGHT */
.active_width = 720, /* ACT_FRM_WIDTH plus 1 */
.active_height = 480, /* ACT_FRM_WIDTH plus 1 */
.frame_rate = 30, /* 30 */
},
{ /*! (B, G, H, I, N) PAL */
.v4l2_id = V4L2_STD_PAL,
.name = "PAL",
.raw_width = 720,
.raw_height = 625,
.active_width = 720,
.active_height = 576,
.frame_rate = 25,
},
{ /*! Unlocked standard */
.v4l2_id = V4L2_STD_ALL,
.name = "Autodetect",
.raw_width = 720,
.raw_height = 625,
.active_width = 720,
.active_height = 576,
.frame_rate = 25,
},
};

static int ioctl_g_ifparm(struct v4l2_int_device *s, struct v4l2_ifparm *p)
{
dev_dbg(&tp2825_data.sen.i2c_client->dev, "adv7180:ioctl_g_ifparm\n");

if (s == NULL) {
pr_err(" ERROR!! no slave device set!\n");
return -1;
}
memset(p, 0, sizeof(*p));
p->if_type = V4L2_IF_TYPE_BT656; 
p->u.bt656.mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT;
#if 1
p->u.bt656.nobt_hs_inv = 0;
p->u.bt656.bt_sync_correct = 0;
p->u.bt656.clock_curr = 0; /* interlace clock mode orig = 0 */
p->u.bt656.latch_clk_inv =1;
#else
p->u.bt656.nobt_hs_inv = 1;
p->u.bt656.bt_sync_correct = 1;
#endif
return 0;
}

static int tp2825_probe(struct i2c_client *client,const struct i2c_device_id *id)

{ .................................................................................................

video_idx = TP2825_NTSC; 
tp2825_data.sen.pix.width = video_fmts[video_idx].raw_width;
tp2825_data.sen.pix.height = video_fmts[video_idx].raw_height;
tp2825_data.sen.pix.pixelformat = V4L2_PIX_FMT_UYVY; /* YUV422 */
tp2825_data.sen.pix.priv = 1; /* 1 is used to indicate TV in */
tp2825_data.sen.on = true;

tp2825_data.sen.mclk = 74250000;

tp2825_data.sen.sensor_clk = clk_get(NULL, "csi_mclk");

tp2825_data.sen.mclk_source = 0;
tp2825_data.sen.csi = 0;

..............................................................................................

}

in camera driver:

static video_fmt_t video_fmts[] = {
{ /*! NTSC */
.v4l2_id = V4L2_STD_NTSC,
.name = "NTSC",
.raw_width = 720, /* SENS_FRM_WIDTH */
.raw_height = 525, /* SENS_FRM_HEIGHT */
.active_width = 720, /* ACT_FRM_WIDTH */
.active_height = 480, /* ACT_FRM_HEIGHT */
.active_top = 13,//13
.active_left = 0,
},
{ /*! (B, G, H, I, N) PAL */
.v4l2_id = V4L2_STD_PAL,
.name = "PAL",
.raw_width = 720,
.raw_height = 625,
.active_width = 720,
.active_height = 576,
.active_top = 0,
.active_left = 0,
},
{ /*! Unlocked standard */
.v4l2_id = V4L2_STD_ALL,
.name = "Autodetect",
.raw_width = 720,
.raw_height = 625,
.active_width = 720,
.active_height = 576,
.active_top = 0,
.active_left = 0,
},
};

static int mxc_v4l2_s_param(cam_data *cam, struct v4l2_streamparm *parm)
{        ............................

      if (ifparm.u.bt656.clock_curr == 0)
               csi_param.clk_mode = IPU_CSI_CLK_MODE_CCIR656_INTERLACED ; 

      .................................

}

static int init_camera_struct(cam_data *cam, struct platform_device *pdev)

{ ............................

   

cam->crop_bounds.left = 0;
cam->crop_bounds.width = 720;
cam->crop_bounds.top = 0;
cam->crop_bounds.height = 480;
cam->crop_current = cam->crop_defrect = cam->crop_bounds;
ipu_csi_set_window_size(cam->ipu, cam->crop_current.width,
cam->crop_current.height, cam->csi);
ipu_csi_set_window_pos(cam->ipu, cam->crop_current.left,
cam->crop_current.top, cam->csi);
cam->streamparm.parm.capture.capturemode = 0;

cam->standard.index = 0;
cam->standard.id = V4L2_STD_UNKNOWN;
cam->standard.frameperiod.denominator = 30;
cam->standard.frameperiod.numerator = 1;
cam->standard.framelines = 480;
cam->standard_autodetect = true;
cam->streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
cam->streamparm.parm.capture.timeperframe = cam->standard.frameperiod;
cam->streamparm.parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
cam->overlay_on = false;
cam->capture_on = false;
cam->v4l2_fb.flags = V4L2_FBUF_FLAG_OVERLAY;

cam->v2f.fmt.pix.sizeimage = 720 * 480 * 2; 
cam->v2f.fmt.pix.bytesperline =720*2; 
cam->v2f.fmt.pix.width = 720;
cam->v2f.fmt.pix.height = 480;
cam->v2f.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
cam->win.w.width = 720;
cam->win.w.height = 720;
cam->win.w.left = 0;
cam->win.w.top = 0;

.................................

}

my test file is mxc_v4l2_tvin.c,which is at  externel/external/linux-test/test/mxc_v4l2_test/.

command:

    ./mxc-v4l2-tvin -ow 1080 -oh 720 -ol 420 -ot 0 -tb -f UYVY

in the mxc_v4l2_tvin.c 

unsigned char arr[691200]; //add

int  mxc_v4l_tvin_test(void)

{........................................

   int h, e, o;   

if (i%2 == 0)
{
for (h = 0, e = 0; h < 480; h += 2, e++)
{
memcpy(&arr[h*1440], capture_buffers[capture_buf.index].start+e*1440, 1440);
}
}
else
{
for (h = 1, o = 0; h < 480; h += 2, o++)
{
memcpy(&arr[h*1440], capture_buffers[capture_buf.index].start+o*1440,1440);
}
}

printf("g_frame_size=%d\n",g_frame_size);
memcpy(output_buffers[output_buf.index].start, arr, g_frame_size);

 

.........................................

}

标签 (1)
0 项奖励
回复
9 回复数

10,461 次查看
feifeihu
Contributor II

xiaojun,

我也在项目中经历了TP2825解码480i的信号,输出到imx6的情况,如果不开去隔行, 可以调出显示正常的隔行信号,不滚屏, 但是,始终都没法很好的去隔行, 论坛里的各种patch都试了, 经VDI处理之后的图像,还是有锯齿, 不知道你这边配置经VDI处理了没有.

0 项奖励
回复

10,461 次查看
xiaojunye
Contributor I

Hi,Fei,

      我这边没有配置VDI。

      我这边显示有雪花,你那边480i显示效果如何?

0 项奖励
回复

10,461 次查看
feifeihu
Contributor II

雪花是没有的. 但是VDI之后还是有锯齿. 如图:

 nnnnnnnnn.png

dvr.png

0 项奖励
回复

10,461 次查看
xiaojunye
Contributor I

Hi,

   主控mx6q与解码芯片tp2825上VDI如何配置?

0 项奖励
回复

10,461 次查看
feifeihu
Contributor II

IMG_19700101_015130.jpg

没有开启VDI的效果如图. 不过我这是高版本android+kernel上调的,4.4.3+3.10.53和7.1+4.1.15,效果都这样.

0 项奖励
回复

10,461 次查看
xiaojunye
Contributor I

Hi,

         你那边480i的cvbs输入到tp2825,输出的经过vdi处理与没有经过vdi是否都有雪花?

0 项奖励
回复

10,461 次查看
feifeihu
Contributor II

你可以把你得到的画面拍照或screencap发出来看看, 我们现在画质上还没能满足客户的要求,不知道问题是在2825还是在其他方面, 我们已经尝试了imx6上能使用的deinterlace方式进行调试,选取最好的效果,也还是不如别家也是imx6+其他DVI芯片的效果.

0 项奖励
回复

10,461 次查看
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Xiaojun,


     如果出现滚屏的现象,一般是2个原因造成的:

(1)camera端和CPU CSI端,数据格式没有对应好。

比如camera数据是PAL,CSI端是NTSC;或者反过来。都会滚屏。所以,你在mxc_v4l2_capture.c中跟踪一下进来的格式。

(2)CSI端接收的image分辨率要是偶数行。

比如,曾经遇到过一位客户CSI接收到的分辨率是720x507的,就滚屏了。


另外,在我们的BSP中,AV7180已经非常成熟了,你完全可以参考它的driver来配置你的decoder.


Have a nice day!

TIC Weidong

0 项奖励
回复

10,461 次查看
xiaojunye
Contributor I

Dear Wigros Sun, 

      现在已经确认:

     1:480i的cvbs的输入,tp2825只能输出960*480与1920*480两种分辨率。这点与adv7180不同。

      2:imx6q去隔行信号支持只支持480i30,576i25,1080i30。

应该是分辨率不匹配导致视频滚动,需要imx6q这边需要增加什么配置才能支持720*480输入。

0 项奖励
回复