} else {
isp->sw_contex.invalid_frame = false;
}
-
ret = atomisp_start_binary(isp);
if (ret)
goto no_frame_done;
}
break;
case CI_MODE_VIDEO:
- if (isp->params.video_dis_en) {
- sh_css_video_set_dis_vector(isp->params.dis_x,
- isp->params.dis_y);
- }
ret = sh_css_video_start(NULL, isp->regular_output_frame,
isp->vf_frame);
if (sh_css_success != ret) {
/* DIS projections. */
isp->params.dis_hor_proj_bytes =
- isp->params.curr_grid_info.dis_height *
+ isp->params.curr_grid_info.dis_aligned_height *
SH_CSS_DIS_NUM_COEF_TYPES *
sizeof(*isp->params.dis_hor_proj_buf);
isp->params.dis_ver_proj_bytes =
- isp->params.curr_grid_info.dis_width *
+ isp->params.curr_grid_info.dis_aligned_width *
SH_CSS_DIS_NUM_COEF_TYPES *
sizeof(*isp->params.dis_ver_proj_buf);
info->s3a_height = isp->params.curr_grid_info.s3a_height;
info->s3a_bqs_per_grid_cell =
isp->params.curr_grid_info.s3a_bqs_per_grid_cell;
- info->dis_width = isp->params.curr_grid_info.dis_width;
- info->dis_height = isp->params.curr_grid_info.dis_height;
+
+ info->dis_width = isp->params.curr_grid_info.dis_width;
+ info->dis_aligned_width = isp->params.curr_grid_info.dis_aligned_width;
+ info->dis_height = isp->params.curr_grid_info.dis_height;
+ info->dis_aligned_height =
+ isp->params.curr_grid_info.dis_aligned_height;
info->dis_bqs_per_grid_cell =
- isp->params.curr_grid_info.dis_bqs_per_grid_cell;
+ isp->params.curr_grid_info.dis_bqs_per_grid_cell;
info->dis_hor_coef_num =
- isp->params.curr_grid_info.dis_hor_coef_num;
+ isp->params.curr_grid_info.dis_hor_coef_num;
info->dis_ver_coef_num =
- isp->params.curr_grid_info.dis_ver_coef_num;
+ isp->params.curr_grid_info.dis_ver_coef_num;
}
/*
return 0;
}
-int atomisp_dis_vector(struct atomisp_device *isp,
- void *config)
+int atomisp_set_dis_vector(struct atomisp_device *isp,
+ struct atomisp_dis_vector *vector)
{
- struct atomisp_dis_config *arg = (struct atomisp_dis_config *)config;
+ unsigned long irqflags;
+
+ /* Avoid race conditions with ISR */
+ spin_lock_irqsave(&isp->irq_lock, irqflags);
+ sh_css_video_set_dis_vector(vector->x, vector->y);
+ spin_unlock_irqrestore(&isp->irq_lock, irqflags);
- /* The dis parameter is initialized at start_video_capture
- * in atomisp_work
- */
- mutex_lock(&isp->isp_lock);
- isp->params.dis_x = arg->dis_x;
- isp->params.dis_y = arg->dis_y;
- mutex_unlock(&isp->isp_lock);
return 0;
}
/*
* Function to set/get image stablization statistics
*/
-int atomisp_dis_stat(struct atomisp_device *isp, int flag,
- void *config)
+int atomisp_get_dis_stat(struct atomisp_device *isp,
+ struct atomisp_dis_statistics *stats)
{
int error;
- struct atomisp_dis_config *arg = (struct atomisp_dis_config *)config;
+ long left;
- if (flag == 0) {
- long time_left;
+ if (stats->vertical_projections == NULL ||
+ stats->horizontal_projections == NULL ||
+ isp->params.dis_hor_proj_buf == NULL ||
+ isp->params.dis_ver_proj_buf == NULL)
+ return -EINVAL;
- if (arg->w_sdis_vertproj_tbl == NULL ||
- arg->w_sdis_horiproj_tbl == NULL ||
- isp->params.dis_hor_proj_buf == NULL ||
- isp->params.dis_ver_proj_buf == NULL)
- return -EINVAL;
+ /* isp needs to be streaming to get DIS statistics */
+ if (!isp->sw_contex.isp_streaming)
+ return -EINVAL;
+ if (!isp->params.video_dis_en)
+ return -EINVAL;
- /* isp need to be streaming to get DIS statistics */
- if (!isp->sw_contex.isp_streaming)
- return -EINVAL;
- if (!isp->params.video_dis_en)
- return -EINVAL;
+ INIT_COMPLETION(isp->dis_state_complete);
- INIT_COMPLETION(isp->dis_state_complete);
+ left = wait_for_completion_timeout(&isp->dis_state_complete, 1 * HZ);
+
+ /* Timeout to get the statistics */
+ if (left == 0) {
+ v4l2_err(&atomisp_dev, "Failed to wait frame DIS state\n");
+ return -EINVAL;
+ }
- time_left =
- wait_for_completion_timeout(&isp->dis_state_complete,
- 1 * HZ);
+ sh_css_get_dis_projections(isp->params.dis_hor_proj_buf,
+ isp->params.dis_ver_proj_buf);
- /* Timeout to get the statistics */
- if (time_left == 0) {
- v4l2_err(&atomisp_dev,
- "Failed to wait frame DIS state\n");
- return -EINVAL;
- }
+ error = copy_to_user(stats->vertical_projections,
+ isp->params.dis_ver_proj_buf,
+ isp->params.dis_ver_proj_bytes);
+ if (error)
+ return -EFAULT;
+ error = copy_to_user(stats->horizontal_projections,
+ isp->params.dis_hor_proj_buf,
+ isp->params.dis_hor_proj_bytes);
+ if (error)
+ return -EFAULT;
- sh_css_get_dis_projections(isp->params.dis_hor_proj_buf,
- isp->params.dis_ver_proj_buf);
+ return 0;
+}
- error = copy_to_user(arg->w_sdis_vertproj_tbl,
- isp->params.dis_ver_proj_buf,
- isp->params.dis_ver_proj_bytes);
- if (error)
- return -EFAULT;
+int atomisp_set_dis_coefs(struct atomisp_device *isp,
+ struct atomisp_dis_coefficients *coefs)
+{
+ int error;
- error = copy_to_user(arg->w_sdis_horiproj_tbl,
- isp->params.dis_hor_proj_buf,
- isp->params.dis_hor_proj_bytes);
- if (error)
- return -EFAULT;
- } else {
- if (arg->sdis_vertcoef_tbl == NULL ||
- arg->sdis_horicoef_tbl == NULL ||
- isp->params.dis_hor_coef_buf == NULL ||
- isp->params.dis_ver_coef_buf == NULL)
- return -EINVAL;
+ if (coefs->horizontal_coefficients == NULL ||
+ coefs->vertical_coefficients == NULL ||
+ isp->params.dis_hor_coef_buf == NULL ||
+ isp->params.dis_ver_coef_buf == NULL)
+ return -EINVAL;
- error = copy_from_user(isp->params.dis_hor_coef_buf,
- (void __user *)arg->sdis_horicoef_tbl,
- isp->params.dis_hor_coef_bytes);
- if (error)
- return -EFAULT;
- error = copy_from_user(isp->params.dis_ver_coef_buf,
- (void __user *)arg->sdis_vertcoef_tbl,
- isp->params.dis_ver_coef_bytes);
- if (error)
- return -EFAULT;
- sh_css_set_dis_coefficients(isp->params.dis_hor_coef_buf,
- isp->params.dis_ver_coef_buf);
- }
+ error = copy_from_user(isp->params.dis_hor_coef_buf,
+ (void __user *)coefs->horizontal_coefficients,
+ isp->params.dis_hor_coef_bytes);
+ if (error)
+ return -EFAULT;
+ error = copy_from_user(isp->params.dis_ver_coef_buf,
+ (void __user *)coefs->vertical_coefficients,
+ isp->params.dis_ver_coef_bytes);
+ if (error)
+ return -EFAULT;
+ sh_css_set_dis_coefficients(isp->params.dis_hor_coef_buf,
+ isp->params.dis_ver_coef_buf);
return 0;
}
unsigned int detail_gain;
};
-struct atomisp_dis_config {
- int *w_sdis_vertproj_tbl;
- int *w_sdis_horiproj_tbl;
- short *sdis_vertcoef_tbl;
- short *sdis_horicoef_tbl;
- int dis_x;
- int dis_y;
-};
-
struct atomisp_3a_output {
int ae_y;
int awb_cnt;
unsigned int s3a_bqs_per_grid_cell;
/* DIS grid: */
unsigned int dis_width; /* also used for vertical projections */
+ unsigned int dis_aligned_width;
unsigned int dis_height; /* also used for horizontal projections */
+ unsigned int dis_aligned_height;
unsigned int dis_bqs_per_grid_cell;
unsigned int dis_hor_coef_num;
unsigned int dis_ver_coef_num;
};
+struct atomisp_dis_vector {
+ int x;
+ int y;
+};
+
+struct atomisp_dis_coefficients {
+ struct atomisp_grid_info grid_info;
+ short *vertical_coefficients;
+ short *horizontal_coefficients;
+};
+
+struct atomisp_dis_statistics {
+ struct atomisp_grid_info grid_info;
+ int *vertical_projections;
+ int *horizontal_projections;
+};
+
struct atomisp_3a_statistics {
struct atomisp_grid_info grid_info;
struct atomisp_3a_output *data;
_IOR('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_ee_config)
#define ATOMISP_IOC_S_EE \
_IOW('v', BASE_VIDIOC_PRIVATE + 13, struct atomisp_ee_config)
+/* Digital Image Stabilization:
+ * 1. get dis statistics: reads DIS statistics from ISP (every frame)
+ * 2. set dis coefficients: set DIS filter coefficients (one time)
+ * 3. set dis motion vecotr: set motion vector (result of DIS, every frame)
+ */
#define ATOMISP_IOC_G_DIS_STAT \
- _IOW('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_dis_config)
-#define ATOMISP_IOC_S_DIS_STAT \
- _IOW('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_dis_config)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_dis_statistics)
+#define ATOMISP_IOC_S_DIS_COEFS \
+ _IOW('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_dis_coefficients)
+#define ATOMISP_IOC_S_DIS_VECTOR \
+ _IOW('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_dis_vector)
+
#define ATOMISP_IOC_G_3A_STAT \
- _IOW('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_3a_statistics)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 17, struct atomisp_3a_statistics)
#define ATOMISP_IOC_G_ISP_PARM \
- _IOR('v', BASE_VIDIOC_PRIVATE + 17, struct atomisp_parm)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_parm)
#define ATOMISP_IOC_S_ISP_PARM \
- _IOW('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_parm)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 19, struct atomisp_parm)
#define ATOMISP_IOC_G_ISP_GAMMA \
- _IOR('v', BASE_VIDIOC_PRIVATE + 19, struct atomisp_gamma_table)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 20, struct atomisp_gamma_table)
#define ATOMISP_IOC_S_ISP_GAMMA \
- _IOW('v', BASE_VIDIOC_PRIVATE + 20, struct atomisp_gamma_table)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_gamma_table)
#define ATOMISP_IOC_G_ISP_GDC_TAB \
- _IOR('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_morph_table)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 22, struct atomisp_morph_table)
#define ATOMISP_IOC_S_ISP_GDC_TAB \
- _IOW('v', BASE_VIDIOC_PRIVATE + 22, struct atomisp_morph_table)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_morph_table)
#define ATOMISP_IOC_ISP_MAKERNOTE \
- _IOWR('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_makernote_info)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 24, struct atomisp_makernote_info)
/* macc parameter control*/
#define ATOMISP_IOC_G_ISP_MACC \
- _IOR('v', BASE_VIDIOC_PRIVATE + 24, struct atomisp_macc_config)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_macc_config)
#define ATOMISP_IOC_S_ISP_MACC \
- _IOW('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_macc_config)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 26, struct atomisp_macc_config)
/* Defect pixel detection & Correction */
#define ATOMISP_IOC_G_ISP_BAD_PIXEL_DETECTION \
- _IOR('v', BASE_VIDIOC_PRIVATE + 26, struct atomisp_dp_config)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 27, struct atomisp_dp_config)
#define ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION \
- _IOW('v', BASE_VIDIOC_PRIVATE + 27, struct atomisp_dp_config)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_dp_config)
/* False Color Correction */
#define ATOMISP_IOC_G_ISP_FALSE_COLOR_CORRECTION \
- _IOR('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_de_config)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 29, struct atomisp_de_config)
#define ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION \
- _IOW('v', BASE_VIDIOC_PRIVATE + 29, struct atomisp_de_config)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_de_config)
/* ctc parameter control */
#define ATOMISP_IOC_G_ISP_CTC \
- _IOR('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_ctc_table)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 31, struct atomisp_ctc_table)
#define ATOMISP_IOC_S_ISP_CTC \
- _IOW('v', BASE_VIDIOC_PRIVATE + 31, struct atomisp_ctc_table)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 32, struct atomisp_ctc_table)
/* white balance Correction */
#define ATOMISP_IOC_G_ISP_WHITE_BALANCE \
- _IOR('v', BASE_VIDIOC_PRIVATE + 32, struct atomisp_wb_config)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 33, struct atomisp_wb_config)
#define ATOMISP_IOC_S_ISP_WHITE_BALANCE \
- _IOW('v', BASE_VIDIOC_PRIVATE + 33, struct atomisp_wb_config)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 34, struct atomisp_wb_config)
/* fpn table loading */
#define ATOMISP_IOC_S_ISP_FPN_TABLE \
#define ATOMISP_IOC_G_SENSOR_MODE_DATA \
_IOR('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_sensor_mode_data)
-#define ATOMISP_IOC_S_DIS_VECTOR \
- _IOW('v', BASE_VIDIOC_PRIVATE + 40, struct atomisp_dis_config)
-
#define ATOMISP_IOC_S_EXPOSURE \
- _IOW('v', BASE_VIDIOC_PRIVATE + 41, struct atomisp_exposure)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 40, struct atomisp_exposure)
/* sensor calibration registers group */
#define ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP \
- _IOWR('v', BASE_VIDIOC_PRIVATE + 42, struct atomisp_calibration_group)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 41, struct atomisp_calibration_group)
/* white balance Correction */
#define ATOMISP_IOC_G_3A_CONFIG \
- _IOR('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_3a_config)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 42, struct atomisp_3a_config)
#define ATOMISP_IOC_S_3A_CONFIG \
- _IOW('v', BASE_VIDIOC_PRIVATE + 44, struct atomisp_3a_config)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_3a_config)
/* Accelerate ioctls */
#define ATOMISP_IOC_ACC_LOAD \
- _IOWR('v', BASE_VIDIOC_PRIVATE + 45, struct atomisp_acc_fw_load)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 44, struct atomisp_acc_fw_load)
#define ATOMISP_IOC_ACC_UNLOAD \
- _IOWR('v', BASE_VIDIOC_PRIVATE + 46, unsigned int)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 45, unsigned int)
#define ATOMISP_IOC_ACC_S_ARG \
- _IOW('v', BASE_VIDIOC_PRIVATE + 47, struct atomisp_acc_fw_arg)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 46, struct atomisp_acc_fw_arg)
#define ATOMISP_IOC_ACC_START \
- _IOW('v', BASE_VIDIOC_PRIVATE + 48, unsigned int)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 47, unsigned int)
#define ATOMISP_IOC_ACC_WAIT \
- _IOW('v', BASE_VIDIOC_PRIVATE + 49, unsigned int)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 48, unsigned int)
#define ATOMISP_IOC_ACC_ABORT \
- _IOW('v', BASE_VIDIOC_PRIVATE + 50, struct atomisp_acc_fw_abort)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 49, struct atomisp_acc_fw_abort)
/* sensor OTP memory read */
#define ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA \
- _IOWR('v', BASE_VIDIOC_PRIVATE + 51, struct v4l2_private_int_data)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 50, struct v4l2_private_int_data)
/* LCS (shading) table write */
#define ATOMISP_IOC_S_ISP_SHD_TAB \
- _IOWR('v', BASE_VIDIOC_PRIVATE + 52, struct atomisp_shading_table)
+ _IOWR('v', BASE_VIDIOC_PRIVATE + 51, struct atomisp_shading_table)
/* Gamma Correction */
#define ATOMISP_IOC_G_ISP_GAMMA_CORRECTION \
- _IOR('v', BASE_VIDIOC_PRIVATE + 53, struct atomisp_gc_config)
+ _IOR('v', BASE_VIDIOC_PRIVATE + 52, struct atomisp_gc_config)
#define ATOMISP_IOC_S_ISP_GAMMA_CORRECTION \
- _IOW('v', BASE_VIDIOC_PRIVATE + 54, struct atomisp_gc_config)
+ _IOW('v', BASE_VIDIOC_PRIVATE + 53, struct atomisp_gc_config)
/* ISP Private control IDs */
#define V4L2_CID_ATOMISP_BAD_PIXEL_DETECTION \