atomisp interface update
authorMarko Ollonen <marko.ollonen@ixonos.com>
Tue, 7 Aug 2012 10:55:55 +0000 (13:55 +0300)
committerMarko Ollonen <marko.ollonen@ixonos.com>
Tue, 7 Aug 2012 11:01:21 +0000 (14:01 +0300)
Change-Id: I8a8b67910c8f2f4a0d731f7662706cd16c6535b5

gst-libs/atomisphal/atomisp_v4l2.h
gst-libs/atomisphal/mfld_driver.c

index bf92315..ac33072 100644 (file)
@@ -3,8 +3,6 @@
  *
  * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
  *
- * Copyright (c) 2010 Silicon Hive www.siliconhive.com.
- *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version
  * 2 as published by the Free Software Foundation.
  *
  */
 
-#ifndef ATOMISP_V4L2_H_
-#define ATOMISP_V4L2_H_
-
-#include <linux/videodev2.h>
-
-/* SH header files */
-#include "sh_css_types.h"
-
-/*Extended IDs for Camera Class*/
-#include "to_upstream.h"
-
-#define ATOMISP_MAJOR          0
-#define ATOMISP_MINOR          5
-#define ATOMISP_PATCHLEVEL     1
+#ifndef _ATOM_ISP_H
+#define _ATOM_ISP_H
 
-#define DRIVER_VERSION_STR     __stringify(ATOMISP_MAJOR) \
-       "." __stringify(ATOMISP_MINOR) "." __stringify(ATOMISP_PATCHLEVEL)
-#define DRIVER_VERSION         KERNEL_VERSION(ATOMISP_MAJOR, \
-       ATOMISP_MINOR, ATOMISP_PATCHLEVEL)
+#include <linux/types.h>
+#include <stdlib.h>            /* for size_t */
 
 /*ISP binary running mode*/
 #define CI_MODE_PREVIEW                0x8000
 #define CI_MODE_VIDEO          0x4000
 #define CI_MODE_STILL_CAPTURE  0x2000
+#define CI_MODE_CONTINUOUS     0x1000
 #define CI_MODE_NONE           0x0000
 
-#define ATOM_ISP_STEP_WIDTH    2
-#define ATOM_ISP_STEP_HEIGHT   2
+#define OUTPUT_MODE_FILE 0x0100
+#define OUTPUT_MODE_TEXT 0x0200
+
+/* Configuration used by Bayer noise reduction and YCC noise reduction */
+struct atomisp_nr_config {
+       /* [gain] Strength of noise reduction for Bayer NR (Used by Bayer NR) */
+       unsigned int bnr_gain;
+       /* [gain] Strength of noise reduction for YCC NR (Used by YCC NR) */
+       unsigned int ynr_gain;
+       /* [intensity] Sensitivity of Edge (Used by Bayer NR) */
+       unsigned int direction;
+       /* [intensity] coring threshold for Cb (Used by YCC NR) */
+       unsigned int threshold_cb;
+       /* [intensity] coring threshold for Cr (Used by YCC NR) */
+       unsigned int threshold_cr;
+};
+
+/* Temporal noise reduction configuration */
+struct atomisp_tnr_config {
+       unsigned int gain;       /* [gain] Strength of NR */
+       unsigned int threshold_y;/* [intensity] Motion sensitivity for Y */
+       unsigned int threshold_uv;/* [intensity] Motion sensitivity for U/V */
+};
+
+/* Histogram. This contains num_elements values of type unsigned int.
+ * The data pointer is a DDR pointer (virtual address).
+ */
+struct atomisp_histogram {
+       unsigned int num_elements;
+       void  *data;
+};
+
+enum atomisp_ob_mode {
+       atomisp_ob_mode_none,
+       atomisp_ob_mode_fixed,
+       atomisp_ob_mode_raster
+};
+
+/* Optical black level configuration */
+struct atomisp_ob_config {
+       /* Obtical black level mode (Fixed / Raster) */
+       enum atomisp_ob_mode mode;
+       /* [intensity] optical black level for GR (relevant for fixed mode) */
+       unsigned int level_gr;
+       /* [intensity] optical black level for R (relevant for fixed mode) */
+       unsigned int level_r;
+       /* [intensity] optical black level for B (relevant for fixed mode) */
+       unsigned int level_b;
+       /* [intensity] optical black level for GB (relevant for fixed mode) */
+       unsigned int level_gb;
+       /* [BQ] 0..63 start position of OB area (relevant for raster mode) */
+       unsigned short start_position;
+       /* [BQ] start..63 end position of OB area (relevant for raster mode) */
+       unsigned short end_position;
+};
+
+/* Edge enhancement (sharpen) configuration */
+struct atomisp_ee_config {
+       /* [gain] The strength of sharpness. u5_11 */
+       unsigned int gain;
+       /* [intensity] The threshold that divides noises from edge. u8_8 */
+       unsigned int threshold;
+       /* [gain] The strength of sharpness in pell-mell area. u5_11 */
+       unsigned int detail_gain;
+};
 
