blob: 7b7e7b26c1e8c525699c04451302586a36bc001a [file] [log] [blame]
/*
* Copyright (C) 2012 Texas Instruments Inc
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contributors:
* Manjunath Hadli <manjunath.hadli@ti.com>
* Prabhakar Lad <prabhakar.lad@ti.com>
*/
#ifndef _DAVINCI_VPFE_USER_H
#define _DAVINCI_VPFE_USER_H
#include <linux/types.h>
#include <linux/videodev2.h>
/*
* Private IOCTL
*
* VIDIOC_VPFE_ISIF_S_RAW_PARAMS: Set raw params in isif
* VIDIOC_VPFE_ISIF_G_RAW_PARAMS: Get raw params from isif
* VIDIOC_VPFE_PRV_S_CONFIG: Set ipipe engine configuration
* VIDIOC_VPFE_PRV_G_CONFIG: Get ipipe engine configuration
* VIDIOC_VPFE_RSZ_S_CONFIG: Set resizer engine configuration
* VIDIOC_VPFE_RSZ_G_CONFIG: Get resizer engine configuration
*/
#define VIDIOC_VPFE_ISIF_S_RAW_PARAMS \
_IOW('V', BASE_VIDIOC_PRIVATE + 1, struct vpfe_isif_raw_config)
#define VIDIOC_VPFE_ISIF_G_RAW_PARAMS \
_IOR('V', BASE_VIDIOC_PRIVATE + 2, struct vpfe_isif_raw_config)
#define VIDIOC_VPFE_IPIPE_S_CONFIG \
_IOWR('P', BASE_VIDIOC_PRIVATE + 3, struct vpfe_ipipe_config)
#define VIDIOC_VPFE_IPIPE_G_CONFIG \
_IOWR('P', BASE_VIDIOC_PRIVATE + 4, struct vpfe_ipipe_config)
#define VIDIOC_VPFE_RSZ_S_CONFIG \
_IOWR('R', BASE_VIDIOC_PRIVATE + 5, struct vpfe_rsz_config)
#define VIDIOC_VPFE_RSZ_G_CONFIG \
_IOWR('R', BASE_VIDIOC_PRIVATE + 6, struct vpfe_rsz_config)
/*
* Private Control's for ISIF
*/
#define VPFE_ISIF_CID_CRGAIN (V4L2_CID_USER_BASE | 0xa001)
#define VPFE_ISIF_CID_CGRGAIN (V4L2_CID_USER_BASE | 0xa002)
#define VPFE_ISIF_CID_CGBGAIN (V4L2_CID_USER_BASE | 0xa003)
#define VPFE_ISIF_CID_CBGAIN (V4L2_CID_USER_BASE | 0xa004)
#define VPFE_ISIF_CID_GAIN_OFFSET (V4L2_CID_USER_BASE | 0xa005)
/*
* Private Control's for ISIF and IPIPEIF
*/
#define VPFE_CID_DPCM_PREDICTOR (V4L2_CID_USER_BASE | 0xa006)
/************************************************************************
* Vertical Defect Correction parameters
***********************************************************************/
/**
* vertical defect correction methods
*/
enum vpfe_isif_vdfc_corr_mode {
/* Defect level subtraction. Just fed through if saturating */
VPFE_ISIF_VDFC_NORMAL,
/**
* Defect level subtraction. Horizontal interpolation ((i-2)+(i+2))/2
* if data saturating
*/
VPFE_ISIF_VDFC_HORZ_INTERPOL_IF_SAT,
/* Horizontal interpolation (((i-2)+(i+2))/2) */
VPFE_ISIF_VDFC_HORZ_INTERPOL
};
/**
* Max Size of the Vertical Defect Correction table
*/
#define VPFE_ISIF_VDFC_TABLE_SIZE 8
/**
* Values used for shifting up the vdfc defect level
*/
enum vpfe_isif_vdfc_shift {
/* No Shift */
VPFE_ISIF_VDFC_NO_SHIFT,
/* Shift by 1 bit */
VPFE_ISIF_VDFC_SHIFT_1,
/* Shift by 2 bit */
VPFE_ISIF_VDFC_SHIFT_2,
/* Shift by 3 bit */
VPFE_ISIF_VDFC_SHIFT_3,
/* Shift by 4 bit */
VPFE_ISIF_VDFC_SHIFT_4
};
/**
* Defect Correction (DFC) table entry
*/
struct vpfe_isif_vdfc_entry {
/* vertical position of defect */
unsigned short pos_vert;
/* horizontal position of defect */
unsigned short pos_horz;
/**
* Defect level of Vertical line defect position. This is subtracted
* from the data at the defect position
*/
unsigned char level_at_pos;
/**
* Defect level of the pixels upper than the vertical line defect.
* This is subtracted from the data
*/
unsigned char level_up_pixels;
/**
* Defect level of the pixels lower than the vertical line defect.
* This is subtracted from the data
*/
unsigned char level_low_pixels;
};
/**
* Structure for Defect Correction (DFC) parameter
*/
struct vpfe_isif_dfc {
/* enable vertical defect correction */
unsigned char en;
/* Correction methods */
enum vpfe_isif_vdfc_corr_mode corr_mode;
/**
* 0 - whole line corrected, 1 - not
* pixels upper than the defect
*/
unsigned char corr_whole_line;
/**
* defect level shift value. level_at_pos, level_upper_pos,
* and level_lower_pos can be shifted up by this value
*/
enum vpfe_isif_vdfc_shift def_level_shift;
/* defect saturation level */
unsigned short def_sat_level;
/* number of vertical defects. Max is VPFE_ISIF_VDFC_TABLE_SIZE */
short num_vdefects;
/* VDFC table ptr */
struct vpfe_isif_vdfc_entry table[VPFE_ISIF_VDFC_TABLE_SIZE];
};
/************************************************************************
* Digital/Black clamp or DC Subtract parameters
************************************************************************/
/**
* Horizontal Black Clamp modes
*/
enum vpfe_isif_horz_bc_mode {
/**
* Horizontal clamp disabled. Only vertical clamp
* value is subtracted
*/
VPFE_ISIF_HORZ_BC_DISABLE,
/**
* Horizontal clamp value is calculated and subtracted
* from image data along with vertical clamp value
*/
VPFE_ISIF_HORZ_BC_CLAMP_CALC_ENABLED,
/**
* Horizontal clamp value calculated from previous image
* is subtracted from image data along with vertical clamp
* value. How the horizontal clamp value for the first image
* is calculated in this case ???
*/
VPFE_ISIF_HORZ_BC_CLAMP_NOT_UPDATED
};
/**
* Base window selection for Horizontal Black Clamp calculations
*/
enum vpfe_isif_horz_bc_base_win_sel {
/* Select Most left window for bc calculation */
VPFE_ISIF_SEL_MOST_LEFT_WIN,
/* Select Most right window for bc calculation */
VPFE_ISIF_SEL_MOST_RIGHT_WIN,
};
/* Size of window in horizontal direction for horizontal bc */
enum vpfe_isif_horz_bc_sz_h {
VPFE_ISIF_HORZ_BC_SZ_H_2PIXELS,
VPFE_ISIF_HORZ_BC_SZ_H_4PIXELS,
VPFE_ISIF_HORZ_BC_SZ_H_8PIXELS,
VPFE_ISIF_HORZ_BC_SZ_H_16PIXELS
};
/* Size of window in vertcal direction for vertical bc */
enum vpfe_isif_horz_bc_sz_v {
VPFE_ISIF_HORZ_BC_SZ_H_32PIXELS,
VPFE_ISIF_HORZ_BC_SZ_H_64PIXELS,
VPFE_ISIF_HORZ_BC_SZ_H_128PIXELS,
VPFE_ISIF_HORZ_BC_SZ_H_256PIXELS
};
/**
* Structure for Horizontal Black Clamp config params
*/
struct vpfe_isif_horz_bclamp {
/* horizontal clamp mode */
enum vpfe_isif_horz_bc_mode mode;
/**
* pixel value limit enable.
* 0 - limit disabled
* 1 - pixel value limited to 1023
*/
unsigned char clamp_pix_limit;
/**
* Select most left or right window for clamp val
* calculation
*/
enum vpfe_isif_horz_bc_base_win_sel base_win_sel_calc;
/* Window count per color for calculation. range 1-32 */
unsigned char win_count_calc;
/* Window start position - horizontal for calculation. 0 - 8191 */
unsigned short win_start_h_calc;
/* Window start position - vertical for calculation 0 - 8191 */
unsigned short win_start_v_calc;
/* Width of the sample window in pixels for calculation */
enum vpfe_isif_horz_bc_sz_h win_h_sz_calc;
/* Height of the sample window in pixels for calculation */
enum vpfe_isif_horz_bc_sz_v win_v_sz_calc;
};
/**
* Black Clamp vertical reset values
*/
enum vpfe_isif_vert_bc_reset_val_sel {
/* Reset value used is the clamp value calculated */
VPFE_ISIF_VERT_BC_USE_HORZ_CLAMP_VAL,
/* Reset value used is reset_clamp_val configured */
VPFE_ISIF_VERT_BC_USE_CONFIG_CLAMP_VAL,
/* No update, previous image value is used */
VPFE_ISIF_VERT_BC_NO_UPDATE
};
enum vpfe_isif_vert_bc_sz_h {
VPFE_ISIF_VERT_BC_SZ_H_2PIXELS,
VPFE_ISIF_VERT_BC_SZ_H_4PIXELS,
VPFE_ISIF_VERT_BC_SZ_H_8PIXELS,
VPFE_ISIF_VERT_BC_SZ_H_16PIXELS,
VPFE_ISIF_VERT_BC_SZ_H_32PIXELS,
VPFE_ISIF_VERT_BC_SZ_H_64PIXELS
};
/**
* Structure for Vertical Black Clamp configuration params
*/
struct vpfe_isif_vert_bclamp {
/* Reset value selection for vertical clamp calculation */
enum vpfe_isif_vert_bc_reset_val_sel reset_val_sel;
/* U12 value if reset_sel = ISIF_BC_VERT_USE_CONFIG_CLAMP_VAL */
unsigned short reset_clamp_val;
/**
* U8Q8. Line average coefficient used in vertical clamp
* calculation
*/
unsigned char line_ave_coef;
/* Width in pixels of the optical black region used for calculation. */
enum vpfe_isif_vert_bc_sz_h ob_h_sz_calc;
/* Height of the optical black region for calculation */
unsigned short ob_v_sz_calc;
/* Optical black region start position - horizontal. 0 - 8191 */
unsigned short ob_start_h;
/* Optical black region start position - vertical 0 - 8191 */
unsigned short ob_start_v;
};
/**
* Structure for Black Clamp configuration params
*/
struct vpfe_isif_black_clamp {
/**
* this offset value is added irrespective of the clamp
* enable status. S13
*/
unsigned short dc_offset;
/**
* Enable black/digital clamp value to be subtracted
* from the image data
*/
unsigned char en;
/**
* black clamp mode. same/separate clamp for 4 colors
* 0 - disable - same clamp value for all colors
* 1 - clamp value calculated separately for all colors
*/
unsigned char bc_mode_color;
/* Vertical start position for bc subtraction */
unsigned short vert_start_sub;
/* Black clamp for horizontal direction */
struct vpfe_isif_horz_bclamp horz;
/* Black clamp for vertical direction */
struct vpfe_isif_vert_bclamp vert;
};
/*************************************************************************
** Color Space Conversion (CSC)
*************************************************************************/
/**
* Number of Coefficient values used for CSC
*/
#define VPFE_ISIF_CSC_NUM_COEFF 16
struct float_8_bit {
/* 8 bit integer part */
__u8 integer;
/* 8 bit decimal part */
__u8 decimal;
};
struct float_16_bit {
/* 16 bit integer part */
__u16 integer;
/* 16 bit decimal part */
__u16 decimal;
};
/*************************************************************************
** Color Space Conversion parameters
*************************************************************************/
/**
* Structure used for CSC config params
*/
struct vpfe_isif_color_space_conv {
/* Enable color space conversion */
unsigned char en;
/**
* csc coefficient table. S8Q5, M00 at index 0, M01 at index 1, and
* so forth
*/
struct float_8_bit coeff[VPFE_ISIF_CSC_NUM_COEFF];
};
enum vpfe_isif_datasft {
/* No Shift */
VPFE_ISIF_NO_SHIFT,
/* 1 bit Shift */
VPFE_ISIF_1BIT_SHIFT,
/* 2 bit Shift */
VPFE_ISIF_2BIT_SHIFT,
/* 3 bit Shift */
VPFE_ISIF_3BIT_SHIFT,
/* 4 bit Shift */
VPFE_ISIF_4BIT_SHIFT,
/* 5 bit Shift */
VPFE_ISIF_5BIT_SHIFT,
/* 6 bit Shift */
VPFE_ISIF_6BIT_SHIFT
};
#define VPFE_ISIF_LINEAR_TAB_SIZE 192
/*************************************************************************
** Linearization parameters
*************************************************************************/
/**
* Structure for Sensor data linearization
*/
struct vpfe_isif_linearize {
/* Enable or Disable linearization of data */
unsigned char en;
/* Shift value applied */
enum vpfe_isif_datasft corr_shft;
/* scale factor applied U11Q10 */
struct float_16_bit scale_fact;
/* Size of the linear table */
unsigned short table[VPFE_ISIF_LINEAR_TAB_SIZE];
};
/*************************************************************************
** ISIF Raw configuration parameters
*************************************************************************/
enum vpfe_isif_fmt_mode {
VPFE_ISIF_SPLIT,
VPFE_ISIF_COMBINE
};
enum vpfe_isif_lnum {
VPFE_ISIF_1LINE,
VPFE_ISIF_2LINES,
VPFE_ISIF_3LINES,
VPFE_ISIF_4LINES
};
enum vpfe_isif_line {
VPFE_ISIF_1STLINE,
VPFE_ISIF_2NDLINE,
VPFE_ISIF_3RDLINE,
VPFE_ISIF_4THLINE
};
struct vpfe_isif_fmtplen {
/**
* number of program entries for SET0, range 1 - 16
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
* ISIF_COMBINE
*/
unsigned short plen0;
/**
* number of program entries for SET1, range 1 - 16
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
* ISIF_COMBINE
*/
unsigned short plen1;
/**
* number of program entries for SET2, range 1 - 16
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
* ISIF_COMBINE
*/
unsigned short plen2;
/**
* number of program entries for SET3, range 1 - 16
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
* ISIF_COMBINE
*/
unsigned short plen3;
};
struct vpfe_isif_fmt_cfg {
/* Split or combine or line alternate */
enum vpfe_isif_fmt_mode fmtmode;
/* enable or disable line alternating mode */
unsigned char ln_alter_en;
/* Split/combine line number */
enum vpfe_isif_lnum lnum;
/* Address increment Range 1 - 16 */
unsigned int addrinc;
};
struct vpfe_isif_fmt_addr_ptr {
/* Initial address */
unsigned int init_addr;
/* output line number */
enum vpfe_isif_line out_line;
};
struct vpfe_isif_fmtpgm_ap {
/* program address pointer */
unsigned char pgm_aptr;
/* program address increment or decrement */
unsigned char pgmupdt;
};
struct vpfe_isif_data_formatter {
/* Enable/Disable data formatter */
unsigned char en;
/* data formatter configuration */
struct vpfe_isif_fmt_cfg cfg;
/* Formatter program entries length */
struct vpfe_isif_fmtplen plen;
/* first pixel in a line fed to formatter */
unsigned short fmtrlen;
/* HD interval for output line. Only valid when split line */
unsigned short fmthcnt;
/* formatter address pointers */
struct vpfe_isif_fmt_addr_ptr fmtaddr_ptr[16];
/* program enable/disable */
unsigned char pgm_en[32];
/* program address pointers */
struct vpfe_isif_fmtpgm_ap fmtpgm_ap[32];
};
struct vpfe_isif_df_csc {
/* Color Space Conversion configuration, 0 - csc, 1 - df */
unsigned int df_or_csc;
/* csc configuration valid if df_or_csc is 0 */
struct vpfe_isif_color_space_conv csc;
/* data formatter configuration valid if df_or_csc is 1 */
struct vpfe_isif_data_formatter df;
/* start pixel in a line at the input */
unsigned int start_pix;
/* number of pixels in input line */
unsigned int num_pixels;
/* start line at the input */
unsigned int start_line;
/* number of lines at the input */
unsigned int num_lines;
};
struct vpfe_isif_gain_offsets_adj {
/* Enable or Disable Gain adjustment for SDRAM data */
unsigned char gain_sdram_en;
/* Enable or Disable Gain adjustment for IPIPE data */
unsigned char gain_ipipe_en;
/* Enable or Disable Gain adjustment for H3A data */
unsigned char gain_h3a_en;
/* Enable or Disable Gain adjustment for SDRAM data */
unsigned char offset_sdram_en;
/* Enable or Disable Gain adjustment for IPIPE data */
unsigned char offset_ipipe_en;
/* Enable or Disable Gain adjustment for H3A data */
unsigned char offset_h3a_en;
};
struct vpfe_isif_cul {
/* Horizontal Cull pattern for odd lines */
unsigned char hcpat_odd;
/* Horizontal Cull pattern for even lines */
unsigned char hcpat_even;
/* Vertical Cull pattern */
unsigned char vcpat;
/* Enable or disable lpf. Apply when cull is enabled */
unsigned char en_lpf;
};
/* all the stuff in this struct will be provided by userland */
struct vpfe_isif_raw_config {
/* Linearization parameters for image sensor data input */
struct vpfe_isif_linearize linearize;
/* Data formatter or CSC */
struct vpfe_isif_df_csc df_csc;
/* Defect Pixel Correction (DFC) confguration */
struct vpfe_isif_dfc dfc;
/* Black/Digital Clamp configuration */
struct vpfe_isif_black_clamp bclamp;
/* Gain, offset adjustments */
struct vpfe_isif_gain_offsets_adj gain_offset;
/* Culling */
struct vpfe_isif_cul culling;
/* horizontal offset for Gain/LSC/DFC */
unsigned short horz_offset;
/* vertical offset for Gain/LSC/DFC */
unsigned short vert_offset;
};
/**********************************************************************
IPIPE API Structures
**********************************************************************/
/* IPIPE module configurations */
/* IPIPE input configuration */
#define VPFE_IPIPE_INPUT_CONFIG (1 << 0)
/* LUT based Defect Pixel Correction */
#define VPFE_IPIPE_LUTDPC (1 << 1)
/* On the fly (OTF) Defect Pixel Correction */
#define VPFE_IPIPE_OTFDPC (1 << 2)
/* Noise Filter - 1 */
#define VPFE_IPIPE_NF1 (1 << 3)
/* Noise Filter - 2 */
#define VPFE_IPIPE_NF2 (1 << 4)
/* White Balance. Also a control ID */
#define VPFE_IPIPE_WB (1 << 5)
/* 1st RGB to RBG Blend module */
#define VPFE_IPIPE_RGB2RGB_1 (1 << 6)
/* 2nd RGB to RBG Blend module */
#define VPFE_IPIPE_RGB2RGB_2 (1 << 7)
/* Gamma Correction */
#define VPFE_IPIPE_GAMMA (1 << 8)
/* 3D LUT color conversion */
#define VPFE_IPIPE_3D_LUT (1 << 9)
/* RGB to YCbCr module */
#define VPFE_IPIPE_RGB2YUV (1 << 10)
/* YUV 422 conversion module */
#define VPFE_IPIPE_YUV422_CONV (1 << 11)
/* Edge Enhancement */
#define VPFE_IPIPE_YEE (1 << 12)
/* Green Imbalance Correction */
#define VPFE_IPIPE_GIC (1 << 13)
/* CFA Interpolation */
#define VPFE_IPIPE_CFA (1 << 14)
/* Chroma Artifact Reduction */
#define VPFE_IPIPE_CAR (1 << 15)
/* Chroma Gain Suppression */
#define VPFE_IPIPE_CGS (1 << 16)
/* Global brightness and contrast control */
#define VPFE_IPIPE_GBCE (1 << 17)
#define VPFE_IPIPE_MAX_MODULES 18
struct ipipe_float_u16 {
unsigned short integer;
unsigned short decimal;
};
struct ipipe_float_s16 {
short integer;
unsigned short decimal;
};
struct ipipe_float_u8 {
unsigned char integer;
unsigned char decimal;
};
/* Copy method selection for vertical correction
* Used when ipipe_dfc_corr_meth is IPIPE_DPC_CTORB_AFTER_HINT
*/
enum vpfe_ipipe_dpc_corr_meth {
/* replace by black or white dot specified by repl_white */
VPFE_IPIPE_DPC_REPL_BY_DOT = 0,
/* Copy from left */
VPFE_IPIPE_DPC_CL = 1,
/* Copy from right */
VPFE_IPIPE_DPC_CR = 2,
/* Horizontal interpolation */
VPFE_IPIPE_DPC_H_INTP = 3,
/* Vertical interpolation */
VPFE_IPIPE_DPC_V_INTP = 4,
/* Copy from top */
VPFE_IPIPE_DPC_CT = 5,
/* Copy from bottom */
VPFE_IPIPE_DPC_CB = 6,
/* 2D interpolation */
VPFE_IPIPE_DPC_2D_INTP = 7,
};
struct vpfe_ipipe_lutdpc_entry {
/* Horizontal position */
unsigned short horz_pos;
/* vertical position */
unsigned short vert_pos;
enum vpfe_ipipe_dpc_corr_meth method;
};
#define VPFE_IPIPE_MAX_SIZE_DPC 256
/* Structure for configuring DPC module */
struct vpfe_ipipe_lutdpc {
/* 0 - disable, 1 - enable */
unsigned char en;
/* 0 - replace with black dot, 1 - white dot when correction
* method is IPIPE_DFC_REPL_BY_DOT=0,
*/
unsigned char repl_white;
/* number of entries in the correction table. Currently only
* support up-to 256 entries. infinite mode is not supported
*/
unsigned short dpc_size;
struct vpfe_ipipe_lutdpc_entry table[VPFE_IPIPE_MAX_SIZE_DPC];
};
enum vpfe_ipipe_otfdpc_det_meth {
VPFE_IPIPE_DPC_OTF_MIN_MAX,
VPFE_IPIPE_DPC_OTF_MIN_MAX2
};
struct vpfe_ipipe_otfdpc_thr {
unsigned short r;
unsigned short gr;
unsigned short gb;
unsigned short b;
};
enum vpfe_ipipe_otfdpc_alg {
VPFE_IPIPE_OTFDPC_2_0,
VPFE_IPIPE_OTFDPC_3_0
};
struct vpfe_ipipe_otfdpc_2_0_cfg {
/* defect detection threshold for MIN_MAX2 method (DPC 2.0 alg) */
struct vpfe_ipipe_otfdpc_thr det_thr;
/* defect correction threshold for MIN_MAX2 method (DPC 2.0 alg) or
* maximum value for MIN_MAX method
*/
struct vpfe_ipipe_otfdpc_thr corr_thr;
};
struct vpfe_ipipe_otfdpc_3_0_cfg {
/* DPC3.0 activity adj shf. activity = (max2-min2) >> (6 -shf)
*/
unsigned char act_adj_shf;
/* DPC3.0 detection threshold, THR */
unsigned short det_thr;
/* DPC3.0 detection threshold slope, SLP */
unsigned short det_slp;
/* DPC3.0 detection threshold min, MIN */
unsigned short det_thr_min;
/* DPC3.0 detection threshold max, MAX */
unsigned short det_thr_max;
/* DPC3.0 correction threshold, THR */
unsigned short corr_thr;
/* DPC3.0 correction threshold slope, SLP */
unsigned short corr_slp;
/* DPC3.0 correction threshold min, MIN */
unsigned short corr_thr_min;
/* DPC3.0 correction threshold max, MAX */
unsigned short corr_thr_max;
};
struct vpfe_ipipe_otfdpc {
/* 0 - disable, 1 - enable */
unsigned char en;
/* defect detection method */
enum vpfe_ipipe_otfdpc_det_meth det_method;
/* Algorithm used. Applicable only when IPIPE_DPC_OTF_MIN_MAX2 is
* used
*/
enum vpfe_ipipe_otfdpc_alg alg;
union {
/* if alg is IPIPE_OTFDPC_2_0 */
struct vpfe_ipipe_otfdpc_2_0_cfg dpc_2_0;
/* if alg is IPIPE_OTFDPC_3_0 */
struct vpfe_ipipe_otfdpc_3_0_cfg dpc_3_0;
} alg_cfg;
};
/* Threshold values table size */
#define VPFE_IPIPE_NF_THR_TABLE_SIZE 8
/* Intensity values table size */
#define VPFE_IPIPE_NF_STR_TABLE_SIZE 8
/* NF, sampling method for green pixels */
enum vpfe_ipipe_nf_sampl_meth {
/* Same as R or B */
VPFE_IPIPE_NF_BOX,
/* Diamond mode */
VPFE_IPIPE_NF_DIAMOND
};
/* Structure for configuring NF module */
struct vpfe_ipipe_nf {
/* 0 - disable, 1 - enable */
unsigned char en;
/* Sampling method for green pixels */
enum vpfe_ipipe_nf_sampl_meth gr_sample_meth;
/* Down shift value in LUT reference address
*/
unsigned char shft_val;
/* Spread value in NF algorithm
*/
unsigned char spread_val;
/* Apply LSC gain to threshold. Enable this only if
* LSC is enabled in ISIF
*/
unsigned char apply_lsc_gain;
/* Threshold values table */
unsigned short thr[VPFE_IPIPE_NF_THR_TABLE_SIZE];
/* intensity values table */
unsigned char str[VPFE_IPIPE_NF_STR_TABLE_SIZE];
/* Edge detection minimum threshold */
unsigned short edge_det_min_thr;
/* Edge detection maximum threshold */
unsigned short edge_det_max_thr;
};
enum vpfe_ipipe_gic_alg {
VPFE_IPIPE_GIC_ALG_CONST_GAIN,
VPFE_IPIPE_GIC_ALG_ADAPT_GAIN
};
enum vpfe_ipipe_gic_thr_sel {
VPFE_IPIPE_GIC_THR_REG,
VPFE_IPIPE_GIC_THR_NF
};
enum vpfe_ipipe_gic_wt_fn_type {
/* Use difference as index */
VPFE_IPIPE_GIC_WT_FN_TYP_DIF,
/* Use weight function as index */
VPFE_IPIPE_GIC_WT_FN_TYP_HP_VAL
};
/* structure for Green Imbalance Correction */
struct vpfe_ipipe_gic {
/* 0 - disable, 1 - enable */
unsigned char en;
/* 0 - Constant gain , 1 - Adaptive gain algorithm */
enum vpfe_ipipe_gic_alg gic_alg;
/* GIC gain or weight. Used for Constant gain and Adaptive algorithms
*/
unsigned short gain;
/* Threshold selection. GIC register values or NF2 thr table */
enum vpfe_ipipe_gic_thr_sel thr_sel;
/* thr1. Used when thr_sel is IPIPE_GIC_THR_REG */
unsigned short thr;
/* this value is used for thr2-thr1, thr3-thr2 or
* thr4-thr3 when wt_fn_type is index. Otherwise it
* is the
*/
unsigned short slope;
/* Apply LSC gain to threshold. Enable this only if
* LSC is enabled in ISIF & thr_sel is IPIPE_GIC_THR_REG
*/
unsigned char apply_lsc_gain;
/* Multiply Nf2 threshold by this gain. Use this when thr_sel
* is IPIPE_GIC_THR_NF
*/
struct ipipe_float_u8 nf2_thr_gain;
/* Weight function uses difference as index or high pass value.
* Used for adaptive gain algorithm
*/
enum vpfe_ipipe_gic_wt_fn_type wt_fn_type;
};
/* Structure for configuring WB module */
struct vpfe_ipipe_wb {
/* Offset (S12) for R */
short ofst_r;
/* Offset (S12) for Gr */
short ofst_gr;
/* Offset (S12) for Gb */
short ofst_gb;
/* Offset (S12) for B */
short ofst_b;
/* Gain (U13Q9) for Red */
struct ipipe_float_u16 gain_r;
/* Gain (U13Q9) for Gr */
struct ipipe_float_u16 gain_gr;
/* Gain (U13Q9) for Gb */
struct ipipe_float_u16 gain_gb;
/* Gain (U13Q9) for Blue */
struct ipipe_float_u16 gain_b;
};
enum vpfe_ipipe_cfa_alg {
/* Algorithm is 2DirAC */
VPFE_IPIPE_CFA_ALG_2DIRAC,
/* Algorithm is 2DirAC + Digital Antialiasing (DAA) */
VPFE_IPIPE_CFA_ALG_2DIRAC_DAA,
/* Algorithm is DAA */
VPFE_IPIPE_CFA_ALG_DAA
};
/* Structure for CFA Interpolation */
struct vpfe_ipipe_cfa {
/* 2DirAC or 2DirAC + DAA */
enum vpfe_ipipe_cfa_alg alg;
/* 2Dir CFA HP value Low Threshold */
unsigned short hpf_thr_2dir;
/* 2Dir CFA HP value slope */
unsigned short hpf_slp_2dir;
/* 2Dir CFA HP mix threshold */
unsigned short hp_mix_thr_2dir;
/* 2Dir CFA HP mix slope */
unsigned short hp_mix_slope_2dir;
/* 2Dir Direction threshold */
unsigned short dir_thr_2dir;
/* 2Dir Direction slope */
unsigned short dir_slope_2dir;
/* 2Dir Non Directional Weight */
unsigned short nd_wt_2dir;
/* DAA Mono Hue Fraction */
unsigned short hue_fract_daa;
/* DAA Mono Edge threshold */
unsigned short edge_thr_daa;
/* DAA Mono threshold minimum */
unsigned short thr_min_daa;
/* DAA Mono threshold slope */
unsigned short thr_slope_daa;
/* DAA Mono slope minimum */
unsigned short slope_min_daa;
/* DAA Mono slope slope */
unsigned short slope_slope_daa;
/* DAA Mono LP wight */
unsigned short lp_wt_daa;
};
/* Struct for configuring RGB2RGB blending module */
struct vpfe_ipipe_rgb2rgb {
/* Matrix coefficient for RR S12Q8 for ID = 1 and S11Q8 for ID = 2 */
struct ipipe_float_s16 coef_rr;
/* Matrix coefficient for GR S12Q8/S11Q8 */
struct ipipe_float_s16 coef_gr;
/* Matrix coefficient for BR S12Q8/S11Q8 */
struct ipipe_float_s16 coef_br;
/* Matrix coefficient for RG S12Q8/S11Q8 */
struct ipipe_float_s16 coef_rg;
/* Matrix coefficient for GG S12Q8/S11Q8 */
struct ipipe_float_s16 coef_gg;
/* Matrix coefficient for BG S12Q8/S11Q8 */
struct ipipe_float_s16 coef_bg;
/* Matrix coefficient for RB S12Q8/S11Q8 */
struct ipipe_float_s16 coef_rb;
/* Matrix coefficient for GB S12Q8/S11Q8 */
struct ipipe_float_s16 coef_gb;
/* Matrix coefficient for BB S12Q8/S11Q8 */
struct ipipe_float_s16 coef_bb;
/* Output offset for R S13/S11 */
int out_ofst_r;
/* Output offset for G S13/S11 */
int out_ofst_g;
/* Output offset for B S13/S11 */
int out_ofst_b;
};
#define VPFE_IPIPE_MAX_SIZE_GAMMA 512
enum vpfe_ipipe_gamma_tbl_size {
VPFE_IPIPE_GAMMA_TBL_SZ_64 = 64,
VPFE_IPIPE_GAMMA_TBL_SZ_128 = 128,
VPFE_IPIPE_GAMMA_TBL_SZ_256 = 256,
VPFE_IPIPE_GAMMA_TBL_SZ_512 = 512,
};
enum vpfe_ipipe_gamma_tbl_sel {
VPFE_IPIPE_GAMMA_TBL_RAM = 0,
VPFE_IPIPE_GAMMA_TBL_ROM = 1,
};
struct vpfe_ipipe_gamma_entry {
/* 10 bit slope */
short slope;
/* 10 bit offset */
unsigned short offset;
};
/* Structure for configuring Gamma correction module */
struct vpfe_ipipe_gamma {
/* 0 - Enable Gamma correction for Red
* 1 - bypass Gamma correction. Data is divided by 16
*/
unsigned char bypass_r;
/* 0 - Enable Gamma correction for Blue
* 1 - bypass Gamma correction. Data is divided by 16
*/
unsigned char bypass_b;
/* 0 - Enable Gamma correction for Green
* 1 - bypass Gamma correction. Data is divided by 16
*/
unsigned char bypass_g;
/* IPIPE_GAMMA_TBL_RAM or IPIPE_GAMMA_TBL_ROM */
enum vpfe_ipipe_gamma_tbl_sel tbl_sel;
/* Table size for RAM gamma table.
*/
enum vpfe_ipipe_gamma_tbl_size tbl_size;
/* R table */
struct vpfe_ipipe_gamma_entry table_r[VPFE_IPIPE_MAX_SIZE_GAMMA];
/* Blue table */
struct vpfe_ipipe_gamma_entry table_b[VPFE_IPIPE_MAX_SIZE_GAMMA];
/* Green table */
struct vpfe_ipipe_gamma_entry table_g[VPFE_IPIPE_MAX_SIZE_GAMMA];
};
#define VPFE_IPIPE_MAX_SIZE_3D_LUT 729
struct vpfe_ipipe_3d_lut_entry {
/* 10 bit entry for red */
unsigned short r;
/* 10 bit entry for green */
unsigned short g;
/* 10 bit entry for blue */
unsigned short b;
};
/* structure for 3D-LUT */
struct vpfe_ipipe_3d_lut {
/* enable/disable 3D lut */
unsigned char en;
/* 3D - LUT table entry */
struct vpfe_ipipe_3d_lut_entry table[VPFE_IPIPE_MAX_SIZE_3D_LUT];
};
/* Struct for configuring rgb2ycbcr module */
struct vpfe_ipipe_rgb2yuv {
/* Matrix coefficient for RY S12Q8 */
struct ipipe_float_s16 coef_ry;
/* Matrix coefficient for GY S12Q8 */
struct ipipe_float_s16 coef_gy;
/* Matrix coefficient for BY S12Q8 */
struct ipipe_float_s16 coef_by;
/* Matrix coefficient for RCb S12Q8 */
struct ipipe_float_s16 coef_rcb;
/* Matrix coefficient for GCb S12Q8 */
struct ipipe_float_s16 coef_gcb;
/* Matrix coefficient for BCb S12Q8 */
struct ipipe_float_s16 coef_bcb;
/* Matrix coefficient for RCr S12Q8 */
struct ipipe_float_s16 coef_rcr;
/* Matrix coefficient for GCr S12Q8 */
struct ipipe_float_s16 coef_gcr;
/* Matrix coefficient for BCr S12Q8 */
struct ipipe_float_s16 coef_bcr;
/* Output offset for R S11 */
int out_ofst_y;
/* Output offset for Cb S11 */
int out_ofst_cb;
/* Output offset for Cr S11 */
int out_ofst_cr;
};
enum vpfe_ipipe_gbce_type {
VPFE_IPIPE_GBCE_Y_VAL_TBL = 0,
VPFE_IPIPE_GBCE_GAIN_TBL = 1,
};
#define VPFE_IPIPE_MAX_SIZE_GBCE_LUT 1024
/* structure for Global brightness and Contrast */
struct vpfe_ipipe_gbce {
/* enable/disable GBCE */
unsigned char en;
/* Y - value table or Gain table */
enum vpfe_ipipe_gbce_type type;
/* ptr to LUT for GBCE with 1024 entries */
unsigned short table[VPFE_IPIPE_MAX_SIZE_GBCE_LUT];
};
/* Chrominance position. Applicable only for YCbCr input
* Applied after edge enhancement
*/
enum vpfe_chr_pos {
/* Co-siting, same position with luminance */
VPFE_IPIPE_YUV422_CHR_POS_COSITE = 0,
/* Centering, In the middle of luminance */
VPFE_IPIPE_YUV422_CHR_POS_CENTRE = 1,
};
/* Structure for configuring yuv422 conversion module */
struct vpfe_ipipe_yuv422_conv {
/* Max Chrominance value */
unsigned char en_chrom_lpf;
/* 1 - enable LPF for chrminance, 0 - disable */
enum vpfe_chr_pos chrom_pos;
};
#define VPFE_IPIPE_MAX_SIZE_YEE_LUT 1024
enum vpfe_ipipe_yee_merge_meth {
VPFE_IPIPE_YEE_ABS_MAX = 0,
VPFE_IPIPE_YEE_EE_ES = 1,
};
/* Structure for configuring YUV Edge Enhancement module */
struct vpfe_ipipe_yee {
/* 1 - enable enhancement, 0 - disable */
unsigned char en;
/* enable/disable halo reduction in edge sharpner */
unsigned char en_halo_red;
/* Merge method between Edge Enhancer and Edge sharpner */
enum vpfe_ipipe_yee_merge_meth merge_meth;
/* HPF Shift length */
unsigned char hpf_shft;
/* HPF Coefficient 00, S10 */
short hpf_coef_00;
/* HPF Coefficient 01, S10 */
short hpf_coef_01;
/* HPF Coefficient 02, S10 */
short hpf_coef_02;
/* HPF Coefficient 10, S10 */
short hpf_coef_10;
/* HPF Coefficient 11, S10 */
short hpf_coef_11;
/* HPF Coefficient 12, S10 */
short hpf_coef_12;
/* HPF Coefficient 20, S10 */
short hpf_coef_20;
/* HPF Coefficient 21, S10 */
short hpf_coef_21;
/* HPF Coefficient 22, S10 */
short hpf_coef_22;
/* Lower threshold before referring to LUT */
unsigned short yee_thr;
/* Edge sharpener Gain */
unsigned short es_gain;
/* Edge sharpener lower threshold */
unsigned short es_thr1;
/* Edge sharpener upper threshold */
unsigned short es_thr2;
/* Edge sharpener gain on gradient */
unsigned short es_gain_grad;
/* Edge sharpener offset on gradient */
unsigned short es_ofst_grad;
/* Ptr to EE table. Must have 1024 entries */
short table[VPFE_IPIPE_MAX_SIZE_YEE_LUT];
};
enum vpfe_ipipe_car_meth {
/* Chromatic Gain Control */
VPFE_IPIPE_CAR_CHR_GAIN_CTRL = 0,
/* Dynamic switching between CHR_GAIN_CTRL
* and MED_FLTR
*/
VPFE_IPIPE_CAR_DYN_SWITCH = 1,
/* Median Filter */
VPFE_IPIPE_CAR_MED_FLTR = 2,
};
enum vpfe_ipipe_car_hpf_type {
VPFE_IPIPE_CAR_HPF_Y = 0,
VPFE_IPIPE_CAR_HPF_H = 1,
VPFE_IPIPE_CAR_HPF_V = 2,
VPFE_IPIPE_CAR_HPF_2D = 3,
/* 2D HPF from YUV Edge Enhancement */
VPFE_IPIPE_CAR_HPF_2D_YEE = 4,
};
struct vpfe_ipipe_car_gain {
/* csup_gain */
unsigned char gain;
/* csup_shf. */
unsigned char shft;
/* gain minimum */
unsigned short gain_min;
};
/* Structure for Chromatic Artifact Reduction */
struct vpfe_ipipe_car {
/* enable/disable */
unsigned char en;
/* Gain control or Dynamic switching */
enum vpfe_ipipe_car_meth meth;
/* Gain1 function configuration for Gain control */
struct vpfe_ipipe_car_gain gain1;
/* Gain2 function configuration for Gain control */
struct vpfe_ipipe_car_gain gain2;
/* HPF type used for CAR */
enum vpfe_ipipe_car_hpf_type hpf;
/* csup_thr: HPF threshold for Gain control */
unsigned char hpf_thr;
/* Down shift value for hpf. 2 bits */
unsigned char hpf_shft;
/* switch limit for median filter */
unsigned char sw0;
/* switch coefficient for Gain control */
unsigned char sw1;
};
/* structure for Chromatic Gain Suppression */
struct vpfe_ipipe_cgs {
/* enable/disable */
unsigned char en;
/* gain1 bright side threshold */
unsigned char h_thr;
/* gain1 bright side slope */
unsigned char h_slope;
/* gain1 down shift value for bright side */
unsigned char h_shft;
/* gain1 bright side minimum gain */
unsigned char h_min;
};
/* Max pixels allowed in the input. If above this either decimation
* or frame division mode to be enabled
*/
#define VPFE_IPIPE_MAX_INPUT_WIDTH 2600
struct vpfe_ipipe_input_config {
unsigned int vst;
unsigned int hst;
};
/**
* struct vpfe_ipipe_config - IPIPE engine configuration (user)
* @input_config: Pointer to structure for ipipe configuration.
* @flag: Specifies which ISP IPIPE functions should be enabled.
* @lutdpc: Pointer to luma enhancement structure.
* @otfdpc: Pointer to structure for defect correction.
* @nf1: Pointer to structure for Noise Filter.
* @nf2: Pointer to structure for Noise Filter.
* @gic: Pointer to structure for Green Imbalance.
* @wbal: Pointer to structure for White Balance.
* @cfa: Pointer to structure containing the CFA interpolation.
* @rgb2rgb1: Pointer to structure for RGB to RGB Blending.
* @rgb2rgb2: Pointer to structure for RGB to RGB Blending.
* @gamma: Pointer to gamma structure.
* @lut: Pointer to structure for 3D LUT.
* @rgb2yuv: Pointer to structure for RGB-YCbCr conversion.
* @gbce: Pointer to structure for Global Brightness,Contrast Control.
* @yuv422_conv: Pointer to structure for YUV 422 conversion.
* @yee: Pointer to structure for Edge Enhancer.
* @car: Pointer to structure for Chromatic Artifact Reduction.
* @cgs: Pointer to structure for Chromatic Gain Suppression.
*/
struct vpfe_ipipe_config {
__u32 flag;
struct vpfe_ipipe_input_config __user *input_config;
struct vpfe_ipipe_lutdpc __user *lutdpc;
struct vpfe_ipipe_otfdpc __user *otfdpc;
struct vpfe_ipipe_nf __user *nf1;
struct vpfe_ipipe_nf __user *nf2;
struct vpfe_ipipe_gic __user *gic;
struct vpfe_ipipe_wb __user *wbal;
struct vpfe_ipipe_cfa __user *cfa;
struct vpfe_ipipe_rgb2rgb __user *rgb2rgb1;
struct vpfe_ipipe_rgb2rgb __user *rgb2rgb2;
struct vpfe_ipipe_gamma __user *gamma;
struct vpfe_ipipe_3d_lut __user *lut;
struct vpfe_ipipe_rgb2yuv __user *rgb2yuv;
struct vpfe_ipipe_gbce __user *gbce;
struct vpfe_ipipe_yuv422_conv __user *yuv422_conv;
struct vpfe_ipipe_yee __user *yee;
struct vpfe_ipipe_car __user *car;
struct vpfe_ipipe_cgs __user *cgs;
};
/*******************************************************************
** Resizer API structures
*******************************************************************/
/* Interpolation types used for horizontal rescale */
enum vpfe_rsz_intp_t {
VPFE_RSZ_INTP_CUBIC,
VPFE_RSZ_INTP_LINEAR
};
/* Horizontal LPF intensity selection */
enum vpfe_rsz_h_lpf_lse_t {
VPFE_RSZ_H_LPF_LSE_INTERN,
VPFE_RSZ_H_LPF_LSE_USER_VAL
};
enum vpfe_rsz_down_scale_ave_sz {
VPFE_IPIPE_DWN_SCALE_1_OVER_2,
VPFE_IPIPE_DWN_SCALE_1_OVER_4,
VPFE_IPIPE_DWN_SCALE_1_OVER_8,
VPFE_IPIPE_DWN_SCALE_1_OVER_16,
VPFE_IPIPE_DWN_SCALE_1_OVER_32,
VPFE_IPIPE_DWN_SCALE_1_OVER_64,
VPFE_IPIPE_DWN_SCALE_1_OVER_128,
VPFE_IPIPE_DWN_SCALE_1_OVER_256
};
struct vpfe_rsz_output_spec {
/* enable horizontal flip */
unsigned char h_flip;
/* enable vertical flip */
unsigned char v_flip;
/* line start offset for y. */
unsigned int vst_y;
/* line start offset for c. Only for 420 */
unsigned int vst_c;
/* vertical rescale interpolation type, YCbCr or Luminance */
enum vpfe_rsz_intp_t v_typ_y;
/* vertical rescale interpolation type for Chrominance */
enum vpfe_rsz_intp_t v_typ_c;
/* vertical lpf intensity - Luminance */
unsigned char v_lpf_int_y;
/* vertical lpf intensity - Chrominance */
unsigned char v_lpf_int_c;
/* horizontal rescale interpolation types, YCbCr or Luminance */
enum vpfe_rsz_intp_t h_typ_y;
/* horizontal rescale interpolation types, Chrominance */
enum vpfe_rsz_intp_t h_typ_c;
/* horizontal lpf intensity - Luminance */
unsigned char h_lpf_int_y;
/* horizontal lpf intensity - Chrominance */
unsigned char h_lpf_int_c;
/* Use down scale mode for scale down */
unsigned char en_down_scale;
/* if downscale, set the downscale more average size for horizontal
* direction. Used only if output width and height is less than
* input sizes
*/
enum vpfe_rsz_down_scale_ave_sz h_dscale_ave_sz;
/* if downscale, set the downscale more average size for vertical
* direction. Used only if output width and height is less than
* input sizes
*/
enum vpfe_rsz_down_scale_ave_sz v_dscale_ave_sz;
/* Y offset. If set, the offset would be added to the base address
*/
unsigned int user_y_ofst;
/* C offset. If set, the offset would be added to the base address
*/
unsigned int user_c_ofst;
};
struct vpfe_rsz_config_params {
unsigned int vst;
/* horizontal start position of the image
* data to IPIPE
*/
unsigned int hst;
/* output spec of the image data coming out of resizer - 0(UYVY).
*/
struct vpfe_rsz_output_spec output1;
/* output spec of the image data coming out of resizer - 1(UYVY).
*/
struct vpfe_rsz_output_spec output2;
/* 0 , chroma sample at odd pixel, 1 - even pixel */
unsigned char chroma_sample_even;
unsigned char frame_div_mode_en;
unsigned char yuv_y_min;
unsigned char yuv_y_max;
unsigned char yuv_c_min;
unsigned char yuv_c_max;
enum vpfe_chr_pos out_chr_pos;
unsigned char bypass;
};
/* Structure for VIDIOC_VPFE_RSZ_[S/G]_CONFIG IOCTLs */
struct vpfe_rsz_config {
struct vpfe_rsz_config_params *config;
};
#endif /* _DAVINCI_VPFE_USER_H */