diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-08-13 23:13:22 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-08-15 15:25:07 -0400 |
commit | 0c0d06cac63ee327ceaab4b5ffe2206574ab86bd (patch) | |
tree | e759f0dc3185d97f2a0c6b5cd5e32ea6faa74d40 /drivers/media/usb/gspca/m5602/m5602_ov9650.h | |
parent | 84cfe9e79bd5ac11c963f4841158454fefa872f6 (diff) |
[media] rename most media/video usb drivers to media/usb
Rename all USB drivers with their own directory under
drivers/media/video into drivers/media/usb and update the
building system.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/usb/gspca/m5602/m5602_ov9650.h')
-rw-r--r-- | drivers/media/usb/gspca/m5602/m5602_ov9650.h | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/drivers/media/usb/gspca/m5602/m5602_ov9650.h b/drivers/media/usb/gspca/m5602/m5602_ov9650.h new file mode 100644 index 000000000000..f7aa5bf68983 --- /dev/null +++ b/drivers/media/usb/gspca/m5602/m5602_ov9650.h | |||
@@ -0,0 +1,307 @@ | |||
1 | /* | ||
2 | * Driver for the ov9650 sensor | ||
3 | * | ||
4 | * Copyright (C) 2008 Erik Andrén | ||
5 | * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project. | ||
6 | * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br> | ||
7 | * | ||
8 | * Portions of code to USB interface and ALi driver software, | ||
9 | * Copyright (c) 2006 Willem Duinker | ||
10 | * v4l2 interface modeled after the V4L2 driver | ||
11 | * for SN9C10x PC Camera Controllers | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or | ||
14 | * modify it under the terms of the GNU General Public License as | ||
15 | * published by the Free Software Foundation, version 2. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #ifndef M5602_OV9650_H_ | ||
20 | #define M5602_OV9650_H_ | ||
21 | |||
22 | #include <linux/dmi.h> | ||
23 | #include "m5602_sensor.h" | ||
24 | |||
25 | /*****************************************************************************/ | ||
26 | |||
27 | #define OV9650_GAIN 0x00 | ||
28 | #define OV9650_BLUE 0x01 | ||
29 | #define OV9650_RED 0x02 | ||
30 | #define OV9650_VREF 0x03 | ||
31 | #define OV9650_COM1 0x04 | ||
32 | #define OV9650_BAVE 0x05 | ||
33 | #define OV9650_GEAVE 0x06 | ||
34 | #define OV9650_RSVD7 0x07 | ||
35 | #define OV9650_COM2 0x09 | ||
36 | #define OV9650_PID 0x0a | ||
37 | #define OV9650_VER 0x0b | ||
38 | #define OV9650_COM3 0x0c | ||
39 | #define OV9650_COM4 0x0d | ||
40 | #define OV9650_COM5 0x0e | ||
41 | #define OV9650_COM6 0x0f | ||
42 | #define OV9650_AECH 0x10 | ||
43 | #define OV9650_CLKRC 0x11 | ||
44 | #define OV9650_COM7 0x12 | ||
45 | #define OV9650_COM8 0x13 | ||
46 | #define OV9650_COM9 0x14 | ||
47 | #define OV9650_COM10 0x15 | ||
48 | #define OV9650_RSVD16 0x16 | ||
49 | #define OV9650_HSTART 0x17 | ||
50 | #define OV9650_HSTOP 0x18 | ||
51 | #define OV9650_VSTRT 0x19 | ||
52 | #define OV9650_VSTOP 0x1a | ||
53 | #define OV9650_PSHFT 0x1b | ||
54 | #define OV9650_MVFP 0x1e | ||
55 | #define OV9650_AEW 0x24 | ||
56 | #define OV9650_AEB 0x25 | ||
57 | #define OV9650_VPT 0x26 | ||
58 | #define OV9650_BBIAS 0x27 | ||
59 | #define OV9650_GbBIAS 0x28 | ||
60 | #define OV9650_Gr_COM 0x29 | ||
61 | #define OV9650_RBIAS 0x2c | ||
62 | #define OV9650_HREF 0x32 | ||
63 | #define OV9650_CHLF 0x33 | ||
64 | #define OV9650_ARBLM 0x34 | ||
65 | #define OV9650_RSVD35 0x35 | ||
66 | #define OV9650_RSVD36 0x36 | ||
67 | #define OV9650_ADC 0x37 | ||
68 | #define OV9650_ACOM38 0x38 | ||
69 | #define OV9650_OFON 0x39 | ||
70 | #define OV9650_TSLB 0x3a | ||
71 | #define OV9650_COM12 0x3c | ||
72 | #define OV9650_COM13 0x3d | ||
73 | #define OV9650_COM15 0x40 | ||
74 | #define OV9650_COM16 0x41 | ||
75 | #define OV9650_LCC1 0x62 | ||
76 | #define OV9650_LCC2 0x63 | ||
77 | #define OV9650_LCC3 0x64 | ||
78 | #define OV9650_LCC4 0x65 | ||
79 | #define OV9650_LCC5 0x66 | ||
80 | #define OV9650_HV 0x69 | ||
81 | #define OV9650_DBLV 0x6b | ||
82 | #define OV9650_COM21 0x8b | ||
83 | #define OV9650_COM22 0x8c | ||
84 | #define OV9650_COM24 0x8e | ||
85 | #define OV9650_DBLC1 0x8f | ||
86 | #define OV9650_RSVD94 0x94 | ||
87 | #define OV9650_RSVD95 0x95 | ||
88 | #define OV9650_RSVD96 0x96 | ||
89 | #define OV9650_LCCFB 0x9d | ||
90 | #define OV9650_LCCFR 0x9e | ||
91 | #define OV9650_AECHM 0xa1 | ||
92 | #define OV9650_COM26 0xa5 | ||
93 | #define OV9650_ACOMA8 0xa8 | ||
94 | #define OV9650_ACOMA9 0xa9 | ||
95 | |||
96 | #define OV9650_REGISTER_RESET (1 << 7) | ||
97 | #define OV9650_VGA_SELECT (1 << 6) | ||
98 | #define OV9650_CIF_SELECT (1 << 5) | ||
99 | #define OV9650_QVGA_SELECT (1 << 4) | ||
100 | #define OV9650_QCIF_SELECT (1 << 3) | ||
101 | #define OV9650_RGB_SELECT (1 << 2) | ||
102 | #define OV9650_RAW_RGB_SELECT (1 << 0) | ||
103 | |||
104 | #define OV9650_FAST_AGC_AEC (1 << 7) | ||
105 | #define OV9650_AEC_UNLIM_STEP_SIZE (1 << 6) | ||
106 | #define OV9650_BANDING (1 << 5) | ||
107 | #define OV9650_AGC_EN (1 << 2) | ||
108 | #define OV9650_AWB_EN (1 << 1) | ||
109 | #define OV9650_AEC_EN (1 << 0) | ||
110 | |||
111 | #define OV9650_VARIOPIXEL (1 << 2) | ||
112 | #define OV9650_SYSTEM_CLK_SEL (1 << 7) | ||
113 | #define OV9650_SLAM_MODE (1 << 4) | ||
114 | |||
115 | #define OV9650_QVGA_VARIOPIXEL (1 << 7) | ||
116 | |||
117 | #define OV9650_VFLIP (1 << 4) | ||
118 | #define OV9650_HFLIP (1 << 5) | ||
119 | |||
120 | #define OV9650_SOFT_SLEEP (1 << 4) | ||
121 | #define OV9650_OUTPUT_DRIVE_2X (1 << 0) | ||
122 | |||
123 | #define OV9650_DENOISE_ENABLE (1 << 5) | ||
124 | #define OV9650_WHITE_PIXEL_ENABLE (1 << 1) | ||
125 | #define OV9650_WHITE_PIXEL_OPTION (1 << 0) | ||
126 | |||
127 | #define OV9650_LEFT_OFFSET 0x62 | ||
128 | |||
129 | #define GAIN_DEFAULT 0x14 | ||
130 | #define RED_GAIN_DEFAULT 0x70 | ||
131 | #define BLUE_GAIN_DEFAULT 0x20 | ||
132 | #define EXPOSURE_DEFAULT 0x1ff | ||
133 | |||
134 | /*****************************************************************************/ | ||
135 | |||
136 | /* Kernel module parameters */ | ||
137 | extern int force_sensor; | ||
138 | extern bool dump_sensor; | ||
139 | |||
140 | int ov9650_probe(struct sd *sd); | ||
141 | int ov9650_init(struct sd *sd); | ||
142 | int ov9650_start(struct sd *sd); | ||
143 | int ov9650_stop(struct sd *sd); | ||
144 | void ov9650_disconnect(struct sd *sd); | ||
145 | |||
146 | static const struct m5602_sensor ov9650 = { | ||
147 | .name = "OV9650", | ||
148 | .i2c_slave_id = 0x60, | ||
149 | .i2c_regW = 1, | ||
150 | .probe = ov9650_probe, | ||
151 | .init = ov9650_init, | ||
152 | .start = ov9650_start, | ||
153 | .stop = ov9650_stop, | ||
154 | .disconnect = ov9650_disconnect, | ||
155 | }; | ||
156 | |||
157 | static const unsigned char preinit_ov9650[][3] = { | ||
158 | /* [INITCAM] */ | ||
159 | {BRIDGE, M5602_XB_MCU_CLK_DIV, 0x02}, | ||
160 | {BRIDGE, M5602_XB_MCU_CLK_CTRL, 0xb0}, | ||
161 | {BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00}, | ||
162 | {BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0}, | ||
163 | {BRIDGE, M5602_XB_ADC_CTRL, 0xc0}, | ||
164 | {BRIDGE, M5602_XB_SENSOR_CTRL, 0x00}, | ||
165 | |||
166 | {BRIDGE, M5602_XB_SENSOR_TYPE, 0x08}, | ||
167 | {BRIDGE, M5602_XB_GPIO_DIR, 0x05}, | ||
168 | {BRIDGE, M5602_XB_GPIO_DAT, 0x04}, | ||
169 | {BRIDGE, M5602_XB_GPIO_EN_H, 0x06}, | ||
170 | {BRIDGE, M5602_XB_GPIO_DIR_H, 0x06}, | ||
171 | {BRIDGE, M5602_XB_GPIO_DAT_H, 0x00}, | ||
172 | {BRIDGE, M5602_XB_GPIO_DAT, 0x00}, | ||
173 | {BRIDGE, M5602_XB_I2C_CLK_DIV, 0x0a}, | ||
174 | /* Reset chip */ | ||
175 | {SENSOR, OV9650_COM7, OV9650_REGISTER_RESET}, | ||
176 | /* Enable double clock */ | ||
177 | {SENSOR, OV9650_CLKRC, 0x80}, | ||
178 | /* Do something out of spec with the power */ | ||
179 | {SENSOR, OV9650_OFON, 0x40} | ||
180 | }; | ||
181 | |||
182 | static const unsigned char init_ov9650[][3] = { | ||
183 | /* [INITCAM] */ | ||
184 | {BRIDGE, M5602_XB_MCU_CLK_DIV, 0x02}, | ||
185 | {BRIDGE, M5602_XB_MCU_CLK_CTRL, 0xb0}, | ||
186 | {BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00}, | ||
187 | {BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0}, | ||
188 | {BRIDGE, M5602_XB_ADC_CTRL, 0xc0}, | ||
189 | {BRIDGE, M5602_XB_SENSOR_CTRL, 0x00}, | ||
190 | |||
191 | {BRIDGE, M5602_XB_SENSOR_TYPE, 0x08}, | ||
192 | {BRIDGE, M5602_XB_GPIO_DIR, 0x05}, | ||
193 | {BRIDGE, M5602_XB_GPIO_DAT, 0x04}, | ||
194 | {BRIDGE, M5602_XB_GPIO_EN_H, 0x06}, | ||
195 | {BRIDGE, M5602_XB_GPIO_DIR_H, 0x06}, | ||
196 | {BRIDGE, M5602_XB_GPIO_DAT_H, 0x00}, | ||
197 | {BRIDGE, M5602_XB_GPIO_DAT, 0x00}, | ||
198 | {BRIDGE, M5602_XB_I2C_CLK_DIV, 0x0a}, | ||
199 | |||
200 | /* Reset chip */ | ||
201 | {SENSOR, OV9650_COM7, OV9650_REGISTER_RESET}, | ||
202 | /* One extra reset is needed in order to make the sensor behave | ||
203 | properly when resuming from ram, could be a timing issue */ | ||
204 | {SENSOR, OV9650_COM7, OV9650_REGISTER_RESET}, | ||
205 | |||
206 | /* Enable double clock */ | ||
207 | {SENSOR, OV9650_CLKRC, 0x80}, | ||
208 | /* Do something out of spec with the power */ | ||
209 | {SENSOR, OV9650_OFON, 0x40}, | ||
210 | |||
211 | /* Set fast AGC/AEC algorithm with unlimited step size */ | ||
212 | {SENSOR, OV9650_COM8, OV9650_FAST_AGC_AEC | | ||
213 | OV9650_AEC_UNLIM_STEP_SIZE}, | ||
214 | |||
215 | {SENSOR, OV9650_CHLF, 0x10}, | ||
216 | {SENSOR, OV9650_ARBLM, 0xbf}, | ||
217 | {SENSOR, OV9650_ACOM38, 0x81}, | ||
218 | /* Turn off color matrix coefficient double option */ | ||
219 | {SENSOR, OV9650_COM16, 0x00}, | ||
220 | /* Enable color matrix for RGB/YUV, Delay Y channel, | ||
221 | set output Y/UV delay to 1 */ | ||
222 | {SENSOR, OV9650_COM13, 0x19}, | ||
223 | /* Enable digital BLC, Set output mode to U Y V Y */ | ||
224 | {SENSOR, OV9650_TSLB, 0x0c}, | ||
225 | /* Limit the AGC/AEC stable upper region */ | ||
226 | {SENSOR, OV9650_COM24, 0x00}, | ||
227 | /* Enable HREF and some out of spec things */ | ||
228 | {SENSOR, OV9650_COM12, 0x73}, | ||
229 | /* Set all DBLC offset signs to positive and | ||
230 | do some out of spec stuff */ | ||
231 | {SENSOR, OV9650_DBLC1, 0xdf}, | ||
232 | {SENSOR, OV9650_COM21, 0x06}, | ||
233 | {SENSOR, OV9650_RSVD35, 0x91}, | ||
234 | /* Necessary, no camera stream without it */ | ||
235 | {SENSOR, OV9650_RSVD16, 0x06}, | ||
236 | {SENSOR, OV9650_RSVD94, 0x99}, | ||
237 | {SENSOR, OV9650_RSVD95, 0x99}, | ||
238 | {SENSOR, OV9650_RSVD96, 0x04}, | ||
239 | /* Enable full range output */ | ||
240 | {SENSOR, OV9650_COM15, 0x0}, | ||
241 | /* Enable HREF at optical black, enable ADBLC bias, | ||
242 | enable ADBLC, reset timings at format change */ | ||
243 | {SENSOR, OV9650_COM6, 0x4b}, | ||
244 | /* Subtract 32 from the B channel bias */ | ||
245 | {SENSOR, OV9650_BBIAS, 0xa0}, | ||
246 | /* Subtract 32 from the Gb channel bias */ | ||
247 | {SENSOR, OV9650_GbBIAS, 0xa0}, | ||
248 | /* Do not bypass the analog BLC and to some out of spec stuff */ | ||
249 | {SENSOR, OV9650_Gr_COM, 0x00}, | ||
250 | /* Subtract 32 from the R channel bias */ | ||
251 | {SENSOR, OV9650_RBIAS, 0xa0}, | ||
252 | /* Subtract 32 from the R channel bias */ | ||
253 | {SENSOR, OV9650_RBIAS, 0x0}, | ||
254 | {SENSOR, OV9650_COM26, 0x80}, | ||
255 | {SENSOR, OV9650_ACOMA9, 0x98}, | ||
256 | /* Set the AGC/AEC stable region upper limit */ | ||
257 | {SENSOR, OV9650_AEW, 0x68}, | ||
258 | /* Set the AGC/AEC stable region lower limit */ | ||
259 | {SENSOR, OV9650_AEB, 0x5c}, | ||
260 | /* Set the high and low limit nibbles to 3 */ | ||
261 | {SENSOR, OV9650_VPT, 0xc3}, | ||
262 | /* Set the Automatic Gain Ceiling (AGC) to 128x, | ||
263 | drop VSYNC at frame drop, | ||
264 | limit exposure timing, | ||
265 | drop frame when the AEC step is larger than the exposure gap */ | ||
266 | {SENSOR, OV9650_COM9, 0x6e}, | ||
267 | /* Set VSYNC negative, Set RESET to SLHS (slave mode horizontal sync) | ||
268 | and set PWDN to SLVS (slave mode vertical sync) */ | ||
269 | {SENSOR, OV9650_COM10, 0x42}, | ||
270 | /* Set horizontal column start high to default value */ | ||
271 | {SENSOR, OV9650_HSTART, 0x1a}, /* 210 */ | ||
272 | /* Set horizontal column end */ | ||
273 | {SENSOR, OV9650_HSTOP, 0xbf}, /* 1534 */ | ||
274 | /* Complementing register to the two writes above */ | ||
275 | {SENSOR, OV9650_HREF, 0xb2}, | ||
276 | /* Set vertical row start high bits */ | ||
277 | {SENSOR, OV9650_VSTRT, 0x02}, | ||
278 | /* Set vertical row end low bits */ | ||
279 | {SENSOR, OV9650_VSTOP, 0x7e}, | ||
280 | /* Set complementing vertical frame control */ | ||
281 | {SENSOR, OV9650_VREF, 0x10}, | ||
282 | {SENSOR, OV9650_ADC, 0x04}, | ||
283 | {SENSOR, OV9650_HV, 0x40}, | ||
284 | |||
285 | /* Enable denoise, and white-pixel erase */ | ||
286 | {SENSOR, OV9650_COM22, OV9650_DENOISE_ENABLE | | ||
287 | OV9650_WHITE_PIXEL_ENABLE | | ||
288 | OV9650_WHITE_PIXEL_OPTION}, | ||
289 | |||
290 | /* Enable VARIOPIXEL */ | ||
291 | {SENSOR, OV9650_COM3, OV9650_VARIOPIXEL}, | ||
292 | {SENSOR, OV9650_COM4, OV9650_QVGA_VARIOPIXEL}, | ||
293 | |||
294 | /* Put the sensor in soft sleep mode */ | ||
295 | {SENSOR, OV9650_COM2, OV9650_SOFT_SLEEP | OV9650_OUTPUT_DRIVE_2X}, | ||
296 | }; | ||
297 | |||
298 | static const unsigned char res_init_ov9650[][3] = { | ||
299 | {SENSOR, OV9650_COM2, OV9650_OUTPUT_DRIVE_2X}, | ||
300 | |||
301 | {BRIDGE, M5602_XB_LINE_OF_FRAME_H, 0x82}, | ||
302 | {BRIDGE, M5602_XB_LINE_OF_FRAME_L, 0x00}, | ||
303 | {BRIDGE, M5602_XB_PIX_OF_LINE_H, 0x82}, | ||
304 | {BRIDGE, M5602_XB_PIX_OF_LINE_L, 0x00}, | ||
305 | {BRIDGE, M5602_XB_SIG_INI, 0x01} | ||
306 | }; | ||
307 | #endif | ||