linux/include/media/davinci/isif.h
<<
>>
Prefs
   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 */
  14struct 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 */
  22struct 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 */
  33struct 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
  56struct 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
  91struct 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 ***********************************************************************/
 142struct 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
 164struct 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        /* Vertical 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
 192struct isif_color_space_conv {
 193        /* Enable color space conversion */
 194        __u8 en;
 195        /*
 196         * csc coefficient 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*************************************************************************/
 206struct 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*************************************************************************/
 220struct 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*************************************************************************/
 235struct 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
 251struct isif_col_pat {
 252        __u8 olop;
 253        __u8 olep;
 254        __u8 elop;
 255        __u8 elep;
 256};
 257
 258/*************************************************************************
 259**  Data formatter parameters
 260*************************************************************************/
 261struct 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
 288struct 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
 305struct 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
 316struct isif_fmtpgm_ap {
 317        /* program address pointer */
 318        __u8 pgm_aptr;
 319        /* program address increment or decrement */
 320        __u8 pgmupdt;
 321};
 322
 323struct 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
 342struct isif_df_csc {
 343        /* Color Space Conversion configuration, 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
 359struct 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
 378struct 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
 389struct 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 */
 404struct 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) configuration */
 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__
 441struct 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 */
 461enum 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
 473enum isif_cfa_pattern {
 474        ISIF_CFA_PAT_MOSAIC,
 475        ISIF_CFA_PAT_STRIPE
 476};
 477
 478struct 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
 508enum 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
 519