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 519