📄 cpia2_core.c
字号:
cam_reg);}/****************************************************************************** * * cpia2_set_property_mirror * *****************************************************************************/void cpia2_set_property_mirror(struct camera_data *cam, int prop_val){ unsigned char cam_reg; cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); cam_reg = cam->params.vp_params.user_effects; if (prop_val) { cam_reg |= CPIA2_VP_USER_EFFECTS_MIRROR; } else { cam_reg &= ~CPIA2_VP_USER_EFFECTS_MIRROR; } cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, cam_reg);}/****************************************************************************** * * set_target_kb * * The new Target KB is set in cam->params.vc_params.target_kb and * activates on reset. *****************************************************************************/int cpia2_set_target_kb(struct camera_data *cam, unsigned char value){ DBG("Requested target_kb = %d\n", value); if (value != cam->params.vc_params.target_kb) { cpia2_usb_stream_pause(cam); /* reset camera for new target_kb */ cam->params.vc_params.target_kb = value; cpia2_reset_camera(cam); cpia2_usb_stream_resume(cam); } return 0;}/****************************************************************************** * * cpia2_set_gpio * *****************************************************************************/int cpia2_set_gpio(struct camera_data *cam, unsigned char setting){ int ret; /* Set the microport direction (register 0x90, should be defined * already) to 1 (user output), and set the microport data (0x91) to * the value in the ioctl argument. */ ret = cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, CPIA2_VC_MP_DIR_OUTPUT, 255); if (ret < 0) return ret; cam->params.vp_params.gpio_direction = 255; ret = cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, CPIA2_VC_MP_DIR_OUTPUT, setting); if (ret < 0) return ret; cam->params.vp_params.gpio_data = setting; return 0;}/****************************************************************************** * * cpia2_set_fps * *****************************************************************************/int cpia2_set_fps(struct camera_data *cam, int framerate){ int retval; switch(framerate) { case CPIA2_VP_FRAMERATE_30: case CPIA2_VP_FRAMERATE_25: if(cam->params.pnp_id.device_type == DEVICE_STV_672 && cam->params.version.sensor_flags == CPIA2_VP_SENSOR_FLAGS_500) { return -EINVAL; } /* Fall through */ case CPIA2_VP_FRAMERATE_15: case CPIA2_VP_FRAMERATE_12_5: case CPIA2_VP_FRAMERATE_7_5: case CPIA2_VP_FRAMERATE_6_25: break; default: return -EINVAL; } if (cam->params.pnp_id.device_type == DEVICE_STV_672 && framerate == CPIA2_VP_FRAMERATE_15) framerate = 0; /* Work around bug in VP4 */ retval = cpia2_do_command(cam, CPIA2_CMD_FRAMERATE_REQ, TRANSFER_WRITE, framerate); if(retval == 0) cam->params.vp_params.frame_rate = framerate; return retval;}/****************************************************************************** * * cpia2_set_brightness * *****************************************************************************/void cpia2_set_brightness(struct camera_data *cam, unsigned char value){ /*** * Don't let the register be set to zero - bug in VP4 - flash of full * brightness ***/ if (cam->params.pnp_id.device_type == DEVICE_STV_672 && value == 0) value++; DBG("Setting brightness to %d (0x%0x)\n", value, value); cpia2_do_command(cam,CPIA2_CMD_SET_VP_BRIGHTNESS, TRANSFER_WRITE,value);}/****************************************************************************** * * cpia2_set_contrast * *****************************************************************************/void cpia2_set_contrast(struct camera_data *cam, unsigned char value){ DBG("Setting contrast to %d (0x%0x)\n", value, value); cam->params.color_params.contrast = value; cpia2_do_command(cam, CPIA2_CMD_SET_CONTRAST, TRANSFER_WRITE, value);}/****************************************************************************** * * cpia2_set_saturation * *****************************************************************************/void cpia2_set_saturation(struct camera_data *cam, unsigned char value){ DBG("Setting saturation to %d (0x%0x)\n", value, value); cam->params.color_params.saturation = value; cpia2_do_command(cam,CPIA2_CMD_SET_VP_SATURATION, TRANSFER_WRITE,value);}/****************************************************************************** * * wake_system * *****************************************************************************/void wake_system(struct camera_data *cam){ cpia2_do_command(cam, CPIA2_CMD_SET_WAKEUP, TRANSFER_WRITE, 0);}/****************************************************************************** * * set_lowlight_boost * * Valid for STV500 sensor only *****************************************************************************/void set_lowlight_boost(struct camera_data *cam){ struct cpia2_command cmd; if (cam->params.pnp_id.device_type != DEVICE_STV_672 || cam->params.version.sensor_flags != CPIA2_VP_SENSOR_FLAGS_500) return; cmd.direction = TRANSFER_WRITE; cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; cmd.reg_count = 3; cmd.start = CPIA2_VP_RAM_ADDR_H; cmd.buffer.block_data[0] = 0; /* High byte of address to write to */ cmd.buffer.block_data[1] = 0x59; /* Low byte of address to write to */ cmd.buffer.block_data[2] = 0; /* High byte of data to write */ cpia2_send_command(cam, &cmd); if (cam->params.vp_params.lowlight_boost) { cmd.buffer.block_data[0] = 0x02; /* Low byte data to write */ } else { cmd.buffer.block_data[0] = 0x06; } cmd.start = CPIA2_VP_RAM_DATA; cmd.reg_count = 1; cpia2_send_command(cam, &cmd); /* Rehash the VP4 values */ cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, TRANSFER_WRITE, 1);}/****************************************************************************** * * cpia2_set_format * * Assumes that new size is already set in param struct. *****************************************************************************/void cpia2_set_format(struct camera_data *cam){ cam->flush = true; cpia2_usb_stream_pause(cam); /* reset camera to new size */ cpia2_set_low_power(cam); cpia2_reset_camera(cam); cam->flush = false; cpia2_dbg_dump_registers(cam); cpia2_usb_stream_resume(cam);}/****************************************************************************** * * cpia2_dbg_dump_registers * *****************************************************************************/void cpia2_dbg_dump_registers(struct camera_data *cam){#ifdef _CPIA2_DEBUG_ struct cpia2_command cmd; if (!(debugs_on & DEBUG_DUMP_REGS)) return; cmd.direction = TRANSFER_READ; /* Start with bank 0 (SYSTEM) */ cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_SYSTEM; cmd.reg_count = 3; cmd.start = 0; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "System Device Hi = 0x%X\n", cmd.buffer.block_data[0]); printk(KERN_DEBUG "System Device Lo = 0x%X\n", cmd.buffer.block_data[1]); printk(KERN_DEBUG "System_system control = 0x%X\n", cmd.buffer.block_data[2]); /* Bank 1 (VC) */ cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC; cmd.reg_count = 4; cmd.start = 0x80; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "ASIC_ID = 0x%X\n", cmd.buffer.block_data[0]); printk(KERN_DEBUG "ASIC_REV = 0x%X\n", cmd.buffer.block_data[1]); printk(KERN_DEBUG "PW_CONTRL = 0x%X\n", cmd.buffer.block_data[2]); printk(KERN_DEBUG "WAKEUP = 0x%X\n", cmd.buffer.block_data[3]); cmd.start = 0xA0; /* ST_CTRL */ cmd.reg_count = 1; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "Stream ctrl = 0x%X\n", cmd.buffer.block_data[0]); cmd.start = 0xA4; /* Stream status */ cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "Stream status = 0x%X\n", cmd.buffer.block_data[0]); cmd.start = 0xA8; /* USB status */ cmd.reg_count = 3; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "USB_CTRL = 0x%X\n", cmd.buffer.block_data[0]); printk(KERN_DEBUG "USB_STRM = 0x%X\n", cmd.buffer.block_data[1]); printk(KERN_DEBUG "USB_STATUS = 0x%X\n", cmd.buffer.block_data[2]); cmd.start = 0xAF; /* USB settings */ cmd.reg_count = 1; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "USB settings = 0x%X\n", cmd.buffer.block_data[0]); cmd.start = 0xC0; /* VC stuff */ cmd.reg_count = 26; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "VC Control = 0x%0X\n", cmd.buffer.block_data[0]); printk(KERN_DEBUG "VC Format = 0x%0X\n", cmd.buffer.block_data[3]); printk(KERN_DEBUG "VC Clocks = 0x%0X\n", cmd.buffer.block_data[4]); printk(KERN_DEBUG "VC IHSize = 0x%0X\n", cmd.buffer.block_data[5]); printk(KERN_DEBUG "VC Xlim Hi = 0x%0X\n", cmd.buffer.block_data[6]); printk(KERN_DEBUG "VC XLim Lo = 0x%0X\n", cmd.buffer.block_data[7]); printk(KERN_DEBUG "VC YLim Hi = 0x%0X\n", cmd.buffer.block_data[8]); printk(KERN_DEBUG "VC YLim Lo = 0x%0X\n", cmd.buffer.block_data[9]); printk(KERN_DEBUG "VC OHSize = 0x%0X\n", cmd.buffer.block_data[10]); printk(KERN_DEBUG "VC OVSize = 0x%0X\n", cmd.buffer.block_data[11]); printk(KERN_DEBUG "VC HCrop = 0x%0X\n", cmd.buffer.block_data[12]); printk(KERN_DEBUG "VC VCrop = 0x%0X\n", cmd.buffer.block_data[13]); printk(KERN_DEBUG "VC HPhase = 0x%0X\n", cmd.buffer.block_data[14]); printk(KERN_DEBUG "VC VPhase = 0x%0X\n", cmd.buffer.block_data[15]); printk(KERN_DEBUG "VC HIspan = 0x%0X\n", cmd.buffer.block_data[16]); printk(KERN_DEBUG "VC VIspan = 0x%0X\n", cmd.buffer.block_data[17]); printk(KERN_DEBUG "VC HiCrop = 0x%0X\n", cmd.buffer.block_data[18]); printk(KERN_DEBUG "VC ViCrop = 0x%0X\n", cmd.buffer.block_data[19]); printk(KERN_DEBUG "VC HiFract = 0x%0X\n", cmd.buffer.block_data[20]); printk(KERN_DEBUG "VC ViFract = 0x%0X\n", cmd.buffer.block_data[21]); printk(KERN_DEBUG "VC JPeg Opt = 0x%0X\n", cmd.buffer.block_data[22]); printk(KERN_DEBUG "VC Creep Per = 0x%0X\n", cmd.buffer.block_data[23]); printk(KERN_DEBUG "VC User Sq. = 0x%0X\n", cmd.buffer.block_data[24]); printk(KERN_DEBUG "VC Target KB = 0x%0X\n", cmd.buffer.block_data[25]); /*** VP ***/ cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VP; cmd.reg_count = 14; cmd.start = 0; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "VP Dev Hi = 0x%0X\n", cmd.buffer.block_data[0]); printk(KERN_DEBUG "VP Dev Lo = 0x%0X\n", cmd.buffer.block_data[1]); printk(KERN_DEBUG "VP Sys State = 0x%0X\n", cmd.buffer.block_data[2]); printk(KERN_DEBUG "VP Sys Ctrl = 0x%0X\n", cmd.buffer.block_data[3]); printk(KERN_DEBUG "VP Sensor flg = 0x%0X\n", cmd.buffer.block_data[5]); printk(KERN_DEBUG "VP Sensor Rev = 0x%0X\n", cmd.buffer.block_data[6]); printk(KERN_DEBUG "VP Dev Config = 0x%0X\n", cmd.buffer.block_data[7]); printk(KERN_DEBUG "VP GPIO_DIR = 0x%0X\n", cmd.buffer.block_data[8]); printk(KERN_DEBUG "VP GPIO_DATA = 0x%0X\n", cmd.buffer.block_data[9]); printk(KERN_DEBUG "VP Ram ADDR H = 0x%0X\n", cmd.buffer.block_data[10]); printk(KERN_DEBUG "VP Ram ADDR L = 0x%0X\n", cmd.buffer.block_data[11]); printk(KERN_DEBUG "VP RAM Data = 0x%0X\n", cmd.buffer.block_data[12]); printk(KERN_DEBUG "Do Call = 0x%0X\n", cmd.buffer.block_data[13]); if (cam->params.pnp_id.device_type == DEVICE_STV_672) { cmd.reg_count = 9; cmd.start = 0x0E; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "VP Clock Ctrl = 0x%0X\n", cmd.buffer.block_data[0]); printk(KERN_DEBUG "VP Patch Rev = 0x%0X\n", cmd.buffer.block_data[1]); printk(KERN_DEBUG "VP Vid Mode = 0x%0X\n", cmd.buffer.block_data[2]); printk(KERN_DEBUG "VP Framerate = 0x%0X\n", cmd.buffer.block_data[3]); printk(KERN_DEBUG "VP UserEffect = 0x%0X\n", cmd.buffer.block_data[4]); printk(KERN_DEBUG "VP White Bal = 0x%0X\n", cmd.buffer.block_data[5]); printk(KERN_DEBUG "VP WB thresh = 0x%0X\n", cmd.buffer.block_data[6]); printk(KERN_DEBUG "VP Exp Modes = 0x%0X\n", cmd.buffer.block_data[7]); printk(KERN_DEBUG "VP Exp Target = 0x%0X\n", cmd.buffer.block_data[8]); cmd.reg_count = 1; cmd.start = 0x1B; cpia2_send_command(cam, &cmd); printk(KERN_DEBUG "VP FlickerMds = 0x%0X\n", cmd.buffer.block_data[0]); } else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -