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