• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * DivIO nw80x subdriver
3  *
4  * Copyright (C) 2011 Jean-François Moine (http://moinejf.free.fr)
5  * Copyright (C) 2003 Sylvain Munaut <tnt@246tNt.com>
6  *			Kjell Claesson <keyson@users.sourceforge.net>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  */
18 
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20 
21 #define MODULE_NAME "nw80x"
22 
23 #include "gspca.h"
24 
25 MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>");
26 MODULE_DESCRIPTION("NW80x USB Camera Driver");
27 MODULE_LICENSE("GPL");
28 
29 static int webcam;
30 
31 /* specific webcam descriptor */
32 struct sd {
33 	struct gspca_dev gspca_dev;	/* !! must be the first item */
34 
35 	u32 ae_res;
36 	s8 ag_cnt;
37 #define AG_CNT_START 13
38 	u8 exp_too_low_cnt;
39 	u8 exp_too_high_cnt;
40 
41 	u8 bridge;
42 	u8 webcam;
43 };
44 
45 enum bridges {
46 	BRIDGE_NW800,	/* and et31x110 */
47 	BRIDGE_NW801,
48 	BRIDGE_NW802,
49 };
50 enum webcams {
51 	Generic800,
52 	SpaceCam,	/* Trust 120 SpaceCam */
53 	SpaceCam2,	/* other Trust 120 SpaceCam */
54 	Cvideopro,	/* Conceptronic Video Pro */
55 	Dlink350c,
56 	DS3303u,
57 	Kr651us,
58 	Kritter,
59 	Mustek300,
60 	Proscope,
61 	Twinkle,
62 	DvcV6,
63 	P35u,
64 	Generic802,
65 	NWEBCAMS	/* number of webcams */
66 };
67 
68 static const u8 webcam_chip[NWEBCAMS] = {
69 	[Generic800]	= BRIDGE_NW800,	/* 06a5:0000
70 					 * Typhoon Webcam 100 USB */
71 
72 	[SpaceCam]	= BRIDGE_NW800,	/* 06a5:d800
73 				* Trust SpaceCam120 or SpaceCam100 PORTABLE */
74 
75 	[SpaceCam2]	= BRIDGE_NW800,	/* 06a5:d800 - pas106
76 			* other Trust SpaceCam120 or SpaceCam100 PORTABLE */
77 
78 	[Cvideopro]	= BRIDGE_NW802,	/* 06a5:d001
79 			* Conceptronic Video Pro 'CVIDEOPRO USB Webcam CCD' */
80 
81 	[Dlink350c]	= BRIDGE_NW802,	/* 06a5:d001
82 					 * D-Link NetQam Pro 250plus */
83 
84 	[DS3303u]	= BRIDGE_NW801,	/* 06a5:d001
85 				* Plustek Opticam 500U or ProLink DS3303u */
86 
87 	[Kr651us]	= BRIDGE_NW802,	/* 06a5:d001
88 					 * Panasonic GP-KR651US */
89 
90 	[Kritter]	= BRIDGE_NW802,	/* 06a5:d001
91 					 * iRez Kritter cam */
92 
93 	[Mustek300]	= BRIDGE_NW802,	/* 055f:d001
94 					 * Mustek Wcam 300 mini */
95 
96 	[Proscope]	= BRIDGE_NW802,	/* 06a5:d001
97 					 * Scalar USB Microscope (ProScope) */
98 
99 	[Twinkle]	= BRIDGE_NW800,	/* 06a5:d800 - hv7121b? (seems pas106)
100 					 * Divio Chicony TwinkleCam
101 					 * DSB-C110 */
102 
103 	[DvcV6]		= BRIDGE_NW802,	/* 0502:d001
104 					 * DVC V6 */
105 
106 	[P35u]		= BRIDGE_NW801,	/* 052b:d001, 06a5:d001 and 06be:d001
107 					 * EZCam Pro p35u */
108 
109 	[Generic802]	= BRIDGE_NW802,
110 };
111 /*
112  * other webcams:
113  *	- nw801 046d:d001
114  *		Logitech QuickCam Pro (dark focus ring)
115  *	- nw801 0728:d001
116  *		AVerMedia Camguard
117  *	- nw??? 06a5:d001
118  *		D-Link NetQam Pro 250plus
119  *	- nw800 065a:d800
120  *		Showcam NGS webcam
121  *	- nw??? ????:????
122  *		Sceptre svc300
123  */
124 
125 /*
126  * registers
127  *    nw800/et31x110	  nw801		  nw802
128  *	0000..009e	0000..00a1	0000..009e
129  *	0200..0211	   id		   id
130  *	0300..0302	   id		   id
131  *	0400..0406	  (inex)	0400..0406
132  *	0500..0505	0500..0506	  (inex)
133  *	0600..061a	0600..0601	0600..0601
134  *	0800..0814	   id		   id
135  *	1000..109c	1000..10a1	1000..109a
136  */
137 
138 /* resolutions
139  *	nw800: 320x240, 352x288
140  *	nw801/802: 320x240, 640x480
141  */
142 static const struct v4l2_pix_format cif_mode[] = {
143 	{320, 240, V4L2_PIX_FMT_JPGL, V4L2_FIELD_NONE,
144 		.bytesperline = 320,
145 		.sizeimage = 320 * 240 * 4 / 8,
146 		.colorspace = V4L2_COLORSPACE_JPEG},
147 	{352, 288, V4L2_PIX_FMT_JPGL, V4L2_FIELD_NONE,
148 		.bytesperline = 352,
149 		.sizeimage = 352 * 288 * 4 / 8,
150 		.colorspace = V4L2_COLORSPACE_JPEG}
151 };
152 static const struct v4l2_pix_format vga_mode[] = {
153 	{320, 240, V4L2_PIX_FMT_JPGL, V4L2_FIELD_NONE,
154 		.bytesperline = 320,
155 		.sizeimage = 320 * 240 * 4 / 8,
156 		.colorspace = V4L2_COLORSPACE_JPEG},
157 	{640, 480, V4L2_PIX_FMT_JPGL, V4L2_FIELD_NONE,
158 		.bytesperline = 640,
159 		.sizeimage = 640 * 480 * 3 / 8,
160 		.colorspace = V4L2_COLORSPACE_JPEG},
161 };
162 
163 /*
164  * The sequences below contain:
165  *	- 1st and 2nd bytes: either
166  *		- register number (BE)
167  *		- I2C0 + i2c address
168  *	- 3rd byte: data length (=0 for end of sequence)
169  *	- n bytes: data
170  */
171 #define I2C0 0xff
172 
173 static const u8 nw800_init[] = {
174 	0x04, 0x05, 0x01, 0x61,
175 	0x04, 0x04, 0x01, 0x01,
176 	0x04, 0x06, 0x01, 0x04,
177 	0x04, 0x04, 0x03, 0x00, 0x00, 0x00,
178 	0x05, 0x05, 0x01, 0x00,
179 	0, 0, 0
180 };
181 static const u8 nw800_start[] = {
182 	0x04, 0x06, 0x01, 0xc0,
183 	0x00, 0x00, 0x40, 0x10, 0x43, 0x00, 0xb4, 0x01, 0x10, 0x00, 0x4f,
184 			  0xef, 0x0e, 0x00, 0x74, 0x01, 0x01, 0x00, 0x19,
185 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
186 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x3e, 0x00, 0x24,
187 			  0x03, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
188 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
189 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
190 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
191 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
192 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
193 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
194 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
195 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
196 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
197 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
198 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
199 	0x00, 0x80, 0x1f, 0xa0, 0x48, 0xc3, 0x02, 0x88, 0x0c, 0x68, 0x00,
200 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x06, 0x00, 0x08,
201 			  0x00, 0x32, 0x01, 0x01, 0x00, 0x16, 0x00, 0x04,
202 			  0x00, 0x4b, 0x00, 0x76, 0x00, 0x86, 0x00,
203 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
204 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
205 			  0x40, 0x20,
206 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
207 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x61, 0xc0,
208 	0x05, 0x00, 0x06, 0xe8, 0x00, 0x00, 0x00, 0x20, 0x20,
209 	0x06, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 			  0x00, 0x00, 0x00,
213 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 			  0x00, 0x00, 0x00, 0x00, 0x00,
216 	0x10, 0x00, 0x40, 0x83, 0x02, 0x20, 0x00, 0x13, 0x00, 0x00, 0x00,
217 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
218 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 			  0x00, 0x49, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
220 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
221 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
222 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
223 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
224 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
225 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
226 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
227 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
228 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
229 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
230 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
231 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
232 	0x10, 0x80, 0x1d, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
233 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x62,
234 			  0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01, 0x20,
235 			  0x01, 0x60, 0x01, 0x00, 0x00,
236 
237 	0x04, 0x04, 0x01, 0xff,
238 	0x04, 0x06, 0x01, 0xc4,
239 
240 	0x04, 0x06, 0x01, 0xc0,
241 	0x00, 0x00, 0x40, 0x10, 0x43, 0x00, 0xb4, 0x01, 0x10, 0x00, 0x4f,
242 			  0xef, 0x0e, 0x00, 0x74, 0x01, 0x01, 0x00, 0x19,
243 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
244 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x3e, 0x00, 0x24,
245 			  0x03, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
246 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
247 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
248 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
249 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
250 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
251 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
252 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
253 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
254 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
255 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
256 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
257 	0x00, 0x80, 0x1f, 0xa0, 0x48, 0xc3, 0x02, 0x88, 0x0c, 0x68, 0x00,
258 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x06, 0x00, 0x08,
259 			  0x00, 0x32, 0x01, 0x01, 0x00, 0x16, 0x00, 0x04,
260 			  0x00, 0x4b, 0x00, 0x76, 0x00, 0x86, 0x00,
261 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
262 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
263 			  0x40, 0x20,
264 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
265 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x61, 0xc0,
266 	0x05, 0x00, 0x06, 0xe8, 0x00, 0x00, 0x00, 0x20, 0x20,
267 	0x06, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 			  0x00, 0x00, 0x00,
271 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 			  0x00, 0x00, 0x00, 0x00, 0x00,
274 	0x10, 0x00, 0x40, 0x83, 0x02, 0x20, 0x00, 0x13, 0x00, 0x00, 0x00,
275 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
276 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277 			  0x00, 0x49, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
278 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
279 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
280 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
281 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
282 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
283 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
284 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
285 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
286 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
287 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
288 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
289 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
290 	0x10, 0x80, 0x1d, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
291 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x62,
292 			  0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01, 0x20,
293 			  0x01, 0x60, 0x01, 0x00, 0x00,
294 
295 	0x02, 0x00, 0x11, 0x48, 0x58, 0x9e, 0x48, 0x58, 0x00, 0x00, 0x00,
296 			  0x00, 0x84, 0x36, 0x05, 0x01, 0xf2, 0x86, 0x65,
297 			  0x40,
298 	0x00, 0x80, 0x01, 0xa0,
299 	0x10, 0x1a, 0x01, 0x00,
300 	0x00, 0x91, 0x02, 0x6c, 0x01,
301 	0x00, 0x03, 0x02, 0xc8, 0x01,
302 	0x10, 0x1a, 0x01, 0x00,
303 	0x10, 0x00, 0x01, 0x83,
304 	0x10, 0x8f, 0x0c, 0x62, 0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01,
305 			  0x20, 0x01, 0x60, 0x01,
306 	0x10, 0x85, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
307 	0x10, 0x1b, 0x02, 0x69, 0x00,
308 	0x10, 0x11, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
309 	0x05, 0x02, 0x01, 0x02,
310 	0x06, 0x00, 0x02, 0x04, 0xd9,
311 	0x05, 0x05, 0x01, 0x20,
312 	0x05, 0x05, 0x01, 0x21,
313 	0x10, 0x0e, 0x01, 0x08,
314 	0x10, 0x41, 0x11, 0x00, 0x08, 0x21, 0x3d, 0x52, 0x63, 0x75, 0x83,
315 			  0x91, 0x9e, 0xaa, 0xb6, 0xc1, 0xcc, 0xd6, 0xe0,
316 			  0xea,
317 	0x10, 0x03, 0x01, 0x00,
318 	0x10, 0x0f, 0x02, 0x13, 0x13,
319 	0x10, 0x03, 0x01, 0x14,
320 	0x10, 0x41, 0x11, 0x00, 0x08, 0x21, 0x3d, 0x52, 0x63, 0x75, 0x83,
321 			  0x91, 0x9e, 0xaa, 0xb6, 0xc1, 0xcc, 0xd6, 0xe0,
322 			  0xea,
323 	0x10, 0x0b, 0x01, 0x14,
324 	0x10, 0x0d, 0x01, 0x20,
325 	0x10, 0x0c, 0x01, 0x34,
326 	0x04, 0x06, 0x01, 0xc3,
327 	0x04, 0x04, 0x01, 0x00,
328 	0x05, 0x02, 0x01, 0x02,
329 	0x06, 0x00, 0x02, 0x00, 0x48,
330 	0x05, 0x05, 0x01, 0x20,
331 	0x05, 0x05, 0x01, 0x21,
332 	0, 0, 0
333 };
334 
335 /* 06a5:d001 - nw801 - Panasonic
336  *		P35u */
337 static const u8 nw801_start_1[] = {
338 	0x05, 0x06, 0x01, 0x04,
339 	0x00, 0x00, 0x40, 0x0e, 0x00, 0x00, 0xf9, 0x02, 0x11, 0x00, 0x0e,
340 			  0x01, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
341 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
342 			  0x00, 0x01, 0x00, 0x19, 0x00, 0xce, 0x00, 0xf4,
343 			  0x05, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
344 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
345 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
346 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
347 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
348 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
349 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
350 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
351 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
352 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
353 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
354 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
355 	0x00, 0x80, 0x22, 0xb4, 0x6f, 0x3f, 0x0f, 0x88, 0x20, 0x08, 0x00,
356 			  0x00, 0x00, 0x00, 0x00, 0x69, 0xa8, 0x1f, 0x00,
357 			  0x0d, 0x02, 0x07, 0x00, 0x01, 0x00, 0x19, 0x00,
358 			  0xf2, 0x00, 0x18, 0x06, 0x10, 0x06, 0x10, 0x00,
359 			  0x36, 0x00,
360 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
361 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
362 			  0x40, 0x20,
363 	0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
364 	0x05, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
365 	0x06, 0x00, 0x02, 0x09, 0x99,
366 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 			  0x00, 0x00, 0x00, 0x00, 0x00,
369 	0x10, 0x00, 0x40, 0x22, 0x02, 0x80, 0x00, 0x1e, 0x00, 0x00, 0x00,
370 			  0x00, 0x00, 0x00, 0x0a, 0x15, 0x08, 0x08, 0x0a,
371 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 			  0x00, 0x01, 0x35, 0xfd, 0x07, 0x3d, 0x00, 0x00,
373 			  0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x14, 0x02,
374 			  0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
375 			  0x40, 0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x06,
376 			  0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06, 0xf7,
377 	0x10, 0x40, 0x40, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80, 0x80,
378 			  0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99, 0xa4,
379 			  0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc, 0xcf,
380 			  0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54, 0x64,
381 			  0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2, 0xe2,
382 			  0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
383 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
384 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
385 	0x10, 0x80, 0x22, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
386 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00, 0x00,
387 			  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x82, 0x02,
388 			  0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40, 0x01,
389 			  0xf0, 0x00,
390 	0, 0, 0,
391 };
392 static const u8 nw801_start_qvga[] = {
393 	0x02, 0x00, 0x10, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
394 			  0x00, 0x78, 0x18, 0x0b, 0x06, 0xa2, 0x86, 0x78,
395 	0x02, 0x0f, 0x01, 0x6b,
396 	0x10, 0x1a, 0x01, 0x15,
397 	0x00, 0x00, 0x01, 0x1e,
398 	0x10, 0x00, 0x01, 0x2f,
399 	0x10, 0x8c, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
400 	0x10, 0x11, 0x08, 0x29, 0x00, 0x18, 0x01, 0x1f, 0x00, 0xd2, 0x00,
401 							/* AE window */
402 	0, 0, 0,
403 };
404 static const u8 nw801_start_vga[] = {
405 	0x02, 0x00, 0x10, 0x78, 0xa0, 0x97, 0x78, 0xa0, 0x00, 0x00, 0x00,
406 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xf0,
407 	0x02, 0x0f, 0x01, 0xd5,
408 	0x10, 0x1a, 0x01, 0x15,
409 	0x00, 0x00, 0x01, 0x0e,
410 	0x10, 0x00, 0x01, 0x22,
411 	0x10, 0x8c, 0x08, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0xdf, 0x01,
412 	0x10, 0x11, 0x08, 0x51, 0x00, 0x30, 0x02, 0x3d, 0x00, 0xa4, 0x01,
413 	0, 0, 0,
414 };
415 static const u8 nw801_start_2[] = {
416 	0x10, 0x04, 0x01, 0x1a,
417 	0x10, 0x19, 0x01, 0x09,				/* clock */
418 	0x10, 0x24, 0x06, 0xc0, 0x00, 0x3f, 0x02, 0x00, 0x01,
419 							 /* .. gain .. */
420 	0x00, 0x03, 0x02, 0x92, 0x03,
421 	0x00, 0x1d, 0x04, 0xf2, 0x00, 0x24, 0x07,
422 	0x00, 0x7b, 0x01, 0xcf,
423 	0x10, 0x94, 0x01, 0x07,
424 	0x05, 0x05, 0x01, 0x01,
425 	0x05, 0x04, 0x01, 0x01,
426 	0x10, 0x0e, 0x01, 0x08,
427 	0x10, 0x48, 0x11, 0x00, 0x37, 0x55, 0x6b, 0x7d, 0x8d, 0x9b, 0xa8,
428 			  0xb4, 0xbf, 0xca, 0xd4, 0xdd, 0xe6, 0xef, 0xf0,
429 			  0xf0,
430 	0x10, 0x03, 0x01, 0x00,
431 	0x10, 0x0f, 0x02, 0x0c, 0x0c,
432 	0x10, 0x03, 0x01, 0x08,
433 	0x10, 0x48, 0x11, 0x00, 0x37, 0x55, 0x6b, 0x7d, 0x8d, 0x9b, 0xa8,
434 			  0xb4, 0xbf, 0xca, 0xd4, 0xdd, 0xe6, 0xef, 0xf0,
435 			  0xf0,
436 	0x10, 0x0b, 0x01, 0x0b,
437 	0x10, 0x0d, 0x01, 0x0b,
438 	0x10, 0x0c, 0x01, 0x1f,
439 	0x05, 0x06, 0x01, 0x03,
440 	0, 0, 0
441 };
442 
443 /* nw802 (sharp IR3Y38M?) */
444 static const u8 nw802_start[] = {
445 	0x04, 0x06, 0x01, 0x04,
446 	0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0xf9, 0x02, 0x10, 0x00, 0x4d,
447 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
448 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
449 			  0x00, 0x01, 0x00, 0x19, 0x00, 0xce, 0x00, 0xf4,
450 			  0x05, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
451 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
452 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
453 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
454 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
455 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
456 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
457 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
458 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
459 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
460 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
461 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
462 	0x00, 0x80, 0x1f, 0xb4, 0x6f, 0x3f, 0x0f, 0x88, 0x20, 0x68, 0x00,
463 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
464 			  0x00, 0x0c, 0x02, 0x01, 0x00, 0x16, 0x00, 0x94,
465 			  0x00, 0x10, 0x06, 0x08, 0x00, 0x18, 0x00,
466 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
467 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
468 			  0x40, 0x20,
469 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
470 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00,
471 	0x06, 0x00, 0x02, 0x09, 0x99,
472 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474 			  0x00, 0x00, 0x00, 0x00, 0x00,
475 	0x10, 0x00, 0x40, 0xa1, 0x02, 0x80, 0x00, 0x1d, 0x00, 0x00, 0x00,
476 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
477 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478 			  0x00, 0x49, 0x13, 0xff, 0x01, 0xc0, 0x00, 0x14,
479 			  0x02, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00,
480 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
481 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
482 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
483 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
484 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
485 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
486 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
487 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
488 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
489 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
490 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
491 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
492 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x05, 0x82,
493 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
494 			  0x01, 0xf0, 0x00,
495 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
496 			  0x00, 0x78, 0x3f, 0x10, 0x02, 0xf2, 0x8f, 0x78,
497 			  0x40,
498 	0x10, 0x1a, 0x01, 0x00,
499 	0x10, 0x00, 0x01, 0xad,
500 	0x00, 0x00, 0x01, 0x08,
501 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
502 	0x10, 0x1b, 0x02, 0x00, 0x00,
503 	0x10, 0x11, 0x08, 0x51, 0x00, 0xf0, 0x00, 0x3d, 0x00, 0xb4, 0x00,
504 	0x10, 0x1d, 0x08, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0,
505 	0x10, 0x0e, 0x01, 0x27,
506 	0x10, 0x41, 0x11, 0x00, 0x0e, 0x35, 0x4f, 0x62, 0x71, 0x7f, 0x8b,
507 			  0x96, 0xa0, 0xa9, 0xb2, 0xbb, 0xc3, 0xca, 0xd2,
508 			  0xd8,
509 	0x10, 0x03, 0x01, 0x00,
510 	0x10, 0x0f, 0x02, 0x14, 0x14,
511 	0x10, 0x03, 0x01, 0x0c,
512 	0x10, 0x41, 0x11, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54, 0x64, 0x74,
513 			  0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2, 0xe2, 0xf1,
514 			  0xff,
515 /*			  0x00, 0x0e, 0x35, 0x4f, 0x62, 0x71, 0x7f, 0x8b,
516  *			  0x96, 0xa0, 0xa9, 0xb2, 0xbb, 0xc3, 0xca, 0xd2,
517  *			  0xd8,	*/
518 	0x10, 0x0b, 0x01, 0x10,
519 	0x10, 0x0d, 0x01, 0x11,
520 	0x10, 0x0c, 0x01, 0x1c,
521 	0x04, 0x06, 0x01, 0x03,
522 	0x04, 0x04, 0x01, 0x00,
523 	0, 0, 0
524 };
525 /* et31x110 - Trust 120 SpaceCam */
526 static const u8 spacecam_init[] = {
527 	0x04, 0x05, 0x01, 0x01,
528 	0x04, 0x04, 0x01, 0x01,
529 	0x04, 0x06, 0x01, 0x04,
530 	0x04, 0x04, 0x03, 0x00, 0x00, 0x00,
531 	0x05, 0x05, 0x01, 0x00,
532 	0, 0, 0
533 };
534 static const u8 spacecam_start[] = {
535 	0x04, 0x06, 0x01, 0x44,
536 	0x00, 0x00, 0x40, 0x10, 0x43, 0x00, 0xb4, 0x01, 0x10, 0x00, 0x4f,
537 			  0xef, 0x0e, 0x00, 0x74, 0x01, 0x01, 0x00, 0x19,
538 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
539 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x3e, 0x00, 0x24,
540 			  0x03, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
541 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
542 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
543 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
544 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
545 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
546 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
547 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
548 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
549 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
550 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
551 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
552 	0x00, 0x80, 0x1f, 0xa0, 0x48, 0xc3, 0x02, 0x88, 0x0c, 0x68, 0x00,
553 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x06, 0x00, 0x08,
554 			  0x00, 0x32, 0x01, 0x01, 0x00, 0x16, 0x00, 0x04,
555 			  0x00, 0x4b, 0x00, 0x7c, 0x00, 0x80, 0x00,
556 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
557 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
558 			  0x40, 0x20,
559 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
560 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
561 	0x05, 0x00, 0x06, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
562 	0x06, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 			  0x00, 0x00, 0x00,
566 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568 			  0x00, 0x00, 0x00, 0x00, 0x00,
569 	0x10, 0x00, 0x40, 0x83, 0x02, 0x20, 0x00, 0x11, 0x00, 0x00, 0x00,
570 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
571 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572 			  0x00, 0x49, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
573 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
574 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
575 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
576 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
577 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
578 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
579 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
580 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
581 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
582 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
583 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
584 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
585 	0x10, 0x80, 0x1d, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
586 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x62,
587 			  0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01, 0x20,
588 			  0x01, 0x60, 0x01, 0x00, 0x00,
589 	0x04, 0x06, 0x01, 0xc0,
590 	0x10, 0x85, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
591 	0x02, 0x00, 0x11, 0x48, 0x58, 0x9e, 0x48, 0x58, 0x00, 0x00, 0x00,
592 			  0x00, 0x84, 0x36, 0x05, 0x01, 0xf2, 0x86, 0x65,
593 			  0x40,
594 	0x00, 0x80, 0x01, 0xa0,
595 	0x10, 0x1a, 0x01, 0x00,
596 	0x00, 0x91, 0x02, 0x32, 0x01,
597 	0x00, 0x03, 0x02, 0x08, 0x02,
598 	0x10, 0x00, 0x01, 0x83,
599 	0x10, 0x8f, 0x0c, 0x62, 0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01,
600 			  0x20, 0x01, 0x60, 0x01,
601 	0x10, 0x11, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
602 	0x10, 0x0e, 0x01, 0x08,
603 	0x10, 0x41, 0x11, 0x00, 0x64, 0x99, 0xc0, 0xe2, 0xf9, 0xf9, 0xf9,
604 			  0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9,
605 			  0xf9,
606 	0x10, 0x03, 0x01, 0x00,
607 	0x10, 0x0f, 0x02, 0x13, 0x13,
608 	0x10, 0x03, 0x01, 0x06,
609 	0x10, 0x41, 0x11, 0x00, 0x64, 0x99, 0xc0, 0xe2, 0xf9, 0xf9, 0xf9,
610 			  0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9,
611 			  0xf9,
612 	0x10, 0x0b, 0x01, 0x08,
613 	0x10, 0x0d, 0x01, 0x10,
614 	0x10, 0x0c, 0x01, 0x1f,
615 	0x04, 0x06, 0x01, 0xc3,
616 	0x04, 0x05, 0x01, 0x40,
617 	0x04, 0x04, 0x01, 0x40,
618 	0, 0, 0
619 };
620 /* et31x110 - pas106 - other Trust SpaceCam120 */
621 static const u8 spacecam2_start[] = {
622 	0x04, 0x06, 0x01, 0x44,
623 	0x04, 0x06, 0x01, 0x00,
624 	0x00, 0x00, 0x40, 0x14, 0x83, 0x00, 0xba, 0x01, 0x10, 0x00, 0x4f,
625 			  0xef, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x19,
626 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
627 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x06, 0x00, 0xfc,
628 			  0x01, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
629 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
630 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
631 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
632 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
633 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
634 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
635 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
636 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
637 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
638 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
639 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
640 	0x00, 0x80, 0x1f, 0xb8, 0x48, 0x0f, 0x04, 0x88, 0x14, 0x68, 0x00,
641 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x03,
642 			  0x00, 0x24, 0x01, 0x01, 0x00, 0x16, 0x00, 0x04,
643 			  0x00, 0x4b, 0x00, 0x76, 0x00, 0x86, 0x00,
644 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
645 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
646 			  0x40, 0x20,
647 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
648 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x61, 0x00,
649 	0x05, 0x00, 0x06, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
650 	0x06, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
651 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
653 			  0x00, 0x00, 0x00,
654 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 			  0x00, 0x00, 0x00, 0x00, 0x00,
657 	0x10, 0x00, 0x40, 0x80, 0x02, 0x20, 0x00, 0x13, 0x00, 0x00, 0x00,
658 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
659 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660 			  0x00, 0x49, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
661 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
662 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
663 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
664 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
665 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
666 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
667 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
668 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
669 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
670 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
671 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
672 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
673 	0x10, 0x80, 0x1d, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
674 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62,
675 			  0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01, 0x20,
676 			  0x01, 0x60, 0x01, 0x00, 0x00,
677 	0x10, 0x85, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
678 	0x04, 0x04, 0x01, 0x40,
679 	0x04, 0x04, 0x01, 0x00,
680 	I2C0, 0x40, 0x0c, 0x02, 0x0c, 0x12, 0x07, 0x00, 0x00, 0x00, 0x05,
681 			  0x00, 0x00, 0x05, 0x05,
682 	I2C0, 0x40, 0x02, 0x11, 0x06,
683 	I2C0, 0x40, 0x02, 0x14, 0x00,
684 	I2C0, 0x40, 0x02, 0x13, 0x01,		/* i2c end */
685 	0x02, 0x00, 0x11, 0x48, 0x58, 0x9e, 0x48, 0x58, 0x00, 0x00, 0x00,
686 			  0x00, 0x84, 0x36, 0x05, 0x01, 0xf2, 0x86, 0x65,
687 			  0x40,
688 	I2C0, 0x40, 0x02, 0x02, 0x0c,		/* pixel clock */
689 	I2C0, 0x40, 0x02, 0x0f, 0x00,
690 	I2C0, 0x40, 0x02, 0x13, 0x01,		/* i2c end */
691 	0x10, 0x00, 0x01, 0x01,
692 	0x10, 0x8f, 0x0c, 0x62, 0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01,
693 			  0x20, 0x01, 0x60, 0x01,
694 	I2C0, 0x40, 0x02, 0x05, 0x0f,		/* exposure */
695 	I2C0, 0x40, 0x02, 0x13, 0x01,		/* i2c end */
696 	I2C0, 0x40, 0x07, 0x09, 0x0b, 0x0f, 0x05, 0x05, 0x0f, 0x00,
697 						/* gains */
698 	I2C0, 0x40, 0x03, 0x12, 0x04, 0x01,
699 	0x10, 0x11, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
700 	0x10, 0x0e, 0x01, 0x08,
701 	0x10, 0x41, 0x11, 0x00, 0x17, 0x3f, 0x69, 0x7b, 0x8c, 0x9a, 0xa7,
702 			  0xb3, 0xbf, 0xc9, 0xd3, 0xdd, 0xe6, 0xef, 0xf7,
703 			  0xf9,
704 	0x10, 0x03, 0x01, 0x00,
705 	0x10, 0x0f, 0x02, 0x13, 0x13,
706 	0x10, 0x03, 0x01, 0x06,
707 	0x10, 0x41, 0x11, 0x00, 0x17, 0x3f, 0x69, 0x7b, 0x8c, 0x9a, 0xa7,
708 			  0xb3, 0xbf, 0xc9, 0xd3, 0xdd, 0xe6, 0xef, 0xf7,
709 			  0xf9,
710 	0x10, 0x0b, 0x01, 0x11,
711 	0x10, 0x0d, 0x01, 0x10,
712 	0x10, 0x0c, 0x01, 0x14,
713 	0x04, 0x06, 0x01, 0x03,
714 	0x04, 0x05, 0x01, 0x61,
715 	0x04, 0x04, 0x01, 0x00,
716 	0, 0, 0
717 };
718 
719 /* nw802 - Conceptronic Video Pro */
720 static const u8 cvideopro_start[] = {
721 	0x04, 0x06, 0x01, 0x04,
722 	0x00, 0x00, 0x40, 0x54, 0x96, 0x98, 0xf9, 0x02, 0x18, 0x00, 0x4c,
723 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
724 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
725 			  0x00, 0x0b, 0x00, 0x1b, 0x00, 0xc8, 0x00, 0xf4,
726 			  0x05, 0xb4, 0x00, 0xcc, 0x00, 0x01, 0x00, 0x01,
727 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
728 			  0x00, 0xa2, 0x00, 0xc6, 0x00, 0x60, 0x00, 0xc6,
729 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
730 	0x00, 0x40, 0x40, 0x00, 0xae, 0x00, 0xd2, 0x00, 0xae, 0x00, 0xd2,
731 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
732 			  0x00, 0xa8, 0x00, 0xc0, 0x00, 0x66, 0x00, 0xc0,
733 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
734 			  0x00, 0x0a, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x54,
735 			  0x00, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
736 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6,
737 			  0x00, 0x5d, 0x00, 0xc7, 0x00, 0x7e, 0x00, 0x30,
738 	0x00, 0x80, 0x1f, 0x98, 0x43, 0x3f, 0x0d, 0x88, 0x20, 0x80, 0x3f,
739 			  0x47, 0xaf, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
740 			  0x00, 0x0c, 0x02, 0x0c, 0x00, 0x1c, 0x00, 0x94,
741 			  0x00, 0x10, 0x06, 0x24, 0x00, 0x4a, 0x00,
742 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
743 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
744 			  0x40, 0x20,
745 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
746 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00,
747 	0x06, 0x00, 0x02, 0x09, 0x99,
748 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
749 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
750 			  0x00, 0x00, 0x00, 0x00, 0x00,
751 	0x10, 0x00, 0x40, 0xa0, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
752 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
753 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
754 			  0x00, 0x49, 0x13, 0x00, 0x00, 0xe0, 0x00, 0x0c,
755 			  0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
756 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
757 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
758 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
759 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
760 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
761 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
762 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
763 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
764 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
765 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
766 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
767 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
768 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x82,
769 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
770 			  0x01, 0xf0, 0x00,
771 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x8c, 0x3c, 0x50, 0x00, 0x00, 0x00,
772 			  0x00, 0x78, 0x3f, 0x3f, 0x06, 0xf2, 0x8f, 0xf0,
773 			  0x40,
774 	0x10, 0x1a, 0x01, 0x03,
775 	0x10, 0x00, 0x01, 0xac,
776 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
777 	0x10, 0x1b, 0x02, 0x3b, 0x01,
778 	0x10, 0x11, 0x08, 0x61, 0x00, 0xe0, 0x00, 0x49, 0x00, 0xa8, 0x00,
779 	0x10, 0x1f, 0x06, 0x01, 0x20, 0x02, 0xe8, 0x03, 0x00,
780 	0x10, 0x1d, 0x02, 0x40, 0x06,
781 	0x10, 0x0e, 0x01, 0x08,
782 	0x10, 0x41, 0x11, 0x00, 0x0f, 0x46, 0x62, 0x76, 0x86, 0x94, 0xa0,
783 			  0xab, 0xb6, 0xbf, 0xc8, 0xcf, 0xd7, 0xdc, 0xdc,
784 			  0xdc,
785 	0x10, 0x03, 0x01, 0x00,
786 	0x10, 0x0f, 0x02, 0x12, 0x12,
787 	0x10, 0x03, 0x01, 0x0c,
788 	0x10, 0x41, 0x11, 0x00, 0x0f, 0x46, 0x62, 0x76, 0x86, 0x94, 0xa0,
789 			  0xab, 0xb6, 0xbf, 0xc8, 0xcf, 0xd7, 0xdc, 0xdc,
790 			  0xdc,
791 	0x10, 0x0b, 0x01, 0x09,
792 	0x10, 0x0d, 0x01, 0x10,
793 	0x10, 0x0c, 0x01, 0x2f,
794 	0x04, 0x06, 0x01, 0x03,
795 	0x04, 0x04, 0x01, 0x00,
796 	0, 0, 0
797 };
798 
799 /* nw802 - D-link dru-350c cam */
800 static const u8 dlink_start[] = {
801 	0x04, 0x06, 0x01, 0x04,
802 	0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x92, 0x03, 0x10, 0x00, 0x4d,
803 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
804 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
805 			  0x00, 0x01, 0x00, 0x19, 0x00, 0xce, 0x00, 0xf4,
806 			  0x05, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
807 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
808 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
809 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
810 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
811 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
812 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
813 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
814 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
815 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
816 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
817 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
818 	0x00, 0x80, 0x1f, 0xb4, 0x6f, 0x3f, 0x0f, 0x88, 0x20, 0x68, 0x00,
819 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
820 			  0x00, 0x0c, 0x02, 0x01, 0x00, 0x16, 0x00, 0x94,
821 			  0x00, 0x10, 0x06, 0x10, 0x00, 0x36, 0x00,
822 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
823 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
824 			  0x40, 0x20,
825 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
826 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00,
827 	0x06, 0x00, 0x02, 0x09, 0x99,
828 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
829 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830 			  0x00, 0x00, 0x00, 0x00, 0x00,
831 	0x10, 0x00, 0x40, 0xa1, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
832 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
833 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834 			  0x00, 0x49, 0x13, 0x00, 0x00, 0xc0, 0x00, 0x14,
835 			  0x02, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00,
836 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
837 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
838 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
839 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
840 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
841 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
842 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
843 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
844 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
845 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
846 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
847 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
848 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x82,
849 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
850 			  0x01, 0xf0, 0x00,
851 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
852 			  0x00, 0x78, 0x3f, 0x10, 0x02, 0xf2, 0x8f, 0x78,
853 			  0x40,
854 	0x10, 0x1a, 0x01, 0x00,
855 	0x10, 0x00, 0x01, 0xad,
856 	0x00, 0x00, 0x01, 0x08,
857 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
858 	0x10, 0x1b, 0x02, 0x00, 0x00,
859 	0x10, 0x11, 0x08, 0x51, 0x00, 0xf0, 0x00, 0x3d, 0x00, 0xb4, 0x00,
860 	0x10, 0x1d, 0x08, 0x40, 0x06, 0x01, 0x20, 0x02, 0xe8, 0x03, 0x00,
861 	0x10, 0x0e, 0x01, 0x20,
862 	0x10, 0x41, 0x11, 0x00, 0x07, 0x1e, 0x38, 0x4d, 0x60, 0x70, 0x7f,
863 			  0x8e, 0x9b, 0xa8, 0xb4, 0xbf, 0xca, 0xd5, 0xdf,
864 			  0xea,
865 	0x10, 0x03, 0x01, 0x00,
866 	0x10, 0x0f, 0x02, 0x11, 0x11,
867 	0x10, 0x03, 0x01, 0x10,
868 	0x10, 0x41, 0x11, 0x00, 0x07, 0x1e, 0x38, 0x4d, 0x60, 0x70, 0x7f,
869 			  0x8e, 0x9b, 0xa8, 0xb4, 0xbf, 0xca, 0xd5, 0xdf,
870 			  0xea,
871 	0x10, 0x0b, 0x01, 0x19,
872 	0x10, 0x0d, 0x01, 0x10,
873 	0x10, 0x0c, 0x01, 0x1e,
874 	0x04, 0x06, 0x01, 0x03,
875 	0x04, 0x04, 0x01, 0x00,
876 	0, 0, 0
877 };
878 
879 /* 06a5:d001 - nw801 - Sony
880  *		Plustek Opticam 500U or ProLink DS3303u (Hitachi HD49322BF) */
881 /*fixme: 320x240 only*/
882 static const u8 ds3303_start[] = {
883 	0x05, 0x06, 0x01, 0x04,
884 	0x00, 0x00, 0x40, 0x16, 0x00, 0x00, 0xf9, 0x02, 0x11, 0x00, 0x0e,
885 			  0x01, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
886 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
887 			  0x00, 0x01, 0x00, 0x19, 0x00, 0xce, 0x00, 0xf4,
888 			  0x05, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
889 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
890 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
891 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
892 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
893 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
894 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
895 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
896 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
897 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
898 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
899 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
900 	0x00, 0x80, 0x22, 0xb4, 0x6f, 0x3f, 0x0f, 0x88, 0x20, 0x08, 0x00,
901 			  0x00, 0x00, 0x00, 0x00, 0xa9, 0xa8, 0x1f, 0x00,
902 			  0x0d, 0x02, 0x07, 0x00, 0x01, 0x00, 0x19, 0x00,
903 			  0xf2, 0x00, 0x18, 0x06, 0x10, 0x06, 0x10, 0x00,
904 			  0x36, 0x00,
905 	0x02, 0x00, 0x12, 0x03, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
906 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0x50,
907 			  0x40, 0x20,
908 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
909 	0x05, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00,
910 	0x06, 0x00, 0x02, 0x09, 0x99,
911 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
912 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913 			  0x00, 0x00, 0x00, 0x00, 0x00,
914 	0x10, 0x00, 0x40, 0x2f, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
915 			  0x00, 0x00, 0x00, 0x10, 0x1f, 0x10, 0x08, 0x0a,
916 			  0x0a, 0x51, 0x00, 0xf1, 0x00, 0x3c, 0x00, 0xb4,
917 			  0x00, 0x01, 0x15, 0xfd, 0x07, 0x3d, 0x00, 0x00,
918 			  0x00, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x01, 0x20,
919 			  0x02, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00,
920 			  0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x03,
921 			  0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06, 0xf7,
922 	0x10, 0x40, 0x40, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80, 0x80,
923 			  0x00, 0x2d, 0x46, 0x58, 0x67, 0x74, 0x7f, 0x88,
924 			  0x94, 0x9d, 0xa6, 0xae, 0xb5, 0xbd, 0xc4, 0xcb,
925 			  0xd1, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54, 0x64,
926 			  0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2, 0xe2,
927 			  0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
928 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
929 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
930 	0x10, 0x80, 0x22, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
931 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x3f, 0x01,
932 			  0x00, 0x00, 0xef, 0x00, 0x02, 0x0a, 0x82, 0x02,
933 			  0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40, 0x01,
934 			  0xf0, 0x00,
935 
936 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
937 			  0x00, 0x78, 0x3f, 0x3f, 0x00, 0xf2, 0x8f, 0x81,
938 			  0x40,
939 	0x10, 0x1a, 0x01, 0x15,
940 	0x10, 0x00, 0x01, 0x2f,
941 	0x10, 0x8c, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
942 	0x10, 0x1b, 0x02, 0x00, 0x00,
943 	0x10, 0x11, 0x08, 0x61, 0x00, 0xe0, 0x00, 0x49, 0x00, 0xa8, 0x00,
944 	0x10, 0x26, 0x06, 0x01, 0x20, 0x02, 0xe8, 0x03, 0x00,
945 	0x10, 0x24, 0x02, 0x40, 0x06,
946 	0x10, 0x0e, 0x01, 0x08,
947 	0x10, 0x48, 0x11, 0x00, 0x15, 0x40, 0x67, 0x84, 0x9d, 0xb2, 0xc6,
948 			  0xd6, 0xe7, 0xf6, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9,
949 			  0xf9,
950 	0x10, 0x03, 0x01, 0x00,
951 	0x10, 0x0f, 0x02, 0x16, 0x16,
952 	0x10, 0x03, 0x01, 0x0c,
953 	0x10, 0x48, 0x11, 0x00, 0x15, 0x40, 0x67, 0x84, 0x9d, 0xb2, 0xc6,
954 			  0xd6, 0xe7, 0xf6, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9,
955 			  0xf9,
956 	0x10, 0x0b, 0x01, 0x26,
957 	0x10, 0x0d, 0x01, 0x10,
958 	0x10, 0x0c, 0x01, 0x1c,
959 	0x05, 0x06, 0x01, 0x03,
960 	0x05, 0x04, 0x01, 0x00,
961 	0, 0, 0
962 };
963 
964 /* 06a5:d001 - nw802 - Panasonic
965  *		GP-KR651US (Philips TDA8786) */
966 static const u8 kr651_start_1[] = {
967 	0x04, 0x06, 0x01, 0x04,
968 	0x00, 0x00, 0x40, 0x44, 0x96, 0x98, 0xf9, 0x02, 0x18, 0x00, 0x48,
969 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
970 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
971 			  0x00, 0x0b, 0x00, 0x1b, 0x00, 0xc8, 0x00, 0xf4,
972 			  0x05, 0xb4, 0x00, 0xcc, 0x00, 0x01, 0x00, 0x01,
973 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
974 			  0x00, 0xa2, 0x00, 0xc6, 0x00, 0x60, 0x00, 0xc6,
975 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
976 	0x00, 0x40, 0x40, 0x00, 0xae, 0x00, 0xd2, 0x00, 0xae, 0x00, 0xd2,
977 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
978 			  0x00, 0xa8, 0x00, 0xc0, 0x00, 0x66, 0x00, 0xc0,
979 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
980 			  0x00, 0x0a, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x54,
981 			  0x00, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
982 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6,
983 			  0x00, 0x5d, 0x00, 0xc7, 0x00, 0x7e, 0x00, 0x30,
984 	0x00, 0x80, 0x1f, 0x18, 0x43, 0x3f, 0x0d, 0x88, 0x20, 0x80, 0x3f,
985 			  0x47, 0xaf, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
986 			  0x00, 0x0c, 0x02, 0x0c, 0x00, 0x1c, 0x00, 0x94,
987 			  0x00, 0x10, 0x06, 0x24, 0x00, 0x4a, 0x00,
988 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
989 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
990 			  0x40, 0x20,
991 	0x03, 0x00, 0x03, 0x02, 0x00, 0x00,
992 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00,
993 	0x06, 0x00, 0x02, 0x09, 0x99,
994 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
995 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 			  0x00, 0x00, 0x00, 0x00, 0x00,
997 	0x10, 0x00, 0x40, 0xa0, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
998 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
999 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1000 			  0x00, 0x49, 0x13, 0x00, 0x00, 0xe0, 0x00, 0x0c,
1001 			  0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
1002 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
1003 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
1004 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
1005 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
1006 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
1007 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
1008 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
1009 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
1010 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
1011 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
1012 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
1013 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
1014 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x82,
1015 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
1016 			  0x01, 0xf0, 0x00,
1017 	0, 0, 0
1018 };
1019 static const u8 kr651_start_qvga[] = {
1020 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
1021 			  0x00, 0x78, 0x3f, 0x10, 0x02, 0xf2, 0x8f, 0x78,
1022 			  0x40,
1023 	0x10, 0x1a, 0x01, 0x03,
1024 	0x10, 0x00, 0x01, 0xac,
1025 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1026 	0x10, 0x1b, 0x02, 0x00, 0x00,
1027 	0x10, 0x11, 0x08, 0x29, 0x00, 0x18, 0x01, 0x1f, 0x00, 0xd2, 0x00,
1028 	0x10, 0x1d, 0x06, 0xe0, 0x00, 0x0c, 0x00, 0x52, 0x00,
1029 	0x10, 0x1d, 0x02, 0x28, 0x01,
1030 	0, 0, 0
1031 };
1032 static const u8 kr651_start_vga[] = {
1033 	0x02, 0x00, 0x11, 0x78, 0xa0, 0x8c, 0x78, 0xa0, 0x00, 0x00, 0x00,
1034 			  0x00, 0xf0, 0x30, 0x03, 0x01, 0x82, 0x82, 0x98,
1035 			  0x80,
1036 	0x10, 0x1a, 0x01, 0x03,
1037 	0x10, 0x00, 0x01, 0xa0,
1038 	0x10, 0x85, 0x08, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0xdf, 0x01,
1039 	0x10, 0x1b, 0x02, 0x00, 0x00,
1040 	0x10, 0x11, 0x08, 0x51, 0x00, 0x30, 0x02, 0x3d, 0x00, 0xa4, 0x01,
1041 	0x10, 0x1d, 0x06, 0xe0, 0x00, 0x0c, 0x00, 0x52, 0x00,
1042 	0x10, 0x1d, 0x02, 0x68, 0x00,
1043 };
1044 static const u8 kr651_start_2[] = {
1045 	0x10, 0x0e, 0x01, 0x08,
1046 	0x10, 0x41, 0x11, 0x00, 0x11, 0x3c, 0x5c, 0x74, 0x88, 0x99, 0xa8,
1047 			  0xb7, 0xc4, 0xd0, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc,
1048 			  0xdc,
1049 	0x10, 0x03, 0x01, 0x00,
1050 	0x10, 0x0f, 0x02, 0x0c, 0x0c,
1051 	0x10, 0x03, 0x01, 0x0c,
1052 	0x10, 0x41, 0x11, 0x00, 0x11, 0x3c, 0x5c, 0x74, 0x88, 0x99, 0xa8,
1053 			  0xb7, 0xc4, 0xd0, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc,
1054 			  0xdc,
1055 	0x10, 0x0b, 0x01, 0x10,
1056 	0x10, 0x0d, 0x01, 0x10,
1057 	0x10, 0x0c, 0x01, 0x2d,
1058 	0x04, 0x06, 0x01, 0x03,
1059 	0x04, 0x04, 0x01, 0x00,
1060 	0, 0, 0
1061 };
1062 
1063 /* nw802 - iRez Kritter cam */
1064 static const u8 kritter_start[] = {
1065 	0x04, 0x06, 0x01, 0x06,
1066 	0x00, 0x00, 0x40, 0x44, 0x96, 0x98, 0x94, 0x03, 0x18, 0x00, 0x48,
1067 			  0x0f, 0x1e, 0x00, 0x0c, 0x02, 0x01, 0x00, 0x19,
1068 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
1069 			  0x00, 0x0b, 0x00, 0x1b, 0x00, 0x0a, 0x01, 0x28,
1070 			  0x07, 0xb4, 0x00, 0xcc, 0x00, 0x01, 0x00, 0x01,
1071 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1072 			  0x00, 0xa2, 0x00, 0xc6, 0x00, 0x60, 0x00, 0xc6,
1073 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1074 	0x00, 0x40, 0x40, 0x00, 0xae, 0x00, 0xd2, 0x00, 0xae, 0x00, 0xd2,
1075 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1076 			  0x00, 0xa8, 0x00, 0xc0, 0x00, 0x66, 0x00, 0xc0,
1077 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1078 			  0x00, 0x0a, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x54,
1079 			  0x00, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
1080 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6,
1081 			  0x00, 0x5d, 0x00, 0x0e, 0x00, 0x7e, 0x00, 0x30,
1082 	0x00, 0x80, 0x1f, 0x18, 0x43, 0x3f, 0x0d, 0x88, 0x20, 0x80, 0x3f,
1083 			  0x47, 0xaf, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
1084 			  0x00, 0x0b, 0x02, 0x0c, 0x00, 0x1c, 0x00, 0x94,
1085 			  0x00, 0x10, 0x06, 0x24, 0x00, 0x4a, 0x00,
1086 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
1087 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
1088 			  0x40, 0x20,
1089 	0x03, 0x00, 0x03, 0x02, 0x00, 0x00,
1090 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00,
1091 	0x06, 0x00, 0x02, 0x09, 0x99,
1092 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 			  0x00, 0x00, 0x00, 0x00, 0x00,
1095 	0x10, 0x00, 0x40, 0xa0, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
1096 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
1097 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1098 			  0x00, 0x49, 0x13, 0x00, 0x00, 0xe0, 0x00, 0x0c,
1099 			  0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
1100 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
1101 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
1102 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
1103 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
1104 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
1105 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
1106 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
1107 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
1108 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
1109 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
1110 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
1111 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
1112 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x82,
1113 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
1114 			  0x01, 0xf0, 0x00,
1115 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x8c, 0x3c, 0x50, 0x00, 0x00, 0x00,
1116 			  0x00, 0x78, 0x3f, 0x3f, 0x06, 0xf2, 0x8f, 0xf0,
1117 			  0x40,
1118 	0x10, 0x1a, 0x01, 0x03,
1119 	0x10, 0x00, 0x01, 0xaf,
1120 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1121 	0x10, 0x1b, 0x02, 0x3b, 0x01,
1122 	0x10, 0x11, 0x08, 0x61, 0x00, 0xe0, 0x00, 0x49, 0x00, 0xa8, 0x00,
1123 	0x10, 0x1d, 0x06, 0xe0, 0x00, 0x0c, 0x00, 0x52, 0x00,
1124 	0x10, 0x1d, 0x02, 0x00, 0x00,
1125 	0x10, 0x0e, 0x01, 0x08,
1126 	0x10, 0x41, 0x11, 0x00, 0x0d, 0x36, 0x4e, 0x60, 0x6f, 0x7b, 0x86,
1127 			  0x90, 0x98, 0xa1, 0xa9, 0xb1, 0xb7, 0xbe, 0xc4,
1128 			  0xcb,
1129 	0x10, 0x03, 0x01, 0x00,
1130 	0x10, 0x0f, 0x02, 0x0d, 0x0d,
1131 	0x10, 0x03, 0x01, 0x02,
1132 	0x10, 0x41, 0x11, 0x00, 0x0d, 0x36, 0x4e, 0x60, 0x6f, 0x7b, 0x86,
1133 			  0x90, 0x98, 0xa1, 0xa9, 0xb1, 0xb7, 0xbe, 0xc4,
1134 			  0xcb,
1135 	0x10, 0x0b, 0x01, 0x17,
1136 	0x10, 0x0d, 0x01, 0x10,
1137 	0x10, 0x0c, 0x01, 0x1e,
1138 	0x04, 0x06, 0x01, 0x03,
1139 	0x04, 0x04, 0x01, 0x00,
1140 	0, 0, 0
1141 };
1142 
1143 /* nw802 - Mustek Wcam 300 mini */
1144 static const u8 mustek_start[] = {
1145 	0x04, 0x06, 0x01, 0x04,
1146 	0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x92, 0x03, 0x10, 0x00, 0x4d,
1147 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
1148 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
1149 			  0x00, 0x01, 0x00, 0x19, 0x00, 0xce, 0x00, 0xf4,
1150 			  0x05, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
1151 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
1152 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
1153 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
1154 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
1155 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
1156 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
1157 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
1158 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
1159 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
1160 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
1161 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
1162 	0x00, 0x80, 0x1f, 0xb4, 0x6f, 0x3f, 0x0f, 0x88, 0x20, 0x68, 0x00,
1163 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
1164 			  0x00, 0x0c, 0x02, 0x01, 0x00, 0x16, 0x00, 0x94,
1165 			  0x00, 0x10, 0x06, 0xfc, 0x05, 0x0c, 0x06,
1166 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
1167 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
1168 			  0x40, 0x20,
1169 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
1170 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00,
1171 	0x06, 0x00, 0x02, 0x09, 0x99,
1172 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1173 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1174 			  0x00, 0x00, 0x00, 0x00, 0x00,
1175 	0x10, 0x00, 0x40, 0xa1, 0x02, 0x80, 0x00, 0x13, 0x00, 0x00, 0x00,
1176 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
1177 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1178 			  0x00, 0x49, 0x13, 0x00, 0x00, 0xc0, 0x00, 0x14,
1179 			  0x02, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00,
1180 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
1181 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
1182 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
1183 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
1184 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
1185 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
1186 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
1187 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
1188 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
1189 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
1190 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
1191 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
1192 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x01, 0x82,
1193 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
1194 			  0x01, 0xf0, 0x00,
1195 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
1196 			  0x00, 0x78, 0x3f, 0x10, 0x02, 0xf2, 0x8f, 0x78,
1197 			  0x40,
1198 	0x10, 0x1a, 0x01, 0x00,
1199 	0x10, 0x00, 0x01, 0xad,
1200 	0x00, 0x00, 0x01, 0x08,
1201 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1202 	0x10, 0x1b, 0x02, 0x00, 0x00,
1203 	0x10, 0x11, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1204 	0x10, 0x1d, 0x08, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1205 	0x10, 0x0e, 0x01, 0x0f,
1206 	0x10, 0x41, 0x11, 0x00, 0x0f, 0x29, 0x4a, 0x64, 0x7a, 0x8c, 0x9e,
1207 			  0xad, 0xba, 0xc7, 0xd3, 0xde, 0xe8, 0xf1, 0xf9,
1208 			  0xff,
1209 	0x10, 0x0f, 0x02, 0x11, 0x11,
1210 	0x10, 0x03, 0x01, 0x0c,
1211 	0x10, 0x41, 0x11, 0x00, 0x0f, 0x29, 0x4a, 0x64, 0x7a, 0x8c, 0x9e,
1212 			  0xad, 0xba, 0xc7, 0xd3, 0xde, 0xe8, 0xf1, 0xf9,
1213 			  0xff,
1214 	0x10, 0x0b, 0x01, 0x1c,
1215 	0x10, 0x0d, 0x01, 0x1a,
1216 	0x10, 0x0c, 0x01, 0x34,
1217 	0x04, 0x05, 0x01, 0x61,
1218 	0x04, 0x04, 0x01, 0x40,
1219 	0x04, 0x06, 0x01, 0x03,
1220 	0, 0, 0
1221 };
1222 
1223 /* nw802 - Scope USB Microscope M2 (ProScope) (Hitachi HD49322BF) */
1224 static const u8 proscope_init[] = {
1225 	0x04, 0x05, 0x01, 0x21,
1226 	0x04, 0x04, 0x01, 0x01,
1227 	0, 0, 0
1228 };
1229 static const u8 proscope_start_1[] = {
1230 	0x04, 0x06, 0x01, 0x04,
1231 	0x00, 0x00, 0x40, 0x10, 0x01, 0x00, 0xf9, 0x02, 0x10, 0x00, 0x04,
1232 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
1233 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
1234 			  0x00, 0x08, 0x00, 0x17, 0x00, 0xce, 0x00, 0xf4,
1235 			  0x05, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
1236 			  0x00, 0xce, 0x00, 0xf8, 0x03, 0x3e, 0x00, 0x86,
1237 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
1238 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
1239 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0xb6,
1240 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
1241 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
1242 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
1243 			  0x00, 0xf6, 0x03, 0x34, 0x04, 0xf6, 0x03, 0x34,
1244 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
1245 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xe8,
1246 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
1247 	0x00, 0x80, 0x1f, 0xb4, 0x6f, 0x1f, 0x0f, 0x08, 0x20, 0xa8, 0x00,
1248 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
1249 			  0x00, 0x0c, 0x02, 0x01, 0x00, 0x19, 0x00, 0x94,
1250 			  0x00, 0x10, 0x06, 0x10, 0x00, 0x36, 0x00,
1251 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
1252 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
1253 			  0x40, 0x20,
1254 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
1255 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00,
1256 	0x06, 0x00, 0x02, 0x09, 0x99,
1257 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1258 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1259 			  0x00, 0x00, 0x00, 0x00, 0x00,
1260 	0x10, 0x00, 0x40, 0xad, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
1261 			  0x00, 0x00, 0x00, 0x10, 0x1f, 0x10, 0x08, 0x0a,
1262 			  0x0a, 0x51, 0x00, 0xf1, 0x00, 0x3c, 0x00, 0xb4,
1263 			  0x00, 0x49, 0x13, 0x00, 0x00, 0x8c, 0x04, 0x01,
1264 			  0x20, 0x02, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00,
1265 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
1266 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
1267 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
1268 	0x10, 0x40, 0x40, 0x80, 0x00, 0x2d, 0x46, 0x58, 0x67, 0x74, 0x7f,
1269 			  0x88, 0x94, 0x9d, 0xa6, 0xae, 0xb5, 0xbd, 0xc4,
1270 			  0xcb, 0xd1, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
1271 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
1272 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
1273 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
1274 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
1275 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
1276 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x3f,
1277 			  0x01, 0x00, 0x00, 0xef, 0x00, 0x09, 0x05, 0x82,
1278 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
1279 			  0x01, 0xf0, 0x00,
1280 	0, 0, 0
1281 };
1282 static const u8 proscope_start_qvga[] = {
1283 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x9e, 0x3c, 0x50, 0x00, 0x00, 0x00,
1284 			  0x00, 0x78, 0x3f, 0x10, 0x02, 0xf2, 0x8f, 0x78,
1285 			  0x40,
1286 	0x10, 0x1a, 0x01, 0x06,
1287 	0x00, 0x03, 0x02, 0xf9, 0x02,
1288 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1289 	0x10, 0x1b, 0x02, 0x00, 0x00,
1290 	0x10, 0x11, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1291 	0x10, 0x1d, 0x08, 0xc0, 0x0d, 0x01, 0x20, 0x02, 0xe8, 0x03, 0x00,
1292 	0x10, 0x0e, 0x01, 0x10,
1293 	0, 0, 0
1294 };
1295 static const u8 proscope_start_vga[] = {
1296 	0x00, 0x03, 0x02, 0xf9, 0x02,
1297 	0x10, 0x85, 0x08, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0xdf, 0x01,
1298 	0x02, 0x00, 0x11, 0x78, 0xa0, 0x8c, 0x78, 0xa0, 0x00, 0x00, 0x00,
1299 			  0x00, 0xf0, 0x16, 0x00, 0x00, 0x82, 0x84, 0x00,
1300 			  0x80,
1301 	0x10, 0x1a, 0x01, 0x06,
1302 	0x10, 0x00, 0x01, 0xa1,
1303 	0x10, 0x1b, 0x02, 0x00, 0x00,
1304 	0x10, 0x1d, 0x08, 0xc0, 0x0d, 0x01, 0x20, 0x02, 0xe8, 0x03, 0x00,
1305 	0x10, 0x11, 0x08, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0xdf, 0x01,
1306 	0x10, 0x0e, 0x01, 0x10,
1307 	0x10, 0x41, 0x11, 0x00, 0x10, 0x51, 0x6e, 0x83, 0x93, 0xa1, 0xae,
1308 			  0xb9, 0xc3, 0xcc, 0xd4, 0xdd, 0xe4, 0xeb, 0xf2,
1309 			  0xf9,
1310 	0x10, 0x03, 0x01, 0x00,
1311 	0, 0, 0
1312 };
1313 static const u8 proscope_start_2[] = {
1314 	0x10, 0x0f, 0x02, 0x0c, 0x0c,
1315 	0x10, 0x03, 0x01, 0x0c,
1316 	0x10, 0x41, 0x11, 0x00, 0x10, 0x51, 0x6e, 0x83, 0x93, 0xa1, 0xae,
1317 			  0xb9, 0xc3, 0xcc, 0xd4, 0xdd, 0xe4, 0xeb, 0xf2,
1318 			  0xf9,
1319 	0x10, 0x0b, 0x01, 0x0b,
1320 	0x10, 0x0d, 0x01, 0x10,
1321 	0x10, 0x0c, 0x01, 0x1b,
1322 	0x04, 0x06, 0x01, 0x03,
1323 	0x04, 0x05, 0x01, 0x21,
1324 	0x04, 0x04, 0x01, 0x00,
1325 	0, 0, 0
1326 };
1327 
1328 /* nw800 - hv7121b? (seems pas106) - Divio Chicony TwinkleCam */
1329 static const u8 twinkle_start[] = {
1330 	0x04, 0x06, 0x01, 0x44,
1331 	0x04, 0x06, 0x01, 0x00,
1332 	0x00, 0x00, 0x40, 0x14, 0x83, 0x00, 0xba, 0x01, 0x10, 0x00, 0x4f,
1333 			  0xef, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x19,
1334 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
1335 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x06, 0x00, 0xfc,
1336 			  0x01, 0x3e, 0x00, 0x86, 0x00, 0x3e, 0x00, 0x86,
1337 			  0x00, 0x3e, 0x00, 0x86, 0x00, 0x01, 0x00, 0x01,
1338 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x56, 0x00, 0x9e,
1339 			  0x00, 0x56, 0x00, 0x9e, 0x00, 0x01, 0x00, 0x01,
1340 	0x00, 0x40, 0x40, 0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
1341 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
1342 			  0x00, 0x6e, 0x00, 0xb6, 0x00, 0x6e, 0x00, 0x78,
1343 			  0x04, 0x6e, 0x00, 0xb6, 0x00, 0x01, 0x00, 0x01,
1344 			  0x00, 0xca, 0x03, 0x46, 0x04, 0xca, 0x03, 0x46,
1345 			  0x04, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
1346 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0,
1347 			  0x00, 0x3e, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x2e,
1348 	0x00, 0x80, 0x1f, 0xb8, 0x48, 0x0f, 0x04, 0x88, 0x14, 0x68, 0x00,
1349 			  0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x03,
1350 			  0x00, 0x24, 0x01, 0x01, 0x00, 0x16, 0x00, 0x04,
1351 			  0x00, 0x4b, 0x00, 0x76, 0x00, 0x86, 0x00,
1352 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
1353 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
1354 			  0x40, 0x20,
1355 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
1356 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0x61, 0x00,
1357 	0x05, 0x00, 0x06, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
1358 	0x06, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1360 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361 			  0x00, 0x00, 0x00,
1362 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 			  0x00, 0x00, 0x00, 0x00, 0x00,
1365 	0x10, 0x00, 0x40, 0x80, 0x02, 0x20, 0x00, 0x11, 0x00, 0x00, 0x00,
1366 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x08,
1367 			  0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 			  0x00, 0x49, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
1370 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
1371 			  0x03, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x06,
1372 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x00, 0x80,
1373 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
1374 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
1375 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
1376 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
1377 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
1378 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
1379 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
1380 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
1381 	0x10, 0x80, 0x1d, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
1382 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62,
1383 			  0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01, 0x20,
1384 			  0x01, 0x60, 0x01, 0x00, 0x00,
1385 
1386 	0x10, 0x85, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
1387 	0x04, 0x04, 0x01, 0x10,
1388 	0x04, 0x04, 0x01, 0x00,
1389 	0x04, 0x05, 0x01, 0x61,
1390 	0x04, 0x04, 0x01, 0x01,
1391 	I2C0, 0x40, 0x0c, 0x02, 0x0c, 0x12, 0x07, 0x00, 0x00, 0x00, 0x00,
1392 			  0x00, 0x00, 0x00, 0x0a,
1393 	I2C0, 0x40, 0x02, 0x11, 0x06,
1394 	I2C0, 0x40, 0x02, 0x14, 0x00,
1395 	I2C0, 0x40, 0x02, 0x13, 0x01,		/* i2c end */
1396 	I2C0, 0x40, 0x02, 0x07, 0x01,
1397 	0x02, 0x00, 0x11, 0x48, 0x58, 0x9e, 0x48, 0x58, 0x00, 0x00, 0x00,
1398 			  0x00, 0x84, 0x36, 0x05, 0x01, 0xf2, 0x86, 0x65,
1399 			  0x40,
1400 	I2C0, 0x40, 0x02, 0x02, 0x0c,
1401 	I2C0, 0x40, 0x02, 0x13, 0x01,
1402 	0x10, 0x00, 0x01, 0x01,
1403 	0x10, 0x8f, 0x0c, 0x62, 0x01, 0x24, 0x01, 0x62, 0x01, 0x24, 0x01,
1404 			  0x20, 0x01, 0x60, 0x01,
1405 	I2C0, 0x40, 0x02, 0x05, 0x0f,
1406 	I2C0, 0x40, 0x02, 0x13, 0x01,
1407 	I2C0, 0x40, 0x08, 0x08, 0x04, 0x0b, 0x01, 0x01, 0x02, 0x00, 0x17,
1408 	I2C0, 0x40, 0x03, 0x12, 0x00, 0x01,
1409 	0x10, 0x11, 0x08, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x1f, 0x01,
1410 	I2C0, 0x40, 0x02, 0x12, 0x00,
1411 	I2C0, 0x40, 0x02, 0x0e, 0x00,
1412 	I2C0, 0x40, 0x02, 0x11, 0x06,
1413 	0x10, 0x41, 0x11, 0x00, 0x17, 0x3f, 0x69, 0x7b, 0x8c, 0x9a, 0xa7,
1414 			  0xb3, 0xbf, 0xc9, 0xd3, 0xdd, 0xe6, 0xef, 0xf7,
1415 			  0xf9,
1416 	0x10, 0x03, 0x01, 0x00,
1417 	0x10, 0x0f, 0x02, 0x0c, 0x0c,
1418 	0x10, 0x03, 0x01, 0x06,
1419 	0x10, 0x41, 0x11, 0x00, 0x17, 0x3f, 0x69, 0x7b, 0x8c, 0x9a, 0xa7,
1420 			  0xb3, 0xbf, 0xc9, 0xd3, 0xdd, 0xe6, 0xef, 0xf7,
1421 			  0xf9,
1422 	0x10, 0x0b, 0x01, 0x19,
1423 	0x10, 0x0d, 0x01, 0x10,
1424 	0x10, 0x0c, 0x01, 0x0d,
1425 	0x04, 0x06, 0x01, 0x03,
1426 	0x04, 0x05, 0x01, 0x61,
1427 	0x04, 0x04, 0x01, 0x41,
1428 	0, 0, 0
1429 };
1430 
1431 /* nw802 dvc-v6 */
1432 static const u8 dvcv6_start[] = {
1433 	0x04, 0x06, 0x01, 0x06,
1434 	0x00, 0x00, 0x40, 0x54, 0x96, 0x98, 0xf9, 0x02, 0x18, 0x00, 0x4c,
1435 			  0x0f, 0x1f, 0x00, 0x0d, 0x02, 0x01, 0x00, 0x19,
1436 			  0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19,
1437 			  0x00, 0x0b, 0x00, 0x1b, 0x00, 0xc8, 0x00, 0xf4,
1438 			  0x05, 0xb4, 0x00, 0xcc, 0x00, 0x01, 0x00, 0x01,
1439 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1440 			  0x00, 0xa2, 0x00, 0xc6, 0x00, 0x60, 0x00, 0xc6,
1441 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1442 	0x00, 0x40, 0x40, 0x00, 0xae, 0x00, 0xd2, 0x00, 0xae, 0x00, 0xd2,
1443 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1444 			  0x00, 0xa8, 0x00, 0xc0, 0x00, 0x66, 0x00, 0xc0,
1445 			  0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
1446 			  0x00, 0x0a, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x54,
1447 			  0x00, 0x10, 0x00, 0x36, 0x00, 0xd2, 0x00, 0xee,
1448 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6,
1449 			  0x00, 0x5d, 0x00, 0xc7, 0x00, 0x7e, 0x00, 0x30,
1450 	0x00, 0x80, 0x1f, 0x98, 0x43, 0x3f, 0x0d, 0x88, 0x20, 0x80, 0x3f,
1451 			  0x47, 0xaf, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x11,
1452 			  0x00, 0x0c, 0x02, 0x0c, 0x00, 0x1c, 0x00, 0x94,
1453 			  0x00, 0x10, 0x06, 0x24, 0x00, 0x4a, 0x00,
1454 	0x02, 0x00, 0x12, 0x78, 0xa0, 0x9e, 0x78, 0xa0, 0x00, 0x00, 0x00,
1455 			  0x00, 0xf0, 0x18, 0x0b, 0x06, 0x62, 0x82, 0xa0,
1456 			  0x40, 0x20,
1457 	0x03, 0x00, 0x03, 0x03, 0x00, 0x00,
1458 	0x04, 0x00, 0x07, 0x01, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00,
1459 	0x06, 0x00, 0x02, 0x09, 0x99,
1460 	0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1461 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1462 			  0x00, 0x00, 0x00, 0x00, 0x00,
1463 	0x10, 0x00, 0x40, 0xa0, 0x02, 0x80, 0x00, 0x12, 0x00, 0x00, 0x00,
1464 			  0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x08, 0x0a,
1465 			  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1466 			  0x00, 0x49, 0x13, 0x00, 0x00, 0xe0, 0x00, 0x0c,
1467 			  0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
1468 			  0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
1469 			  0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x06,
1470 			  0xf7, 0xee, 0x1c, 0x1c, 0xe9, 0xfc, 0x10, 0x80,
1471 	0x10, 0x40, 0x40, 0x80, 0x00, 0x05, 0x35, 0x5e, 0x78, 0x8b, 0x99,
1472 			  0xa4, 0xae, 0xb5, 0xbc, 0xc1, 0xc6, 0xc9, 0xcc,
1473 			  0xcf, 0xd0, 0x00, 0x11, 0x22, 0x32, 0x43, 0x54,
1474 			  0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3, 0xd2,
1475 			  0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32, 0x43,
1476 			  0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3, 0xc3,
1477 			  0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x11, 0x22, 0x32,
1478 			  0x43, 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb3,
1479 	0x10, 0x80, 0x1b, 0xc3, 0xd2, 0xe2, 0xf1, 0xff, 0x00, 0x00, 0x00,
1480 			  0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x82,
1481 			  0x02, 0xe4, 0x01, 0x40, 0x01, 0xf0, 0x00, 0x40,
1482 			  0x01, 0xf0, 0x00,
1483 	0x00, 0x03, 0x02, 0x94, 0x03,
1484 	0x00, 0x1d, 0x04, 0x0a, 0x01, 0x28, 0x07,
1485 	0x00, 0x7b, 0x02, 0xe0, 0x00,
1486 	0x10, 0x8d, 0x01, 0x00,
1487 	0x00, 0x09, 0x04, 0x1e, 0x00, 0x0c, 0x02,
1488 	0x00, 0x91, 0x02, 0x0b, 0x02,
1489 	0x10, 0x00, 0x01, 0xaf,
1490 	0x02, 0x00, 0x11, 0x3c, 0x50, 0x8f, 0x3c, 0x50, 0x00, 0x00, 0x00,
1491 			  0x00, 0x78, 0x3f, 0x3f, 0x06, 0xf2, 0x8f, 0xf0,
1492 			  0x40,
1493 	0x10, 0x1a, 0x01, 0x02,
1494 	0x10, 0x00, 0x01, 0xaf,
1495 	0x10, 0x85, 0x08, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x00,
1496 	0x10, 0x1b, 0x02, 0x07, 0x01,
1497 	0x10, 0x11, 0x08, 0x61, 0x00, 0xe0, 0x00, 0x49, 0x00, 0xa8, 0x00,
1498 	0x10, 0x1f, 0x06, 0x01, 0x20, 0x02, 0xe8, 0x03, 0x00,
1499 	0x10, 0x1d, 0x02, 0x40, 0x06,
1500 	0x10, 0x0e, 0x01, 0x08,
1501 	0x10, 0x41, 0x11, 0x00, 0x0f, 0x54, 0x6f, 0x82, 0x91, 0x9f, 0xaa,
1502 			  0xb4, 0xbd, 0xc5, 0xcd, 0xd5, 0xdb, 0xdc, 0xdc,
1503 			  0xdc,
1504 	0x10, 0x03, 0x01, 0x00,
1505 	0x10, 0x0f, 0x02, 0x12, 0x12,
1506 	0x10, 0x03, 0x01, 0x11,
1507 	0x10, 0x41, 0x11, 0x00, 0x0f, 0x54, 0x6f, 0x82, 0x91, 0x9f, 0xaa,
1508 			  0xb4, 0xbd, 0xc5, 0xcd, 0xd5, 0xdb, 0xdc, 0xdc,
1509 			  0xdc,
1510 	0x10, 0x0b, 0x01, 0x16,
1511 	0x10, 0x0d, 0x01, 0x10,
1512 	0x10, 0x0c, 0x01, 0x1a,
1513 	0x04, 0x06, 0x01, 0x03,
1514 	0x04, 0x04, 0x01, 0x00,
1515 };
1516 
1517 static const u8 *webcam_start[] = {
1518 	[Generic800] = nw800_start,
1519 	[SpaceCam] = spacecam_start,
1520 	[SpaceCam2] = spacecam2_start,
1521 	[Cvideopro] = cvideopro_start,
1522 	[Dlink350c] = dlink_start,
1523 	[DS3303u] = ds3303_start,
1524 	[Kr651us] = kr651_start_1,
1525 	[Kritter] = kritter_start,
1526 	[Mustek300] = mustek_start,
1527 	[Proscope] = proscope_start_1,
1528 	[Twinkle] = twinkle_start,
1529 	[DvcV6] = dvcv6_start,
1530 	[P35u] = nw801_start_1,
1531 	[Generic802] = nw802_start,
1532 };
1533 
1534 /* -- write a register -- */
reg_w(struct gspca_dev * gspca_dev,u16 index,const u8 * data,int len)1535 static void reg_w(struct gspca_dev *gspca_dev,
1536 			u16 index,
1537 			const u8 *data,
1538 			int len)
1539 {
1540 	struct usb_device *dev = gspca_dev->dev;
1541 	int ret;
1542 
1543 	if (gspca_dev->usb_err < 0)
1544 		return;
1545 	if (len == 1)
1546 		gspca_dbg(gspca_dev, D_USBO, "SET 00 0000 %04x %02x\n",
1547 			  index, *data);
1548 	else
1549 		gspca_dbg(gspca_dev, D_USBO, "SET 00 0000 %04x %02x %02x ...\n",
1550 			  index, *data, data[1]);
1551 	memcpy(gspca_dev->usb_buf, data, len);
1552 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
1553 			0x00,
1554 			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1555 			0x00,		/* value */
1556 			index,
1557 			gspca_dev->usb_buf,
1558 			len,
1559 			500);
1560 	if (ret < 0) {
1561 		pr_err("reg_w err %d\n", ret);
1562 		gspca_dev->usb_err = ret;
1563 	}
1564 }
1565 
1566 /* -- read registers in usb_buf -- */
reg_r(struct gspca_dev * gspca_dev,u16 index,int len)1567 static void reg_r(struct gspca_dev *gspca_dev,
1568 			u16 index,
1569 			int len)
1570 {
1571 	struct usb_device *dev = gspca_dev->dev;
1572 	int ret;
1573 
1574 	if (gspca_dev->usb_err < 0)
1575 		return;
1576 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
1577 			0x00,
1578 			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1579 			0x00, index,
1580 			gspca_dev->usb_buf, len, 500);
1581 	if (ret < 0) {
1582 		pr_err("reg_r err %d\n", ret);
1583 		gspca_dev->usb_err = ret;
1584 		/*
1585 		 * Make sure the buffer is zeroed to avoid uninitialized
1586 		 * values.
1587 		 */
1588 		memset(gspca_dev->usb_buf, 0, USB_BUF_SZ);
1589 		return;
1590 	}
1591 	if (len == 1)
1592 		gspca_dbg(gspca_dev, D_USBI, "GET 00 0000 %04x %02x\n",
1593 			  index, gspca_dev->usb_buf[0]);
1594 	else
1595 		gspca_dbg(gspca_dev, D_USBI, "GET 00 0000 %04x %02x %02x ..\n",
1596 			  index, gspca_dev->usb_buf[0],
1597 			  gspca_dev->usb_buf[1]);
1598 }
1599 
i2c_w(struct gspca_dev * gspca_dev,u8 i2c_addr,const u8 * data,int len)1600 static void i2c_w(struct gspca_dev *gspca_dev,
1601 			u8 i2c_addr,
1602 			const u8 *data,
1603 			int len)
1604 {
1605 	u8 val[2];
1606 	int i;
1607 
1608 	reg_w(gspca_dev, 0x0600, data + 1, len - 1);
1609 	reg_w(gspca_dev, 0x0600, data, len);
1610 	val[0] = len;
1611 	val[1] = i2c_addr;
1612 	reg_w(gspca_dev, 0x0502, val, 2);
1613 	val[0] = 0x01;
1614 	reg_w(gspca_dev, 0x0501, val, 1);
1615 	for (i = 5; --i >= 0; ) {
1616 		msleep(4);
1617 		reg_r(gspca_dev, 0x0505, 1);
1618 		if (gspca_dev->usb_err < 0)
1619 			return;
1620 		if (gspca_dev->usb_buf[0] == 0)
1621 			return;
1622 	}
1623 	gspca_dev->usb_err = -ETIME;
1624 }
1625 
reg_w_buf(struct gspca_dev * gspca_dev,const u8 * cmd)1626 static void reg_w_buf(struct gspca_dev *gspca_dev,
1627 			const u8 *cmd)
1628 {
1629 	u16 reg;
1630 	int len;
1631 
1632 	for (;;) {
1633 		reg = *cmd++ << 8;
1634 		reg += *cmd++;
1635 		len = *cmd++;
1636 		if (len == 0)
1637 			break;
1638 		if (cmd[-3] != I2C0)
1639 			reg_w(gspca_dev, reg, cmd, len);
1640 		else
1641 			i2c_w(gspca_dev, reg, cmd, len);
1642 		cmd += len;
1643 	}
1644 }
1645 
swap_bits(int v)1646 static int swap_bits(int v)
1647 {
1648 	int r, i;
1649 
1650 	r = 0;
1651 	for (i = 0; i < 8; i++) {
1652 		r <<= 1;
1653 		if (v & 1)
1654 			r++;
1655 		v >>= 1;
1656 	}
1657 	return r;
1658 }
1659 
setgain(struct gspca_dev * gspca_dev,u8 val)1660 static void setgain(struct gspca_dev *gspca_dev, u8 val)
1661 {
1662 	struct sd *sd = (struct sd *) gspca_dev;
1663 	u8 v[2];
1664 
1665 	switch (sd->webcam) {
1666 	case P35u:
1667 		reg_w(gspca_dev, 0x1026, &val, 1);
1668 		break;
1669 	case Kr651us:
1670 		/* 0 - 253 */
1671 		val = swap_bits(val);
1672 		v[0] = val << 3;
1673 		v[1] = val >> 5;
1674 		reg_w(gspca_dev, 0x101d, v, 2);	/* SIF reg0/1 (AGC) */
1675 		break;
1676 	}
1677 }
1678 
setexposure(struct gspca_dev * gspca_dev,s32 val)1679 static void setexposure(struct gspca_dev *gspca_dev, s32 val)
1680 {
1681 	struct sd *sd = (struct sd *) gspca_dev;
1682 	u8 v[2];
1683 
1684 	switch (sd->webcam) {
1685 	case P35u:
1686 		v[0] = ((9 - val) << 3) | 0x01;
1687 		reg_w(gspca_dev, 0x1019, v, 1);
1688 		break;
1689 	case Cvideopro:
1690 	case DvcV6:
1691 	case Kritter:
1692 	case Kr651us:
1693 		v[0] = val;
1694 		v[1] = val >> 8;
1695 		reg_w(gspca_dev, 0x101b, v, 2);
1696 		break;
1697 	}
1698 }
1699 
setautogain(struct gspca_dev * gspca_dev,s32 val)1700 static void setautogain(struct gspca_dev *gspca_dev, s32 val)
1701 {
1702 	struct sd *sd = (struct sd *) gspca_dev;
1703 	int w, h;
1704 
1705 	if (!val) {
1706 		sd->ag_cnt = -1;
1707 		return;
1708 	}
1709 	sd->ag_cnt = AG_CNT_START;
1710 
1711 	reg_r(gspca_dev, 0x1004, 1);
1712 	if (gspca_dev->usb_buf[0] & 0x04) {	/* if AE_FULL_FRM */
1713 		sd->ae_res = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
1714 	} else {				/* get the AE window size */
1715 		reg_r(gspca_dev, 0x1011, 8);
1716 		w = (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]
1717 		  - (gspca_dev->usb_buf[3] << 8) - gspca_dev->usb_buf[2];
1718 		h = (gspca_dev->usb_buf[5] << 8) + gspca_dev->usb_buf[4]
1719 		  - (gspca_dev->usb_buf[7] << 8) - gspca_dev->usb_buf[6];
1720 		sd->ae_res = h * w;
1721 		if (sd->ae_res == 0)
1722 			sd->ae_res = gspca_dev->pixfmt.width *
1723 					gspca_dev->pixfmt.height;
1724 	}
1725 }
1726 
nw802_test_reg(struct gspca_dev * gspca_dev,u16 index,u8 value)1727 static int nw802_test_reg(struct gspca_dev *gspca_dev,
1728 			u16 index,
1729 			u8 value)
1730 {
1731 	/* write the value */
1732 	reg_w(gspca_dev, index, &value, 1);
1733 
1734 	/* read it */
1735 	reg_r(gspca_dev, index, 1);
1736 
1737 	return gspca_dev->usb_buf[0] == value;
1738 }
1739 
1740 /* this function is called at probe time */
sd_config(struct gspca_dev * gspca_dev,const struct usb_device_id * id)1741 static int sd_config(struct gspca_dev *gspca_dev,
1742 			const struct usb_device_id *id)
1743 {
1744 	struct sd *sd = (struct sd *) gspca_dev;
1745 
1746 	if ((unsigned) webcam >= NWEBCAMS)
1747 		webcam = 0;
1748 	sd->webcam = webcam;
1749 	gspca_dev->cam.needs_full_bandwidth = 1;
1750 	sd->ag_cnt = -1;
1751 
1752 	/*
1753 	 * Autodetect sequence inspired from some log.
1754 	 * We try to detect what registers exist or not.
1755 	 * If 0x0500 does not exist => NW802
1756 	 * If it does, test 0x109b. If it doesn't exist,
1757 	 * then it's a NW801. Else, a NW800
1758 	 * If a et31x110 (nw800 and 06a5:d800)
1759 	 *	get the sensor ID
1760 	 */
1761 	if (!nw802_test_reg(gspca_dev, 0x0500, 0x55)) {
1762 		sd->bridge = BRIDGE_NW802;
1763 		if (sd->webcam == Generic800)
1764 			sd->webcam = Generic802;
1765 	} else if (!nw802_test_reg(gspca_dev, 0x109b, 0xaa)) {
1766 		sd->bridge = BRIDGE_NW801;
1767 		if (sd->webcam == Generic800)
1768 			sd->webcam = P35u;
1769 	} else if (id->idVendor == 0x06a5 && id->idProduct == 0xd800) {
1770 		reg_r(gspca_dev, 0x0403, 1);		/* GPIO */
1771 		gspca_dbg(gspca_dev, D_PROBE, "et31x110 sensor type %02x\n",
1772 			  gspca_dev->usb_buf[0]);
1773 		switch (gspca_dev->usb_buf[0] >> 1) {
1774 		case 0x00:				/* ?? */
1775 			if (sd->webcam == Generic800)
1776 				sd->webcam = SpaceCam;
1777 			break;
1778 		case 0x01:				/* Hynix? */
1779 			if (sd->webcam == Generic800)
1780 				sd->webcam = Twinkle;
1781 			break;
1782 		case 0x0a:				/* Pixart */
1783 			if (sd->webcam == Generic800)
1784 				sd->webcam = SpaceCam2;
1785 			break;
1786 		}
1787 	}
1788 	if (webcam_chip[sd->webcam] != sd->bridge) {
1789 		pr_err("Bad webcam type %d for NW80%d\n",
1790 		       sd->webcam, sd->bridge);
1791 		gspca_dev->usb_err = -ENODEV;
1792 		return gspca_dev->usb_err;
1793 	}
1794 	gspca_dbg(gspca_dev, D_PROBE, "Bridge nw80%d - type: %d\n",
1795 		  sd->bridge, sd->webcam);
1796 
1797 	if (sd->bridge == BRIDGE_NW800) {
1798 		switch (sd->webcam) {
1799 		case DS3303u:
1800 			gspca_dev->cam.cam_mode = cif_mode;	/* qvga */
1801 			break;
1802 		default:
1803 			gspca_dev->cam.cam_mode = &cif_mode[1];	/* cif */
1804 			break;
1805 		}
1806 		gspca_dev->cam.nmodes = 1;
1807 	} else {
1808 		gspca_dev->cam.cam_mode = vga_mode;
1809 		switch (sd->webcam) {
1810 		case Kr651us:
1811 		case Proscope:
1812 		case P35u:
1813 			gspca_dev->cam.nmodes = ARRAY_SIZE(vga_mode);
1814 			break;
1815 		default:
1816 			gspca_dev->cam.nmodes = 1;	/* qvga only */
1817 			break;
1818 		}
1819 	}
1820 
1821 	return gspca_dev->usb_err;
1822 }
1823 
1824 /* this function is called at probe and resume time */
sd_init(struct gspca_dev * gspca_dev)1825 static int sd_init(struct gspca_dev *gspca_dev)
1826 {
1827 	struct sd *sd = (struct sd *) gspca_dev;
1828 
1829 	switch (sd->bridge) {
1830 	case BRIDGE_NW800:
1831 		switch (sd->webcam) {
1832 		case SpaceCam:
1833 			reg_w_buf(gspca_dev, spacecam_init);
1834 			break;
1835 		default:
1836 			reg_w_buf(gspca_dev, nw800_init);
1837 			break;
1838 		}
1839 		break;
1840 	default:
1841 		switch (sd->webcam) {
1842 		case Mustek300:
1843 		case P35u:
1844 		case Proscope:
1845 			reg_w_buf(gspca_dev, proscope_init);
1846 			break;
1847 		}
1848 		break;
1849 	}
1850 	return gspca_dev->usb_err;
1851 }
1852 
1853 /* -- start the camera -- */
sd_start(struct gspca_dev * gspca_dev)1854 static int sd_start(struct gspca_dev *gspca_dev)
1855 {
1856 	struct sd *sd = (struct sd *) gspca_dev;
1857 	const u8 *cmd;
1858 
1859 	cmd = webcam_start[sd->webcam];
1860 	reg_w_buf(gspca_dev, cmd);
1861 	switch (sd->webcam) {
1862 	case P35u:
1863 		if (gspca_dev->pixfmt.width == 320)
1864 			reg_w_buf(gspca_dev, nw801_start_qvga);
1865 		else
1866 			reg_w_buf(gspca_dev, nw801_start_vga);
1867 		reg_w_buf(gspca_dev, nw801_start_2);
1868 		break;
1869 	case Kr651us:
1870 		if (gspca_dev->pixfmt.width == 320)
1871 			reg_w_buf(gspca_dev, kr651_start_qvga);
1872 		else
1873 			reg_w_buf(gspca_dev, kr651_start_vga);
1874 		reg_w_buf(gspca_dev, kr651_start_2);
1875 		break;
1876 	case Proscope:
1877 		if (gspca_dev->pixfmt.width == 320)
1878 			reg_w_buf(gspca_dev, proscope_start_qvga);
1879 		else
1880 			reg_w_buf(gspca_dev, proscope_start_vga);
1881 		reg_w_buf(gspca_dev, proscope_start_2);
1882 		break;
1883 	}
1884 
1885 	sd->exp_too_high_cnt = 0;
1886 	sd->exp_too_low_cnt = 0;
1887 	return gspca_dev->usb_err;
1888 }
1889 
sd_stopN(struct gspca_dev * gspca_dev)1890 static void sd_stopN(struct gspca_dev *gspca_dev)
1891 {
1892 	struct sd *sd = (struct sd *) gspca_dev;
1893 	u8 value;
1894 
1895 	/* 'go' off */
1896 	if (sd->bridge != BRIDGE_NW801) {
1897 		value = 0x02;
1898 		reg_w(gspca_dev, 0x0406, &value, 1);
1899 	}
1900 
1901 	/* LED off */
1902 	switch (sd->webcam) {
1903 	case Cvideopro:
1904 	case Kr651us:
1905 	case DvcV6:
1906 	case Kritter:
1907 		value = 0xff;
1908 		break;
1909 	case Dlink350c:
1910 		value = 0x21;
1911 		break;
1912 	case SpaceCam:
1913 	case SpaceCam2:
1914 	case Proscope:
1915 	case Twinkle:
1916 		value = 0x01;
1917 		break;
1918 	default:
1919 		return;
1920 	}
1921 	reg_w(gspca_dev, 0x0404, &value, 1);
1922 }
1923 
sd_pkt_scan(struct gspca_dev * gspca_dev,u8 * data,int len)1924 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1925 			u8 *data,			/* isoc packet */
1926 			int len)			/* iso packet length */
1927 {
1928 	/*
1929 	 * frame header = '00 00 hh ww ss xx ff ff'
1930 	 * with:
1931 	 *	- 'hh': height / 4
1932 	 *	- 'ww': width / 4
1933 	 *	- 'ss': frame sequence number c0..dd
1934 	 */
1935 	if (data[0] == 0x00 && data[1] == 0x00
1936 	 && data[6] == 0xff && data[7] == 0xff) {
1937 		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
1938 		gspca_frame_add(gspca_dev, FIRST_PACKET, data + 8, len - 8);
1939 	} else {
1940 		gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1941 	}
1942 }
1943 
do_autogain(struct gspca_dev * gspca_dev)1944 static void do_autogain(struct gspca_dev *gspca_dev)
1945 {
1946 	struct sd *sd = (struct sd *) gspca_dev;
1947 	int luma;
1948 
1949 	if (sd->ag_cnt < 0)
1950 		return;
1951 	if (--sd->ag_cnt >= 0)
1952 		return;
1953 	sd->ag_cnt = AG_CNT_START;
1954 
1955 	/* get the average luma */
1956 	reg_r(gspca_dev, sd->bridge == BRIDGE_NW801 ? 0x080d : 0x080c, 4);
1957 	luma = (gspca_dev->usb_buf[3] << 24) + (gspca_dev->usb_buf[2] << 16)
1958 		+ (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0];
1959 	luma /= sd->ae_res;
1960 
1961 	switch (sd->webcam) {
1962 	case P35u:
1963 		gspca_coarse_grained_expo_autogain(gspca_dev, luma, 100, 5);
1964 		break;
1965 	default:
1966 		gspca_expo_autogain(gspca_dev, luma, 100, 5, 230, 0);
1967 		break;
1968 	}
1969 }
1970 
1971 
sd_s_ctrl(struct v4l2_ctrl * ctrl)1972 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
1973 {
1974 	struct gspca_dev *gspca_dev =
1975 		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
1976 
1977 	gspca_dev->usb_err = 0;
1978 
1979 	if (!gspca_dev->streaming)
1980 		return 0;
1981 
1982 	switch (ctrl->id) {
1983 	/* autogain/gain/exposure control cluster */
1984 	case V4L2_CID_AUTOGAIN:
1985 		if (ctrl->is_new)
1986 			setautogain(gspca_dev, ctrl->val);
1987 		if (!ctrl->val) {
1988 			if (gspca_dev->gain->is_new)
1989 				setgain(gspca_dev, gspca_dev->gain->val);
1990 			if (gspca_dev->exposure->is_new)
1991 				setexposure(gspca_dev,
1992 					    gspca_dev->exposure->val);
1993 		}
1994 		break;
1995 	/* Some webcams only have exposure, so handle that separately from the
1996 	   autogain/gain/exposure cluster in the previous case. */
1997 	case V4L2_CID_EXPOSURE:
1998 		setexposure(gspca_dev, gspca_dev->exposure->val);
1999 		break;
2000 	}
2001 	return gspca_dev->usb_err;
2002 }
2003 
2004 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
2005 	.s_ctrl = sd_s_ctrl,
2006 };
2007 
sd_init_controls(struct gspca_dev * gspca_dev)2008 static int sd_init_controls(struct gspca_dev *gspca_dev)
2009 {
2010 	struct sd *sd = (struct sd *)gspca_dev;
2011 	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
2012 
2013 	gspca_dev->vdev.ctrl_handler = hdl;
2014 	v4l2_ctrl_handler_init(hdl, 3);
2015 	switch (sd->webcam) {
2016 	case P35u:
2017 		gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2018 			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
2019 		/* For P35u choose coarse expo auto gain function gain minimum,
2020 		 * to avoid a large settings jump the first auto adjustment */
2021 		gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2022 			V4L2_CID_GAIN, 0, 127, 1, 127 / 5 * 2);
2023 		gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2024 			V4L2_CID_EXPOSURE, 0, 9, 1, 9);
2025 		break;
2026 	case Kr651us:
2027 		gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2028 			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
2029 		gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2030 			V4L2_CID_GAIN, 0, 253, 1, 128);
2031 		/* fall through */
2032 	case Cvideopro:
2033 	case DvcV6:
2034 	case Kritter:
2035 		gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
2036 			V4L2_CID_EXPOSURE, 0, 315, 1, 150);
2037 		break;
2038 	default:
2039 		break;
2040 	}
2041 
2042 	if (hdl->error) {
2043 		pr_err("Could not initialize controls\n");
2044 		return hdl->error;
2045 	}
2046 	if (gspca_dev->autogain)
2047 		v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
2048 	return 0;
2049 }
2050 
2051 /* sub-driver description */
2052 static const struct sd_desc sd_desc = {
2053 	.name = MODULE_NAME,
2054 	.config = sd_config,
2055 	.init = sd_init,
2056 	.init_controls = sd_init_controls,
2057 	.start = sd_start,
2058 	.stopN = sd_stopN,
2059 	.pkt_scan = sd_pkt_scan,
2060 	.dq_callback = do_autogain,
2061 };
2062 
2063 /* -- module initialisation -- */
2064 static const struct usb_device_id device_table[] = {
2065 	{USB_DEVICE(0x046d, 0xd001)},
2066 	{USB_DEVICE(0x0502, 0xd001)},
2067 	{USB_DEVICE(0x052b, 0xd001)},
2068 	{USB_DEVICE(0x055f, 0xd001)},
2069 	{USB_DEVICE(0x06a5, 0x0000)},
2070 	{USB_DEVICE(0x06a5, 0xd001)},
2071 	{USB_DEVICE(0x06a5, 0xd800)},
2072 	{USB_DEVICE(0x06be, 0xd001)},
2073 	{USB_DEVICE(0x0728, 0xd001)},
2074 	{}
2075 };
2076 MODULE_DEVICE_TABLE(usb, device_table);
2077 
2078 /* -- device connect -- */
sd_probe(struct usb_interface * intf,const struct usb_device_id * id)2079 static int sd_probe(struct usb_interface *intf,
2080 			const struct usb_device_id *id)
2081 {
2082 	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
2083 				THIS_MODULE);
2084 }
2085 
2086 static struct usb_driver sd_driver = {
2087 	.name = MODULE_NAME,
2088 	.id_table = device_table,
2089 	.probe = sd_probe,
2090 	.disconnect = gspca_disconnect,
2091 #ifdef CONFIG_PM
2092 	.suspend = gspca_suspend,
2093 	.resume = gspca_resume,
2094 	.reset_resume = gspca_resume,
2095 #endif
2096 };
2097 
2098 module_usb_driver(sd_driver);
2099 
2100 module_param(webcam, int, 0644);
2101 MODULE_PARM_DESC(webcam,
2102 	"Webcam type\n"
2103 	"0: generic\n"
2104 	"1: Trust 120 SpaceCam\n"
2105 	"2: other Trust 120 SpaceCam\n"
2106 	"3: Conceptronic Video Pro\n"
2107 	"4: D-link dru-350c\n"
2108 	"5: Plustek Opticam 500U\n"
2109 	"6: Panasonic GP-KR651US\n"
2110 	"7: iRez Kritter\n"
2111 	"8: Mustek Wcam 300 mini\n"
2112 	"9: Scalar USB Microscope M2 (Proscope)\n"
2113 	"10: Divio Chicony TwinkleCam\n"
2114 	"11: DVC-V6\n");
2115