From bb7bcb0a02c51d9bd0c2bf83c7f4eb4e6815e288 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Tue, 22 May 2018 18:42:28 +0800 Subject: [PATCH] media: rk-isp10: modify for af function add af funtion first time Change-Id: I91fc8c532e47987cc63694b242f5bac7ef1bc59c Signed-off-by: Hu Kejun --- drivers/media/platform/rk-isp10/cif_isp10.c | 45 +++++++++++++++++-- drivers/media/platform/rk-isp10/cif_isp10.h | 5 +++ .../rk-isp10/cif_isp10_img_src_v4l2-subdev.c | 5 ++- .../media/platform/rk-isp10/cif_isp10_isp.c | 28 +++++++++--- .../media/platform/rk-isp10/cif_isp10_isp.h | 2 + .../linux/platform_data/rk_isp10_platform.h | 11 +++++ include/media/rk-isp10-config.h | 19 ++++++++ include/media/v4l2-config_rockchip.h | 3 +- 8 files changed, 104 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/rk-isp10/cif_isp10.c b/drivers/media/platform/rk-isp10/cif_isp10.c index 0995351ee508..4723a106f720 100644 --- a/drivers/media/platform/rk-isp10/cif_isp10.c +++ b/drivers/media/platform/rk-isp10/cif_isp10.c @@ -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); diff --git a/drivers/media/platform/rk-isp10/cif_isp10.h b/drivers/media/platform/rk-isp10/cif_isp10.h index d53ad7b6fc64..b97e2f41087f 100644 --- a/drivers/media/platform/rk-isp10/cif_isp10.h +++ b/drivers/media/platform/rk-isp10/cif_isp10.h @@ -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, diff --git a/drivers/media/platform/rk-isp10/cif_isp10_img_src_v4l2-subdev.c b/drivers/media/platform/rk-isp10/cif_isp10_img_src_v4l2-subdev.c index dce595f2d3e3..92ac9d5e7adf 100644 --- a/drivers/media/platform/rk-isp10/cif_isp10_img_src_v4l2-subdev.c +++ b/drivers/media/platform/rk-isp10/cif_isp10_img_src_v4l2-subdev.c @@ -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); diff --git a/drivers/media/platform/rk-isp10/cif_isp10_isp.c b/drivers/media/platform/rk-isp10/cif_isp10_isp.c index ea52525911b4..e6c645a88fe2 100644 --- a/drivers/media/platform/rk-isp10/cif_isp10_isp.c +++ b/drivers/media/platform/rk-isp10/cif_isp10_isp.c @@ -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); diff --git a/drivers/media/platform/rk-isp10/cif_isp10_isp.h b/drivers/media/platform/rk-isp10/cif_isp10_isp.h index 2c97e6effd50..006c808ffca5 100644 --- a/drivers/media/platform/rk-isp10/cif_isp10_isp.h +++ b/drivers/media/platform/rk-isp10/cif_isp10_isp.h @@ -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; diff --git a/include/linux/platform_data/rk_isp10_platform.h b/include/linux/platform_data/rk_isp10_platform.h index 78762b192229..858d9959aadd 100644 --- a/include/linux/platform_data/rk_isp10_platform.h +++ b/include/linux/platform_data/rk_isp10_platform.h @@ -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; diff --git a/include/media/rk-isp10-config.h b/include/media/rk-isp10-config.h index e8e65b43f086..f64af7f9f8f0 100644 --- a/include/media/rk-isp10-config.h +++ b/include/media/rk-isp10-config.h @@ -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 { diff --git a/include/media/v4l2-config_rockchip.h b/include/media/v4l2-config_rockchip.h index afb5a9bd7023..b7dd7a7a8d7c 100644 --- a/include/media/v4l2-config_rockchip.h +++ b/include/media/v4l2-config_rockchip.h @@ -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 {