summaryrefslogtreecommitdiff
path: root/include/media/davinci/dm355_ccdc.h
blob: 1f3d00aa46d1b268aed0892a5bacc34a614c76ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2005-2009 Texas Instruments Inc
 */
#ifndef _DM355_CCDC_H
#define _DM355_CCDC_H
#include <media/davinci/ccdc_types.h>
#include <media/davinci/vpfe_types.h>

/* enum for No of pixel per line to be avg. in Black Clamping */
enum ccdc_sample_length {
	CCDC_SAMPLE_1PIXELS,
	CCDC_SAMPLE_2PIXELS,
	CCDC_SAMPLE_4PIXELS,
	CCDC_SAMPLE_8PIXELS,
	CCDC_SAMPLE_16PIXELS
};

/* enum for No of lines in Black Clamping */
enum ccdc_sample_line {
	CCDC_SAMPLE_1LINES,
	CCDC_SAMPLE_2LINES,
	CCDC_SAMPLE_4LINES,
	CCDC_SAMPLE_8LINES,
	CCDC_SAMPLE_16LINES
};

/* enum for Alaw gamma width */
enum ccdc_gamma_width {
	CCDC_GAMMA_BITS_13_4,
	CCDC_GAMMA_BITS_12_3,
	CCDC_GAMMA_BITS_11_2,
	CCDC_GAMMA_BITS_10_1,
	CCDC_GAMMA_BITS_09_0
};

enum ccdc_colpats {
	CCDC_RED,
	CCDC_GREEN_RED,
	CCDC_GREEN_BLUE,
	CCDC_BLUE
};

struct ccdc_col_pat {
	enum ccdc_colpats olop;
	enum ccdc_colpats olep;
	enum ccdc_colpats elop;
	enum ccdc_colpats elep;
};

enum ccdc_datasft {
	CCDC_DATA_NO_SHIFT,
	CCDC_DATA_SHIFT_1BIT,
	CCDC_DATA_SHIFT_2BIT,
	CCDC_DATA_SHIFT_3BIT,
	CCDC_DATA_SHIFT_4BIT,
	CCDC_DATA_SHIFT_5BIT,
	CCDC_DATA_SHIFT_6BIT
};

enum ccdc_data_size {
	CCDC_DATA_16BITS,
	CCDC_DATA_15BITS,
	CCDC_DATA_14BITS,
	CCDC_DATA_13BITS,
	CCDC_DATA_12BITS,
	CCDC_DATA_11BITS,
	CCDC_DATA_10BITS,
	CCDC_DATA_8BITS
};
enum ccdc_mfilt1 {
	CCDC_NO_MEDIAN_FILTER1,
	CCDC_AVERAGE_FILTER1,
	CCDC_MEDIAN_FILTER1
};

enum ccdc_mfilt2 {
	CCDC_NO_MEDIAN_FILTER2,
	CCDC_AVERAGE_FILTER2,
	CCDC_MEDIAN_FILTER2
};

/* structure for ALaw */
struct ccdc_a_law {
	/* Enable/disable A-Law */
	unsigned char enable;
	/* Gamma Width Input */
	enum ccdc_gamma_width gamma_wd;
};

/* structure for Black Clamping */
struct ccdc_black_clamp {
	/* only if bClampEnable is TRUE */
	unsigned char b_clamp_enable;
	/* only if bClampEnable is TRUE */
	enum ccdc_sample_length sample_pixel;
	/* only if bClampEnable is TRUE */
	enum ccdc_sample_line sample_ln;
	/* only if bClampEnable is TRUE */
	unsigned short start_pixel;
	/* only if bClampEnable is FALSE */
	unsigned short sgain;
	unsigned short dc_sub;
};

/* structure for Black Level Compensation */
struct ccdc_black_compensation {
	/* Constant value to subtract from Red component */
	unsigned char r;
	/* Constant value to subtract from Gr component */
	unsigned char gr;
	/* Constant value to subtract from Blue component */
	unsigned char b;
	/* Constant value to subtract from Gb component */
	unsigned char gb;
};

struct ccdc_float {
	int integer;
	unsigned int decimal;
};

#define CCDC_CSC_COEFF_TABLE_SIZE	16
/* structure for color space converter */
struct ccdc_csc {
	unsigned char enable;
	/*
	 * S8Q5. Use 2 decimal precision, user values range from -3.00 to 3.99.
	 * example - to use 1.03, set integer part as 1, and decimal part as 3
	 * to use -1.03, set integer part as -1 and decimal part as 3
	 */
	struct ccdc_float coeff[CCDC_CSC_COEFF_TABLE_SIZE];
};

/* Structures for Vertical Defect Correction*/
enum ccdc_vdf_csl {
	CCDC_VDF_NORMAL,
	CCDC_VDF_HORZ_INTERPOL_SAT,
	CCDC_VDF_HORZ_INTERPOL
};

enum ccdc_vdf_cuda {
	CCDC_VDF_WHOLE_LINE_CORRECT,
	CCDC_VDF_UPPER_DISABLE
};

enum ccdc_dfc_mwr {
	CCDC_DFC_MWR_WRITE_COMPLETE,
	CCDC_DFC_WRITE_REG
};

enum ccdc_dfc_mrd {
	CCDC_DFC_READ_COMPLETE,
	CCDC_DFC_READ_REG
};

