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