-#define ATOM_ISP_MIN_WIDTH     256
-#define ATOM_ISP_MIN_HEIGHT    2
-#define ATOM_ISP_MAX_WIDTH     4608
-#define ATOM_ISP_MAX_HEIGHT    3450
+struct atomisp_3a_output {
+       int ae_y;
+       int awb_cnt;
+       int awb_gr;
+       int awb_r;
+       int awb_b;
+       int awb_gb;
+       int af_hpf1;
+       int af_hpf2;
+};
 
-#define ATOM_ISP_MAX_WIDTH_TMP 1280
-#define ATOM_ISP_MAX_HEIGHT_TMP        720
+enum atomisp_calibration_type {
+       calibration_type1,
+       calibration_type2,
+       calibration_type3
+};
 
-struct atomisp_3a_binary {
-       unsigned int mode;
-       int s3atbl_width;
-       int s3atbl_height;
-       int width;
-       int height;
-       int deci_factor;
+struct atomisp_calibration_group {
+       unsigned int size;
+       unsigned int type;
+       unsigned short *calb_grp_values;
 };
 
-struct sh_css_grid_info_user {
+struct atomisp_gc_config {
+       __u16 gain_k1;
+       __u16 gain_k2;
+};
+
+struct atomisp_3a_config {
+       unsigned int ae_y_coef_r;       /* [gain] Weight of R for Y */
+       unsigned int ae_y_coef_g;       /* [gain] Weight of G for Y */
+       unsigned int ae_y_coef_b;       /* [gain] Weight of B for Y */
+       unsigned int awb_lg_high_raw;   /* [intensity]
+                                          AWB level gate high for raw */
+       unsigned int awb_lg_low;        /* [intensity] AWB level gate low */
+       unsigned int awb_lg_high;       /* [intensity] AWB level gate high */
+       int af_fir1_coef[7];    /* [factor] AF FIR coefficients of fir1 */
+       int af_fir2_coef[7];    /* [factor] AF FIR coefficients of fir2 */
+};
+
+/* structure that describes the 3A and DIS grids shared with 3A lib*/
+struct atomisp_grid_info {
+       /* ISP input size that is visible for user */
+       unsigned int isp_in_width;
+       unsigned int isp_in_height;
        /* 3A statistics grid: */
        unsigned int s3a_width;
        unsigned int s3a_height;
        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 __user *vertical_coefficients;
+       //short __user *horizontal_coefficients;
+       short  *vertical_coefficients;
+       short  *horizontal_coefficients;
+
+};
+
+struct atomisp_dis_statistics {
+       struct atomisp_grid_info grid_info;
+//     int __user *vertical_projections;
+//     int __user *horizontal_projections;
+       int  *vertical_projections;
+       int  *horizontal_projections;
+
+};
+
+
+struct atomisp_3a_statistics {
+       struct atomisp_grid_info  grid_info;
+       struct atomisp_3a_output  *data;
+};
+
+/* White Balance (Gain Adjust) */
+struct atomisp_wb_config {
+       unsigned int integer_bits;
+       unsigned int gr;        /* unsigned <integer_bits>.<16-integer_bits> */
+       unsigned int r;         /* unsigned <integer_bits>.<16-integer_bits> */
+       unsigned int b;         /* unsigned <integer_bits>.<16-integer_bits> */
+       unsigned int gb;        /* unsigned <integer_bits>.<16-integer_bits> */
+};
+
+/* Color Space Conversion settings */
+struct atomisp_cc_config {
+       unsigned int fraction_bits;
+       int matrix[3 * 3];      /* RGB2YUV Color matrix, signed
+                                  <13-fraction_bits>.<fraction_bits> */
+};
+
+/* De pixel noise configuration */
+struct atomisp_de_config {
+       unsigned int pixelnoise;
+       unsigned int c1_coring_threshold;
+       unsigned int c2_coring_threshold;
+};
+
+/* Chroma enhancement */
+struct atomisp_ce_config {
+       unsigned int uv_level_min;
+       unsigned int uv_level_max;
+};
+
+/* Defect pixel correction configuration */
+struct atomisp_dp_config {
+       /* [intensity] The threshold of defect Pixel Correction, representing
+        * the permissible difference of intensity between one pixel and its
+        * surrounding pixels. Smaller values result in more frequent pixel
+        * corrections. u0_16
+        */
+       unsigned int threshold;
+       /* [gain] The sensitivity of mis-correction. ISP will miss a lot of
+        * defects if the value is set too large. u8_8
+        */
+       unsigned int gain;
+};
+
 struct atomisp_parm {
-       struct sh_css_grid_info_user info;
-       struct sh_css_wb_config wb_config;
-       struct sh_css_cc_config cc_config;
-       struct sh_css_ob_config ob_config;
-       struct sh_css_dp_config dp_config;
-       struct sh_css_nr_config nr_config;
-       struct sh_css_ee_config ee_config;
-       struct sh_css_tnr_config tnr_config;
+       struct atomisp_grid_info info;
+       struct atomisp_wb_config wb_config;
+       struct atomisp_cc_config cc_config;
+       struct atomisp_ob_config ob_config;
+       struct atomisp_de_config de_config;
+       struct atomisp_ce_config ce_config;
+       struct atomisp_dp_config dp_config;
+       struct atomisp_nr_config nr_config;
+       struct atomisp_ee_config ee_config;
+       struct atomisp_tnr_config tnr_config;
 };
 
-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;
+#define ATOMISP_GAMMA_TABLE_SIZE        1024
+struct atomisp_gamma_table {
+       unsigned short data[ATOMISP_GAMMA_TABLE_SIZE];
 };
 
-struct atomisp_3a_stat {
-       void *w_3a_stat;
+/* Morphing table for advanced ISP.
+ * Each line of width elements takes up COORD_TABLE_EXT_WIDTH elements
+ * in memory.
+ */
+#define ATOMISP_MORPH_TABLE_NUM_PLANES  6
+struct atomisp_morph_table {
+       unsigned int height;
+       unsigned int width;     /* number of valid elements per line */
+       unsigned short  *coordinates_x[ATOMISP_MORPH_TABLE_NUM_PLANES];
+       unsigned short  *coordinates_y[ATOMISP_MORPH_TABLE_NUM_PLANES];
 };
 
-struct atomisp_gdc_tbl {
-       unsigned int size;
-       unsigned short *gdc_table;
+#define ATOMISP_NUM_SC_COLORS  4
+#define ATOMISP_SC_FLAG_QUERY  (1 << 0)
+
+struct atomisp_shading_table {
+       /*
+        * If flag ATOMISP_SC_FLAG_QUERY is set, IOCTL will only query current
+        * LSC status and return, otherwise it will set LSC according to
+        * userspace's input.
+        */
+       __u8 flags;
+       /*
+        * If ATOMISP_SC_FLAG_QUERY is set, enable is output parameter,
+        * otherwise it is an input parameter and will enable/disable LSC
+        * engine
+        */
+       __u8 enable;
+       /* native sensor resolution */
+       __u32 sensor_width;
+       __u32 sensor_height;
+       /* number of data points per line per color (bayer quads) */
+       __u32 width;
+       /* number of lines of data points per color (bayer quads) */
+       __u32 height;
+       /* bits of fraction part for shading table values */
+       __u32 fraction_bits;
+       /* one table for each color (use sh_css_sc_color to index) */
+       __u16  *data[ATOMISP_NUM_SC_COLORS];
+};
+
+struct atomisp_makernote_info {
+       /* bits 31-16: numerator, bits 15-0: denominator */
+       unsigned int focal_length;
+       /* bits 31-16: numerator, bits 15-0: denominator*/
+       unsigned int f_number_curr;
+       /*
+       * bits 31-24: max f-number numerator
+       * bits 23-16: max f-number denominator
+       * bits 15-8: min f-number numerator
+       * bits 7-0: min f-number denominator
+       */
+       unsigned int f_number_range;
+};
+
+/* parameter for MACC */
+#define ATOMISP_NUM_MACC_AXES           16
+struct atomisp_macc_table {
+       short data[4 * ATOMISP_NUM_MACC_AXES];
+};
+
+struct atomisp_macc_config {
+       int color_effect;
+       struct atomisp_macc_table table;
+};
+
+/* Parameter for ctc parameter control */
+#define ATOMISP_CTC_TABLE_SIZE          1024
+struct atomisp_ctc_table {
+       unsigned short data[ATOMISP_CTC_TABLE_SIZE];
+};
+
+/* Parameter for overlay image loading */
+struct atomisp_overlay {
+       /* the frame containing the overlay data The overlay frame width should
+        * be the multiples of 2*ISP_VEC_NELEMS. The overlay frame height
+        * should be the multiples of 2.
+        */
+       struct v4l2_framebuffer *frame;
+       /* Y value of overlay background */
+       unsigned char bg_y;
+       /* U value of overlay background */
+       char bg_u;
+       /* V value of overlay background */
+       char bg_v;
+       /* the blending percent of input data for Y subpixels */
+       unsigned char blend_input_perc_y;
+       /* the blending percent of input data for U subpixels */
+       unsigned char blend_input_perc_u;
+       /* the blending percent of input data for V subpixels */
+       unsigned char blend_input_perc_v;
+       /* the blending percent of overlay data for Y subpixels */
+       unsigned char blend_overlay_perc_y;
+       /* the blending percent of overlay data for U subpixels */
+       unsigned char blend_overlay_perc_u;
+       /* the blending percent of overlay data for V subpixels */
+       unsigned char blend_overlay_perc_v;
+       /* the overlay start x pixel position on output frame It should be the
+          multiples of 2*ISP_VEC_NELEMS. */
+       unsigned int overlay_start_x;
+       /* the overlay start y pixel position on output frame It should be the
+          multiples of 2. */
+       unsigned int overlay_start_y;
+};
+
+/* Sensor resolution specific data for AE calculation.
+ * This contains sensor specific data, so we simply use an array of 64
+ * bytes. */
+struct atomisp_sensor_mode_data {
+       unsigned char data[64];
+};
+
+struct atomisp_exposure {
+       unsigned int integration_time[8];
+       unsigned int shutter_speed[8];
+       unsigned int gain[4];
+       unsigned int aperture;
+};
+
+/* For texture streaming. */
+struct atomisp_bc_video_package {
+       int ioctl_cmd;
+       int device_id;
+       int inputparam;
+       int outputparam;
+};
+
+enum atomisp_focus_hp {
+       ATOMISP_FOCUS_HP_IN_PROGRESS = (1U << 2),
+       ATOMISP_FOCUS_HP_COMPLETE    = (2U << 2),
+       ATOMISP_FOCUS_HP_FAILED      = (3U << 2)
 };
 
-struct atomisp_makernote {
+/* Masks */
+#define ATOMISP_FOCUS_STATUS_MOVING           (1U << 0)
+#define ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE (1U << 1)
+#define ATOMISP_FOCUS_STATUS_HOME_POSITION    (3U << 2)
+
+enum atomisp_camera_port {
+       ATOMISP_CAMERA_PORT_SECONDARY,
+       ATOMISP_CAMERA_PORT_PRIMARY,
+};
+
+/* Flash modes. Default is off.
+ * Setting a flash to TORCH or INDICATOR mode will automatically
+ * turn it on. Setting it to FLASH mode will not turn on the flash
+ * until the FLASH_STROBE command is sent. */
+enum atomisp_flash_mode {
+       ATOMISP_FLASH_MODE_OFF,
+       ATOMISP_FLASH_MODE_FLASH,
+       ATOMISP_FLASH_MODE_TORCH,
+       ATOMISP_FLASH_MODE_INDICATOR,
+};
+
+/* Flash statuses, used by atomisp driver to check before starting
+ * flash and after having started flash. */
+enum atomisp_flash_status {
+       ATOMISP_FLASH_STATUS_OK,
+       ATOMISP_FLASH_STATUS_HW_ERROR,
+       ATOMISP_FLASH_STATUS_INTERRUPTED,
+       ATOMISP_FLASH_STATUS_TIMEOUT,
+};
+
+/* Frame status. This is used to detect corrupted frames and flash
+ * exposed frames. Usually, the first 2 frames coming out of the sensor
+ * are corrupted. When using flash, the frame before and the frame after
+ * the flash exposed frame may be partially exposed by flash. The ISP
+ * statistics for these frames should not be used by the 3A library.
+ * The frame status value can be found in the "reserved" field in the
+ * v4l2_buffer struct. */
+enum atomisp_frame_status {
+       ATOMISP_FRAME_STATUS_OK,
+       ATOMISP_FRAME_STATUS_CORRUPTED,
+       ATOMISP_FRAME_STATUS_FLASH_EXPOSED,
+       ATOMISP_FRAME_STATUS_FLASH_PARTIAL,
+       ATOMISP_FRAME_STATUS_FLASH_FAILED,
+};
+
+enum atomisp_acc_type {
+       ATOMISP_ACC_STANDALONE, /* Stand-alone acceleration */
+       ATOMISP_ACC_OUTPUT,     /* Accelerator stage on output frame */
+       ATOMISP_ACC_VIEWFINDER  /* Accelerator stage on viewfinder frame */
+};
+
+enum atomisp_acc_arg_type {
+       ATOMISP_ACC_ARG_SCALAR_IN,    /* Scalar input argument */
+       ATOMISP_ACC_ARG_SCALAR_OUT,   /* Scalar output argument */
+       ATOMISP_ACC_ARG_SCALAR_IO,    /* Scalar in/output argument */
+       ATOMISP_ACC_ARG_PTR_IN,      /* Pointer input argument */
+       ATOMISP_ACC_ARG_PTR_OUT,             /* Pointer output argument */
+       ATOMISP_ACC_ARG_PTR_IO,      /* Pointer in/output argument */
+       ATOMISP_ARG_PTR_NOFLUSH,  /* Pointer argument will not be flushed */
+       ATOMISP_ARG_PTR_STABLE,   /* Pointer input argument that is stable */
+       ATOMISP_ACC_ARG_FRAME        /* Frame argument */
+};
+
+enum {
+       ATOMISP_IOC_SIGNAL_SOF, /* Start Of Frame */
+       ATOMISP_IOC_SIGNAL_EOF, /* End Of Frame */
+};
+
+struct atomisp_sp_arg {
+       enum atomisp_acc_arg_type type; /* Type  of SP argument */
+       void                    *value; /* Value of SP argument */
+       unsigned int             size;  /* Size  of SP argument */
+};
+
+/* Acceleration API */
+struct atomisp_acc_fw_arg {
+       unsigned int fw_handle;
+       unsigned int index;
+       void  *value;
+       size_t size;
+};
+
+struct atomisp_acc_fw_abort {
+       unsigned int fw_handle;
+       /* Timeout in us */
+       unsigned int timeout;
+};
+
+struct atomisp_acc_fw_load {
        unsigned int size;
-       unsigned char *buf;
+       unsigned int fw_handle;
+       void  *data;
+};
+
+/*
+ * V4L2 private internal data interface.
+ * -----------------------------------------------------------------------------
+ * struct v4l2_private_int_data - request private data stored in video device
+ * internal memory.
+ * @size: sanity check to ensure userspace's buffer fits whole private data.
+ *       If not, kernel will make partial copy (or nothing if @size == 0).
+ *       @size is always corrected for the minimum necessary if IOCTL returns
+ *       no error.
+ * @data: pointer to userspace buffer.
+ */
+struct v4l2_private_int_data {
+       __u32 size;
+       void  *data;
+       __u32 reserved[2];
 };
 
 /*Private IOCTLs for ISP */
@@ -118,58 +496,179 @@ struct atomisp_makernote {
        _IOR('v', BASE_VIDIOC_PRIVATE + 0, int)
 #define ATOMISP_IOC_S_XNR \
        _IOW('v', BASE_VIDIOC_PRIVATE + 1, int)
-#define ATOMISP_IOC_G_BAYER_NR \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 2, struct sh_css_nr_config)
+#define ATOMISP_IOC_G_NR \
+       _IOR('v', BASE_VIDIOC_PRIVATE + 2, struct atomisp_nr_config)
+#define ATOMISP_IOC_S_NR \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 3, struct atomisp_nr_config)
 #define ATOMISP_IOC_S_BAYER_NR \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 3, struct sh_css_nr_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 3, struct atomisp_nr_config)
+
 #define ATOMISP_IOC_G_TNR \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 4, struct sh_css_tnr_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 4, struct atomisp_tnr_config)
 #define ATOMISP_IOC_S_TNR \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 5, struct sh_css_tnr_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 5, struct atomisp_tnr_config)
 #define ATOMISP_IOC_G_HISTOGRAM \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 6, struct sh_css_histogram)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_histogram)
 #define ATOMISP_IOC_S_HISTOGRAM \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 7, struct sh_css_histogram)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 7, struct atomisp_histogram)
 #define ATOMISP_IOC_G_BLACK_LEVEL_COMP \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 8, struct sh_css_ob_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 8, struct atomisp_ob_config)
 #define ATOMISP_IOC_S_BLACK_LEVEL_COMP \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 9, struct sh_css_ob_config)
-#define ATOMISP_IOC_G_YCC_NR \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 10, struct sh_css_nr_config)
-#define ATOMISP_IOC_S_YCC_NR \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 11, struct sh_css_nr_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 9, struct atomisp_ob_config)
 #define ATOMISP_IOC_G_EE \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 12, struct sh_css_ee_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_ee_config)
 #define ATOMISP_IOC_S_EE \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 13, struct sh_css_ee_config)
+       _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_stat)
+       _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 sh_css_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 sh_css_gamma_table)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_gamma_table)
 #define ATOMISP_IOC_G_ISP_GDC_TAB \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 21, struct sh_css_morph_table)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 22, struct atomisp_morph_table)
 #define ATOMISP_IOC_S_ISP_GDC_TAB \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 22, struct sh_css_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)
+       _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 sh_css_macc_table)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_macc_config)
 #define ATOMISP_IOC_S_ISP_MACC \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 25, struct sh_css_macc_table)
+       _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 + 27, struct atomisp_dp_config)
+#define ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION \
+       _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 + 29, struct atomisp_de_config)
+#define ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_de_config)
+
+/* ctc parameter control */
+#define ATOMISP_IOC_G_ISP_CTC \
+       _IOR('v', BASE_VIDIOC_PRIVATE + 31, struct atomisp_ctc_table)
+#define ATOMISP_IOC_S_ISP_CTC \
+       _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 + 33, struct atomisp_wb_config)
+#define ATOMISP_IOC_S_ISP_WHITE_BALANCE \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 34, struct atomisp_wb_config)
+
+/* fpn table loading */
+#define ATOMISP_IOC_S_ISP_FPN_TABLE \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 35, struct v4l2_framebuffer)
+
+/* overlay image loading */
+#define ATOMISP_IOC_G_ISP_OVERLAY \
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 36, struct atomisp_overlay)
+#define ATOMISP_IOC_S_ISP_OVERLAY \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 37, struct atomisp_overlay)
 
