Ejemplo n.º 1
0
static int32_t ov2720_write_exp_gain(struct msm_sensor_ctrl_t *s_ctrl,
		uint16_t gain, uint32_t line)
{
	uint32_t fl_lines, offset;
	uint8_t int_time[3];
	fl_lines =
		(s_ctrl->curr_frame_length_lines * s_ctrl->fps_divider) / Q10;
	offset = s_ctrl->sensor_exp_gain_info->vert_offset;
	if (line > (fl_lines - offset))
		fl_lines = line + offset;

	s_ctrl->func_tbl->sensor_group_hold_on(s_ctrl);
	msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
		s_ctrl->sensor_output_reg_addr->frame_length_lines, fl_lines,
		MSM_CAMERA_I2C_WORD_DATA);
	int_time[0] = line >> 12;
	int_time[1] = line >> 4;
	int_time[2] = line << 4;
	msm_camera_i2c_write_seq(s_ctrl->sensor_i2c_client,
		s_ctrl->sensor_exp_gain_info->coarse_int_time_addr-1,
		&int_time[0], 3);
	msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
		s_ctrl->sensor_exp_gain_info->global_gain_addr, gain,
		MSM_CAMERA_I2C_WORD_DATA);
	s_ctrl->func_tbl->sensor_group_hold_off(s_ctrl);
	return 0;
}
void RamWrite32A_lc898111(uint16_t addr, uint32_t data)
{
	int32_t rc = 0;
	uint8_t *data_ptr;
	uint8_t dummy[4];

	if (binder_i2c_client == NULL)
		return;

	data_ptr = (uint8_t *)(&data);
	dummy[0] = *(data_ptr+3);
	dummy[1] = *(data_ptr+2);
	dummy[2] = *(data_ptr+1);
	dummy[3] = *(data_ptr);
	*(data_ptr) = dummy[0];
	*(data_ptr+1) = dummy[1];
	*(data_ptr+2) = dummy[2];
	*(data_ptr+3) = dummy[3];

	rc = msm_camera_i2c_write_seq(binder_i2c_client, addr, (uint8_t *)&data, 4);
	if (rc < 0) {
		pr_err("%s i2c write failed (%d)\n", __func__, rc);
		return;
	}
}
void RegWriteA_lc898111(uint16_t addr, uint8_t data)
{
	int32_t rc = 0;

	if (binder_i2c_client == NULL)
		return;

	rc = msm_camera_i2c_write_seq(binder_i2c_client, addr, (uint8_t *)&data, 1);
	if (rc < 0) {
		pr_err("%s i2c write failed (%d)\n", __func__, rc);
		return;
	}
}
/* TBD: Need to revisit*/
static int32_t ov10820_write_exp_gain(struct msm_sensor_ctrl_t *s_ctrl,
		uint16_t gain, uint32_t line, int32_t luma_avg, uint16_t fgain)
{
	uint32_t fl_lines, offset;
	uint8_t int_time[3];

	fl_lines =
		(s_ctrl->curr_frame_length_lines * s_ctrl->fps_divider) / Q10;
	offset = s_ctrl->sensor_exp_gain_info->vert_offset;
	if (line > (fl_lines - offset))
		fl_lines = line + offset;

	fl_lines += (fl_lines & 0x1);

	int_time[0] = line >> 12;
	int_time[1] = line >> 4;
	int_time[2] = line << 4;

	if (allow_asic_control) {
		msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
				s_ctrl->sensor_output_reg_addr->
				frame_length_lines, fl_lines,
				MSM_CAMERA_I2C_WORD_DATA);
		ov660_set_i2c_bypass(0);
		ov660_set_exposure_gain(gain, line);
		ov660_set_i2c_bypass(1);
	} else {
		s_ctrl->func_tbl->sensor_group_hold_on(s_ctrl);
		msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
				s_ctrl->sensor_output_reg_addr->
				frame_length_lines, fl_lines,
				MSM_CAMERA_I2C_WORD_DATA);
		msm_camera_i2c_write_seq(s_ctrl->sensor_i2c_client,
				s_ctrl->sensor_exp_gain_info->
				coarse_int_time_addr, &int_time[0], 3);
		msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
				s_ctrl->sensor_exp_gain_info->
				global_gain_addr, gain,
				MSM_CAMERA_I2C_BYTE_DATA);
		s_ctrl->func_tbl->sensor_group_hold_off(s_ctrl);
		if (update_ov660_gain)
			ov660_set_exposure_gain2(gain, line);
	}

	return 0;
}
static int32_t ov5693_write_exp_gain(struct msm_sensor_ctrl_t *s_ctrl,
		uint16_t gain, uint32_t line, int32_t x, uint16_t y)
{
	uint32_t fl_lines, offset;
	uint8_t int_time[3];

	s_ctrl->func_tbl->sensor_group_hold_on(s_ctrl);

	/* adjust the frame rate */
	fl_lines = (s_ctrl->curr_frame_length_lines * s_ctrl->fps_divider) / Q10;
	offset = s_ctrl->sensor_exp_gain_info->vert_offset;
	if (line > (fl_lines - offset))
		fl_lines = line + offset;
	fl_lines += (fl_lines & 0x1);

	CDBG("gain:%d line:%d fl_line:%d\n", gain, line, fl_lines);

	msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
		s_ctrl->sensor_output_reg_addr->frame_length_lines, fl_lines,
		MSM_CAMERA_I2C_WORD_DATA);

	/* exposure control */
	line = line << 4;
	int_time[0] = (uint8_t)(line >> 16);
	int_time[1] = (uint8_t)((line & 0xFFFF) >> 8);
	int_time[2] = (uint8_t)(line & 0xFF);

	msm_camera_i2c_write_seq(s_ctrl->sensor_i2c_client,
		s_ctrl->sensor_exp_gain_info->coarse_int_time_addr,
		&int_time[0], 3);

	/* gain control */
	msm_camera_i2c_write(s_ctrl->sensor_i2c_client,
		s_ctrl->sensor_exp_gain_info->global_gain_addr, gain,
		MSM_CAMERA_I2C_WORD_DATA);

	s_ctrl->func_tbl->sensor_group_hold_off(s_ctrl);

	return 0;
}