enum ccdc_dfc_ma_rst {
	CCDC_DFC_INCR_ADDR,
	CCDC_DFC_CLR_ADDR
};

enum ccdc_dfc_mclr {
	CCDC_DFC_CLEAR_COMPLETE,
	CCDC_DFC_CLEAR
};

struct ccdc_dft_corr_ctl {
	enum ccdc_vdf_csl vdfcsl;
	enum ccdc_vdf_cuda vdfcuda;
	unsigned int vdflsft;
};

struct ccdc_dft_corr_mem_ctl {
	enum ccdc_dfc_mwr dfcmwr;
	enum ccdc_dfc_mrd dfcmrd;
	enum ccdc_dfc_ma_rst dfcmarst;
	enum ccdc_dfc_mclr dfcmclr;
};

#define CCDC_DFT_TABLE_SIZE	16
/*
 * Main Structure for vertical defect correction. Vertical defect
 * correction can correct up to 16 defects if defects less than 16
 * then pad the rest with 0
 */
struct ccdc_vertical_dft {
	unsigned char ver_dft_en;
	unsigned char gen_dft_en;
	unsigned int saturation_ctl;
	struct ccdc_dft_corr_ctl dft_corr_ctl;
	struct ccdc_dft_corr_mem_ctl dft_corr_mem_ctl;
	int table_size;
	unsigned int dft_corr_horz[CCDC_DFT_TABLE_SIZE];
	unsigned int dft_corr_vert[CCDC_DFT_TABLE_SIZE];
	unsigned int dft_corr_sub1[CCDC_DFT_TABLE_SIZE];
	unsigned int dft_corr_sub2[CCDC_DFT_TABLE_SIZE];
	unsigned int dft_corr_sub3[CCDC_DFT_TABLE_SIZE];
};

struct ccdc_data_offset {
	unsigned char horz_offset;
	unsigned char vert_offset;
};

/*
 * Structure for CCDC configuration parameters for raw capture mode passed
 * by application
 */
struct ccdc_config_params_raw {
	/* data shift to be applied before storing */
	enum ccdc_datasft datasft;
	/* data size value from 8 to 16 bits */
	enum ccdc_data_size data_sz;
	/* median filter for sdram */
	enum ccdc_mfilt1 mfilt1;
	enum ccdc_mfilt2 mfilt2;
	/* low pass filter enable/disable */
	unsigned char lpf_enable;
	/* Threshold of median filter */
	int med_filt_thres;
	/*
	 * horz and vertical data offset. Applicable for defect correction
	 * and lsc
	 */
	struct ccdc_data_offset data_offset;
	/* Structure for Optional A-Law */
	struct ccdc_a_law alaw;
	/* Structure for Optical Black Clamp */
	struct ccdc_black_clamp blk_clamp;
	/* Structure for Black Compensation */
	struct ccdc_black_compensation blk_comp;
	/* structure for vertical Defect Correction Module Configuration */
	struct ccdc_vertical_dft vertical_dft;
	/* structure for color space converter Module Configuration */
	struct ccdc_csc csc;
	/* color patters for bayer capture */
	struct ccdc_col_pat col_pat_field0;
	struct ccdc_col_pat col_pat_field1;
};

#ifdef __KERNEL__
#include <linux/io.h>

#define CCDC_WIN_PAL	{0, 0, 720, 576}
#define CCDC_WIN_VGA	{0, 0, 640, 480}

struct ccdc_params_ycbcr {
	/* pixel format */
	enum ccdc_pixfmt pix_fmt;
	/* progressive or interlaced frame */
	enum ccdc_frmfmt frm_fmt;
	/* video window */
	struct v4l2_rect win;
	/* field id polarity */
	enum vpfe_pin_pol fid_pol;
	/* vertical sync polarity */
	enum vpfe_pin_pol vd_pol;
	/* horizontal sync polarity */
	enum vpfe_pin_pol hd_pol;
	/* enable BT.656 embedded sync mode */
	int bt656_enable;
	/* cb:y:cr:y or y:cb:y:cr in memory */
	enum ccdc_pixorder pix_order;
	/* interleaved or separated fields  */
	enum ccdc_buftype buf_type;
};

/* Gain applied to Raw Bayer data */
struct ccdc_gain {
	unsigned short r_ye;
	unsigned short gr_cy;
	unsigned short gb_g;
	unsigned short b_mg;
};

/* Structure for CCDC configuration parameters for raw capture mode */
struct ccdc_params_raw {
	/* pixel format */
	enum ccdc_pixfmt pix_fmt;
	/* progressive or interlaced frame */
	enum ccdc_frmfmt frm_fmt;
	/* video window */
	struct v4l2_rect win;
	/* field id polarity */
	enum vpfe_pin_pol fid_pol;
	/* vertical sync polarity */
	enum vpfe_pin_pol vd_pol;
	/* horizontal sync polarity */
	enum vpfe_pin_pol hd_pol;
	/* interleaved or separated fields */
	enum ccdc_buftype buf_type;
	/* Gain values */
	struct ccdc_gain gain;
	/* offset */
	unsigned int ccdc_offset;
	/* horizontal flip enable */
	unsigned char horz_flip_enable;
	/*
	 * enable to store the image in inverse order in memory
	 * (bottom to top)
	 */
	unsigned char image_invert_enable;
	/* Configurable part of raw data */
	struct ccdc_config_params_raw config_params;
};

#endif
#endif				/* DM355_CCDC_H */