root/include/media/davinci/isif.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  * Copyright (C) 2008-2009 Texas Instruments Inc
   4  *
   5  * isif header file
   6  */
   7 #ifndef _ISIF_H
   8 #define _ISIF_H
   9 
  10 #include <media/davinci/ccdc_types.h>
  11 #include <media/davinci/vpfe_types.h>
  12 
  13 /* isif float type S8Q8/U8Q8 */
  14 struct isif_float_8 {
  15         /* 8 bit integer part */
  16         __u8 integer;
  17         /* 8 bit decimal part */
  18         __u8 decimal;
  19 };
  20 
  21 /* isif float type U16Q16/S16Q16 */
  22 struct isif_float_16 {
  23         /* 16 bit integer part */
  24         __u16 integer;
  25         /* 16 bit decimal part */
  26         __u16 decimal;
  27 };
  28 
  29 /************************************************************************
  30  *   Vertical Defect Correction parameters
  31  ***********************************************************************/
  32 /* Defect Correction (DFC) table entry */
  33 struct isif_vdfc_entry {
  34         /* vertical position of defect */
  35         __u16 pos_vert;
  36         /* horizontal position of defect */
  37         __u16 pos_horz;
  38         /*
  39          * Defect level of Vertical line defect position. This is subtracted
  40          * from the data at the defect position
  41          */
  42         __u8 level_at_pos;
  43         /*
  44          * Defect level of the pixels upper than the vertical line defect.
  45          * This is subtracted from the data
  46          */
  47         __u8 level_up_pixels;
  48         /*
  49          * Defect level of the pixels lower than the vertical line defect.
  50          * This is subtracted from the data
  51          */
  52         __u8 level_low_pixels;
  53 };
  54 
  55 #define ISIF_VDFC_TABLE_SIZE            8
  56 struct isif_dfc {
  57         /* enable vertical defect correction */
  58         __u8 en;
  59         /* Defect level subtraction. Just fed through if saturating */
  60 #define ISIF_VDFC_NORMAL                0
  61         /*
  62          * Defect level subtraction. Horizontal interpolation ((i-2)+(i+2))/2
  63          * if data saturating
  64          */
  65 #define ISIF_VDFC_HORZ_INTERPOL_IF_SAT  1
  66         /* Horizontal interpolation (((i-2)+(i+2))/2) */
  67 #define ISIF_VDFC_HORZ_INTERPOL         2
  68         /* one of the vertical defect correction modes above */
  69         __u8 corr_mode;
  70         /* 0 - whole line corrected, 1 - not pixels upper than the defect */
  71         __u8 corr_whole_line;
  72 #define ISIF_VDFC_NO_SHIFT              0
  73 #define ISIF_VDFC_SHIFT_1               1
  74 #define ISIF_VDFC_SHIFT_2               2
  75 #define ISIF_VDFC_SHIFT_3               3
  76 #define ISIF_VDFC_SHIFT_4               4
  77         /*
  78          * defect level shift value. level_at_pos, level_upper_pos,
  79          * and level_lower_pos can be shifted up by this value. Choose
  80          * one of the values above
  81          */
  82         __u8 def_level_shift;
  83         /* defect saturation level */
  84         __u16 def_sat_level;
  85         /* number of vertical defects. Max is ISIF_VDFC_TABLE_SIZE */
  86         __u16 num_vdefects;
  87         /* VDFC table ptr */
  88         struct isif_vdfc_entry table[ISIF_VDFC_TABLE_SIZE];
  89 };
  90 
  91 struct isif_horz_bclamp {
  92 
  93         /* Horizontal clamp disabled. Only vertical clamp value is subtracted */
  94 #define ISIF_HORZ_BC_DISABLE            0
  95         /*
  96          * Horizontal clamp value is calculated and subtracted from image data
  97          * along with vertical clamp value
  98          */
  99 #define ISIF_HORZ_BC_CLAMP_CALC_ENABLED 1
 100         /*
 101          * Horizontal clamp value calculated from previous image is subtracted
 102          * from image data along with vertical clamp value.
 103          */
 104 #define ISIF_HORZ_BC_CLAMP_NOT_UPDATED  2
 105         /* horizontal clamp mode. One of the values above */
 106         __u8 mode;
 107         /*
 108          * pixel value limit enable.
 109          *  0 - limit disabled
 110          *  1 - pixel value limited to 1023
 111          */
 112         __u8 clamp_pix_limit;
 113         /* Select Most left window for bc calculation */
 114 #define ISIF_SEL_MOST_LEFT_WIN          0
 115         /* Select Most right window for bc calculation */
 116 #define ISIF_SEL_MOST_RIGHT_WIN         1
 117         /* Select most left or right window for clamp val calculation */
 118         __u8 base_win_sel_calc;
 119         /* Window count per color for calculation. range 1-32 */
 120         __u8 win_count_calc;
 121         /* Window start position - horizontal for calculation. 0 - 8191 */
 122         __u16 win_start_h_calc;
 123         /* Window start position - vertical for calculation 0 - 8191 */
 124         __u16 win_start_v_calc;
 125 #define ISIF_HORZ_BC_SZ_H_2PIXELS       0
 126 #define ISIF_HORZ_BC_SZ_H_4PIXELS       1
 127 #define ISIF_HORZ_BC_SZ_H_8PIXELS       2
 128 #define ISIF_HORZ_BC_SZ_H_16PIXELS      3
 129         /* Width of the sample window in pixels for calculation */
 130         __u8 win_h_sz_calc;
 131 #define ISIF_HORZ_BC_SZ_V_32PIXELS      0
 132 #define ISIF_HORZ_BC_SZ_V_64PIXELS      1
 133 #define ISIF_HORZ_BC_SZ_V_128PIXELS     2
 134 #define ISIF_HORZ_BC_SZ_V_256PIXELS     3
 135         /* Height of the sample window in pixels for calculation */
 136         __u8 win_v_sz_calc;
 137 };
 138 
 139 /************************************************************************
 140  *  Black Clamp parameters
 141  ***********************************************************************/
 142 struct isif_vert_bclamp {
 143         /* Reset value used is the clamp value calculated */
 144 #define ISIF_VERT_BC_USE_HORZ_CLAMP_VAL         0
 145         /* Reset value used is reset_clamp_val configured */
 146 #define ISIF_VERT_BC_USE_CONFIG_CLAMP_VAL       1
 147         /* No update, previous image value is used */
 148 #define ISIF_VERT_BC_NO_UPDATE                  2
 149         /*
 150          * Reset value selector for vertical clamp calculation. Use one of
 151          * the above values
 152          */
 153         __u8 reset_val_sel;
 154         /* U8Q8. Line average coefficient used in vertical clamp calculation */
 155         __u8 line_ave_coef;
 156         /* Height of the optical black region for calculation */
 157         __u16 ob_v_sz_calc;
 158         /* Optical black region start position - horizontal. 0 - 8191 */
 159         __u16 ob_start_h;
 160         /* Optical black region start position - vertical 0 - 8191 */
 161         __u16 ob_start_v;
 162 };
 163 
 164 struct isif_black_clamp {
 165         /*
 166          * This offset value is added irrespective of the clamp enable status.
 167          * S13
 168          */
 169         __u16 dc_offset;
 170         /*
 171          * Enable black/digital clamp value to be subtracted from the image data
 172          */
 173         __u8 en;
 174         /*
 175          * black clamp mode. same/separate clamp for 4 colors
 176          * 0 - disable - same clamp value for all colors
 177          * 1 - clamp value calculated separately for all colors
 178          */
 179         __u8 bc_mode_color;
 180         /* Vrtical start position for bc subtraction */
 181         __u16 vert_start_sub;
 182         /* Black clamp for horizontal direction */
 183         struct isif_horz_bclamp horz;
 184         /* Black clamp for vertical direction */
 185         struct isif_vert_bclamp vert;
 186 };
 187 
 188 /*************************************************************************
 189 ** Color Space Conversion (CSC)
 190 *************************************************************************/
 191 #define ISIF_CSC_NUM_COEFF      16
 192 struct isif_color_space_conv {
 193         /* Enable color space conversion */
 194         __u8 en;
 195         /*
 196          * csc coeffient table. S8Q5, M00 at index 0, M01 at index 1, and
 197          * so forth
 198          */
 199         struct isif_float_8 coeff[ISIF_CSC_NUM_COEFF];
 200 };
 201 
 202 
 203 /*************************************************************************
 204 **  Black  Compensation parameters
 205 *************************************************************************/
 206 struct isif_black_comp {
 207         /* Comp for Red */
 208         __s8 r_comp;
 209         /* Comp for Gr */
 210         __s8 gr_comp;
 211         /* Comp for Blue */
 212         __s8 b_comp;
 213         /* Comp for Gb */
 214         __s8 gb_comp;
 215 };
 216 
 217 /*************************************************************************
 218 **  Gain parameters
 219 *************************************************************************/
 220 struct isif_gain {
 221         /* Gain for Red or ye */
 222         struct isif_float_16 r_ye;
 223         /* Gain for Gr or cy */
 224         struct isif_float_16 gr_cy;
 225         /* Gain for Gb or g */
 226         struct isif_float_16 gb_g;
 227         /* Gain for Blue or mg */
 228         struct isif_float_16 b_mg;
 229 };
 230 
 231 #define ISIF_LINEAR_TAB_SIZE    192
 232 /*************************************************************************
 233 **  Linearization parameters
 234 *************************************************************************/
 235 struct isif_linearize {
 236         /* Enable or Disable linearization of data */
 237         __u8 en;
 238         /* Shift value applied */
 239         __u8 corr_shft;
 240         /* scale factor applied U11Q10 */
 241         struct isif_float_16 scale_fact;
 242         /* Size of the linear table */
 243         __u16 table[ISIF_LINEAR_TAB_SIZE];
 244 };
 245 
 246 /* Color patterns */
 247 #define ISIF_RED        0
 248 #define ISIF_GREEN_RED  1
 249 #define ISIF_GREEN_BLUE 2
 250 #define ISIF_BLUE       3
 251 struct isif_col_pat {
 252         __u8 olop;
 253         __u8 olep;
 254         __u8 elop;
 255         __u8 elep;
 256 };
 257 
 258 /*************************************************************************
 259 **  Data formatter parameters
 260 *************************************************************************/
 261 struct isif_fmtplen {
 262         /*
 263          * number of program entries for SET0, range 1 - 16
 264          * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
 265          * ISIF_COMBINE
 266          */
 267         __u16 plen0;
 268         /*
 269          * number of program entries for SET1, range 1 - 16
 270          * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
 271          * ISIF_COMBINE
 272          */
 273         __u16 plen1;
 274         /**
 275          * number of program entries for SET2, range 1 - 16
 276          * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
 277          * ISIF_COMBINE
 278          */
 279         __u16 plen2;
 280         /**
 281          * number of program entries for SET3, range 1 - 16
 282          * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
 283          * ISIF_COMBINE
 284          */
 285         __u16 plen3;
 286 };
 287 
 288 struct isif_fmt_cfg {
 289 #define ISIF_SPLIT              0
 290 #define ISIF_COMBINE            1
 291         /* Split or combine or line alternate */
 292         __u8 fmtmode;
 293         /* enable or disable line alternating mode */
 294         __u8 ln_alter_en;
 295 #define ISIF_1LINE              0
 296 #define ISIF_2LINES             1
 297 #define ISIF_3LINES             2
 298 #define ISIF_4LINES             3
 299         /* Split/combine line number */
 300         __u8 lnum;
 301         /* Address increment Range 1 - 16 */
 302         __u8 addrinc;
 303 };
 304 
 305 struct isif_fmt_addr_ptr {
 306         /* Initial address */
 307         __u32 init_addr;
 308         /* output line number */
 309 #define ISIF_1STLINE            0
 310 #define ISIF_2NDLINE            1
 311 #define ISIF_3RDLINE            2
 312 #define ISIF_4THLINE            3
 313         __u8 out_line;
 314 };
 315 
 316 struct isif_fmtpgm_ap {
 317         /* program address pointer */
 318         __u8 pgm_aptr;
 319         /* program address increment or decrement */
 320         __u8 pgmupdt;
 321 };
 322 
 323 struct isif_data_formatter {
 324         /* Enable/Disable data formatter */
 325         __u8 en;
 326         /* data formatter configuration */
 327         struct isif_fmt_cfg cfg;
 328         /* Formatter program entries length */
 329         struct isif_fmtplen plen;
 330         /* first pixel in a line fed to formatter */
 331         __u16 fmtrlen;
 332         /* HD interval for output line. Only valid when split line */
 333         __u16 fmthcnt;
 334         /* formatter address pointers */
 335         struct isif_fmt_addr_ptr fmtaddr_ptr[16];
 336         /* program enable/disable */
 337         __u8 pgm_en[32];
 338         /* program address pointers */
 339         struct isif_fmtpgm_ap fmtpgm_ap[32];
 340 };
 341 
 342 struct isif_df_csc {
 343         /* Color Space Conversion confguration, 0 - csc, 1 - df */
 344         __u8 df_or_csc;
 345         /* csc configuration valid if df_or_csc is 0 */
 346         struct isif_color_space_conv csc;
 347         /* data formatter configuration valid if df_or_csc is 1 */
 348         struct isif_data_formatter df;
 349         /* start pixel in a line at the input */
 350         __u32 start_pix;
 351         /* number of pixels in input line */
 352         __u32 num_pixels;
 353         /* start line at the input */
 354         __u32 start_line;
 355         /* number of lines at the input */
 356         __u32 num_lines;
 357 };
 358 
 359 struct isif_gain_offsets_adj {
 360         /* Gain adjustment per color */
 361         struct isif_gain gain;
 362         /* Offset adjustment */
 363         __u16 offset;
 364         /* Enable or Disable Gain adjustment for SDRAM data */
 365         __u8 gain_sdram_en;
 366         /* Enable or Disable Gain adjustment for IPIPE data */
 367         __u8 gain_ipipe_en;
 368         /* Enable or Disable Gain adjustment for H3A data */
 369         __u8 gain_h3a_en;
 370         /* Enable or Disable Gain adjustment for SDRAM data */
 371         __u8 offset_sdram_en;
 372         /* Enable or Disable Gain adjustment for IPIPE data */
 373         __u8 offset_ipipe_en;
 374         /* Enable or Disable Gain adjustment for H3A data */
 375         __u8 offset_h3a_en;
 376 };
 377 
 378 struct isif_cul {
 379         /* Horizontal Cull pattern for odd lines */
 380         __u8 hcpat_odd;
 381         /* Horizontal Cull pattern for even lines */
 382         __u8 hcpat_even;
 383         /* Vertical Cull pattern */
 384         __u8 vcpat;
 385         /* Enable or disable lpf. Apply when cull is enabled */
 386         __u8 en_lpf;
 387 };
 388 
 389 struct isif_compress {
 390 #define ISIF_ALAW               0
 391 #define ISIF_DPCM               1
 392 #define ISIF_NO_COMPRESSION     2
 393         /* Compression Algorithm used */
 394         __u8 alg;
 395         /* Choose Predictor1 for DPCM compression */
 396 #define ISIF_DPCM_PRED1         0
 397         /* Choose Predictor2 for DPCM compression */
 398 #define ISIF_DPCM_PRED2         1
 399         /* Predictor for DPCM compression */
 400         __u8 pred;
 401 };
 402 
 403 /* all the stuff in this struct will be provided by userland */
 404 struct isif_config_params_raw {
 405         /* Linearization parameters for image sensor data input */
 406         struct isif_linearize linearize;
 407         /* Data formatter or CSC */
 408         struct isif_df_csc df_csc;
 409         /* Defect Pixel Correction (DFC) confguration */
 410         struct isif_dfc dfc;
 411         /* Black/Digital Clamp configuration */
 412         struct isif_black_clamp bclamp;
 413         /* Gain, offset adjustments */
 414         struct isif_gain_offsets_adj gain_offset;
 415         /* Culling */
 416         struct isif_cul culling;
 417         /* A-Law and DPCM compression options */
 418         struct isif_compress compress;
 419         /* horizontal offset for Gain/LSC/DFC */
 420         __u16 horz_offset;
 421         /* vertical offset for Gain/LSC/DFC */
 422         __u16 vert_offset;
 423         /* color pattern for field 0 */
 424         struct isif_col_pat col_pat_field0;
 425         /* color pattern for field 1 */
 426         struct isif_col_pat col_pat_field1;
 427 #define ISIF_NO_SHIFT           0
 428 #define ISIF_1BIT_SHIFT         1
 429 #define ISIF_2BIT_SHIFT         2
 430 #define ISIF_3BIT_SHIFT         3
 431 #define ISIF_4BIT_SHIFT         4
 432 #define ISIF_5BIT_SHIFT         5
 433 #define ISIF_6BIT_SHIFT         6
 434         /* Data shift applied before storing to SDRAM */
 435         __u8 data_shift;
 436         /* enable input test pattern generation */
 437         __u8 test_pat_gen;
 438 };
 439 
 440 #ifdef __KERNEL__
 441 struct isif_ycbcr_config {
 442         /* isif pixel format */
 443         enum ccdc_pixfmt pix_fmt;
 444         /* isif frame format */
 445         enum ccdc_frmfmt frm_fmt;
 446         /* ISIF crop window */
 447         struct v4l2_rect win;
 448         /* field polarity */
 449         enum vpfe_pin_pol fid_pol;
 450         /* interface VD polarity */
 451         enum vpfe_pin_pol vd_pol;
 452         /* interface HD polarity */
 453         enum vpfe_pin_pol hd_pol;
 454         /* isif pix order. Only used for ycbcr capture */
 455         enum ccdc_pixorder pix_order;
 456         /* isif buffer type. Only used for ycbcr capture */
 457         enum ccdc_buftype buf_type;
 458 };
 459 
 460 /* MSB of image data connected to sensor port */
 461 enum isif_data_msb {
 462         ISIF_BIT_MSB_15,
 463         ISIF_BIT_MSB_14,
 464         ISIF_BIT_MSB_13,
 465         ISIF_BIT_MSB_12,
 466         ISIF_BIT_MSB_11,
 467         ISIF_BIT_MSB_10,
 468         ISIF_BIT_MSB_9,
 469         ISIF_BIT_MSB_8,
 470         ISIF_BIT_MSB_7
 471 };
 472 
 473 enum isif_cfa_pattern {
 474         ISIF_CFA_PAT_MOSAIC,
 475         ISIF_CFA_PAT_STRIPE
 476 };
 477 
 478 struct isif_params_raw {
 479         /* isif pixel format */
 480         enum ccdc_pixfmt pix_fmt;
 481         /* isif frame format */
 482         enum ccdc_frmfmt frm_fmt;
 483         /* video window */
 484         struct v4l2_rect win;
 485         /* field polarity */
 486         enum vpfe_pin_pol fid_pol;
 487         /* interface VD polarity */
 488         enum vpfe_pin_pol vd_pol;
 489         /* interface HD polarity */
 490         enum vpfe_pin_pol hd_pol;
 491         /* buffer type. Applicable for interlaced mode */
 492         enum ccdc_buftype buf_type;
 493         /* Gain values */
 494         struct isif_gain gain;
 495         /* cfa pattern */
 496         enum isif_cfa_pattern cfa_pat;
 497         /* Data MSB position */
 498         enum isif_data_msb data_msb;
 499         /* Enable horizontal flip */
 500         unsigned char horz_flip_en;
 501         /* Enable image invert vertically */
 502         unsigned char image_invert_en;
 503 
 504         /* all the userland defined stuff*/
 505         struct isif_config_params_raw config_params;
 506 };
 507 
 508 enum isif_data_pack {
 509         ISIF_PACK_16BIT,
 510         ISIF_PACK_12BIT,
 511         ISIF_PACK_8BIT
 512 };
 513 
 514 #define ISIF_WIN_NTSC                           {0, 0, 720, 480}
 515 #define ISIF_WIN_VGA                            {0, 0, 640, 480}
 516 
 517 #endif
 518 #endif

/* [<][>][^][v][top][bottom][index][help] */