This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DM365 RGB888 + THS8200 Video Out

Other Parts Discussed in Thread: THS8200

Hi , All

I am working on DM365, I want to output 1280x720 display to a LVDS devices through VPBE + THS8200.

Now I set THS8200 and VPBE to output 720x576 RGB Signal for testing. But something strange happened, I can output VPBE Colorbar to THS8200 and then THS8200 display the VPBE colorbar, but when I connect camera in to VPFE and then put the video in to VPBE to THS8200, no data display in LVDS device.

 

All testing are under CCS:

The following is the THS8200 settings:

 

//THS8200 SetStd

static INT32 ths8200_setstd(enum v4l2_std_modes std)

{

INT32 num_std;

UINT16 err = 0xFFFF;

INT32 i = 0;

UINT8 value;

 

num_std = sizeof(mode_info) / sizeof(struct ths8200_mode_info);

for (i = 0; i < num_std; i++) {

if (std & mode_info[i].std) {

err = 0;

printf("TEST_0!\n");

ths8200_write(THS8200_CHIP_CTL, 0x01);

 

err |= ths8200_read(THS8200_DATA_CNTL, &value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value &= (~THS8200_DATA_CNTL_INTF_MASK);

value |=  mode_info[i].input_intf;

/* Use 3.01K resistor (FSADJ1) for 700mv swing */

value &= ~(1 << 6);

err |= ths8200_write(THS8200_DATA_CNTL, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_11!\n");

value = 0;

err |= ths8200_read(THS8200_DTG1_MODE, &value);

value &= ~(THS8200_DTG1_MODE_MASK);

value |= mode_info[i].mode;

err |= ths8200_write(THS8200_DTG1_MODE, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_1!\n");

/* Set the pixels per line */

value = mode_info[i].pixels_per_line &

THS8200_DTG1_TOT_PIXELS_LSB_MASK;

err |= ths8200_write(THS8200_DTG1_TOT_PIXELS_LSB, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value = (mode_info[i].pixels_per_line >> 8) &

THS8200_DTG1_TOT_PIXELS_MSB_MASK;

err |= ths8200_write(THS8200_DTG1_TOT_PIXELS_MSB, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

 

value = mode_info[i].pixels_per_line / 2;

err |= ths8200_write(THS8200_DTG1_SPEC_G_LSB,value & THS8200_DTG1_SPEC_G_LSB_MASK);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value = (value >> 8) & THS8200_DTG1_SPEC_G_MSB_MASK;

err |= ths8200_write(THS8200_DTG1_SPEC_G_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_2!\n");

/* Set the frame size */

value = mode_info[i].frame_size &THS8200_DTG1_FRAME_SZ_LSB_MASK;

err |= ths8200_write(THS8200_DTG1_FRAME_SZ_LSB, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

 

value = 0;

err |= ths8200_read(THS8200_DTG1_FRAME_FIELD_SZ_MSB, &value);

value &= ~(THS8200_DTG1_FRAME_SZ_MSB_MASK);

value |= ((mode_info[i].frame_size >> 8) <<THS8200_DTG1_FRAME_SZ_MSB_SHIFT) & THS8200_DTG1_FRAME_SZ_MSB_MASK;

err |= ths8200_write(THS8200_DTG1_FRAME_FIELD_SZ_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

/* Set the field Size */

value = mode_info[i].field_size & THS8200_DTG1_FIELD_SZ_LSB_MASK;

err |= ths8200_write(THS8200_DTG1_FIELD_SZ_LSB, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

 

value = 0;

err |= ths8200_read(THS8200_DTG1_FRAME_FIELD_SZ_MSB, &value);

value &= ~(THS8200_DTG1_FIELD_SZ_MSB_MASK);

value |= ((mode_info[i].frame_size >> 8) << THS8200_DTG1_FIELD_SZ_MSB_SHIFT) & THS8200_DTG1_FIELD_SZ_MSB_MASK;

err |= ths8200_write(THS8200_DTG1_FRAME_FIELD_SZ_MSB, value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_3!\n");

value = mode_info[i].hs_in_delay & THS8200_DTG2_HS_IN_DLY_LSB_MASK;

err |= ths8200_write(THS8200_DTG2_HS_IN_DLY_LSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value = (mode_info[i].hs_in_delay >> 8) & THS8200_DTG2_HS_IN_DLY_MSB_MASK;

err |= ths8200_write(THS8200_DTG2_HS_IN_DLY_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

err |= ths8200_write(THS8200_DTG1_SPEC_A,mode_info[i].negative_hsync_width);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

err |= ths8200_write(THS8200_DTG1_SPEC_C,mode_info[i].positive_hsync_width);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

 

err |= ths8200_write(THS8200_DTG1_SPEC_D_LSB,(mode_info[i].hfront_porch & THS8200_DTG1_SPEC_D_LSB_MASK));

printf("TEST_4!\n");

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value = 0;

err |= ths8200_read(THS8200_DTG1_SPEC_DEH_MSB,&value);

value &= 0x7F;

value |= ((mode_info[i].hfront_porch & 0x100) >> 1);

 

err |= ths8200_write(THS8200_DTG1_SPEC_DEH_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

err |= ths8200_write(THS8200_DTG1_SPEC_B,mode_info[i].hback_porch);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

err |= ths8200_write(THS8200_DTG1_SPEC_E_LSB,(mode_info[i].vfront_porch & THS8200_DTG1_SPEC_E_LSB_MASK));

printf("TEST_41!\n");

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value = 0;

err |= ths8200_read(THS8200_DTG1_SPEC_DEH_MSB, &value);

value &= 0xBF;

value |= ((mode_info[i].vfront_porch & 0x100) >> 2);

err |= ths8200_write(THS8200_DTG1_SPEC_DEH_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_42!\n");

err |= ths8200_write(THS8200_DTG1_SPEC_H_LSB,(mode_info[i].pulse_duration & THS8200_DTG1_SPEC_H_LSB_MASK));

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

//

value = 0;

err |= ths8200_read(THS8200_DTG1_SPEC_DEH_MSB, &value);

value &= 0xFC;

value |= ((mode_info[i].pulse_duration >> 8) & THS8200_DTG1_SPEC_DEH_MSB_MASK);

err |= ths8200_write(THS8200_DTG1_SPEC_DEH_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_43!\n");

err |= ths8200_write(THS8200_DTG1_SPEC_I_LSB,(mode_info[i].full_line_pulse_duration & THS8200_DTG1_SPEC_I_LSB_MASK));

value = 0;

err |= ths8200_read(THS8200_DTG1_SPEC_I_MSB, &value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value &= 0xF0;

value |= ((mode_info[i].full_line_pulse_duration >> 8) & THS8200_DTG1_SPEC_I_MSB_MASK);

err |= ths8200_write(THS8200_DTG1_SPEC_I_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

printf("TEST_44!\n");

err |= ths8200_write(THS8200_DTG1_SPEC_K_LSB,(mode_info[i].vback_porch & THS8200_DTG1_SPEC_K_LSB_MASK));

printf("TEST_5!\n");

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

value = 0;

err |= ths8200_read(THS8200_DTG1_SPEC_K_MSB, &value);

value &= 0xF8;

value |= ((mode_info[i].vback_porch >> 8) & THS8200_DTG1_SPEC_K_MSB_MASK);

err |= ths8200_write(THS8200_DTG1_SPEC_K_MSB,value);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

 

err |= ths8200_write(THS8200_DTG1_SPEC_K1,mode_info[i].dtg_spec_k1);

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

err |= ths8200_write(THS8200_DTG2_VS_IN_DLY_LSB,(mode_info[i].vs_in_delay & THS8200_DTG2_VS_IN_DLY_LSB_MASK));

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

err |= ths8200_write(THS8200_DTG2_VS_IN_DLY_MSB,((mode_info[i].vs_in_delay >> 8) & THS8200_DTG2_VS_IN_DLY_MSB_MASK));

 

err |= ths8200_write(THS8200_DTG2_CNTL, 0xDB);

 

if(err !=0)

printf("Error Here %s %d \n",__FILE__,__LINE__);

//ths8200_write(THS8200_CHIP_CTL, 0x00);

//_waitusec(100);

printf("TEST_6!\n");

ths8200_write(THS8200_CHIP_CTL, 0x1);

#ifdef THS8200_CB

ths8200_write(0x3C,0x50);

err |= ths8200_write(THS8200_CHIP_CTL, 0xE3);

#endif

 

break;

}

}

 

if (i == num_std)

printf("Std not supported\n");

if (err != 0)

printf("Error setting std, write failed\n");

 

return err;

}

 

//THS8200 SETUP TDM365

INT32 ths8200_setup_dm365(enum v4l2_std_modes std)

{

UINT16 err = 0;

UINT8 value;

 

ths8200_write(THS8200_CHIP_CTL, 0x01);

 

/* Initialize THS8200 registers */

err |= ths8200_read(THS8200_DTG1_MODE, &value);

value |= THS8200_DTG1_MODE_DTG_ON_MASK;

printf("value 0x%x\n", value);

err |= ths8200_write(THS8200_DTG1_MODE, value);

 

value = 0;

err |= ths8200_read(THS8200_DTG2_CNTL, &value);

value |= THS8200_DTG2_CNTL_IGNORE_FID_MASK;

value &= ~THS8200_DTG2_CNTL_EMD_TIMING_MASK;

value |= (THS8200_DTG2_CNTL_RGB_MODE_MASK);

printf("value 0x%x\n", value);

err |= ths8200_write(THS8200_DTG2_CNTL, value);

 

value = 0;

err |= ths8200_read(THS8200_CSC_OFFS3, &value);

value |= (THS8200_CSC_OFFS3_CSC_BYPASS_MASK | THS8200_CSC_OFFS3_UNDER_OVERFLOW_MASK);

printf("value 0x%x\n", value);

err |= ths8200_write(THS8200_CSC_OFFS3, value);

 

//err |= ths8200_write(THS8200_CHIP_CTL, 0x00);

//_waitusec(100);

//err |= ths8200_write(THS8200_CHIP_CTL, 0x01);

 

err = ths8200_setstd(std);

if (err != 0) {

printf("Error setting std during init\n");

return -1;

}

 

return err;

}

 

Would someone give me some help?

 

Thanks

  • Hi,

    Because THS8200 operation is independent of Davinci, if you were able to see correct output when VPFE is disabled, I believe THS8200 has already been programmed correctly.

    I have a feeling that enabling VPFE somehow corrupted VPBE operation. So you should look into that.

    phoenixtju said:

    Now I set THS8200 and VPBE to output 720x576 RGB Signal for testing. But something strange happened, I can output VPBE Colorbar to THS8200 and then THS8200 display the VPBE colorbar, but when I connect camera in to VPFE and then put the video in to VPBE to THS8200, no data display in LVDS device.

    Just to be clear... You meant VPBE->THS8200->LVDS display?  so this LVDS display accepts analog input?

    When you connected your camera, is there any configuartion change on the above datapath at all? i.e. clock, sync... If your display path setup is independent to the capture side, what happens when you disable CCDC capture?