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