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