-/*Private control IDs*/
+/* bcd driver bridge */
+#define ATOMISP_IOC_CAMERA_BRIDGE \
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 38, struct atomisp_bc_video_package)
+
+/* Sensor resolution specific info for AE */
+#define ATOMISP_IOC_G_SENSOR_MODE_DATA \
+       _IOR('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_sensor_mode_data)
+
+#define ATOMISP_IOC_S_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 + 41, struct atomisp_calibration_group)
+
+/* white balance Correction */
+#define ATOMISP_IOC_G_3A_CONFIG \
+       _IOR('v', BASE_VIDIOC_PRIVATE + 42, struct atomisp_3a_config)
+#define ATOMISP_IOC_S_3A_CONFIG \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_3a_config)
+
+/* Accelerate ioctls */
+#define ATOMISP_IOC_ACC_LOAD \
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 44, struct atomisp_acc_fw_load)
+
+#define ATOMISP_IOC_ACC_UNLOAD \
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 45, unsigned int)
+
+#define ATOMISP_IOC_ACC_S_ARG \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 46, struct atomisp_acc_fw_arg)
+
+#define ATOMISP_IOC_ACC_START \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 47, unsigned int)
+
+#define ATOMISP_IOC_ACC_WAIT \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 48, unsigned int)
+
+#define ATOMISP_IOC_ACC_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 + 50, struct v4l2_private_int_data)
+
+/* LCS (shading) table write */
+#define ATOMISP_IOC_S_ISP_SHD_TAB \
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 51, struct atomisp_shading_table)
+
+/* Gamma Correction */
+#define ATOMISP_IOC_G_ISP_GAMMA_CORRECTION \
+       _IOR('v', BASE_VIDIOC_PRIVATE + 52, struct atomisp_gc_config)
+
+#define ATOMISP_IOC_S_ISP_GAMMA_CORRECTION \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 53, struct atomisp_gc_config)
+
+#define ATOMISP_IOC_ACC_DESTAB \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 54, struct atomisp_acc_fw_arg)
+
+/*
+ * Reserved ioctls. We have customer implementing it internally.
+ * We can't use both numbers to not cause ABI conflict.
+ * Anyway, those ioctls are hacks and not implemented by us:
+ *
+ * #define ATOMISP_IOC_G_SENSOR_REG \
+ *     _IOW('v', BASE_VIDIOC_PRIVATE + 55, struct atomisp_sensor_regs)
+ * #define ATOMISP_IOC_S_SENSOR_REG \
+ *     _IOW('v', BASE_VIDIOC_PRIVATE + 56, struct atomisp_sensor_regs)
+ */
+
+/* motor internal memory read */
+#define ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA \
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 57, struct v4l2_private_int_data)
+
+/* signal */
+#define ATOMISP_IOC_S_SIGNAL \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 58, int)
+
+#define ATOMISP_IOC_S_MIPI_IRQ \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 59, int)
+
+/*  ISP Private control IDs */
 #define V4L2_CID_ATOMISP_BAD_PIXEL_DETECTION \
        (V4L2_CID_PRIVATE_BASE + 0)
 #define V4L2_CID_ATOMISP_POSTPROCESS_GDC_CAC \
