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
309
310
|
/*
* Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
/*!
* @file mx27_prp.h
*
* @brief Header file for MX27 V4L2 capture driver
*
* @ingroup MXC_V4L2_CAPTURE
*/
#ifndef __MX27_PRP_H__
#define __MX27_PRP_H__
#define PRP_REG(ofs) (IO_ADDRESS(EMMA_BASE_ADDR) + ofs)
/* Register definitions of PrP */
#define PRP_CNTL PRP_REG(0x00)
#define PRP_INTRCNTL PRP_REG(0x04)
#define PRP_INTRSTATUS PRP_REG(0x08)
#define PRP_SOURCE_Y_PTR PRP_REG(0x0C)
#define PRP_SOURCE_CB_PTR PRP_REG(0x10)
#define PRP_SOURCE_CR_PTR PRP_REG(0x14)
#define PRP_DEST_RGB1_PTR PRP_REG(0x18)
#define PRP_DEST_RGB2_PTR PRP_REG(0x1C)
#define PRP_DEST_Y_PTR PRP_REG(0x20)
#define PRP_DEST_CB_PTR PRP_REG(0x24)
#define PRP_DEST_CR_PTR PRP_REG(0x28)
#define PRP_SOURCE_FRAME_SIZE PRP_REG(0x2C)
#define PRP_CH1_LINE_STRIDE PRP_REG(0x30)
#define PRP_SRC_PIXEL_FORMAT_CNTL PRP_REG(0x34)
#define PRP_CH1_PIXEL_FORMAT_CNTL PRP_REG(0x38)
#define PRP_CH1_OUT_IMAGE_SIZE PRP_REG(0x3C)
#define PRP_CH2_OUT_IMAGE_SIZE PRP_REG(0x40)
#define PRP_SOURCE_LINE_STRIDE PRP_REG(0x44)
#define PRP_CSC_COEF_012 PRP_REG(0x48)
#define PRP_CSC_COEF_345 PRP_REG(0x4C)
#define PRP_CSC_COEF_678 PRP_REG(0x50)
#define PRP_CH1_RZ_HORI_COEF1 PRP_REG(0x54)
#define PRP_CH1_RZ_HORI_COEF2 PRP_REG(0x58)
#define PRP_CH1_RZ_HORI_VALID PRP_REG(0x5C)
#define PRP_CH1_RZ_VERT_COEF1 PRP_REG(0x60)
#define PRP_CH1_RZ_VERT_COEF2 PRP_REG(0x64)
#define PRP_CH1_RZ_VERT_VALID PRP_REG(0x68)
#define PRP_CH2_RZ_HORI_COEF1 PRP_REG(0x6C)
#define PRP_CH2_RZ_HORI_COEF2 PRP_REG(0x70)
#define PRP_CH2_RZ_HORI_VALID PRP_REG(0x74)
#define PRP_CH2_RZ_VERT_COEF1 PRP_REG(0x78)
#define PRP_CH2_RZ_VERT_COEF2 PRP_REG(0x7C)
#define PRP_CH2_RZ_VERT_VALID PRP_REG(0x80)
#define B_SET(b) (1 << (b))
/* Bit definitions for PrP control register */
#define PRP_CNTL_RSTVAL 0x28
#define PRP_CNTL_CH1EN B_SET(0)
#define PRP_CNTL_CH2EN B_SET(1)
#define PRP_CNTL_CSI B_SET(2)
#define PRP_CNTL_IN_32 B_SET(3)
#define PRP_CNTL_IN_RGB B_SET(4)
#define PRP_CNTL_IN_YUV420 0
#define PRP_CNTL_IN_YUV422 PRP_CNTL_IN_32
#define PRP_CNTL_IN_RGB16 PRP_CNTL_IN_RGB
#define PRP_CNTL_IN_RGB32 (PRP_CNTL_IN_RGB | PRP_CNTL_IN_32)
#define PRP_CNTL_CH1_RGB8 0
#define PRP_CNTL_CH1_RGB16 B_SET(5)
#define PRP_CNTL_CH1_RGB32 B_SET(6)
#define PRP_CNTL_CH1_YUV422 (B_SET(5) | B_SET(6))
#define PRP_CNTL_CH2_YUV420 0
#define PRP_CNTL_CH2_YUV422 B_SET(7)
#define PRP_CNTL_CH2_YUV444 B_SET(8)
#define PRP_CNTL_CH1_LOOP B_SET(9)
#define PRP_CNTL_CH2_LOOP B_SET(10)
#define PRP_CNTL_AUTODROP B_SET(11)
#define PRP_CNTL_RST B_SET(12)
#define PRP_CNTL_CNTREN B_SET(13)
#define PRP_CNTL_WINEN B_SET(14)
#define PRP_CNTL_UNCHAIN B_SET(15)
#define PRP_CNTL_IN_SKIP_NONE 0
#define PRP_CNTL_IN_SKIP_1_2 B_SET(16)
#define PRP_CNTL_IN_SKIP_1_3 B_SET(17)
#define PRP_CNTL_IN_SKIP_2_3 (B_SET(16) | B_SET(17))
#define PRP_CNTL_IN_SKIP_1_4 B_SET(18)
#define PRP_CNTL_IN_SKIP_3_4 (B_SET(16) | B_SET(18))
#define PRP_CNTL_IN_SKIP_2_5 (B_SET(17) | B_SET(18))
#define PRP_CNTL_IN_SKIP_3_5 (B_SET(16) | B_SET(17) | B_SET(18))
#define PRP_CNTL_CH1_SKIP_NONE 0
#define PRP_CNTL_CH1_SKIP_1_2 B_SET(19)
#define PRP_CNTL_CH1_SKIP_1_3 B_SET(20)
#define PRP_CNTL_CH1_SKIP_2_3 (B_SET(19) | B_SET(20))
#define PRP_CNTL_CH1_SKIP_1_4 B_SET(21)
#define PRP_CNTL_CH1_SKIP_3_4 (B_SET(19) | B_SET(21))
#define PRP_CNTL_CH1_SKIP_2_5 (B_SET(20) | B_SET(21))
#define PRP_CNTL_CH1_SKIP_3_5 (B_SET(19) | B_SET(20) | B_SET(21))
#define PRP_CNTL_CH2_SKIP_NONE 0
#define PRP_CNTL_CH2_SKIP_1_2 B_SET(22)
#define PRP_CNTL_CH2_SKIP_1_3 B_SET(23)
#define PRP_CNTL_CH2_SKIP_2_3 (B_SET(22) | B_SET(23))
#define PRP_CNTL_CH2_SKIP_1_4 B_SET(24)
#define PRP_CNTL_CH2_SKIP_3_4 (B_SET(22) | B_SET(24))
#define PRP_CNTL_CH2_SKIP_2_5 (B_SET(23) | B_SET(24))
#define PRP_CNTL_CH2_SKIP_3_5 (B_SET(22) | B_SET(23) | B_SET(24))
#define PRP_CNTL_FIFO_I128 0
#define PRP_CNTL_FIFO_I96 B_SET(25)
#define PRP_CNTL_FIFO_I64 B_SET(26)
#define PRP_CNTL_FIFO_I32 (B_SET(25) | B_SET(26))
#define PRP_CNTL_FIFO_O64 0
#define PRP_CNTL_FIFO_O48 B_SET(27)
#define PRP_CNTL_FIFO_O32 B_SET(28)
#define PRP_CNTL_FIFO_O16 (B_SET(27) | B_SET(28))
#define PRP_CNTL_CH2B1 B_SET(29)
#define PRP_CNTL_CH2B2 B_SET(30)
#define PRP_CNTL_CH2_FLOWEN B_SET(31)
/* Bit definitions for PrP interrupt control register */
#define PRP_INTRCNTL_RDERR B_SET(0)
#define PRP_INTRCNTL_CH1WERR B_SET(1)
#define PRP_INTRCNTL_CH2WERR B_SET(2)
#define PRP_INTRCNTL_CH1FC B_SET(3)
#define PRP_INTRCNTL_CH2FC B_SET(5)
#define PRP_INTRCNTL_LBOVF B_SET(7)
#define PRP_INTRCNTL_CH2OVF B_SET(8)
/* Bit definitions for PrP interrupt status register */
#define PRP_INTRSTAT_RDERR B_SET(0)
#define PRP_INTRSTAT_CH1WERR B_SET(1)
#define PRP_INTRSTAT_CH2WERR B_SET(2)
#define PRP_INTRSTAT_CH2BUF2 B_SET(3)
#define PRP_INTRSTAT_CH2BUF1 B_SET(4)
#define PRP_INTRSTAT_CH1BUF2 B_SET(5)
#define PRP_INTRSTAT_CH1BUF1 B_SET(6)
#define PRP_INTRSTAT_LBOVF B_SET(7)
#define PRP_INTRSTAT_CH2OVF B_SET(8)
#define PRP_CHANNEL_1 0x1
#define PRP_CHANNEL_2 0x2
/* PRP-CSI config */
#define PRP_CSI_EN 0x80
#define PRP_CSI_LOOP (0x40 | PRP_CSI_EN)
#define PRP_CSI_IRQ_FRM (0x08 | PRP_CSI_LOOP)
#define PRP_CSI_IRQ_CH1ERR (0x10 | PRP_CSI_LOOP)
#define PRP_CSI_IRQ_CH2ERR (0x20 | PRP_CSI_LOOP)
#define PRP_CSI_IRQ_ALL (0x38 | PRP_CSI_LOOP)
#define PRP_CSI_SKIP_NONE 0
#define PRP_CSI_SKIP_1OF2 1
#define PRP_CSI_SKIP_1OF3 2
#define PRP_CSI_SKIP_2OF3 3
#define PRP_CSI_SKIP_1OF4 4
#define PRP_CSI_SKIP_3OF4 5
#define PRP_CSI_SKIP_2OF5 6
#define PRP_CSI_SKIP_4OF5 7
#define PRP_PIXIN_RGB565 0x2CA00565
#define PRP_PIXIN_RGB888 0x41000888
#define PRP_PIXIN_YUV420 0
#define PRP_PIXIN_YUYV 0x22000888
#define PRP_PIXIN_YVYU 0x20100888
#define PRP_PIXIN_UYVY 0x03080888
#define PRP_PIXIN_VYUY 0x01180888
#define PRP_PIXIN_YUV422 0x62080888
#define PRP_PIX1_RGB332 0x14400322
#define PRP_PIX1_RGB565 0x2CA00565
#define PRP_PIX1_RGB888 0x41000888
#define PRP_PIX1_YUYV 0x62000888
#define PRP_PIX1_YVYU 0x60100888
#define PRP_PIX1_UYVY 0x43080888
#define PRP_PIX1_VYUY 0x41180888
#define PRP_PIX1_UNUSED 0
#define PRP_PIX2_YUV420 0
#define PRP_PIX2_YUV422 1
#define PRP_PIX2_YUV444 4
#define PRP_PIX2_UNUSED 8
#define PRP_ALGO_WIDTH_ANY 0
#define PRP_ALGO_HEIGHT_ANY 0
#define PRP_ALGO_WIDTH_BIL 1
#define PRP_ALGO_WIDTH_AVG 2
#define PRP_ALGO_HEIGHT_BIL 4
#define PRP_ALGO_HEIGHT_AVG 8
#define PRP_ALGO_BYPASS 0x10
typedef struct _emma_prp_ratio {
unsigned short num;
unsigned short den;
} emma_prp_ratio;
/*
* The following definitions are for resizing. Definition values must not
* be changed otherwise decision logic will be wrong.
*/
#define SCALE_RETRY 16 /* retry times if ratio is not supported */
#define BC_COEF 3
#define MAX_TBL 20
#define SZ_COEF (1 << BC_COEF)
#define ALGO_AUTO 0
#define ALGO_BIL 1
#define ALGO_AVG 2
typedef struct {
char tbl[20]; /* table entries */
char len; /* table length used */
char algo; /* ALGO_xxx */
char ratio[20]; /* ratios used */
} scale_t;
/*
* structure for prp scaling.
* algorithm - bilinear or averaging for each axis
* PRP_ALGO_WIDTH_x | PRP_ALGO_HEIGHT_x | PRP_ALGO_BYPASS
* PRP_ALGO_BYPASS - Ch1 will not use Ch2 scaling with this flag
*/
typedef struct _emma_prp_scale {
unsigned char algo;
emma_prp_ratio width;
emma_prp_ratio height;
} emma_prp_scale;
typedef struct emma_prp_cfg {
unsigned int in_pix; /* PRP_PIXIN_xxx */
unsigned short in_width; /* image width, 32 - 2044 */
unsigned short in_height; /* image height, 32 - 2044 */
unsigned char in_csi; /* PRP_CSI_SKIP_x | PRP_CSI_LOOP */
unsigned short in_line_stride; /* in_line_stride and in_line_skip */
unsigned short in_line_skip; /* allow cropping from CSI */
unsigned int in_ptr; /* bus address */
/*
* in_csc[9] = 1 -> Y-16
* if in_csc[1..9] == 0
* in_csc[0] represents YUV range 0-3 = A0,A1,B0,B1;
* else
* in_csc[0..9] represents either format
*/
unsigned short in_csc[10];
unsigned char ch2_pix; /* PRP_PIX2_xxx */
emma_prp_scale ch2_scale; /* resizing paramters */
unsigned short ch2_width; /* 4-2044, 0 = scaled */
unsigned short ch2_height; /* 4-2044, 0 = scaled */
unsigned int ch2_ptr; /* bus addr */
unsigned int ch2_ptr2; /* bus addr for 2nd buf (loop mode) */
unsigned char ch2_csi; /* PRP_CSI_SKIP_x | PRP_CSI_LOOP */
unsigned int ch1_pix; /* PRP_PIX1_xxx */
emma_prp_scale ch1_scale; /* resizing parameters */
unsigned short ch1_width; /* 4-2044, 0 = scaled */
unsigned short ch1_height; /* 4-2044, 0 = scaled */
unsigned short ch1_stride; /* 4-4088, 0 = ch1_width */
unsigned int ch1_ptr; /* bus addr */
unsigned int ch1_ptr2; /* bus addr for 2nd buf (loop mode) */
unsigned char ch1_csi; /* PRP_CSI_SKIP_x | PRP_CSI_LOOP */
/*
* channel resizing coefficients
* scale[0] for channel 1 width
* scale[1] for channel 1 height
* scale[2] for channel 2 width
* scale[3] for channel 2 height
*/
scale_t scale[4];
} emma_prp_cfg;
int prphw_reset(void);
int prphw_enable(int channel);
int prphw_disable(int channel);
int prphw_inptr(emma_prp_cfg *);
int prphw_ch1ptr(emma_prp_cfg *);
int prphw_ch1ptr2(emma_prp_cfg *);
int prphw_ch2ptr(emma_prp_cfg *);
int prphw_ch2ptr2(emma_prp_cfg *);
int prphw_cfg(emma_prp_cfg *);
int prphw_isr(void);
void prphw_init(void);
void prphw_exit(void);
/*
* scale out coefficient table
* din in scale numerator
* dout in scale denominator
* inv in pre-scale dimension
* vout in/out post-scale output dimension
* pout out post-scale internal dimension [opt]
* retry in retry times (round the output length) when need
*/
int prp_scale(scale_t * pscale, int din, int dout, int inv,
unsigned short *vout, unsigned short *pout, int retry);
int prp_init(void *dev_id);
void prp_exit(void *dev_id);
int prp_enc_select(void *data);
int prp_enc_deselect(void *data);
int prp_vf_select(void *data);
int prp_vf_deselect(void *data);
int prp_still_select(void *data);
int prp_still_deselect(void *data);
#endif /* __MX27_PRP_H__ */
|