/* * ths8200 - Texas Instruments THS8200 video encoder driver * * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. * * This program is free software; you may redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2. * * This program is distributed .as is. WITHOUT ANY WARRANTY of any * kind, whether express or implied; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details.
*/
staticint ths8200_write(struct v4l2_subdev *sd, u8 reg, u8 val)
{ struct i2c_client *client = v4l2_get_subdevdata(sd); int ret; int i;
for (i = 0; i < 3; i++) {
ret = i2c_smbus_write_byte_data(client, reg, val); if (ret == 0) return 0;
}
v4l2_err(sd, "I2C Write Problem\n"); return ret;
}
/* To set specific bits in the register, a clear-mask is given (to be AND-ed), * and then the value-mask (to be OR-ed).
*/ staticinlinevoid
ths8200_write_and_or(struct v4l2_subdev *sd, u8 reg,
uint8_t clr_mask, uint8_t val_mask)
{
ths8200_write(sd, reg, (ths8200_read(sd, reg) & clr_mask) | val_mask);
}
/**** Data path control (DATA) ****/ /* Set FSADJ 700 mV, * bypass 422-444 interpolation, * input format 30 bit RGB444
*/
ths8200_write(sd, THS8200_DATA_CNTL, 0x70);
/* DTG Mode (Video blocked during blanking * VESA slave
*/
ths8200_write(sd, THS8200_DTG1_MODE, 0x87);
/**** Display Timing Generator Control, Part 1 (DTG1). ****/
/* Disable embedded syncs on the output by setting * the amplitude to zero for all channels.
*/
ths8200_write(sd, THS8200_DTG1_Y_SYNC_MSB, 0x00);
ths8200_write(sd, THS8200_DTG1_CBCR_SYNC_MSB, 0x00);
}
/* Zero for progressive scan formats.*/ if (!bt->interlaced)
ths8200_write(sd, THS8200_DTG1_SPEC_C, 0x00);
/* Distance from leading edge of h sync to start of active video. * MSB in 0x2b
*/
ths8200_write(sd, THS8200_DTG1_SPEC_D_LSB,
(bt->hbackporch + bt->hsync) & 0xff); /* Zero for SDTV-mode. MSB in 0x2b */
ths8200_write(sd, THS8200_DTG1_SPEC_E_LSB, 0x00); /* * MSB for dtg1_spec(d/e/h). See comment for * corresponding LSB registers.
*/
ths8200_write(sd, THS8200_DTG1_SPEC_DEH_MSB,
((bt->hbackporch + bt->hsync) & 0x100) >> 1);
/* h front porch */
ths8200_write(sd, THS8200_DTG1_SPEC_K_LSB, (bt->hfrontporch) & 0xff);
ths8200_write(sd, THS8200_DTG1_SPEC_K_MSB,
((bt->hfrontporch) & 0x700) >> 8);
/* Half the line length. Used to calculate SDTV line types. */
ths8200_write(sd, THS8200_DTG1_SPEC_G_LSB, (htotal(bt)/2) & 0xff);
ths8200_write(sd, THS8200_DTG1_SPEC_G_MSB,
((htotal(bt)/2) >> 8) & 0x0f);
/* Total pixels per line (ex. 720p: 1650) */
ths8200_write(sd, THS8200_DTG1_TOT_PIXELS_MSB, htotal(bt) >> 8);
ths8200_write(sd, THS8200_DTG1_TOT_PIXELS_LSB, htotal(bt) & 0xff);
/* Frame height and field height */ /* Field height should be programmed higher than frame_size for * progressive scan formats
*/
ths8200_write(sd, THS8200_DTG1_FRAME_FIELD_SZ_MSB,
((vtotal(bt) >> 4) & 0xf0) + 0x7);
ths8200_write(sd, THS8200_DTG1_FRAME_SZ_LSB, vtotal(bt) & 0xff);
/* Should be programmed higher than frame_size * for progressive formats
*/ if (!bt->interlaced)
ths8200_write(sd, THS8200_DTG1_FIELD_SZ_LSB, 0xff);
/**** Display Timing Generator Control, Part 2 (DTG2). ****/ /* Set breakpoint line numbers and types * THS8200 generates line types with different properties. A line type * that sets all the RGB-outputs to zero is used in the blanking areas, * while a line type that enable the RGB-outputs is used in active video * area. The line numbers for start of active video, start of front * porch and after the last line in the frame must be set with the * corresponding line types. * * Line types: * 0x9 - Full normal sync pulse: Blocks data when dtg1_pass is off. * Used in blanking area. * 0x0 - Active video: Video data is always passed. Used in active * video area.
*/
ths8200_write_and_or(sd, THS8200_DTG2_BP1_2_MSB, 0x88,
((line_start_active_video >> 4) & 0x70) +
((line_start_front_porch >> 8) & 0x07));
ths8200_write(sd, THS8200_DTG2_BP3_4_MSB, ((vtotal(bt)) >> 4) & 0x70);
ths8200_write(sd, THS8200_DTG2_BP1_LSB, line_start_active_video & 0xff);
ths8200_write(sd, THS8200_DTG2_BP2_LSB, line_start_front_porch & 0xff);
ths8200_write(sd, THS8200_DTG2_BP3_LSB, (vtotal(bt)) & 0xff);
/* line types */
ths8200_write(sd, THS8200_DTG2_LINETYPE1, 0x90);
ths8200_write(sd, THS8200_DTG2_LINETYPE2, 0x90);
/* The pixel value h sync is asserted on */
ths8200_write_and_or(sd, THS8200_DTG2_HLENGTH_LSB_HDLY_MSB, 0xe0,
(htotal(bt) >> 8) & 0x1f);
ths8200_write(sd, THS8200_DTG2_HLENGTH_HDLY_LSB, htotal(bt));
/* v sync width transmitted (must add 1 to get correct output) */
ths8200_write(sd, THS8200_DTG2_VLENGTH1_LSB, (bt->vsync + 1) & 0xff);
ths8200_write_and_or(sd, THS8200_DTG2_VLENGTH1_MSB_VDLY1_MSB, 0x3f,
((bt->vsync + 1) >> 2) & 0xc0);
/* The pixel value v sync is asserted on (must add 1 to get correct output) */
ths8200_write_and_or(sd, THS8200_DTG2_VLENGTH1_MSB_VDLY1_MSB, 0xf8,
((vtotal(bt) + 1) >> 8) & 0x7);
ths8200_write(sd, THS8200_DTG2_VDLY1_LSB, vtotal(bt) + 1);
/* For progressive video vlength2 must be set to all 0 and vdly2 must * be set to all 1.
*/
ths8200_write(sd, THS8200_DTG2_VLENGTH2_LSB, 0x00);
ths8200_write(sd, THS8200_DTG2_VLENGTH2_MSB_VDLY2_MSB, 0x07);
ths8200_write(sd, THS8200_DTG2_VDLY2_LSB, 0xff);
/* Internal delay factors to synchronize the sync pulses and the data */ /* Experimental values delays (hor 0, ver 0) */
ths8200_write(sd, THS8200_DTG2_HS_IN_DLY_MSB, 0);
ths8200_write(sd, THS8200_DTG2_HS_IN_DLY_LSB, 0);
ths8200_write(sd, THS8200_DTG2_VS_IN_DLY_MSB, 0);
ths8200_write(sd, THS8200_DTG2_VS_IN_DLY_LSB, 0);
/* Polarity of received and transmitted sync signals */ if (bt->polarities & V4L2_DV_HSYNC_POS_POL) {
polarity |= 0x01; /* HS_IN */
polarity |= 0x08; /* HS_OUT */
} if (bt->polarities & V4L2_DV_VSYNC_POS_POL) {
polarity |= 0x02; /* VS_IN */
polarity |= 0x10; /* VS_OUT */
}
/* RGB mode, no embedded timings */ /* Timing of video input bus is derived from HS, VS, and FID dedicated * inputs
*/
ths8200_write(sd, THS8200_DTG2_CNTL, 0x44 | polarity);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.