📄 cpia2_core.c
字号:
(u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2); else cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2); /* Scaling registers (defaults) */ cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE; cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE; cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN; cmd.buffer.registers[i++].value = (u8) 31; cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN; cmd.buffer.registers[i++].value = (u8) 31; cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP; cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP; cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT; cmd.buffer.registers[i++].value = (u8) 0x81; /* = 8/1 = 8 (HIBYTE/LOBYTE) */ cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT; cmd.buffer.registers[i++].value = (u8) 0x81; /* = 8/1 = 8 (HIBYTE/LOBYTE) */ cmd.reg_count = i; cpia2_send_command(cam, &cmd); return i;}/****************************************************************************** * * config_sensor_500(cam) * *****************************************************************************/static int config_sensor_500(struct camera_data *cam, int req_width, int req_height){ struct cpia2_command cmd; int i = 0; int image_size = VIDEOSIZE_CIF; int image_type = VIDEOSIZE_VGA; int width = req_width; int height = req_height; unsigned int device = cam->params.pnp_id.device_type; image_size = cpia2_match_video_size(width, height); if (width > STV_IMAGE_CIF_COLS || height > STV_IMAGE_CIF_ROWS) image_type = VIDEOSIZE_VGA; else if (width > STV_IMAGE_QVGA_COLS || height > STV_IMAGE_QVGA_ROWS) image_type = VIDEOSIZE_CIF; else if (width > STV_IMAGE_QCIF_COLS || height > STV_IMAGE_QCIF_ROWS) image_type = VIDEOSIZE_QVGA; else image_type = VIDEOSIZE_QCIF; if (image_size >= 0) { set_vw_size(cam, image_size); width = cam->params.roi.width; height = cam->params.roi.height; } else { ERR("ConfigSensor500 failed\n"); return -EINVAL; } DBG("image_size = %d, width = %d, height = %d, type = %d\n", image_size, width, height, image_type); cmd.req_mode = CAMERAACCESS_TYPE_RANDOM | CAMERAACCESS_VC; cmd.direction = TRANSFER_WRITE; i = 0; /* VC Format */ cmd.buffer.registers[i].index = CPIA2_VC_VC_FORMAT; cmd.buffer.registers[i].value = (u8) CPIA2_VC_VC_FORMAT_UFIRST; if (image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i].value |= (u8) CPIA2_VC_VC_FORMAT_DECIMATING; i++; /* VC Clocks */ cmd.buffer.registers[i].index = CPIA2_VC_VC_CLOCKS; if (device == DEVICE_STV_672) { if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i].value = (u8)CPIA2_VC_VC_CLOCKS_LOGDIV1; else cmd.buffer.registers[i].value = (u8)(CPIA2_VC_VC_672_CLOCKS_SCALING | CPIA2_VC_VC_CLOCKS_LOGDIV3); } else { if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i].value = (u8)CPIA2_VC_VC_CLOCKS_LOGDIV0; else cmd.buffer.registers[i].value = (u8)(CPIA2_VC_VC_676_CLOCKS_SCALING | CPIA2_VC_VC_CLOCKS_LOGDIV2); } i++; DBG("VC_CLOCKS = 0x%X\n", cmd.buffer.registers[i-1].value); /* Input width from VP */ cmd.buffer.registers[i].index = CPIA2_VC_VC_IHSIZE_LO; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i].value = (u8) (STV_IMAGE_VGA_COLS / 4); else cmd.buffer.registers[i].value = (u8) (STV_IMAGE_QVGA_COLS / 4); i++; DBG("Input width = %d\n", cmd.buffer.registers[i-1].value); /* Timings */ cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_HI; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i++].value = (u8) 2; else cmd.buffer.registers[i++].value = (u8) 1; cmd.buffer.registers[i].index = CPIA2_VC_VC_XLIM_LO; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i++].value = (u8) 250; else if (image_type == VIDEOSIZE_QVGA) cmd.buffer.registers[i++].value = (u8) 125; else cmd.buffer.registers[i++].value = (u8) 160; cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_HI; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i++].value = (u8) 2; else cmd.buffer.registers[i++].value = (u8) 1; cmd.buffer.registers[i].index = CPIA2_VC_VC_YLIM_LO; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i++].value = (u8) 12; else if (image_type == VIDEOSIZE_QVGA) cmd.buffer.registers[i++].value = (u8) 64; else cmd.buffer.registers[i++].value = (u8) 6; /* Output Image Size */ cmd.buffer.registers[i].index = CPIA2_VC_VC_OHSIZE; if (image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = STV_IMAGE_CIF_COLS / 4; else cmd.buffer.registers[i++].value = width / 4; cmd.buffer.registers[i].index = CPIA2_VC_VC_OVSIZE; if (image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = STV_IMAGE_CIF_ROWS / 4; else cmd.buffer.registers[i++].value = height / 4; /* Cropping */ cmd.buffer.registers[i].index = CPIA2_VC_VC_HCROP; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_VGA_COLS / 4) - (width / 4)) / 2); else if (image_type == VIDEOSIZE_QVGA) cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_QVGA_COLS / 4) - (width / 4)) / 2); else if (image_type == VIDEOSIZE_CIF) cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_CIF_COLS / 4) - (width / 4)) / 2); else /*if (image_type == VIDEOSIZE_QCIF)*/ cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_QCIF_COLS / 4) - (width / 4)) / 2); cmd.buffer.registers[i].index = CPIA2_VC_VC_VCROP; if (image_type == VIDEOSIZE_VGA) cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_VGA_ROWS / 4) - (height / 4)) / 2); else if (image_type == VIDEOSIZE_QVGA) cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_QVGA_ROWS / 4) - (height / 4)) / 2); else if (image_type == VIDEOSIZE_CIF) cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_CIF_ROWS / 4) - (height / 4)) / 2); else /*if (image_type == VIDEOSIZE_QCIF)*/ cmd.buffer.registers[i++].value = (u8) (((STV_IMAGE_QCIF_ROWS / 4) - (height / 4)) / 2); /* Scaling registers (defaults) */ cmd.buffer.registers[i].index = CPIA2_VC_VC_HPHASE; if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = (u8) 36; else cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_VPHASE; if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = (u8) 32; else cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_HISPAN; if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = (u8) 26; else cmd.buffer.registers[i++].value = (u8) 31; cmd.buffer.registers[i].index = CPIA2_VC_VC_VISPAN; if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = (u8) 21; else cmd.buffer.registers[i++].value = (u8) 31; cmd.buffer.registers[i].index = CPIA2_VC_VC_HICROP; cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_VICROP; cmd.buffer.registers[i++].value = (u8) 0; cmd.buffer.registers[i].index = CPIA2_VC_VC_HFRACT; if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = (u8) 0x2B; /* 2/11 */ else cmd.buffer.registers[i++].value = (u8) 0x81; /* 8/1 */ cmd.buffer.registers[i].index = CPIA2_VC_VC_VFRACT; if (image_type == VIDEOSIZE_CIF || image_type == VIDEOSIZE_QCIF) cmd.buffer.registers[i++].value = (u8) 0x13; /* 1/3 */ else cmd.buffer.registers[i++].value = (u8) 0x81; /* 8/1 */ cmd.reg_count = i; cpia2_send_command(cam, &cmd); return i;}/****************************************************************************** * * setallproperties * * This sets all user changeable properties to the values in cam->params. *****************************************************************************/int set_all_properties(struct camera_data *cam){ /** * Don't set target_kb here, it will be set later. * framerate and user_mode were already set (set_default_user_mode). **/ cpia2_set_color_params(cam); cpia2_usb_change_streaming_alternate(cam, cam->params.camera_state.stream_mode); cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE, cam->params.vp_params.user_effects); cpia2_set_flicker_mode(cam, cam->params.flicker_control.flicker_mode_req); cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, TRANSFER_WRITE, cam->params.vp_params.gpio_direction); cpia2_do_command(cam, CPIA2_CMD_SET_VC_MP_GPIO_DATA, TRANSFER_WRITE, cam->params.vp_params.gpio_data); wake_system(cam); set_lowlight_boost(cam); return 0;}/****************************************************************************** * * cpia2_save_camera_state * *****************************************************************************/void cpia2_save_camera_state(struct camera_data *cam){ get_color_params(cam); cpia2_do_command(cam, CPIA2_CMD_GET_USER_EFFECTS, TRANSFER_READ, 0); cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION, TRANSFER_READ, 0); cpia2_do_command(cam, CPIA2_CMD_GET_VC_MP_GPIO_DATA, TRANSFER_READ, 0); /* Don't get framerate or target_kb. Trust the values we already have */}/****************************************************************************** * * get_color_params * *****************************************************************************/void get_color_params(struct camera_data *cam){ cpia2_do_command(cam, CPIA2_CMD_GET_VP_BRIGHTNESS, TRANSFER_READ, 0); cpia2_do_command(cam, CPIA2_CMD_GET_VP_SATURATION, TRANSFER_READ, 0); cpia2_do_command(cam, CPIA2_CMD_GET_CONTRAST, TRANSFER_READ, 0);}/****************************************************************************** * * cpia2_set_color_params * *****************************************************************************/void cpia2_set_color_params(struct camera_data *cam){ DBG("Setting color params\n"); cpia2_set_brightness(cam, cam->params.color_params.brightness); cpia2_set_contrast(cam, cam->params.color_params.contrast); cpia2_set_saturation(cam, cam->params.color_params.saturation);}/****************************************************************************** * * cpia2_set_flicker_mode * *****************************************************************************/int cpia2_set_flicker_mode(struct camera_data *cam, int mode){ unsigned char cam_reg; int err = 0; if(cam->params.pnp_id.device_type != DEVICE_STV_672) return -EINVAL; /* Set the appropriate bits in FLICKER_MODES, preserving the rest */ if((err = cpia2_do_command(cam, CPIA2_CMD_GET_FLICKER_MODES, TRANSFER_READ, 0))) return err; cam_reg = cam->params.flicker_control.cam_register; switch(mode) { case NEVER_FLICKER: cam_reg |= CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ; break; case FLICKER_60: cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; cam_reg &= ~CPIA2_VP_FLICKER_MODES_50HZ; break; case FLICKER_50: cam_reg &= ~CPIA2_VP_FLICKER_MODES_NEVER_FLICKER; cam_reg |= CPIA2_VP_FLICKER_MODES_50HZ; break; default: return -EINVAL; } if((err = cpia2_do_command(cam, CPIA2_CMD_SET_FLICKER_MODES, TRANSFER_WRITE, cam_reg))) return err; /* Set the appropriate bits in EXP_MODES, preserving the rest */ if((err = cpia2_do_command(cam, CPIA2_CMD_GET_VP_EXP_MODES, TRANSFER_READ, 0))) return err; cam_reg = cam->params.vp_params.exposure_modes; if (mode == NEVER_FLICKER) { cam_reg |= CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER; } else { cam_reg &= ~CPIA2_VP_EXPOSURE_MODES_INHIBIT_FLICKER; } if((err = cpia2_do_command(cam, CPIA2_CMD_SET_VP_EXP_MODES, TRANSFER_WRITE, cam_reg))) return err; if((err = cpia2_do_command(cam, CPIA2_CMD_REHASH_VP4, TRANSFER_WRITE, 1))) return err; switch(mode) { case NEVER_FLICKER: cam->params.flicker_control.flicker_mode_req = mode; break; case FLICKER_60: cam->params.flicker_control.flicker_mode_req = mode; cam->params.flicker_control.mains_frequency = 60; break; case FLICKER_50: cam->params.flicker_control.flicker_mode_req = mode; cam->params.flicker_control.mains_frequency = 50; break; default: err = -EINVAL; } return err;}/****************************************************************************** * * cpia2_set_property_flip * *****************************************************************************/void cpia2_set_property_flip(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_FLIP; } else { cam_reg &= ~CPIA2_VP_USER_EFFECTS_FLIP; } cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -