• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
27 struct 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 */
35 struct 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 */
46 struct 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
69 struct 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 
104 struct 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  ***********************************************************************/
155 struct 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 
177 struct 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
205 struct 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 *************************************************************************/
219 struct 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 *************************************************************************/
233 struct 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 *************************************************************************/
248 struct 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
264 struct isif_col_pat {
265 	__u8 olop;
266 	__u8 olep;
267 	__u8 elop;
268 	__u8 elep;
269 };
270 
271 /*************************************************************************
272 **  Data formatter parameters
273 *************************************************************************/
274 struct 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 
301 struct 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 
318 struct 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 
329 struct isif_fmtpgm_ap {
330 	/* program address pointer */
331 	__u8 pgm_aptr;
332 	/* program address increment or decrement */
333 	__u8 pgmupdt;
334 };
335 
336 struct 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 
355 struct 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 
372 struct 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 
391 struct 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 
402 struct 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 */
417 struct 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__
454 struct 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 */
474 enum 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 
486 enum isif_cfa_pattern {
487 	ISIF_CFA_PAT_MOSAIC,
488 	ISIF_CFA_PAT_STRIPE
489 };
490 
491 struct 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 
521 enum 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