6db4831e98
Android 14
528 lines
14 KiB
C
528 lines
14 KiB
C
/*
|
|
* Copyright (C) 2008-2009 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; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* 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.
|
|
*
|
|
* isif header file
|
|
*/
|
|
#ifndef _ISIF_H
|
|
#define _ISIF_H
|
|
|
|
#include <media/davinci/ccdc_types.h>
|
|
#include <media/davinci/vpfe_types.h>
|
|
|
|
/* isif float type S8Q8/U8Q8 */
|
|
struct isif_float_8 {
|
|
/* 8 bit integer part */
|
|
__u8 integer;
|
|
/* 8 bit decimal part */
|
|
__u8 decimal;
|
|
};
|
|
|
|
/* isif float type U16Q16/S16Q16 */
|
|
struct isif_float_16 {
|
|
/* 16 bit integer part */
|
|
__u16 integer;
|
|
/* 16 bit decimal part */
|
|
__u16 decimal;
|
|
};
|
|
|
|
/************************************************************************
|
|
* Vertical Defect Correction parameters
|
|
***********************************************************************/
|
|
/* Defect Correction (DFC) table entry */
|
|
struct isif_vdfc_entry {
|
|
/* vertical position of defect */
|
|
__u16 pos_vert;
|
|
/* horizontal position of defect */
|
|
__u16 pos_horz;
|
|
/*
|
|
* Defect level of Vertical line defect position. This is subtracted
|
|
* from the data at the defect position
|
|
*/
|
|
__u8 level_at_pos;
|
|
/*
|
|
* Defect level of the pixels upper than the vertical line defect.
|
|
* This is subtracted from the data
|
|
*/
|
|
__u8 level_up_pixels;
|
|
/*
|
|
* Defect level of the pixels lower than the vertical line defect.
|
|
* This is subtracted from the data
|
|
*/
|
|
__u8 level_low_pixels;
|
|
};
|
|
|
|
#define ISIF_VDFC_TABLE_SIZE 8
|
|
struct isif_dfc {
|
|
/* enable vertical defect correction */
|
|
__u8 en;
|
|
/* Defect level subtraction. Just fed through if saturating */
|
|
#define ISIF_VDFC_NORMAL 0
|
|
/*
|
|
* Defect level subtraction. Horizontal interpolation ((i-2)+(i+2))/2
|
|
* if data saturating
|
|
*/
|
|
#define ISIF_VDFC_HORZ_INTERPOL_IF_SAT 1
|
|
/* Horizontal interpolation (((i-2)+(i+2))/2) */
|
|
#define ISIF_VDFC_HORZ_INTERPOL 2
|
|
/* one of the vertical defect correction modes above */
|
|
__u8 corr_mode;
|
|
/* 0 - whole line corrected, 1 - not pixels upper than the defect */
|
|
__u8 corr_whole_line;
|
|
#define ISIF_VDFC_NO_SHIFT 0
|
|
#define ISIF_VDFC_SHIFT_1 1
|
|
#define ISIF_VDFC_SHIFT_2 2
|
|
#define ISIF_VDFC_SHIFT_3 3
|
|
#define ISIF_VDFC_SHIFT_4 4
|
|
/*
|
|
* defect level shift value. level_at_pos, level_upper_pos,
|
|
* and level_lower_pos can be shifted up by this value. Choose
|
|
* one of the values above
|
|
*/
|
|
__u8 def_level_shift;
|
|
/* defect saturation level */
|
|
__u16 def_sat_level;
|
|
/* number of vertical defects. Max is ISIF_VDFC_TABLE_SIZE */
|
|
__u16 num_vdefects;
|
|
/* VDFC table ptr */
|
|
struct isif_vdfc_entry table[ISIF_VDFC_TABLE_SIZE];
|
|
};
|
|
|
|
struct isif_horz_bclamp {
|
|
|
|
/* Horizontal clamp disabled. Only vertical clamp value is subtracted */
|
|
#define ISIF_HORZ_BC_DISABLE 0
|
|
/*
|
|
* Horizontal clamp value is calculated and subtracted from image data
|
|
* along with vertical clamp value
|
|
*/
|
|
#define ISIF_HORZ_BC_CLAMP_CALC_ENABLED 1
|
|
/*
|
|
* Horizontal clamp value calculated from previous image is subtracted
|
|
* from image data along with vertical clamp value.
|
|
*/
|
|
#define ISIF_HORZ_BC_CLAMP_NOT_UPDATED 2
|
|
/* horizontal clamp mode. One of the values above */
|
|
__u8 mode;
|
|
/*
|
|
* pixel value limit enable.
|
|
* 0 - limit disabled
|
|
* 1 - pixel value limited to 1023
|
|
*/
|
|
__u8 clamp_pix_limit;
|
|
/* Select Most left window for bc calculation */
|
|
#define ISIF_SEL_MOST_LEFT_WIN 0
|
|
/* Select Most right window for bc calculation */
|
|
#define ISIF_SEL_MOST_RIGHT_WIN 1
|
|
/* Select most left or right window for clamp val calculation */
|
|
__u8 base_win_sel_calc;
|
|
/* Window count per color for calculation. range 1-32 */
|
|
__u8 win_count_calc;
|
|
/* Window start position - horizontal for calculation. 0 - 8191 */
|
|
__u16 win_start_h_calc;
|
|
/* Window start position - vertical for calculation 0 - 8191 */
|
|
__u16 win_start_v_calc;
|
|
#define ISIF_HORZ_BC_SZ_H_2PIXELS 0
|
|
#define ISIF_HORZ_BC_SZ_H_4PIXELS 1
|
|
#define ISIF_HORZ_BC_SZ_H_8PIXELS 2
|
|
#define ISIF_HORZ_BC_SZ_H_16PIXELS 3
|
|
/* Width of the sample window in pixels for calculation */
|
|
__u8 win_h_sz_calc;
|
|
#define ISIF_HORZ_BC_SZ_V_32PIXELS 0
|
|
#define ISIF_HORZ_BC_SZ_V_64PIXELS 1
|
|
#define ISIF_HORZ_BC_SZ_V_128PIXELS 2
|
|
#define ISIF_HORZ_BC_SZ_V_256PIXELS 3
|
|
/* Height of the sample window in pixels for calculation */
|
|
__u8 win_v_sz_calc;
|
|
};
|
|
|
|
/************************************************************************
|
|
* Black Clamp parameters
|
|
***********************************************************************/
|
|
struct isif_vert_bclamp {
|
|
/* Reset value used is the clamp value calculated */
|
|
#define ISIF_VERT_BC_USE_HORZ_CLAMP_VAL 0
|
|
/* Reset value used is reset_clamp_val configured */
|
|
#define ISIF_VERT_BC_USE_CONFIG_CLAMP_VAL 1
|
|
/* No update, previous image value is used */
|
|
#define ISIF_VERT_BC_NO_UPDATE 2
|
|
/*
|
|
* Reset value selector for vertical clamp calculation. Use one of
|
|
* the above values
|
|
*/
|
|
__u8 reset_val_sel;
|
|
/* U8Q8. Line average coefficient used in vertical clamp calculation */
|
|
__u8 line_ave_coef;
|
|
/* Height of the optical black region for calculation */
|
|
__u16 ob_v_sz_calc;
|
|
/* Optical black region start position - horizontal. 0 - 8191 */
|
|
__u16 ob_start_h;
|
|
/* Optical black region start position - vertical 0 - 8191 */
|
|
__u16 ob_start_v;
|
|
};
|
|
|
|
struct isif_black_clamp {
|
|
/*
|
|
* This offset value is added irrespective of the clamp enable status.
|
|
* S13
|
|
*/
|
|
__u16 dc_offset;
|
|
/*
|
|
* Enable black/digital clamp value to be subtracted from the image data
|
|
*/
|
|
__u8 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
|
|
*/
|
|
__u8 bc_mode_color;
|
|
/* Vrtical start position for bc subtraction */
|
|
__u16 vert_start_sub;
|
|
/* Black clamp for horizontal direction */
|
|
struct isif_horz_bclamp horz;
|
|
/* Black clamp for vertical direction */
|
|
struct isif_vert_bclamp vert;
|
|
};
|
|
|
|
/*************************************************************************
|
|
** Color Space Conversion (CSC)
|
|
*************************************************************************/
|
|
#define ISIF_CSC_NUM_COEFF 16
|
|
struct isif_color_space_conv {
|
|
/* Enable color space conversion */
|
|
__u8 en;
|
|
/*
|
|
* csc coeffient table. S8Q5, M00 at index 0, M01 at index 1, and
|
|
* so forth
|
|
*/
|
|
struct isif_float_8 coeff[ISIF_CSC_NUM_COEFF];
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
** Black Compensation parameters
|
|
*************************************************************************/
|
|
struct isif_black_comp {
|
|
/* Comp for Red */
|
|
__s8 r_comp;
|
|
/* Comp for Gr */
|
|
__s8 gr_comp;
|
|
/* Comp for Blue */
|
|
__s8 b_comp;
|
|
/* Comp for Gb */
|
|
__s8 gb_comp;
|
|
};
|
|
|
|
/*************************************************************************
|
|
** Gain parameters
|
|
*************************************************************************/
|
|
struct isif_gain {
|
|
/* Gain for Red or ye */
|
|
struct isif_float_16 r_ye;
|
|
/* Gain for Gr or cy */
|
|
struct isif_float_16 gr_cy;
|
|
/* Gain for Gb or g */
|
|
struct isif_float_16 gb_g;
|
|
/* Gain for Blue or mg */
|
|
struct isif_float_16 b_mg;
|
|
};
|
|
|
|
#define ISIF_LINEAR_TAB_SIZE 192
|
|
/*************************************************************************
|
|
** Linearization parameters
|
|
*************************************************************************/
|
|
struct isif_linearize {
|
|
/* Enable or Disable linearization of data */
|
|
__u8 en;
|
|
/* Shift value applied */
|
|
__u8 corr_shft;
|
|
/* scale factor applied U11Q10 */
|
|
struct isif_float_16 scale_fact;
|
|
/* Size of the linear table */
|
|
__u16 table[ISIF_LINEAR_TAB_SIZE];
|
|
};
|
|
|
|
/* Color patterns */
|
|
#define ISIF_RED 0
|
|
#define ISIF_GREEN_RED 1
|
|
#define ISIF_GREEN_BLUE 2
|
|
#define ISIF_BLUE 3
|
|
struct isif_col_pat {
|
|
__u8 olop;
|
|
__u8 olep;
|
|
__u8 elop;
|
|
__u8 elep;
|
|
};
|
|
|
|
/*************************************************************************
|
|
** Data formatter parameters
|
|
*************************************************************************/
|
|
struct isif_fmtplen {
|
|
/*
|
|
* number of program entries for SET0, range 1 - 16
|
|
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
|
|
* ISIF_COMBINE
|
|
*/
|
|
__u16 plen0;
|
|
/*
|
|
* number of program entries for SET1, range 1 - 16
|
|
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
|
|
* ISIF_COMBINE
|
|
*/
|
|
__u16 plen1;
|
|
/**
|
|
* number of program entries for SET2, range 1 - 16
|
|
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
|
|
* ISIF_COMBINE
|
|
*/
|
|
__u16 plen2;
|
|
/**
|
|
* number of program entries for SET3, range 1 - 16
|
|
* when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
|
|
* ISIF_COMBINE
|
|
*/
|
|
__u16 plen3;
|
|
};
|
|
|
|
struct isif_fmt_cfg {
|
|
#define ISIF_SPLIT 0
|
|
#define ISIF_COMBINE 1
|
|
/* Split or combine or line alternate */
|
|
__u8 fmtmode;
|
|
/* enable or disable line alternating mode */
|
|
__u8 ln_alter_en;
|
|
#define ISIF_1LINE 0
|
|
#define ISIF_2LINES 1
|
|
#define ISIF_3LINES 2
|
|
#define ISIF_4LINES 3
|
|
/* Split/combine line number */
|
|
__u8 lnum;
|
|
/* Address increment Range 1 - 16 */
|
|
__u8 addrinc;
|
|
};
|
|
|
|
struct isif_fmt_addr_ptr {
|
|
/* Initial address */
|
|
__u32 init_addr;
|
|
/* output line number */
|
|
#define ISIF_1STLINE 0
|
|
#define ISIF_2NDLINE 1
|
|
#define ISIF_3RDLINE 2
|
|
#define ISIF_4THLINE 3
|
|
__u8 out_line;
|
|
};
|
|
|
|
struct isif_fmtpgm_ap {
|
|
/* program address pointer */
|
|
__u8 pgm_aptr;
|
|
/* program address increment or decrement */
|
|
__u8 pgmupdt;
|
|
};
|
|
|
|
struct isif_data_formatter {
|
|
/* Enable/Disable data formatter */
|
|
__u8 en;
|
|
/* data formatter configuration */
|
|
struct isif_fmt_cfg cfg;
|
|
/* Formatter program entries length */
|
|
struct isif_fmtplen plen;
|
|
/* first pixel in a line fed to formatter */
|
|
__u16 fmtrlen;
|
|
/* HD interval for output line. Only valid when split line */
|
|
__u16 fmthcnt;
|
|
/* formatter address pointers */
|
|
struct isif_fmt_addr_ptr fmtaddr_ptr[16];
|
|
/* program enable/disable */
|
|
__u8 pgm_en[32];
|
|
/* program address pointers */
|
|
struct isif_fmtpgm_ap fmtpgm_ap[32];
|
|
};
|
|
|
|
struct isif_df_csc {
|
|
/* Color Space Conversion confguration, 0 - csc, 1 - df */
|
|
__u8 df_or_csc;
|
|
/* csc configuration valid if df_or_csc is 0 */
|
|
struct isif_color_space_conv csc;
|
|
/* data formatter configuration valid if df_or_csc is 1 */
|
|
struct isif_data_formatter df;
|
|
/* start pixel in a line at the input */
|
|
__u32 start_pix;
|
|
/* number of pixels in input line */
|
|
__u32 num_pixels;
|
|
/* start line at the input */
|
|
__u32 start_line;
|
|
/* number of lines at the input */
|
|
__u32 num_lines;
|
|
};
|
|
|
|
struct isif_gain_offsets_adj {
|
|
/* Gain adjustment per color */
|
|
struct isif_gain gain;
|
|
/* Offset adjustment */
|
|
__u16 offset;
|
|
/* Enable or Disable Gain adjustment for SDRAM data */
|
|
__u8 gain_sdram_en;
|
|
/* Enable or Disable Gain adjustment for IPIPE data */
|
|
__u8 gain_ipipe_en;
|
|
/* Enable or Disable Gain adjustment for H3A data */
|
|
__u8 gain_h3a_en;
|
|
/* Enable or Disable Gain adjustment for SDRAM data */
|
|
__u8 offset_sdram_en;
|
|
/* Enable or Disable Gain adjustment for IPIPE data */
|
|
__u8 offset_ipipe_en;
|
|
/* Enable or Disable Gain adjustment for H3A data */
|
|
__u8 offset_h3a_en;
|
|
};
|
|
|
|
struct isif_cul {
|
|
/* Horizontal Cull pattern for odd lines */
|
|
__u8 hcpat_odd;
|
|
/* Horizontal Cull pattern for even lines */
|
|
__u8 hcpat_even;
|
|
/* Vertical Cull pattern */
|
|
__u8 vcpat;
|
|
/* Enable or disable lpf. Apply when cull is enabled */
|
|
__u8 en_lpf;
|
|
};
|
|
|
|
struct isif_compress {
|
|
#define ISIF_ALAW 0
|
|
#define ISIF_DPCM 1
|
|
#define ISIF_NO_COMPRESSION 2
|
|
/* Compression Algorithm used */
|
|
__u8 alg;
|
|
/* Choose Predictor1 for DPCM compression */
|
|
#define ISIF_DPCM_PRED1 0
|
|
/* Choose Predictor2 for DPCM compression */
|
|
#define ISIF_DPCM_PRED2 1
|
|
/* Predictor for DPCM compression */
|
|
__u8 pred;
|
|
};
|
|
|
|
/* all the stuff in this struct will be provided by userland */
|
|
struct isif_config_params_raw {
|
|
/* Linearization parameters for image sensor data input */
|
|
struct isif_linearize linearize;
|
|
/* Data formatter or CSC */
|
|
struct isif_df_csc df_csc;
|
|
/* Defect Pixel Correction (DFC) confguration */
|
|
struct isif_dfc dfc;
|
|
/* Black/Digital Clamp configuration */
|
|
struct isif_black_clamp bclamp;
|
|
/* Gain, offset adjustments */
|
|
struct isif_gain_offsets_adj gain_offset;
|
|
/* Culling */
|
|
struct isif_cul culling;
|
|
/* A-Law and DPCM compression options */
|
|
struct isif_compress compress;
|
|
/* horizontal offset for Gain/LSC/DFC */
|
|
__u16 horz_offset;
|
|
/* vertical offset for Gain/LSC/DFC */
|
|
__u16 vert_offset;
|
|
/* color pattern for field 0 */
|
|
struct isif_col_pat col_pat_field0;
|
|
/* color pattern for field 1 */
|
|
struct isif_col_pat col_pat_field1;
|
|
#define ISIF_NO_SHIFT 0
|
|
#define ISIF_1BIT_SHIFT 1
|
|
#define ISIF_2BIT_SHIFT 2
|
|
#define ISIF_3BIT_SHIFT 3
|
|
#define ISIF_4BIT_SHIFT 4
|
|
#define ISIF_5BIT_SHIFT 5
|
|
#define ISIF_6BIT_SHIFT 6
|
|
/* Data shift applied before storing to SDRAM */
|
|
__u8 data_shift;
|
|
/* enable input test pattern generation */
|
|
__u8 test_pat_gen;
|
|
};
|
|
|
|
#ifdef __KERNEL__
|
|
struct isif_ycbcr_config {
|
|
/* isif pixel format */
|
|
enum ccdc_pixfmt pix_fmt;
|
|
/* isif frame format */
|
|
enum ccdc_frmfmt frm_fmt;
|
|
/* ISIF crop window */
|
|
struct v4l2_rect win;
|
|
/* field polarity */
|
|
enum vpfe_pin_pol fid_pol;
|
|
/* interface VD polarity */
|
|
enum vpfe_pin_pol vd_pol;
|
|
/* interface HD polarity */
|
|
enum vpfe_pin_pol hd_pol;
|
|
/* isif pix order. Only used for ycbcr capture */
|
|
enum ccdc_pixorder pix_order;
|
|
/* isif buffer type. Only used for ycbcr capture */
|
|
enum ccdc_buftype buf_type;
|
|
};
|
|
|
|
/* MSB of image data connected to sensor port */
|
|
enum isif_data_msb {
|
|
ISIF_BIT_MSB_15,
|
|
ISIF_BIT_MSB_14,
|
|
ISIF_BIT_MSB_13,
|
|
ISIF_BIT_MSB_12,
|
|
ISIF_BIT_MSB_11,
|
|
ISIF_BIT_MSB_10,
|
|
ISIF_BIT_MSB_9,
|
|
ISIF_BIT_MSB_8,
|
|
ISIF_BIT_MSB_7
|
|
};
|
|
|
|
enum isif_cfa_pattern {
|
|
ISIF_CFA_PAT_MOSAIC,
|
|
ISIF_CFA_PAT_STRIPE
|
|
};
|
|
|
|
struct isif_params_raw {
|
|
/* isif pixel format */
|
|
enum ccdc_pixfmt pix_fmt;
|
|
/* isif frame format */
|
|
enum ccdc_frmfmt frm_fmt;
|
|
/* video window */
|
|
struct v4l2_rect win;
|
|
/* field polarity */
|
|
enum vpfe_pin_pol fid_pol;
|
|
/* interface VD polarity */
|
|
enum vpfe_pin_pol vd_pol;
|
|
/* interface HD polarity */
|
|
enum vpfe_pin_pol hd_pol;
|
|
/* buffer type. Applicable for interlaced mode */
|
|
enum ccdc_buftype buf_type;
|
|
/* Gain values */
|
|
struct isif_gain gain;
|
|
/* cfa pattern */
|
|
enum isif_cfa_pattern cfa_pat;
|
|
/* Data MSB position */
|
|
enum isif_data_msb data_msb;
|
|
/* Enable horizontal flip */
|
|
unsigned char horz_flip_en;
|
|
/* Enable image invert vertically */
|
|
unsigned char image_invert_en;
|
|
|
|
/* all the userland defined stuff*/
|
|
struct isif_config_params_raw config_params;
|
|
};
|
|
|
|
enum isif_data_pack {
|
|
ISIF_PACK_16BIT,
|
|
ISIF_PACK_12BIT,
|
|
ISIF_PACK_8BIT
|
|
};
|
|
|
|
#define ISIF_WIN_NTSC {0, 0, 720, 480}
|
|
#define ISIF_WIN_VGA {0, 0, 640, 480}
|
|
|
|
#endif
|
|
#endif
|