media: rk-isp10: modify for af function

add af funtion first time

Change-Id: I91fc8c532e47987cc63694b242f5bac7ef1bc59c
Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
This commit is contained in:
Hu Kejun
2018-05-22 18:42:28 +08:00
committed by Tao Huang
parent 347d89b653
commit bb7bcb0a02
8 changed files with 104 additions and 14 deletions

View File

@@ -4917,11 +4917,23 @@ static int cif_isp10_start(
cif_isp10_img_src_ioctl(dev->img_src,
RK_VIDIOC_SENSOR_MODE_DATA,
&dev->img_src_exps.data[0].data);
cif_isp10_img_src_ioctl(dev->img_src,
RK_VIDIOC_SENSOR_MODE_DATA,
&dev->img_src_exps.data[1].data);
dev->img_src_exps.data[0].v_frame_id = 0;
dev->img_src_exps.data[1].v_frame_id = 0;
dev->img_src_exps.data[0].data.isp_input_width =
dev->config.isp_config.input->defrect.width;
dev->img_src_exps.data[0].data.isp_input_height =
dev->config.isp_config.input->defrect.height;
dev->img_src_exps.data[0].data.isp_input_horizontal_start =
dev->config.isp_config.input->defrect.left;
dev->img_src_exps.data[0].data.isp_input_vertical_start =
dev->config.isp_config.input->defrect.top;
dev->img_src_exps.data[0].data.isp_output_width =
dev->config.isp_config.output.width;
dev->img_src_exps.data[0].data.isp_output_height =
dev->config.isp_config.output.height;
memcpy(&dev->img_src_exps.data[1], &dev->img_src_exps.data[0],
sizeof(dev->img_src_exps.data[0]));
mutex_unlock(&dev->img_src_exps.mutex);
cif_isp10_pltfrm_rtrace_printf(dev->dev,
@@ -5257,6 +5269,19 @@ static void cif_isp10_vs_work(struct work_struct *work)
cif_isp10_img_src_ioctl(dev->img_src,
RK_VIDIOC_SENSOR_MODE_DATA,
&new_data->data);
new_data->data.isp_input_width =
dev->config.isp_config.input->defrect.width;
new_data->data.isp_input_height =
dev->config.isp_config.input->defrect.height;
new_data->data.isp_input_horizontal_start =
dev->config.isp_config.input->defrect.left;
new_data->data.isp_input_vertical_start =
dev->config.isp_config.input->defrect.top;
new_data->data.isp_output_width =
dev->config.isp_config.output.width;
new_data->data.isp_output_height =
dev->config.isp_config.output.height;
mutex_unlock(&dev->img_src_exps.mutex);
/*
@@ -6000,6 +6025,17 @@ failed:
return retval;
}
int cif_isp10_s_vcm(
struct cif_isp10_device *dev,
unsigned int id,
int val)
{
if (dev->img_src != NULL)
cif_isp10_img_src_ioctl(dev->img_src,
PLTFRM_CIFCAM_SET_VCM_POS, &val);
return 0;
}
int cif_isp10_s_isp_metadata(
struct cif_isp10_device *dev,
struct cif_isp10_isp_readout_work *readout_work,
@@ -6363,7 +6399,6 @@ int cif_isp10_s_ctrl(
case CIF_ISP10_CID_ANALOG_GAIN:
case CIF_ISP10_CID_EXPOSURE_TIME:
case CIF_ISP10_CID_BLACK_LEVEL:
case CIF_ISP10_CID_FOCUS_ABSOLUTE:
case CIF_ISP10_CID_AUTO_N_PRESET_WHITE_BALANCE:
case CIF_ISP10_CID_SCENE_MODE:
case CIF_ISP10_CID_AUTO_FPS:
@@ -6371,6 +6406,8 @@ int cif_isp10_s_ctrl(
case CIF_ISP10_CID_VFLIP:
return cif_isp10_img_src_s_ctrl(dev->img_src,
id, val);
case CIF_ISP10_CID_FOCUS_ABSOLUTE:
return cif_isp10_s_vcm(dev, id, val);
default:
cif_isp10_pltfrm_pr_err(dev->dev,
"unknown/unsupported control %d\n", id);

View File

@@ -794,6 +794,11 @@ int cif_isp10_s_exp(
struct cif_isp10_device *dev,
struct cif_isp10_img_src_ext_ctrl *exp_ctrl);
int cif_isp10_s_vcm(
struct cif_isp10_device *dev,
unsigned int id,
int val);
void cif_isp10_sensor_mode_data_sync(
struct cif_isp10_device *dev,
unsigned int frame_id,

View File

@@ -464,6 +464,9 @@ long cif_isp10_img_src_v4l2_subdev_ioctl(
case PLTFRM_CIFCAM_G_ITF_CFG:
case PLTFRM_CIFCAM_G_DEFRECT:
case PLTFRM_CIFCAM_ATTACH:
case PLTFRM_CIFCAM_SET_VCM_POS:
case PLTFRM_CIFCAM_GET_VCM_POS:
case PLTFRM_CIFCAM_GET_VCM_MOVE_RES:
ret = v4l2_subdev_call(subdev,
core,
ioctl,
@@ -475,7 +478,7 @@ long cif_isp10_img_src_v4l2_subdev_ioctl(
break;
}
if (IS_ERR_VALUE(ret))
if (IS_ERR_VALUE(ret) && cmd != PLTFRM_CIFCAM_GET_VCM_MOVE_RES)
pr_err("img_src.%s subdev call(cmd: 0x%x) failed with error %ld\n",
__func__, cmd, ret);

View File

@@ -2245,14 +2245,14 @@ static void cifisp_afc_config(const struct cif_isp10_isp_dev *isp_dev)
for (i = 0; i < num_of_win; i++) {
cifisp_iowrite32(
CIFISP_AFC_WINDOW_X(pconfig->afm_win[0].h_offs) |
CIFISP_AFC_WINDOW_Y(pconfig->afm_win[0].v_offs),
CIFISP_AFC_WINDOW_X(pconfig->afm_win[i].h_offs) |
CIFISP_AFC_WINDOW_Y(pconfig->afm_win[i].v_offs),
CIF_ISP_AFM_LT_A + i * 8);
cifisp_iowrite32(
CIFISP_AFC_WINDOW_X(pconfig->afm_win[0].h_size +
pconfig->afm_win[0].h_offs) |
CIFISP_AFC_WINDOW_Y(pconfig->afm_win[0].v_size +
pconfig->afm_win[0].v_offs),
CIFISP_AFC_WINDOW_X(pconfig->afm_win[i].h_size +
pconfig->afm_win[i].h_offs) |
CIFISP_AFC_WINDOW_Y(pconfig->afm_win[i].v_size +
pconfig->afm_win[i].v_offs),
CIF_ISP_AFM_RB_A + i * 8);
}
@@ -2279,7 +2279,7 @@ static void cifisp_afc_end(struct cif_isp10_isp_dev *isp_dev)
static void cifisp_get_afc_meas(struct cif_isp10_isp_dev *isp_dev,
struct cifisp_stat_buffer *pbuf)
{
pbuf->meas_type = CIFISP_STAT_AFM_FIN;
pbuf->meas_type |= CIFISP_STAT_AFM_FIN;
pbuf->params.af.window[0].sum =
cifisp_ioread32(CIF_ISP_AFM_SUM_A);
@@ -3675,6 +3675,8 @@ static void cifisp_send_measurement(
struct cif_isp10_buffer *buf = NULL;
struct vb2_buffer *vb = NULL;
void *mem_addr;
struct pltfrm_cam_vcm_tim vcm_tim;
long ret;
unsigned int active_meas = isp_dev->active_meas;
struct cifisp_stat_buffer *stat_buf;
@@ -3719,6 +3721,7 @@ static void cifisp_send_measurement(
list_del(&buf->queue);
spin_unlock_irqrestore(&isp_dev->irq_lock, lock_flags);
isp_dev->meas_stats.stat.meas_type = 0;
if (active_meas & CIF_ISP_AWB_DONE) {
memcpy(&isp_dev->meas_stats.stat.params.awb,
&stat_buf->params.awb,
@@ -3752,6 +3755,17 @@ static void cifisp_send_measurement(
}
isp_dev->meas_stats.g_frame_id = meas_work->frame_id;
ret = cif_isp10_img_src_ioctl(cif_dev->img_src,
PLTFRM_CIFCAM_GET_VCM_MOVE_RES,
&vcm_tim);
if (ret == 0) {
stat_buf->subdev_stat.vcm.vcm_start_t = vcm_tim.vcm_start_t;
stat_buf->subdev_stat.vcm.vcm_end_t = vcm_tim.vcm_end_t;
}
stat_buf->vs_t = meas_work->vs_t;
stat_buf->fi_t = meas_work->fi_t;
vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
wake_up(&vb->vb2_queue->done_wq);

View File

@@ -107,6 +107,8 @@ struct cif_isp10_isp_readout_work {
struct cif_isp10_isp_dev *isp_dev;
unsigned int frame_id;
struct timeval vs_t;
struct timeval fi_t;
enum cif_isp10_isp_readout_cmd readout;
struct vb2_buffer *vb;
unsigned int stream_id;

View File

@@ -125,6 +125,17 @@ struct pltfrm_cam_itf {
(PLTFRM_CIFCAM_IOCTL_INTERNAL_BASE + 2)
#define PLTFRM_CIFCAM_ATTACH \
(PLTFRM_CIFCAM_IOCTL_INTERNAL_BASE + 3)
#define PLTFRM_CIFCAM_SET_VCM_POS \
(PLTFRM_CIFCAM_IOCTL_INTERNAL_BASE + 4)
#define PLTFRM_CIFCAM_GET_VCM_POS \
(PLTFRM_CIFCAM_IOCTL_INTERNAL_BASE + 5)
#define PLTFRM_CIFCAM_GET_VCM_MOVE_RES \
(PLTFRM_CIFCAM_IOCTL_INTERNAL_BASE + 6)
struct pltfrm_cam_vcm_tim {
struct timeval vcm_start_t;
struct timeval vcm_end_t;
};
struct pltfrm_cam_defrect {
unsigned int width;

View File

@@ -219,6 +219,22 @@ struct cifisp_af_stat {
struct cifisp_af_meas_val window[CIFISP_AFM_MAX_WINDOWS];
};
enum cifisp_vcm_val {
CIFISP_VCM_INVAL = -1,
CIFISP_VCM_MOVE_START = 0,
CIFISP_VCM_MOVE_RUNNING = 1,
CIFISP_VCM_MOVE_END = 2
};
struct cifisp_vcm_tim {
struct timeval vcm_start_t;
struct timeval vcm_end_t;
};
struct cifisp_subdev_stat {
struct cifisp_vcm_tim vcm;
};
struct cifisp_stat {
struct cifisp_awb_stat awb;
struct cifisp_ae_stat ae;
@@ -230,6 +246,9 @@ struct cifisp_stat_buffer {
unsigned int meas_type;
struct cifisp_stat params;
struct isp_supplemental_sensor_mode_data sensor_mode;
struct cifisp_subdev_stat subdev_stat;
struct timeval vs_t;
struct timeval fi_t;
};
struct cifisp_dpcc_methods_config {

View File

@@ -46,8 +46,6 @@ struct isp_supplemental_sensor_mode_data {
unsigned char exposure_valid_frame[2];
int exp_time;
unsigned short gain;
unsigned short af_onoff;
unsigned int vcm_max_step;
};
struct camera_module_info_s {
@@ -64,6 +62,7 @@ struct camera_module_info_s {
bool iq_flip;
int flash_support;
int flash_exp_percent;
int af_support;
};
struct flash_timeinfo_s {