staticint adv7393_setstd(struct v4l2_subdev *sd, v4l2_std_id std)
{ struct adv7393_state *state = to_state(sd); conststruct adv7393_std_info *std_info; int num_std;
u8 reg;
u32 val; int err = 0; int i;
num_std = ARRAY_SIZE(stdinfo);
for (i = 0; i < num_std; i++) { if (stdinfo[i].stdid & std) break;
}
if (i == num_std) {
v4l2_dbg(1, debug, sd, "Invalid std or std is not supported: %llx\n",
(unsignedlonglong)std); return -EINVAL;
}
std_info = &stdinfo[i];
/* Set the standard */
val = state->reg80 & ~SD_STD_MASK;
val |= std_info->standard_val3;
err = adv7393_write(sd, ADV7393_SD_MODE_REG1, val); if (err < 0) goto setstd_exit;
state->reg80 = val;
/* Configure the input mode register */
val = state->reg01 & ~INPUT_MODE_MASK;
val |= SD_INPUT_MODE;
err = adv7393_write(sd, ADV7393_MODE_SELECT_REG, val); if (err < 0) goto setstd_exit;
state->reg01 = val;
/* Program the sub carrier frequency registers */
val = std_info->fsc_val; for (reg = ADV7393_FSC_REG0; reg <= ADV7393_FSC_REG3; reg++) {
err = adv7393_write(sd, reg, val); if (err < 0) goto setstd_exit;
val >>= 8;
}
val = state->reg82;
/* Pedestal settings */ if (std & (V4L2_STD_NTSC | V4L2_STD_NTSC_443))
val |= SD_PEDESTAL_EN; else
val &= SD_PEDESTAL_DI;
if (output_type > ADV7393_SVIDEO_ID) {
v4l2_dbg(1, debug, sd, "Invalid output type or output type not supported:%d\n",
output_type); return -EINVAL;
}
/* Enable Appropriate DAC */
val = state->reg00 & 0x03;
if (output_type == ADV7393_COMPOSITE_ID)
val |= ADV7393_COMPOSITE_POWER_VALUE; elseif (output_type == ADV7393_COMPONENT_ID)
val |= ADV7393_COMPONENT_POWER_VALUE; else
val |= ADV7393_SVIDEO_POWER_VALUE;
/* configure SD DAC Output 1 bit */
val = state->reg82; if (output_type == ADV7393_COMPONENT_ID)
val &= SD_DAC_OUT1_DI; else
val |= SD_DAC_OUT1_EN;
err = adv7393_write(sd, ADV7393_SD_MODE_REG2, val); if (err < 0) goto setoutput_exit;
state->reg82 = val;
/* configure ED/HD Color DAC Swap bit to zero */
val = state->reg35 & HD_DAC_SWAP_DI;
err = adv7393_write(sd, ADV7393_HD_MODE_REG6, val); if (err < 0) goto setoutput_exit;
/* Configure for default video standard */
err = adv7393_setoutput(sd, state->output); if (err < 0) {
v4l2_err(sd, "Error setting output during init\n"); return -EINVAL;
}
err = adv7393_setstd(sd, state->std); if (err < 0) {
v4l2_err(sd, "Error setting std during init\n"); return -EINVAL;
}
return err;
}
staticint adv7393_probe(struct i2c_client *client)
{ struct adv7393_state *state; int err;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -ENODEV;
v4l_info(client, "chip found @ 0x%x (%s)\n",
client->addr << 1, client->adapter->name);
state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); if (state == NULL) return -ENOMEM;
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.