• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Driver for Logitech Quickcam Messenger usb video camera
3  * Copyright (C) Jaya Kumar
4  *
5  * This work was sponsored by CIS(M) Sdn Bhd.
6  * History:
7  * 05/08/2006 - Jaya Kumar
8  * I wrote this based on the konicawc by Simon Evans.
9  * -
10  * Full credit for reverse engineering and creating an initial
11  * working linux driver for the VV6422 goes to the qce-ga project by
12  * Tuukka Toivonen, Jochen Hoenicke, Peter McConnell,
13  * Cristiano De Michele, Georg Acher, Jean-Frederic Clere as well as
14  * others.
15  * ---
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
29  *
30  */
31 
32 #include <linux/kernel.h>
33 #include <linux/module.h>
34 #include <linux/init.h>
35 #include <linux/input.h>
36 #include <linux/usb/input.h>
37 
38 #include "usbvideo.h"
39 #include "quickcam_messenger.h"
40 
41 /*
42  * Version Information
43  */
44 
45 #ifdef CONFIG_USB_DEBUG
46 static int debug;
47 #define DEBUG(n, format, arg...) \
48 	if (n <= debug) {	 \
49 		printk(KERN_DEBUG __FILE__ ":%s(): " format "\n", __func__ , ## arg); \
50 	}
51 #else
52 #define DEBUG(n, arg...)
53 static const int debug;
54 #endif
55 
56 #define DRIVER_VERSION "v0.01"
57 #define DRIVER_DESC "Logitech Quickcam Messenger USB"
58 
59 #define USB_LOGITECH_VENDOR_ID	0x046D
60 #define USB_QCM_PRODUCT_ID	0x08F0
61 
62 #define MAX_CAMERAS	1
63 
64 #define MAX_COLOUR	32768
65 #define MAX_HUE		32768
66 #define MAX_BRIGHTNESS	32768
67 #define MAX_CONTRAST	32768
68 #define MAX_WHITENESS	32768
69 
70 static int size = SIZE_320X240;
71 static int colour = MAX_COLOUR;
72 static int hue = MAX_HUE;
73 static int brightness =	MAX_BRIGHTNESS;
74 static int contrast =	MAX_CONTRAST;
75 static int whiteness =	MAX_WHITENESS;
76 
77 static struct usbvideo *cams;
78 
79 static struct usb_device_id qcm_table [] = {
80 	{ USB_DEVICE(USB_LOGITECH_VENDOR_ID, USB_QCM_PRODUCT_ID) },
81 	{ }
82 };
83 MODULE_DEVICE_TABLE(usb, qcm_table);
84 
85 #ifdef CONFIG_INPUT
qcm_register_input(struct qcm * cam,struct usb_device * dev)86 static void qcm_register_input(struct qcm *cam, struct usb_device *dev)
87 {
88 	struct input_dev *input_dev;
89 	int error;
90 
91 	usb_make_path(dev, cam->input_physname, sizeof(cam->input_physname));
92 	strncat(cam->input_physname, "/input0", sizeof(cam->input_physname));
93 
94 	cam->input = input_dev = input_allocate_device();
95 	if (!input_dev) {
96 		dev_warn(&dev->dev, "insufficient mem for cam input device\n");
97 		return;
98 	}
99 
100 	input_dev->name = "QCM button";
101 	input_dev->phys = cam->input_physname;
102 	usb_to_input_id(dev, &input_dev->id);
103 	input_dev->dev.parent = &dev->dev;
104 
105 	input_dev->evbit[0] = BIT_MASK(EV_KEY);
106 	input_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);
107 
108 	error = input_register_device(cam->input);
109 	if (error) {
110 		dev_warn(&dev->dev,
111 			 "Failed to register camera's input device, err: %d\n",
112 			 error);
113 		input_free_device(cam->input);
114 		cam->input = NULL;
115 	}
116 }
117 
qcm_unregister_input(struct qcm * cam)118 static void qcm_unregister_input(struct qcm *cam)
119 {
120 	if (cam->input) {
121 		input_unregister_device(cam->input);
122 		cam->input = NULL;
123 	}
124 }
125 
qcm_report_buttonstat(struct qcm * cam)126 static void qcm_report_buttonstat(struct qcm *cam)
127 {
128 	if (cam->input) {
129 		input_report_key(cam->input, BTN_0, cam->button_sts);
130 		input_sync(cam->input);
131 	}
132 }
133 
qcm_int_irq(struct urb * urb)134 static void qcm_int_irq(struct urb *urb)
135 {
136 	int ret;
137 	struct uvd *uvd = urb->context;
138 	struct qcm *cam;
139 
140 	if (!CAMERA_IS_OPERATIONAL(uvd))
141 		return;
142 
143 	if (!uvd->streaming)
144 		return;
145 
146 	uvd->stats.urb_count++;
147 
148 	if (urb->status < 0)
149 		uvd->stats.iso_err_count++;
150 	else {
151 		if (urb->actual_length > 0 ) {
152 			cam = (struct qcm *) uvd->user_data;
153 			if (cam->button_sts_buf == 0x88)
154 				cam->button_sts = 0x0;
155 			else if (cam->button_sts_buf == 0x80)
156 				cam->button_sts = 0x1;
157 			qcm_report_buttonstat(cam);
158 		}
159 	}
160 
161 	ret = usb_submit_urb(urb, GFP_ATOMIC);
162 	if (ret < 0)
163 		err("usb_submit_urb error (%d)", ret);
164 }
165 
qcm_setup_input_int(struct qcm * cam,struct uvd * uvd)166 static int qcm_setup_input_int(struct qcm *cam, struct uvd *uvd)
167 {
168 	int errflag;
169 	usb_fill_int_urb(cam->button_urb, uvd->dev,
170 			usb_rcvintpipe(uvd->dev, uvd->video_endp + 1),
171 			&cam->button_sts_buf,
172 			1,
173 			qcm_int_irq,
174 			uvd, 16);
175 
176 	errflag = usb_submit_urb(cam->button_urb, GFP_KERNEL);
177 	if (errflag)
178 		err ("usb_submit_int ret %d", errflag);
179 	return errflag;
180 }
181 
qcm_stop_int_data(struct qcm * cam)182 static void qcm_stop_int_data(struct qcm *cam)
183 {
184 	usb_kill_urb(cam->button_urb);
185 }
186 
qcm_alloc_int_urb(struct qcm * cam)187 static int qcm_alloc_int_urb(struct qcm *cam)
188 {
189 	cam->button_urb = usb_alloc_urb(0, GFP_KERNEL);
190 
191 	if (!cam->button_urb)
192 		return -ENOMEM;
193 
194 	return 0;
195 }
196 
qcm_free_int(struct qcm * cam)197 static void qcm_free_int(struct qcm *cam)
198 {
199 	usb_free_urb(cam->button_urb);
200 }
201 #endif /* CONFIG_INPUT */
202 
qcm_stv_setb(struct usb_device * dev,u16 reg,u8 val)203 static int qcm_stv_setb(struct usb_device *dev, u16 reg, u8 val)
204 {
205 	int ret;
206 
207 	/* we'll wait up to 3 slices but no more */
208 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
209 		0x04, USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
210 		reg, 0, &val, 1, 3*HZ);
211 	return ret;
212 }
213 
qcm_stv_setw(struct usb_device * dev,u16 reg,__le16 val)214 static int qcm_stv_setw(struct usb_device *dev, u16 reg, __le16 val)
215 {
216 	int ret;
217 
218 	/* we'll wait up to 3 slices but no more */
219 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
220 		0x04, USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
221 		reg, 0, &val, 2, 3*HZ);
222 	return ret;
223 }
224 
qcm_stv_getw(struct usb_device * dev,unsigned short reg,__le16 * val)225 static int qcm_stv_getw(struct usb_device *dev, unsigned short reg,
226 							__le16 *val)
227 {
228 	int ret;
229 
230 	/* we'll wait up to 3 slices but no more */
231 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
232 		0x04, USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
233 		reg, 0, val, 2, 3*HZ);
234 	return ret;
235 }
236 
qcm_camera_on(struct uvd * uvd)237 static int qcm_camera_on(struct uvd *uvd)
238 {
239 	int ret;
240 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, STV_ISO_ENABLE, 0x01));
241 	return 0;
242 }
243 
qcm_camera_off(struct uvd * uvd)244 static int qcm_camera_off(struct uvd *uvd)
245 {
246 	int ret;
247 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, STV_ISO_ENABLE, 0x00));
248 	return 0;
249 }
250 
qcm_hsv2rgb(u16 hue,u16 sat,u16 val,u16 * r,u16 * g,u16 * b)251 static void qcm_hsv2rgb(u16 hue, u16 sat, u16 val, u16 *r, u16 *g, u16 *b)
252 {
253 	unsigned int segment, valsat;
254 	signed int   h = (signed int) hue;
255 	unsigned int s = (sat - 32768) * 2;	/* rescale */
256 	unsigned int v = val;
257 	unsigned int p;
258 
259 	/*
260 	the registers controlling gain are 8 bit of which
261 	we affect only the last 4 bits with our gain.
262 	we know that if saturation is 0, (unsaturated) then
263 	we're grayscale (center axis of the colour cone) so
264 	we set rgb=value. we use a formula obtained from
265 	wikipedia to map the cone to the RGB plane. it's
266 	as follows for the human value case of h=0..360,
267 	s=0..1, v=0..1
268 	h_i = h/60 % 6 , f = h/60 - h_i , p = v(1-s)
269 	q = v(1 - f*s) , t = v(1 - (1-f)s)
270 	h_i==0 => r=v , g=t, b=p
271 	h_i==1 => r=q , g=v, b=p
272 	h_i==2 => r=p , g=v, b=t
273 	h_i==3 => r=p , g=q, b=v
274 	h_i==4 => r=t , g=p, b=v
275 	h_i==5 => r=v , g=p, b=q
276 	the bottom side (the point) and the stuff just up
277 	of that is black so we simplify those two cases.
278 	*/
279 	if (sat < 32768) {
280 		/* anything less than this is unsaturated */
281 		*r = val;
282 		*g = val;
283 		*b = val;
284 		return;
285 	}
286 	if (val <= (0xFFFF/8)) {
287 		/* anything less than this is black */
288 		*r = 0;
289 		*g = 0;
290 		*b = 0;
291 		return;
292 	}
293 
294 	/* the rest of this code is copying tukkat's
295 	implementation of the hsv2rgb conversion as taken
296 	from qc-usb-messenger code. the 10923 is 0xFFFF/6
297 	to divide the cone into 6 sectors.  */
298 
299 	segment = (h + 10923) & 0xFFFF;
300 	segment = segment*3 >> 16;		/* 0..2: 0=R, 1=G, 2=B */
301 	hue -= segment * 21845;			/* -10923..10923 */
302 	h = hue;
303 	h *= 3;
304 	valsat = v*s >> 16;			/* 0..65534 */
305 	p = v - valsat;
306 	if (h >= 0) {
307 		unsigned int t = v - (valsat * (32769 - h) >> 15);
308 		switch (segment) {
309 		case 0:	/* R-> */
310 			*r = v;
311 			*g = t;
312 			*b = p;
313 			break;
314 		case 1:	/* G-> */
315 			*r = p;
316 			*g = v;
317 			*b = t;
318 			break;
319 		case 2:	/* B-> */
320 			*r = t;
321 			*g = p;
322 			*b = v;
323 			break;
324 		}
325 	} else {
326 		unsigned int q = v - (valsat * (32769 + h) >> 15);
327 		switch (segment) {
328 		case 0:	/* ->R */
329 			*r = v;
330 			*g = p;
331 			*b = q;
332 			break;
333 		case 1:	/* ->G */
334 			*r = q;
335 			*g = v;
336 			*b = p;
337 			break;
338 		case 2:	/* ->B */
339 			*r = p;
340 			*g = q;
341 			*b = v;
342 			break;
343 		}
344 	}
345 }
346 
qcm_sensor_set_gains(struct uvd * uvd,u16 hue,u16 saturation,u16 value)347 static int qcm_sensor_set_gains(struct uvd *uvd, u16 hue,
348 	u16 saturation, u16 value)
349 {
350 	int ret;
351 	u16 r=0,g=0,b=0;
352 
353 	/* this code is based on qc-usb-messenger */
354 	qcm_hsv2rgb(hue, saturation, value, &r, &g, &b);
355 
356 	r >>= 12;
357 	g >>= 12;
358 	b >>= 12;
359 
360 	/* min val is 8 */
361 	r = max((u16) 8, r);
362 	g = max((u16) 8, g);
363 	b = max((u16) 8, b);
364 
365 	r |= 0x30;
366 	g |= 0x30;
367 	b |= 0x30;
368 
369 	/* set the r,g,b gain registers */
370 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x0509, r));
371 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x050A, g));
372 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x050B, b));
373 
374 	/* doing as qc-usb did */
375 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x050C, 0x2A));
376 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x050D, 0x01));
377 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x143F, 0x01));
378 
379 	return 0;
380 }
381 
qcm_sensor_set_exposure(struct uvd * uvd,int exposure)382 static int qcm_sensor_set_exposure(struct uvd *uvd, int exposure)
383 {
384 	int ret;
385 	int formedval;
386 
387 	/* calculation was from qc-usb-messenger driver */
388 	formedval = ( exposure >> 12 );
389 
390 	/* max value for formedval is 14 */
391 	formedval = min(formedval, 14);
392 
393 	CHECK_RET(ret, qcm_stv_setb(uvd->dev,
394 			0x143A, 0xF0 | formedval));
395 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x143F, 0x01));
396 	return 0;
397 }
398 
qcm_sensor_setlevels(struct uvd * uvd,int brightness,int contrast,int hue,int colour)399 static int qcm_sensor_setlevels(struct uvd *uvd, int brightness, int contrast,
400 					int hue, int colour)
401 {
402 	int ret;
403 	/* brightness is exposure, contrast is gain, colour is saturation */
404 	CHECK_RET(ret,
405 		qcm_sensor_set_exposure(uvd, brightness));
406 	CHECK_RET(ret, qcm_sensor_set_gains(uvd, hue, colour, contrast));
407 
408 	return 0;
409 }
410 
qcm_sensor_setsize(struct uvd * uvd,u8 size)411 static int qcm_sensor_setsize(struct uvd *uvd, u8 size)
412 {
413 	int ret;
414 
415 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x1505, size));
416 	return 0;
417 }
418 
qcm_sensor_set_shutter(struct uvd * uvd,int whiteness)419 static int qcm_sensor_set_shutter(struct uvd *uvd, int whiteness)
420 {
421 	int ret;
422 	/* some rescaling as done by the qc-usb-messenger code */
423 	if (whiteness > 0xC000)
424 		whiteness = 0xC000 + (whiteness & 0x3FFF)*8;
425 
426 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x143D,
427 				(whiteness >> 8) & 0xFF));
428 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x143E,
429 				(whiteness >> 16) & 0x03));
430 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x143F, 0x01));
431 
432 	return 0;
433 }
434 
qcm_sensor_init(struct uvd * uvd)435 static int qcm_sensor_init(struct uvd *uvd)
436 {
437 	struct qcm *cam = (struct qcm *) uvd->user_data;
438 	int ret;
439 	int i;
440 
441 	for (i=0; i < ARRAY_SIZE(regval_table) ; i++) {
442 		CHECK_RET(ret, qcm_stv_setb(uvd->dev,
443 					regval_table[i].reg,
444 					regval_table[i].val));
445 	}
446 
447 	CHECK_RET(ret, qcm_stv_setw(uvd->dev, 0x15c1,
448 				cpu_to_le16(ISOC_PACKET_SIZE)));
449 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x15c3, 0x08));
450 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, 0x143f, 0x01));
451 
452 	CHECK_RET(ret, qcm_stv_setb(uvd->dev, STV_ISO_ENABLE, 0x00));
453 
454 	CHECK_RET(ret, qcm_sensor_setsize(uvd, camera_sizes[cam->size].cmd));
455 
456 	CHECK_RET(ret, qcm_sensor_setlevels(uvd, uvd->vpic.brightness,
457 			uvd->vpic.contrast, uvd->vpic.hue, uvd->vpic.colour));
458 
459 	CHECK_RET(ret, qcm_sensor_set_shutter(uvd, uvd->vpic.whiteness));
460 	CHECK_RET(ret, qcm_sensor_setsize(uvd, camera_sizes[cam->size].cmd));
461 
462 	return 0;
463 }
464 
qcm_set_camera_size(struct uvd * uvd)465 static int qcm_set_camera_size(struct uvd *uvd)
466 {
467 	int ret;
468 	struct qcm *cam = (struct qcm *) uvd->user_data;
469 
470 	CHECK_RET(ret, qcm_sensor_setsize(uvd, camera_sizes[cam->size].cmd));
471 	cam->width = camera_sizes[cam->size].width;
472 	cam->height = camera_sizes[cam->size].height;
473 	uvd->videosize = VIDEOSIZE(cam->width, cam->height);
474 
475 	return 0;
476 }
477 
qcm_setup_on_open(struct uvd * uvd)478 static int qcm_setup_on_open(struct uvd *uvd)
479 {
480 	int ret;
481 
482 	CHECK_RET(ret, qcm_sensor_set_gains(uvd, uvd->vpic.hue,
483 				uvd->vpic.colour, uvd->vpic.contrast));
484 	CHECK_RET(ret, qcm_sensor_set_exposure(uvd, uvd->vpic.brightness));
485 	CHECK_RET(ret, qcm_sensor_set_shutter(uvd, uvd->vpic.whiteness));
486 	CHECK_RET(ret, qcm_set_camera_size(uvd));
487 	CHECK_RET(ret, qcm_camera_on(uvd));
488 	return 0;
489 }
490 
qcm_adjust_picture(struct uvd * uvd)491 static void qcm_adjust_picture(struct uvd *uvd)
492 {
493 	int ret;
494 	struct qcm *cam = (struct qcm *) uvd->user_data;
495 
496 	ret = qcm_camera_off(uvd);
497 	if (ret) {
498 		err("can't turn camera off. abandoning pic adjustment");
499 		return;
500 	}
501 
502 	/* if there's been a change in contrast, hue, or
503 	colour then we need to recalculate hsv in order
504 	to update gains */
505 	if ((cam->contrast != uvd->vpic.contrast) ||
506 		(cam->hue != uvd->vpic.hue) ||
507 		(cam->colour != uvd->vpic.colour)) {
508 		cam->contrast = uvd->vpic.contrast;
509 		cam->hue = uvd->vpic.hue;
510 		cam->colour = uvd->vpic.colour;
511 		ret = qcm_sensor_set_gains(uvd, cam->hue, cam->colour,
512 						cam->contrast);
513 		if (ret) {
514 			err("can't set gains. abandoning pic adjustment");
515 			return;
516 		}
517 	}
518 
519 	if (cam->brightness != uvd->vpic.brightness) {
520 		cam->brightness = uvd->vpic.brightness;
521 		ret = qcm_sensor_set_exposure(uvd, cam->brightness);
522 		if (ret) {
523 			err("can't set exposure. abandoning pic adjustment");
524 			return;
525 		}
526 	}
527 
528 	if (cam->whiteness != uvd->vpic.whiteness) {
529 		cam->whiteness = uvd->vpic.whiteness;
530 		qcm_sensor_set_shutter(uvd, cam->whiteness);
531 		if (ret) {
532 			err("can't set shutter. abandoning pic adjustment");
533 			return;
534 		}
535 	}
536 
537 	ret = qcm_camera_on(uvd);
538 	if (ret) {
539 		err("can't reenable camera. pic adjustment failed");
540 		return;
541 	}
542 }
543 
qcm_process_frame(struct uvd * uvd,u8 * cdata,int framelen)544 static int qcm_process_frame(struct uvd *uvd, u8 *cdata, int framelen)
545 {
546 	int datalen;
547 	int totaldata;
548 	struct framehdr {
549 		__be16 id;
550 		__be16 len;
551 	};
552 	struct framehdr *fhdr;
553 
554 	totaldata = 0;
555 	while (framelen) {
556 		fhdr = (struct framehdr *) cdata;
557 		datalen = be16_to_cpu(fhdr->len);
558 		framelen -= 4;
559 		cdata += 4;
560 
561 		if ((fhdr->id) == cpu_to_be16(0x8001)) {
562 			RingQueue_Enqueue(&uvd->dp, marker, 4);
563 			totaldata += 4;
564 			continue;
565 		}
566 		if ((fhdr->id & cpu_to_be16(0xFF00)) == cpu_to_be16(0x0200)) {
567 			RingQueue_Enqueue(&uvd->dp, cdata, datalen);
568 			totaldata += datalen;
569 		}
570 		framelen -= datalen;
571 		cdata += datalen;
572 	}
573 	return totaldata;
574 }
575 
qcm_compress_iso(struct uvd * uvd,struct urb * dataurb)576 static int qcm_compress_iso(struct uvd *uvd, struct urb *dataurb)
577 {
578 	int totlen;
579 	int i;
580 	unsigned char *cdata;
581 
582 	totlen=0;
583 	for (i = 0; i < dataurb->number_of_packets; i++) {
584 		int n = dataurb->iso_frame_desc[i].actual_length;
585 		int st = dataurb->iso_frame_desc[i].status;
586 
587 		cdata = dataurb->transfer_buffer +
588 			dataurb->iso_frame_desc[i].offset;
589 
590 		if (st < 0) {
591 			dev_warn(&uvd->dev->dev,
592 				 "Data error: packet=%d. len=%d. status=%d.\n",
593 				 i, n, st);
594 			uvd->stats.iso_err_count++;
595 			continue;
596 		}
597 		if (!n)
598 			continue;
599 
600 		totlen += qcm_process_frame(uvd, cdata, n);
601 	}
602 	return totlen;
603 }
604 
resubmit_urb(struct uvd * uvd,struct urb * urb)605 static void resubmit_urb(struct uvd *uvd, struct urb *urb)
606 {
607 	int ret;
608 
609 	urb->dev = uvd->dev;
610 	ret = usb_submit_urb(urb, GFP_ATOMIC);
611 	if (ret)
612 		err("usb_submit_urb error (%d)", ret);
613 }
614 
qcm_isoc_irq(struct urb * urb)615 static void qcm_isoc_irq(struct urb *urb)
616 {
617 	int len;
618 	struct uvd *uvd = urb->context;
619 
620 	if (!CAMERA_IS_OPERATIONAL(uvd))
621 		return;
622 
623 	if (!uvd->streaming)
624 		return;
625 
626 	uvd->stats.urb_count++;
627 
628 	if (!urb->actual_length) {
629 		resubmit_urb(uvd, urb);
630 		return;
631 	}
632 
633 	len = qcm_compress_iso(uvd, urb);
634 	resubmit_urb(uvd, urb);
635 	uvd->stats.urb_length = len;
636 	uvd->stats.data_count += len;
637 	if (len)
638 		RingQueue_WakeUpInterruptible(&uvd->dp);
639 }
640 
qcm_start_data(struct uvd * uvd)641 static int qcm_start_data(struct uvd *uvd)
642 {
643 	struct qcm *cam = (struct qcm *) uvd->user_data;
644 	int i;
645 	int errflag;
646 	int pktsz;
647 	int err;
648 
649 	pktsz = uvd->iso_packet_len;
650 	if (!CAMERA_IS_OPERATIONAL(uvd)) {
651 		err("Camera is not operational");
652 		return -EFAULT;
653 	}
654 
655 	err = usb_set_interface(uvd->dev, uvd->iface, uvd->ifaceAltActive);
656 	if (err < 0) {
657 		err("usb_set_interface error");
658 		uvd->last_error = err;
659 		return -EBUSY;
660 	}
661 
662 	for (i=0; i < USBVIDEO_NUMSBUF; i++) {
663 		int j, k;
664 		struct urb *urb = uvd->sbuf[i].urb;
665 		urb->dev = uvd->dev;
666 		urb->context = uvd;
667 		urb->pipe = usb_rcvisocpipe(uvd->dev, uvd->video_endp);
668 		urb->interval = 1;
669 		urb->transfer_flags = URB_ISO_ASAP;
670 		urb->transfer_buffer = uvd->sbuf[i].data;
671 		urb->complete = qcm_isoc_irq;
672 		urb->number_of_packets = FRAMES_PER_DESC;
673 		urb->transfer_buffer_length = pktsz * FRAMES_PER_DESC;
674 		for (j=k=0; j < FRAMES_PER_DESC; j++, k += pktsz) {
675 			urb->iso_frame_desc[j].offset = k;
676 			urb->iso_frame_desc[j].length = pktsz;
677 		}
678 	}
679 
680 	uvd->streaming = 1;
681 	uvd->curframe = -1;
682 	for (i=0; i < USBVIDEO_NUMSBUF; i++) {
683 		errflag = usb_submit_urb(uvd->sbuf[i].urb, GFP_KERNEL);
684 		if (errflag)
685 			err ("usb_submit_isoc(%d) ret %d", i, errflag);
686 	}
687 
688 	CHECK_RET(err, qcm_setup_input_int(cam, uvd));
689 	CHECK_RET(err, qcm_camera_on(uvd));
690 	return 0;
691 }
692 
qcm_stop_data(struct uvd * uvd)693 static void qcm_stop_data(struct uvd *uvd)
694 {
695 	struct qcm *cam = (struct qcm *) uvd->user_data;
696 	int i, j;
697 	int ret;
698 
699 	if ((uvd == NULL) || (!uvd->streaming) || (uvd->dev == NULL))
700 		return;
701 
702 	ret = qcm_camera_off(uvd);
703 	if (ret)
704 		dev_warn(&uvd->dev->dev, "couldn't turn the cam off.\n");
705 
706 	uvd->streaming = 0;
707 
708 	/* Unschedule all of the iso td's */
709 	for (i=0; i < USBVIDEO_NUMSBUF; i++)
710 		usb_kill_urb(uvd->sbuf[i].urb);
711 
712 	qcm_stop_int_data(cam);
713 
714 	if (!uvd->remove_pending) {
715 		/* Set packet size to 0 */
716 		j = usb_set_interface(uvd->dev, uvd->iface,
717 					uvd->ifaceAltInactive);
718 		if (j < 0) {
719 			err("usb_set_interface() error %d.", j);
720 			uvd->last_error = j;
721 		}
722 	}
723 }
724 
qcm_process_isoc(struct uvd * uvd,struct usbvideo_frame * frame)725 static void qcm_process_isoc(struct uvd *uvd, struct usbvideo_frame *frame)
726 {
727 	struct qcm *cam = (struct qcm *) uvd->user_data;
728 	int x;
729 	struct rgb *rgbL0;
730 	struct rgb *rgbL1;
731 	struct bayL0 *bayL0;
732 	struct bayL1 *bayL1;
733 	int hor,ver,hordel,verdel;
734 	assert(frame != NULL);
735 
736 	switch (cam->size) {
737 	case SIZE_160X120:
738 		hor = 162; ver = 124; hordel = 1; verdel = 2;
739 		break;
740 	case SIZE_320X240:
741 	default:
742 		hor = 324; ver = 248; hordel = 2; verdel = 4;
743 		break;
744 	}
745 
746 	if (frame->scanstate == ScanState_Scanning) {
747 		while (RingQueue_GetLength(&uvd->dp) >=
748 			 4 + (hor*verdel + hordel)) {
749 			if ((RING_QUEUE_PEEK(&uvd->dp, 0) == 0x00) &&
750 			    (RING_QUEUE_PEEK(&uvd->dp, 1) == 0xff) &&
751 			    (RING_QUEUE_PEEK(&uvd->dp, 2) == 0x00) &&
752 			    (RING_QUEUE_PEEK(&uvd->dp, 3) == 0xff)) {
753 				frame->curline = 0;
754 				frame->scanstate = ScanState_Lines;
755 				frame->frameState = FrameState_Grabbing;
756 				RING_QUEUE_DEQUEUE_BYTES(&uvd->dp, 4);
757 			/*
758 			* if we're starting, we need to discard the first
759 			* 4 lines of y bayer data
760 			* and the first 2 gr elements of x bayer data
761 			*/
762 				RING_QUEUE_DEQUEUE_BYTES(&uvd->dp,
763 							(hor*verdel + hordel));
764 				break;
765 			}
766 			RING_QUEUE_DEQUEUE_BYTES(&uvd->dp, 1);
767 		}
768 	}
769 
770 	if (frame->scanstate == ScanState_Scanning)
771 		return;
772 
773 	/* now we can start processing bayer data so long as we have at least
774 	* 2 lines worth of data. this is the simplest demosaicing method that
775 	* I could think of. I use each 2x2 bayer element without interpolation
776 	* to generate 4 rgb pixels.
777 	*/
778 	while ( frame->curline < cam->height &&
779 		(RingQueue_GetLength(&uvd->dp) >= hor*2)) {
780 		/* get 2 lines of bayer for demosaicing
781 		 * into 2 lines of RGB */
782 		RingQueue_Dequeue(&uvd->dp, cam->scratch, hor*2);
783 		bayL0 = (struct bayL0 *) cam->scratch;
784 		bayL1 = (struct bayL1 *) (cam->scratch + hor);
785 		/* frame->curline is the rgb y line */
786 		rgbL0 = (struct rgb *)
787 				( frame->data + (cam->width*3*frame->curline));
788 		/* w/2 because we're already doing 2 pixels */
789 		rgbL1 = rgbL0 + (cam->width/2);
790 
791 		for (x=0; x < cam->width; x+=2) {
792 			rgbL0->r = bayL0->r;
793 			rgbL0->g = bayL0->g;
794 			rgbL0->b = bayL1->b;
795 
796 			rgbL0->r2 = bayL0->r;
797 			rgbL0->g2 = bayL1->g;
798 			rgbL0->b2 = bayL1->b;
799 
800 			rgbL1->r = bayL0->r;
801 			rgbL1->g = bayL1->g;
802 			rgbL1->b = bayL1->b;
803 
804 			rgbL1->r2 = bayL0->r;
805 			rgbL1->g2 = bayL1->g;
806 			rgbL1->b2 = bayL1->b;
807 
808 			rgbL0++;
809 			rgbL1++;
810 
811 			bayL0++;
812 			bayL1++;
813 		}
814 
815 		frame->seqRead_Length += cam->width*3*2;
816 		frame->curline += 2;
817 	}
818 	/* See if we filled the frame */
819 	if (frame->curline == cam->height) {
820 		frame->frameState = FrameState_Done_Hold;
821 		frame->curline = 0;
822 		uvd->curframe = -1;
823 		uvd->stats.frame_num++;
824 	}
825 }
826 
827 /* taken from konicawc */
qcm_set_video_mode(struct uvd * uvd,struct video_window * vw)828 static int qcm_set_video_mode(struct uvd *uvd, struct video_window *vw)
829 {
830 	int ret;
831 	int newsize;
832 	int oldsize;
833 	int x = vw->width;
834 	int y = vw->height;
835 	struct qcm *cam = (struct qcm *) uvd->user_data;
836 
837 	if (x > 0 && y > 0) {
838 		DEBUG(2, "trying to find size %d,%d", x, y);
839 		for (newsize = 0; newsize <= MAX_FRAME_SIZE; newsize++) {
840 			if ((camera_sizes[newsize].width == x) &&
841 				(camera_sizes[newsize].height == y))
842 				break;
843 		}
844 	} else
845 		newsize = cam->size;
846 
847 	if (newsize > MAX_FRAME_SIZE) {
848 		DEBUG(1, "couldn't find size %d,%d", x, y);
849 		return -EINVAL;
850 	}
851 
852 	if (newsize == cam->size) {
853 		DEBUG(1, "Nothing to do");
854 		return 0;
855 	}
856 
857 	qcm_stop_data(uvd);
858 
859 	if (cam->size != newsize) {
860 		oldsize = cam->size;
861 		cam->size = newsize;
862 		ret = qcm_set_camera_size(uvd);
863 		if (ret) {
864 			err("Couldn't set camera size, err=%d",ret);
865 			/* restore the original size */
866 			cam->size = oldsize;
867 			return ret;
868 		}
869 	}
870 
871 	/* Flush the input queue and clear any current frame in progress */
872 
873 	RingQueue_Flush(&uvd->dp);
874 	if (uvd->curframe != -1) {
875 		uvd->frame[uvd->curframe].curline = 0;
876 		uvd->frame[uvd->curframe].seqRead_Length = 0;
877 		uvd->frame[uvd->curframe].seqRead_Index = 0;
878 	}
879 
880 	CHECK_RET(ret, qcm_start_data(uvd));
881 	return 0;
882 }
883 
qcm_configure_video(struct uvd * uvd)884 static int qcm_configure_video(struct uvd *uvd)
885 {
886 	int ret;
887 	memset(&uvd->vpic, 0, sizeof(uvd->vpic));
888 	memset(&uvd->vpic_old, 0x55, sizeof(uvd->vpic_old));
889 
890 	uvd->vpic.colour = colour;
891 	uvd->vpic.hue = hue;
892 	uvd->vpic.brightness = brightness;
893 	uvd->vpic.contrast = contrast;
894 	uvd->vpic.whiteness = whiteness;
895 	uvd->vpic.depth = 24;
896 	uvd->vpic.palette = VIDEO_PALETTE_RGB24;
897 
898 	memset(&uvd->vcap, 0, sizeof(uvd->vcap));
899 	strcpy(uvd->vcap.name, "QCM USB Camera");
900 	uvd->vcap.type = VID_TYPE_CAPTURE;
901 	uvd->vcap.channels = 1;
902 	uvd->vcap.audios = 0;
903 
904 	uvd->vcap.minwidth = camera_sizes[SIZE_160X120].width;
905 	uvd->vcap.minheight = camera_sizes[SIZE_160X120].height;
906 	uvd->vcap.maxwidth = camera_sizes[SIZE_320X240].width;
907 	uvd->vcap.maxheight = camera_sizes[SIZE_320X240].height;
908 
909 	memset(&uvd->vchan, 0, sizeof(uvd->vchan));
910 	uvd->vchan.flags = 0 ;
911 	uvd->vchan.tuners = 0;
912 	uvd->vchan.channel = 0;
913 	uvd->vchan.type = VIDEO_TYPE_CAMERA;
914 	strcpy(uvd->vchan.name, "Camera");
915 
916 	CHECK_RET(ret, qcm_sensor_init(uvd));
917 	return 0;
918 }
919 
qcm_probe(struct usb_interface * intf,const struct usb_device_id * devid)920 static int qcm_probe(struct usb_interface *intf,
921 			const struct usb_device_id *devid)
922 {
923 	int err;
924 	struct uvd *uvd;
925 	struct usb_device *dev = interface_to_usbdev(intf);
926 	struct qcm *cam;
927 	size_t buffer_size;
928 	unsigned char video_ep;
929 	struct usb_host_interface *interface;
930 	struct usb_endpoint_descriptor *endpoint;
931 	int i,j;
932 	unsigned int ifacenum, ifacenum_inact=0;
933 	__le16 sensor_id;
934 
935 	/* we don't support multiconfig cams */
936 	if (dev->descriptor.bNumConfigurations != 1)
937 		return -ENODEV;
938 
939 	/* first check for the video interface and not
940 	* the audio interface */
941 	interface = &intf->cur_altsetting[0];
942 	if ((interface->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
943 		|| (interface->desc.bInterfaceSubClass !=
944 			USB_CLASS_VENDOR_SPEC))
945 		return -ENODEV;
946 
947 	/*
948 	walk through each endpoint in each setting in the interface
949 	stop when we find the one that's an isochronous IN endpoint.
950 	*/
951 	for (i=0; i < intf->num_altsetting; i++) {
952 		interface = &intf->cur_altsetting[i];
953 		ifacenum = interface->desc.bAlternateSetting;
954 		/* walk the end points */
955 		for (j=0; j < interface->desc.bNumEndpoints; j++) {
956 			endpoint = &interface->endpoint[j].desc;
957 
958 			if (usb_endpoint_dir_out(endpoint))
959 				continue; /* not input then not good */
960 
961 			buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
962 			if (!buffer_size) {
963 				ifacenum_inact = ifacenum;
964 				continue; /* 0 pkt size is not what we want */
965 			}
966 
967 			if (usb_endpoint_xfer_isoc(endpoint)) {
968 				video_ep = endpoint->bEndpointAddress;
969 				/* break out of the search */
970 				goto good_videoep;
971 			}
972 		}
973 	}
974 	/* failed out since nothing useful was found */
975 	err("No suitable endpoint was found\n");
976 	return -ENODEV;
977 
978 good_videoep:
979 	/* disable isochronous stream before doing anything else */
980 	err = qcm_stv_setb(dev, STV_ISO_ENABLE, 0);
981 	if (err < 0) {
982 		err("Failed to disable sensor stream");
983 		return -EIO;
984 	}
985 
986 	/*
987 	Check that this is the same unknown sensor that is known to work. This
988 	sensor is suspected to be the ST VV6422C001. I'll check the same value
989 	that the qc-usb driver checks. This value is probably not even the
990 	sensor ID since it matches the USB dev ID. Oh well. If it doesn't
991 	match, it's probably a diff sensor so exit and apologize.
992 	*/
993 	err = qcm_stv_getw(dev, CMOS_SENSOR_IDREV, &sensor_id);
994 	if (err < 0) {
995 		err("Couldn't read sensor values. Err %d\n",err);
996 		return err;
997 	}
998 	if (sensor_id != cpu_to_le16(0x08F0)) {
999 		err("Sensor ID %x != %x. Unsupported. Sorry\n",
1000 			le16_to_cpu(sensor_id), (0x08F0));
1001 		return -ENODEV;
1002 	}
1003 
1004 	uvd = usbvideo_AllocateDevice(cams);
1005 	if (!uvd)
1006 		return -ENOMEM;
1007 
1008 	cam = (struct qcm *) uvd->user_data;
1009 
1010 	/* buf for doing demosaicing */
1011 	cam->scratch = kmalloc(324*2, GFP_KERNEL);
1012 	if (!cam->scratch) /* uvd freed in dereg */
1013 		return -ENOMEM;
1014 
1015 	/* yes, if we fail after here, cam->scratch gets freed
1016 	by qcm_free_uvd */
1017 
1018 	err = qcm_alloc_int_urb(cam);
1019 	if (err < 0)
1020 		return err;
1021 
1022 	/* yes, if we fail after here, int urb gets freed
1023 	by qcm_free_uvd */
1024 
1025 	RESTRICT_TO_RANGE(size, SIZE_160X120, SIZE_320X240);
1026 	cam->width = camera_sizes[size].width;
1027 	cam->height = camera_sizes[size].height;
1028 	cam->size = size;
1029 
1030 	uvd->debug = debug;
1031 	uvd->flags = 0;
1032 	uvd->dev = dev;
1033 	uvd->iface = intf->altsetting->desc.bInterfaceNumber;
1034 	uvd->ifaceAltActive = ifacenum;
1035 	uvd->ifaceAltInactive = ifacenum_inact;
1036 	uvd->video_endp = video_ep;
1037 	uvd->iso_packet_len = buffer_size;
1038 	uvd->paletteBits = 1L << VIDEO_PALETTE_RGB24;
1039 	uvd->defaultPalette = VIDEO_PALETTE_RGB24;
1040 	uvd->canvas = VIDEOSIZE(320, 240);
1041 	uvd->videosize = VIDEOSIZE(cam->width, cam->height);
1042 	err = qcm_configure_video(uvd);
1043 	if (err) {
1044 		err("failed to configure video settings");
1045 		return err;
1046 	}
1047 
1048 	err = usbvideo_RegisterVideoDevice(uvd);
1049 	if (err) { /* the uvd gets freed in Deregister */
1050 		err("usbvideo_RegisterVideoDevice() failed.");
1051 		return err;
1052 	}
1053 
1054 	uvd->max_frame_size = (320 * 240 * 3);
1055 	qcm_register_input(cam, dev);
1056 	usb_set_intfdata(intf, uvd);
1057 	return 0;
1058 }
1059 
qcm_free_uvd(struct uvd * uvd)1060 static void qcm_free_uvd(struct uvd *uvd)
1061 {
1062 	struct qcm *cam = (struct qcm *) uvd->user_data;
1063 
1064 	kfree(cam->scratch);
1065 	qcm_unregister_input(cam);
1066 	qcm_free_int(cam);
1067 }
1068 
1069 static struct usbvideo_cb qcm_driver = {
1070 	.probe = 		qcm_probe,
1071 	.setupOnOpen = 		qcm_setup_on_open,
1072 	.processData = 		qcm_process_isoc,
1073 	.setVideoMode = 	qcm_set_video_mode,
1074 	.startDataPump = 	qcm_start_data,
1075 	.stopDataPump = 	qcm_stop_data,
1076 	.adjustPicture = 	qcm_adjust_picture,
1077 	.userFree = 		qcm_free_uvd
1078 };
1079 
qcm_init(void)1080 static int __init qcm_init(void)
1081 {
1082 	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
1083 	       DRIVER_DESC "\n");
1084 
1085 	return usbvideo_register(
1086 		&cams,
1087 		MAX_CAMERAS,
1088 		sizeof(struct qcm),
1089 		"QCM",
1090 		&qcm_driver,
1091 		THIS_MODULE,
1092 		qcm_table);
1093 }
1094 
qcm_exit(void)1095 static void __exit qcm_exit(void)
1096 {
1097 	usbvideo_Deregister(&cams);
1098 }
1099 
1100 module_param(size, int, 0);
1101 MODULE_PARM_DESC(size, "Initial Size 0: 160x120 1: 320x240");
1102 module_param(colour, int, 0);
1103 MODULE_PARM_DESC(colour, "Initial colour");
1104 module_param(hue, int, 0);
1105 MODULE_PARM_DESC(hue, "Initial hue");
1106 module_param(brightness, int, 0);
1107 MODULE_PARM_DESC(brightness, "Initial brightness");
1108 module_param(contrast, int, 0);
1109 MODULE_PARM_DESC(contrast, "Initial contrast");
1110 module_param(whiteness, int, 0);
1111 MODULE_PARM_DESC(whiteness, "Initial whiteness");
1112 
1113 #ifdef CONFIG_USB_DEBUG
1114 module_param(debug, int, S_IRUGO | S_IWUSR);
1115 MODULE_PARM_DESC(debug, "Debug level: 0-9 (default=0)");
1116 #endif
1117 
1118 module_init(qcm_init);
1119 module_exit(qcm_exit);
1120 
1121 MODULE_LICENSE("GPL");
1122 MODULE_AUTHOR("Jaya Kumar");
1123 MODULE_DESCRIPTION("QCM USB Camera");
1124 MODULE_SUPPORTED_DEVICE("QCM USB Camera");
1125