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