in usb/cpia2/cpia2_core.c [128:514]
int cpia2_do_command(struct camera_data *cam,
u32 command, u8 direction, u8 param)
{
int retval = 0;
struct cpia2_command cmd;
unsigned int device = cam->params.pnp_id.device_type;
cmd.command = command;
cmd.reg_count = 2; /* default */
cmd.direction = direction;
/***
* Set up the command.
***/
switch (command) {
case CPIA2_CMD_GET_VERSION:
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.start = CPIA2_SYSTEM_DEVICE_HI;
break;
case CPIA2_CMD_GET_PNP_ID:
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.reg_count = 8;
cmd.start = CPIA2_SYSTEM_DESCRIP_VID_HI;
break;
case CPIA2_CMD_GET_ASIC_TYPE:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
cmd.start = CPIA2_VC_ASIC_ID;
break;
case CPIA2_CMD_GET_SENSOR:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.start = CPIA2_VP_SENSOR_FLAGS;
break;
case CPIA2_CMD_GET_VP_DEVICE:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.start = CPIA2_VP_DEVICEH;
break;
case CPIA2_CMD_SET_VP_BRIGHTNESS:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VP_BRIGHTNESS:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
if (device == DEVICE_STV_672)
cmd.start = CPIA2_VP4_EXPOSURE_TARGET;
else
cmd.start = CPIA2_VP5_EXPOSURE_TARGET;
break;
case CPIA2_CMD_SET_CONTRAST:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_CONTRAST:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_YRANGE;
break;
case CPIA2_CMD_SET_VP_SATURATION:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VP_SATURATION:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
if (device == DEVICE_STV_672)
cmd.start = CPIA2_VP_SATURATION;
else
cmd.start = CPIA2_VP5_MCUVSATURATION;
break;
case CPIA2_CMD_SET_VP_GPIO_DATA:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VP_GPIO_DATA:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_GPIO_DATA;
break;
case CPIA2_CMD_SET_VP_GPIO_DIRECTION:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VP_GPIO_DIRECTION:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_GPIO_DIRECTION;
break;
case CPIA2_CMD_SET_VC_MP_GPIO_DATA:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VC_MP_GPIO_DATA:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
cmd.reg_count = 1;
cmd.start = CPIA2_VC_MP_DATA;
break;
case CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
cmd.reg_count = 1;
cmd.start = CPIA2_VC_MP_DIR;
break;
case CPIA2_CMD_ENABLE_PACKET_CTRL:
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.start = CPIA2_SYSTEM_INT_PACKET_CTRL;
cmd.reg_count = 1;
cmd.buffer.block_data[0] = param;
break;
case CPIA2_CMD_SET_FLICKER_MODES:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_FLICKER_MODES:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_FLICKER_MODES;
break;
case CPIA2_CMD_RESET_FIFO: /* clear fifo and enable stream block */
cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
cmd.reg_count = 2;
cmd.start = 0;
cmd.buffer.registers[0].index = CPIA2_VC_ST_CTRL;
cmd.buffer.registers[0].value = CPIA2_VC_ST_CTRL_SRC_VC |
CPIA2_VC_ST_CTRL_DST_USB | CPIA2_VC_ST_CTRL_EOF_DETECT;
cmd.buffer.registers[1].index = CPIA2_VC_ST_CTRL;
cmd.buffer.registers[1].value = CPIA2_VC_ST_CTRL_SRC_VC |
CPIA2_VC_ST_CTRL_DST_USB |
CPIA2_VC_ST_CTRL_EOF_DETECT |
CPIA2_VC_ST_CTRL_FIFO_ENABLE;
break;
case CPIA2_CMD_SET_HI_POWER:
cmd.req_mode =
CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_SYSTEM;
cmd.reg_count = 2;
cmd.buffer.registers[0].index =
CPIA2_SYSTEM_SYSTEM_CONTROL;
cmd.buffer.registers[1].index =
CPIA2_SYSTEM_SYSTEM_CONTROL;
cmd.buffer.registers[0].value = CPIA2_SYSTEM_CONTROL_CLEAR_ERR;
cmd.buffer.registers[1].value =
CPIA2_SYSTEM_CONTROL_HIGH_POWER;
break;
case CPIA2_CMD_SET_LOW_POWER:
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.reg_count = 1;
cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL;
cmd.buffer.block_data[0] = 0;
break;
case CPIA2_CMD_CLEAR_V2W_ERR:
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.reg_count = 1;
cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL;
cmd.buffer.block_data[0] = CPIA2_SYSTEM_CONTROL_CLEAR_ERR;
break;
case CPIA2_CMD_SET_USER_MODE:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_USER_MODE:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
if (device == DEVICE_STV_672)
cmd.start = CPIA2_VP4_USER_MODE;
else
cmd.start = CPIA2_VP5_USER_MODE;
break;
case CPIA2_CMD_FRAMERATE_REQ:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
if (device == DEVICE_STV_672)
cmd.start = CPIA2_VP4_FRAMERATE_REQUEST;
else
cmd.start = CPIA2_VP5_FRAMERATE_REQUEST;
cmd.buffer.block_data[0] = param;
break;
case CPIA2_CMD_SET_WAKEUP:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_WAKEUP:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
cmd.reg_count = 1;
cmd.start = CPIA2_VC_WAKEUP;
break;
case CPIA2_CMD_SET_PW_CONTROL:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_PW_CONTROL:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
cmd.reg_count = 1;
cmd.start = CPIA2_VC_PW_CTRL;
break;
case CPIA2_CMD_GET_VP_SYSTEM_STATE:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_SYSTEMSTATE;
break;
case CPIA2_CMD_SET_SYSTEM_CTRL:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_SYSTEM_CTRL:
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.reg_count = 1;
cmd.start = CPIA2_SYSTEM_SYSTEM_CONTROL;
break;
case CPIA2_CMD_SET_VP_SYSTEM_CTRL:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VP_SYSTEM_CTRL:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_SYSTEMCTRL;
break;
case CPIA2_CMD_SET_VP_EXP_MODES:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VP_EXP_MODES:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_EXPOSURE_MODES;
break;
case CPIA2_CMD_SET_DEVICE_CONFIG:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_DEVICE_CONFIG:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_DEVICE_CONFIG;
break;
case CPIA2_CMD_SET_SERIAL_ADDR:
cmd.buffer.block_data[0] = param;
cmd.req_mode =
CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM;
cmd.reg_count = 1;
cmd.start = CPIA2_SYSTEM_VP_SERIAL_ADDR;
break;
case CPIA2_CMD_SET_SENSOR_CR1:
cmd.buffer.block_data[0] = param;
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_SENSOR_CR1;
break;
case CPIA2_CMD_SET_VC_CONTROL:
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_VC_CONTROL:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
cmd.reg_count = 1;
cmd.start = CPIA2_VC_VC_CTRL;
break;
case CPIA2_CMD_SET_TARGET_KB:
cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
cmd.reg_count = 1;
cmd.buffer.registers[0].index = CPIA2_VC_VC_TARGET_KB;
cmd.buffer.registers[0].value = param;
break;
case CPIA2_CMD_SET_DEF_JPEG_OPT:
cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC;
cmd.reg_count = 4;
cmd.buffer.registers[0].index = CPIA2_VC_VC_JPEG_OPT;
cmd.buffer.registers[0].value =
CPIA2_VC_VC_JPEG_OPT_DOUBLE_SQUEEZE;
cmd.buffer.registers[1].index = CPIA2_VC_VC_USER_SQUEEZE;
cmd.buffer.registers[1].value = 20;
cmd.buffer.registers[2].index = CPIA2_VC_VC_CREEP_PERIOD;
cmd.buffer.registers[2].value = 2;
cmd.buffer.registers[3].index = CPIA2_VC_VC_JPEG_OPT;
cmd.buffer.registers[3].value = CPIA2_VC_VC_JPEG_OPT_DEFAULT;
break;
case CPIA2_CMD_REHASH_VP4:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
cmd.start = CPIA2_VP_REHASH_VALUES;
cmd.buffer.block_data[0] = param;
break;
case CPIA2_CMD_SET_USER_EFFECTS: /* Note: Be careful with this as
this register can also affect
flicker modes */
cmd.buffer.block_data[0] = param;
fallthrough;
case CPIA2_CMD_GET_USER_EFFECTS:
cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP;
cmd.reg_count = 1;
if (device == DEVICE_STV_672)
cmd.start = CPIA2_VP4_USER_EFFECTS;
else
cmd.start = CPIA2_VP5_USER_EFFECTS;
break;
default:
LOG("DoCommand received invalid command\n");
return -EINVAL;
}
retval = cpia2_send_command(cam, &cmd);
if (retval) {
return retval;
}
/***
* Now copy any results from a read into the appropriate param struct.
***/
switch (command) {
case CPIA2_CMD_GET_VERSION:
cam->params.version.firmware_revision_hi =
cmd.buffer.block_data[0];
cam->params.version.firmware_revision_lo =
cmd.buffer.block_data[1];
break;
case CPIA2_CMD_GET_PNP_ID:
cam->params.pnp_id.vendor = (cmd.buffer.block_data[0] << 8) |
cmd.buffer.block_data[1];
cam->params.pnp_id.product = (cmd.buffer.block_data[2] << 8) |
cmd.buffer.block_data[3];
cam->params.pnp_id.device_revision =
(cmd.buffer.block_data[4] << 8) |
cmd.buffer.block_data[5];
if (cam->params.pnp_id.vendor == 0x553) {
if (cam->params.pnp_id.product == 0x100) {
cam->params.pnp_id.device_type = DEVICE_STV_672;
} else if (cam->params.pnp_id.product == 0x140 ||
cam->params.pnp_id.product == 0x151) {
cam->params.pnp_id.device_type = DEVICE_STV_676;
}
}
break;
case CPIA2_CMD_GET_ASIC_TYPE:
cam->params.version.asic_id = cmd.buffer.block_data[0];
cam->params.version.asic_rev = cmd.buffer.block_data[1];
break;
case CPIA2_CMD_GET_SENSOR:
cam->params.version.sensor_flags = cmd.buffer.block_data[0];
cam->params.version.sensor_rev = cmd.buffer.block_data[1];
break;
case CPIA2_CMD_GET_VP_DEVICE:
cam->params.version.vp_device_hi = cmd.buffer.block_data[0];
cam->params.version.vp_device_lo = cmd.buffer.block_data[1];
break;
case CPIA2_CMD_GET_VP_GPIO_DATA:
cam->params.vp_params.gpio_data = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VP_GPIO_DIRECTION:
cam->params.vp_params.gpio_direction = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION:
cam->params.vc_params.vc_mp_direction =cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VC_MP_GPIO_DATA:
cam->params.vc_params.vc_mp_data = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_FLICKER_MODES:
cam->params.flicker_control.cam_register =
cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_WAKEUP:
cam->params.vc_params.wakeup = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_PW_CONTROL:
cam->params.vc_params.pw_control = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_SYSTEM_CTRL:
cam->params.camera_state.system_ctrl = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VP_SYSTEM_STATE:
cam->params.vp_params.system_state = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VP_SYSTEM_CTRL:
cam->params.vp_params.system_ctrl = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VP_EXP_MODES:
cam->params.vp_params.exposure_modes = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_DEVICE_CONFIG:
cam->params.vp_params.device_config = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_VC_CONTROL:
cam->params.vc_params.vc_control = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_USER_MODE:
cam->params.vp_params.video_mode = cmd.buffer.block_data[0];
break;
case CPIA2_CMD_GET_USER_EFFECTS:
cam->params.vp_params.user_effects = cmd.buffer.block_data[0];
break;
default:
break;
}
return retval;
}