@@ -180,7 +679,63 @@ struct atomisp_makernote {
        (V4L2_CID_PRIVATE_BASE + 3)
 #define V4L2_CID_ATOMISP_FALSE_COLOR_CORRECTION \
        (V4L2_CID_PRIVATE_BASE + 4)
-#define V4L2_CID_ATOMISP_SHADING_CORRECTION \
+#define V4L2_CID_ATOMISP_LOW_LIGHT \
        (V4L2_CID_PRIVATE_BASE + 5)
 
-#endif /* ATOMISP_V4L2_H_ */
+/* Camera class:
+ * Exposure, Flash and privacy (indicator) light controls, to be upstreamed */
+#define V4L2_CID_CAMERA_LASTP1             (V4L2_CID_CAMERA_CLASS_BASE + 1024)
+
+#define V4L2_CID_FOCAL_ABSOLUTE            (V4L2_CID_CAMERA_LASTP1 + 0)
+#define V4L2_CID_FNUMBER_ABSOLUTE          (V4L2_CID_CAMERA_LASTP1 + 1)
+#define V4L2_CID_FNUMBER_RANGE             (V4L2_CID_CAMERA_LASTP1 + 2)
+
+/* Flash related CIDs, see also:
+ * http://linuxtv.org/downloads/v4l-dvb-apis/extended-controls.html\
+ * #flash-controls */
+
+/* Request a number of flash-exposed frames. The frame status can be
+ * found in the reserved field in the v4l2_buffer struct. */
+#define V4L2_CID_REQUEST_FLASH             (V4L2_CID_CAMERA_LASTP1 + 3)
+/* Flash intensity, in percentage. */
+#define V4L2_CID_FLASH_INTENSITY           (V4L2_CID_CAMERA_LASTP1 + 4)
+/* Query flash driver status. See enum atomisp_flash_status above. */
+#define V4L2_CID_FLASH_STATUS              (V4L2_CID_CAMERA_LASTP1 + 5)
+/* Torch intensity, in percentage. */
+#define V4L2_CID_FLASH_TORCH_INTENSITY     (V4L2_CID_CAMERA_LASTP1 + 6)
+/* Indicator intensity, in percentage. */
+#define V4L2_CID_FLASH_INDICATOR_INTENSITY (V4L2_CID_CAMERA_LASTP1 + 7)
+/* Flash timeout (in ms). */
+#define V4L2_CID_FLASH_TIMEOUT             (V4L2_CID_CAMERA_LASTP1 + 8)
+/* Enable (1) or disable (0) the flash (only valid in FLASH mode). */
+#define V4L2_CID_FLASH_STROBE              (V4L2_CID_CAMERA_LASTP1 + 9)
+/* Set the flash mode (see enum atomisp_flash_mode) */
+#define V4L2_CID_FLASH_MODE                (V4L2_CID_CAMERA_LASTP1 + 10)
+
+/* VCM slew control */
+#define V4L2_CID_VCM_SLEW                  (V4L2_CID_CAMERA_LASTP1 + 11)
+/* VCM step time */
+#define V4L2_CID_VCM_TIMEING               (V4L2_CID_CAMERA_LASTP1 + 12)
+/* sensor test pattern */
+#define V4L2_CID_TEST_PATTERN              (V4L2_CID_CAMERA_LASTP1 + 13)
+
+/* Query Focus Status */
+#define V4L2_CID_FOCUS_STATUS              (V4L2_CID_CAMERA_LASTP1 + 14)
+
+/* Query sensor's binning factor */
+#define V4L2_CID_BIN_FACTOR_HORZ          (V4L2_CID_CAMERA_LASTP1 + 15)
+#define V4L2_CID_BIN_FACTOR_VERT          (V4L2_CID_CAMERA_LASTP1 + 16)
+
+/* number of frames to skip at stream start */
+#define V4L2_CID_G_SKIP_FRAMES            (V4L2_CID_CAMERA_LASTP1 + 17)
+
+#define V4L2_BUF_FLAG_BUFFER_INVALID       0x0400
+#define V4L2_BUF_FLAG_BUFFER_VALID         0x0800
+
+/* Nonstandard color effects for V4L2_CID_COLORFX */
+enum {
+       V4L2_COLORFX_SKIN_WHITEN_LOW = 1001,
+       V4L2_COLORFX_SKIN_WHITEN_HIGH = 1002,
+};
+
+#endif /* _ATOM_ISP_H */
index 1cd6048..72b31a2 100644 (file)
@@ -256,7 +256,7 @@ ctrl_failed3:
   }
 }
 
