Post Go back to editing

ADV7280-M Timeout on Syncpt

I've recently posted about getting a ADV7280-M working over CSI on our NVIDIA Tegra system-on-module.

This now works and I can happily stream video.

However, I've recently stumbled across some issues when starting a gstreamer pipeline whereby occasionally, the video feed stutters and stumbles, with occasional half previous frames being shown alongside half current image frames (if that makes any sense).

Having had a look through the Linux dmesgs, I can see the following being output:

[ 1064.946867] vi vi: Timeout on VI syncpt
[ 1064.946891] vi vi: buffer_addr = 0x00707000
[ 1064.946911] vi vi: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000
[ 1066.956686] vi vi: Timeout on VI syncpt
[ 1066.956709] vi vi: buffer_addr = 0x0079f000
[ 1066.956750] vi vi: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000
[ 1068.956679] vi vi: Timeout on VI syncpt
[ 1068.956703] vi vi: buffer_addr = 0x00707000
[ 1068.956724] vi vi: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000
[ 1074.506788] vi vi: Timeout on VI syncpt
[ 1074.506812] vi vi: buffer_addr = 0x00707000
[ 1074.506833] vi vi: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000
[ 1076.516691] vi vi: Timeout on VI syncpt
[ 1076.516715] vi vi: buffer_addr = 0x0079f000
[ 1076.516736] vi vi: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000
[ 1078.516694] video4linux video0: Timeout on CSI syncpt
[ 1078.516719] video4linux video0: buffer_addr = 0x00707000
[ 1078.516744] video4linux video0: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000, ROSTATUS = 0x00000000
[ 1080.516752] video4linux video0: Timeout on CSI syncpt
[ 1080.516777] video4linux video0: buffer_addr = 0x00707000
[ 1080.516803] video4linux video0: PPSTATUS = 0x00000000, CILSTATUS = 0x00000000, ROSTATUS = 0x00000000

If I power down the camera and power back on while the gstreamer pipeline is closed, about 6/7 times out of 10, the video feed starts again and is smooth without stutter - the rest of the time, the feed is jerky and has issues (if I can capture some images then I will add them to this post).

One previous post on a similar "timeout on VI syncpt" issue mentions the "continuous_clk" field of the platform data for the camera. The adv7280-m driver on my Linux distro has it set to "1" which could be incorrect.

I'd be grateful for any advice.

Kevin

Parents
  • This is the other thread:

    ADV7280-M Resolution Issue 

    Here is the initialization code from the adv7280 driver:

    /* Reset */
    ret = adv7280_write_reg(client,
    ADV7280_POWER_MANAGEMENT, 0xA0);
    if (ret < 0)
    goto err_unreg_subdev;
    msleep(10);

    ret = adv7280_write_reg(client, 0x0F, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x00, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x0E, 0x80);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x9c, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x9c, 0xff);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x0e, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x03, 0x4e);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x04, 0x57);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x13, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x17, 0x41);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x1D, 0xC0);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x52, 0xCD);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x80, 0x51);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x81, 0x51);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x82, 0x68);
    if (ret < 0)
    goto err_unreg_subdev;


    #ifdef HW_DEINT
    /* Set VPP Map */
    ret = adv7280_write_reg(client,
    ADV7280_VPP_SLAVE_ADDRESS, (VPP_SLAVE_ADDRESS << 1));
    if (ret < 0)
    goto err_unreg_subdev;

    /* VPP - not documented */
    ret = adv7280_write_reg(&vpp_client,
    0xA3, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    /* VPP - Enbable Advanced Timing Mode */
    ret = adv7280_write_reg(&vpp_client,
    VPP_ADV_TIMING_MODE_EN, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    /* VPP - Enable Deinterlacer */
    ret = adv7280_write_reg(&vpp_client,
    VPP_I2C_DEINT_ENABLE, 0x80);
    if (ret < 0)
    goto err_unreg_subdev;
    #endif

    ret = adv7280_write_reg(client, 0xfe, 0x88);
    if (ret < 0)
    goto err_unreg_subdev;

    // --------------------------------
    // Based on Analog recommended script
    ret = adv7280_write_reg(&csi_client, 0x01, 0x20);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x02, 0x28);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x03, 0x38);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x04, 0x30);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x05, 0x30);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x06, 0x80);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x07, 0x70);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x08, 0x50);
    if (ret < 0)
    goto err_unreg_subdev;

    // --------------------------------

    ret = adv7280_write_reg(&csi_client, 0xde, 0x02);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0xd2, 0xf7);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0xd8, 0x65);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0xe0, 0x09);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x2c, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x00, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    return 0;

Reply
  • This is the other thread:

    ADV7280-M Resolution Issue 

    Here is the initialization code from the adv7280 driver:

    /* Reset */
    ret = adv7280_write_reg(client,
    ADV7280_POWER_MANAGEMENT, 0xA0);
    if (ret < 0)
    goto err_unreg_subdev;
    msleep(10);

    ret = adv7280_write_reg(client, 0x0F, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x00, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x0E, 0x80);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x9c, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x9c, 0xff);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x0e, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x03, 0x4e);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x04, 0x57);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x13, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x17, 0x41);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x1D, 0xC0);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x52, 0xCD);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x80, 0x51);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x81, 0x51);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(client, 0x82, 0x68);
    if (ret < 0)
    goto err_unreg_subdev;


    #ifdef HW_DEINT
    /* Set VPP Map */
    ret = adv7280_write_reg(client,
    ADV7280_VPP_SLAVE_ADDRESS, (VPP_SLAVE_ADDRESS << 1));
    if (ret < 0)
    goto err_unreg_subdev;

    /* VPP - not documented */
    ret = adv7280_write_reg(&vpp_client,
    0xA3, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    /* VPP - Enbable Advanced Timing Mode */
    ret = adv7280_write_reg(&vpp_client,
    VPP_ADV_TIMING_MODE_EN, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    /* VPP - Enable Deinterlacer */
    ret = adv7280_write_reg(&vpp_client,
    VPP_I2C_DEINT_ENABLE, 0x80);
    if (ret < 0)
    goto err_unreg_subdev;
    #endif

    ret = adv7280_write_reg(client, 0xfe, 0x88);
    if (ret < 0)
    goto err_unreg_subdev;

    // --------------------------------
    // Based on Analog recommended script
    ret = adv7280_write_reg(&csi_client, 0x01, 0x20);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x02, 0x28);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x03, 0x38);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x04, 0x30);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x05, 0x30);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x06, 0x80);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x07, 0x70);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x08, 0x50);
    if (ret < 0)
    goto err_unreg_subdev;

    // --------------------------------

    ret = adv7280_write_reg(&csi_client, 0xde, 0x02);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0xd2, 0xf7);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0xd8, 0x65);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0xe0, 0x09);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x2c, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    ret = adv7280_write_reg(&csi_client, 0x00, 0x00);
    if (ret < 0)
    goto err_unreg_subdev;

    return 0;

Children
No Data

Before You Switch


Switching languages will make ADI Explorer unavailable. Resume your session by switching back to English and reopening ADI Explorer.