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