-static struct sh_css_gamma_table g_gamma_table;
+static struct atomisp_gamma_table g_gamma_table;
 
 /* Gamma configuration
  * Also used by extended dymanic range and tone control
@@ -334,8 +334,8 @@ cam_driver_set_fpn (int fd, int on)
 cam_err_t
 cam_driver_set_sc (int fd, int on)
 {
-  return cam_driver_set_attribute (fd, V4L2_CID_ATOMISP_SHADING_CORRECTION, on,
-                                  "Shading Correction");
+// TODO check this
+  return CAM_ERR_NONE;
 }
 
 /* Bad Pixel Detection*/
@@ -355,9 +355,9 @@ cam_driver_get_bpd (int fd, int *on)
 cam_err_t
 cam_driver_set_bnr (int fd, int on)
 {
-  struct sh_css_nr_config bnr;
+  struct atomisp_nr_config bnr;
   if (on) {
-    bnr.gain = 60000;
+    bnr.bnr_gain = 60000;
     bnr.direction = 3200;
     bnr.threshold_cb = 64;
     bnr.threshold_cr = 64;
@@ -386,7 +386,7 @@ cam_driver_set_ynr (int fd, int on)
 cam_err_t
 cam_driver_set_ee (int fd, int on)
 {
-  struct sh_css_ee_config ee;
+  struct atomisp_ee_config ee;
   if (on) {
     ee.gain = 8192;
     ee.threshold = 128;
@@ -403,8 +403,8 @@ cam_driver_set_ee (int fd, int on)
 cam_err_t
 cam_driver_set_blc (int fd, int on)
 {
-  static struct sh_css_ob_config ob_off;
-  struct sh_css_ob_config ob_on;
+  static struct atomisp_ob_config ob_off;
+  struct atomisp_ob_config ob_on;
   static int current_status = 0;
 
   cam_driver_dbg("Set Black Level compensation\n");
@@ -418,7 +418,7 @@ cam_driver_set_blc (int fd, int on)
       return CAM_ERR_NONE;
   }
 
-  ob_on.mode = sh_css_ob_mode_fixed;
+  ob_on.mode = atomisp_ob_mode_fixed;
   ob_on.level_gr = 0;
   ob_on.level_r = 0;
   ob_on.level_b = 0;
@@ -449,7 +449,7 @@ cam_driver_set_blc (int fd, int on)
 cam_err_t
 cam_driver_set_tnr (int fd, int on)
 {
-  struct sh_css_tnr_config tnr;
+  struct atomisp_tnr_config tnr;
   return xioctl (fd, ATOMISP_IOC_S_TNR, &tnr, "ATOMISP_IOC_S_TNR");
 }
 
@@ -595,29 +595,29 @@ cam_driver_get_exposure (int fd, int *exposure)
 cam_err_t
 cam_driver_set_aperture (int fd, unsigned int aperture)
 {
-  if (aperture == 0)
-    return CAM_ERR_NONE;
-  return cam_driver_set_attribute (fd, V4L2_CID_APERTURE_ABSOLUTE, aperture, "aperture");
+// TODO check this
+  return CAM_ERR_NONE;
 }
 
 cam_err_t
 cam_driver_get_aperture (int fd, int *aperture)
 {
-  return cam_driver_get_attribute (fd, V4L2_CID_APERTURE_ABSOLUTE, aperture, "Aperture");
+// TODO check this
+  return CAM_ERR_NONE;
 }
 
 cam_err_t
 cam_driver_set_iso_speed (int fd, unsigned int iso_speed)
 {
-  if (iso_speed == 0)
-    return CAM_ERR_NONE;
-  return cam_driver_set_attribute (fd, V4L2_CID_ISO_ABSOLUTE, iso_speed, "iso_speed");
+// TODO check this
+  return CAM_ERR_NONE;
 }
 
 cam_err_t
 cam_driver_get_iso_speed (int fd, int *iso_speed)
 {
-  return cam_driver_get_attribute (fd, V4L2_CID_ISO_ABSOLUTE, iso_speed, "ISO_SPEED");
+// TODO check this
+  return CAM_ERR_NONE;
 }
 
 cam_err_t
@@ -654,12 +654,8 @@ cam_err_t
 cam_driver_get_makernote (int fd, unsigned char *buf, unsigned size)
 {
        int ret;
-       struct atomisp_makernote arg;
-
-       arg.buf = buf;
-       arg.size = size;
 
-       ret = xioctl (fd, ATOMISP_IOC_ISP_MAKERNOTE, &arg, "G_MAKERNOTE");
+       ret = xioctl (fd, ATOMISP_IOC_ISP_MAKERNOTE, buf, "G_MAKERNOTE");
        if (ret < 0)
          return CAM_ERR_SYS;
        else