• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Endpoints (formerly known as AOX) se401 USB Camera Driver
3  *
4  * Copyright (c) 2000 Jeroen B. Vreeken (pe1rxq@amsat.org)
5  *
6  * Still somewhat based on the Linux ov511 driver.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation; either version 2 of the License, or (at your
11  * option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16  * 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 Foundation,
20  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  *
23  * Thanks to Endpoints Inc. (www.endpoints.com) for making documentation on
24  * their chipset available and supporting me while writing this driver.
25  * 	- Jeroen Vreeken
26  */
27 
28 static const char version[] = "0.24";
29 
30 #include <linux/module.h>
31 #include <linux/init.h>
32 #include <linux/vmalloc.h>
33 #include <linux/slab.h>
34 #include <linux/pagemap.h>
35 #include <linux/usb.h>
36 #include "se401.h"
37 
38 static int flickerless;
39 static int video_nr = -1;
40 
41 static struct usb_device_id device_table [] = {
42 	{ USB_DEVICE(0x03e8, 0x0004) },/* Endpoints/Aox SE401 */
43 	{ USB_DEVICE(0x0471, 0x030b) },/* Philips PCVC665K */
44 	{ USB_DEVICE(0x047d, 0x5001) },/* Kensington 67014 */
45 	{ USB_DEVICE(0x047d, 0x5002) },/* Kensington 6701(5/7) */
46 	{ USB_DEVICE(0x047d, 0x5003) },/* Kensington 67016 */
47 	{ }
48 };
49 
50 MODULE_DEVICE_TABLE(usb, device_table);
51 
52 MODULE_AUTHOR("Jeroen Vreeken <pe1rxq@amsat.org>");
53 MODULE_DESCRIPTION("SE401 USB Camera Driver");
54 MODULE_LICENSE("GPL");
55 module_param(flickerless, int, 0);
56 MODULE_PARM_DESC(flickerless, "Net frequency to adjust exposure time to (0/50/60)");
57 module_param(video_nr, int, 0);
58 
59 static struct usb_driver se401_driver;
60 
61 
62 /**********************************************************************
63  *
64  * Memory management
65  *
66  **********************************************************************/
rvmalloc(unsigned long size)67 static void *rvmalloc(unsigned long size)
68 {
69 	void *mem;
70 	unsigned long adr;
71 
72 	size = PAGE_ALIGN(size);
73 	mem = vmalloc_32(size);
74 	if (!mem)
75 		return NULL;
76 
77 	memset(mem, 0, size); /* Clear the ram out, no junk to the user */
78 	adr = (unsigned long) mem;
79 	while (size > 0) {
80 		SetPageReserved(vmalloc_to_page((void *)adr));
81 		adr += PAGE_SIZE;
82 		size -= PAGE_SIZE;
83 	}
84 
85 	return mem;
86 }
87 
rvfree(void * mem,unsigned long size)88 static void rvfree(void *mem, unsigned long size)
89 {
90 	unsigned long adr;
91 
92 	if (!mem)
93 		return;
94 
95 	adr = (unsigned long) mem;
96 	while ((long) size > 0) {
97 		ClearPageReserved(vmalloc_to_page((void *)adr));
98 		adr += PAGE_SIZE;
99 		size -= PAGE_SIZE;
100 	}
101 	vfree(mem);
102 }
103 
104 
105 
106 /****************************************************************************
107  *
108  * se401 register read/write functions
109  *
110  ***************************************************************************/
111 
se401_sndctrl(int set,struct usb_se401 * se401,unsigned short req,unsigned short value,unsigned char * cp,int size)112 static int se401_sndctrl(int set, struct usb_se401 *se401, unsigned short req,
113 			 unsigned short value, unsigned char *cp, int size)
114 {
115 	return usb_control_msg (
116 		se401->dev,
117 		set ? usb_sndctrlpipe(se401->dev, 0) : usb_rcvctrlpipe(se401->dev, 0),
118 		req,
119 		(set ? USB_DIR_OUT : USB_DIR_IN) | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
120 		value,
121 		0,
122 		cp,
123 		size,
124 		1000
125 	);
126 }
127 
se401_set_feature(struct usb_se401 * se401,unsigned short selector,unsigned short param)128 static int se401_set_feature(struct usb_se401 *se401, unsigned short selector,
129 			     unsigned short param)
130 {
131 	/* specs say that the selector (address) should go in the value field
132 	   and the param in index, but in the logs of the windows driver they do
133 	   this the other way around...
134 	 */
135 	return usb_control_msg (
136 		se401->dev,
137 		usb_sndctrlpipe(se401->dev, 0),
138 		SE401_REQ_SET_EXT_FEATURE,
139 		USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
140 		param,
141 		selector,
142 		NULL,
143 		0,
144 		1000
145 	);
146 }
147 
se401_get_feature(struct usb_se401 * se401,unsigned short selector)148 static unsigned short se401_get_feature(struct usb_se401 *se401,
149 					unsigned short selector)
150 {
151 	/* For 'set' the selecetor should be in index, not sure if the spec is
152 	   wrong here to....
153 	 */
154 	unsigned char cp[2];
155 	usb_control_msg (
156 		se401->dev,
157 		usb_rcvctrlpipe(se401->dev, 0),
158 		SE401_REQ_GET_EXT_FEATURE,
159 		USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
160 		0,
161 		selector,
162 		cp,
163 		2,
164 		1000
165 	);
166 	return cp[0]+cp[1]*256;
167 }
168 
169 /****************************************************************************
170  *
171  * Camera control
172  *
173  ***************************************************************************/
174 
175 
se401_send_pict(struct usb_se401 * se401)176 static int se401_send_pict(struct usb_se401 *se401)
177 {
178 	se401_set_feature(se401, HV7131_REG_TITL, se401->expose_l);/* integration time low */
179 	se401_set_feature(se401, HV7131_REG_TITM, se401->expose_m);/* integration time mid */
180 	se401_set_feature(se401, HV7131_REG_TITU, se401->expose_h);/* integration time mid */
181 	se401_set_feature(se401, HV7131_REG_ARLV, se401->resetlevel);/* reset level value */
182 	se401_set_feature(se401, HV7131_REG_ARCG, se401->rgain);/* red color gain */
183 	se401_set_feature(se401, HV7131_REG_AGCG, se401->ggain);/* green color gain */
184 	se401_set_feature(se401, HV7131_REG_ABCG, se401->bgain);/* blue color gain */
185 
186 	return 0;
187 }
188 
se401_set_exposure(struct usb_se401 * se401,int brightness)189 static void se401_set_exposure(struct usb_se401 *se401, int brightness)
190 {
191 	int integration=brightness<<5;
192 
193 	if (flickerless==50) {
194 		integration=integration-integration%106667;
195 	}
196 	if (flickerless==60) {
197 		integration=integration-integration%88889;
198 	}
199 	se401->brightness=integration>>5;
200 	se401->expose_h=(integration>>16)&0xff;
201 	se401->expose_m=(integration>>8)&0xff;
202 	se401->expose_l=integration&0xff;
203 }
204 
se401_get_pict(struct usb_se401 * se401,struct video_picture * p)205 static int se401_get_pict(struct usb_se401 *se401, struct video_picture *p)
206 {
207 	p->brightness=se401->brightness;
208 	if (se401->enhance) {
209 		p->whiteness=32768;
210 	} else {
211 		p->whiteness=0;
212 	}
213 	p->colour=65535;
214 	p->contrast=65535;
215 	p->hue=se401->rgain<<10;
216 	p->palette=se401->palette;
217 	p->depth=3; /* rgb24 */
218 	return 0;
219 }
220 
221 
se401_set_pict(struct usb_se401 * se401,struct video_picture * p)222 static int se401_set_pict(struct usb_se401 *se401, struct video_picture *p)
223 {
224 	if (p->palette != VIDEO_PALETTE_RGB24)
225 		return 1;
226 	se401->palette=p->palette;
227 	if (p->hue!=se401->hue) {
228 		se401->rgain= p->hue>>10;
229 		se401->bgain= 0x40-(p->hue>>10);
230 		se401->hue=p->hue;
231 	}
232 	if (p->brightness!=se401->brightness) {
233 		se401_set_exposure(se401, p->brightness);
234 	}
235 	if (p->whiteness>=32768) {
236 		se401->enhance=1;
237 	} else {
238 		se401->enhance=0;
239 	}
240 	se401_send_pict(se401);
241 	se401_send_pict(se401);
242 	return 0;
243 }
244 
245 /*
246 	Hyundai have some really nice docs about this and other sensor related
247 	stuff on their homepage: www.hei.co.kr
248 */
se401_auto_resetlevel(struct usb_se401 * se401)249 static void se401_auto_resetlevel(struct usb_se401 *se401)
250 {
251 	unsigned int ahrc, alrc;
252 	int oldreset=se401->resetlevel;
253 
254 	/* For some reason this normally read-only register doesn't get reset
255 	   to zero after reading them just once...
256 	 */
257 	se401_get_feature(se401, HV7131_REG_HIREFNOH);
258 	se401_get_feature(se401, HV7131_REG_HIREFNOL);
259 	se401_get_feature(se401, HV7131_REG_LOREFNOH);
260 	se401_get_feature(se401, HV7131_REG_LOREFNOL);
261 	ahrc=256*se401_get_feature(se401, HV7131_REG_HIREFNOH) +
262 	    se401_get_feature(se401, HV7131_REG_HIREFNOL);
263 	alrc=256*se401_get_feature(se401, HV7131_REG_LOREFNOH) +
264 	    se401_get_feature(se401, HV7131_REG_LOREFNOL);
265 
266 	/* Not an exact science, but it seems to work pretty well... */
267 	if (alrc > 10) {
268 		while (alrc>=10 && se401->resetlevel < 63) {
269 			se401->resetlevel++;
270 			alrc /=2;
271 		}
272 	} else if (ahrc > 20) {
273 		while (ahrc>=20 && se401->resetlevel > 0) {
274 			se401->resetlevel--;
275 			ahrc /=2;
276 		}
277 	}
278 	if (se401->resetlevel!=oldreset)
279 		se401_set_feature(se401, HV7131_REG_ARLV, se401->resetlevel);
280 
281 	return;
282 }
283 
284 /* irq handler for snapshot button */
se401_button_irq(struct urb * urb)285 static void se401_button_irq(struct urb *urb)
286 {
287 	struct usb_se401 *se401 = urb->context;
288 	int status;
289 
290 	if (!se401->dev) {
291 		dev_info(&urb->dev->dev, "device vapourished\n");
292 		return;
293 	}
294 
295 	switch (urb->status) {
296 	case 0:
297 		/* success */
298 		break;
299 	case -ECONNRESET:
300 	case -ENOENT:
301 	case -ESHUTDOWN:
302 		/* this urb is terminated, clean up */
303 		dbg("%s - urb shutting down with status: %d", __func__, urb->status);
304 		return;
305 	default:
306 		dbg("%s - nonzero urb status received: %d", __func__, urb->status);
307 		goto exit;
308 	}
309 
310 	if (urb->actual_length >=2) {
311 		if (se401->button)
312 			se401->buttonpressed=1;
313 	}
314 exit:
315 	status = usb_submit_urb (urb, GFP_ATOMIC);
316 	if (status)
317 		err ("%s - usb_submit_urb failed with result %d",
318 		     __func__, status);
319 }
320 
se401_video_irq(struct urb * urb)321 static void se401_video_irq(struct urb *urb)
322 {
323 	struct usb_se401 *se401 = urb->context;
324 	int length = urb->actual_length;
325 
326 	/* ohoh... */
327 	if (!se401->streaming)
328 		return;
329 
330 	if (!se401->dev) {
331 		dev_info(&urb->dev->dev, "device vapourished\n");
332 		return;
333 	}
334 
335 	/* 0 sized packets happen if we are to fast, but sometimes the camera
336 	   keeps sending them forever...
337 	 */
338 	if (length && !urb->status) {
339 		se401->nullpackets=0;
340 		switch(se401->scratch[se401->scratch_next].state) {
341 			case BUFFER_READY:
342 			case BUFFER_BUSY: {
343 				se401->dropped++;
344 				break;
345 			}
346 			case BUFFER_UNUSED: {
347 				memcpy(se401->scratch[se401->scratch_next].data, (unsigned char *)urb->transfer_buffer, length);
348 				se401->scratch[se401->scratch_next].state=BUFFER_READY;
349 				se401->scratch[se401->scratch_next].offset=se401->bayeroffset;
350 				se401->scratch[se401->scratch_next].length=length;
351 				if (waitqueue_active(&se401->wq)) {
352 					wake_up_interruptible(&se401->wq);
353 				}
354 				se401->scratch_overflow=0;
355 				se401->scratch_next++;
356 				if (se401->scratch_next>=SE401_NUMSCRATCH)
357 					se401->scratch_next=0;
358 				break;
359 			}
360 		}
361 		se401->bayeroffset+=length;
362 		if (se401->bayeroffset>=se401->cheight*se401->cwidth) {
363 			se401->bayeroffset=0;
364 		}
365 	} else {
366 		se401->nullpackets++;
367 		if (se401->nullpackets > SE401_MAX_NULLPACKETS) {
368 			if (waitqueue_active(&se401->wq)) {
369 				wake_up_interruptible(&se401->wq);
370 			}
371 		}
372 	}
373 
374 	/* Resubmit urb for new data */
375 	urb->status=0;
376 	urb->dev=se401->dev;
377 	if(usb_submit_urb(urb, GFP_KERNEL))
378 		dev_info(&urb->dev->dev, "urb burned down\n");
379 	return;
380 }
381 
se401_send_size(struct usb_se401 * se401,int width,int height)382 static void se401_send_size(struct usb_se401 *se401, int width, int height)
383 {
384 	int i=0;
385 	int mode=0x03; /* No compression */
386 	int sendheight=height;
387 	int sendwidth=width;
388 
389 	/* JangGu compression can only be used with the camera supported sizes,
390 	   but bayer seems to work with any size that fits on the sensor.
391 	   We check if we can use compression with the current size with either
392 	   4 or 16 times subcapturing, if not we use uncompressed bayer data
393 	   but this will result in cutouts of the maximum size....
394 	 */
395 	while (i<se401->sizes && !(se401->width[i]==width && se401->height[i]==height))
396 		i++;
397 	while (i<se401->sizes) {
398 		if (se401->width[i]==width*2 && se401->height[i]==height*2) {
399 			sendheight=se401->height[i];
400 			sendwidth=se401->width[i];
401 			mode=0x40;
402 		}
403 		if (se401->width[i]==width*4 && se401->height[i]==height*4) {
404 			sendheight=se401->height[i];
405 			sendwidth=se401->width[i];
406 			mode=0x42;
407 		}
408 		i++;
409 	}
410 
411 	se401_sndctrl(1, se401, SE401_REQ_SET_WIDTH, sendwidth, NULL, 0);
412 	se401_sndctrl(1, se401, SE401_REQ_SET_HEIGHT, sendheight, NULL, 0);
413 	se401_set_feature(se401, SE401_OPERATINGMODE, mode);
414 
415 	if (mode==0x03) {
416 		se401->format=FMT_BAYER;
417 	} else {
418 		se401->format=FMT_JANGGU;
419 	}
420 
421 	return;
422 }
423 
424 /*
425 	In this function se401_send_pict is called several times,
426 	for some reason (depending on the state of the sensor and the phase of
427 	the moon :) doing this only in either place doesn't always work...
428 */
se401_start_stream(struct usb_se401 * se401)429 static int se401_start_stream(struct usb_se401 *se401)
430 {
431 	struct urb *urb;
432 	int err=0, i;
433 	se401->streaming=1;
434 
435 	se401_sndctrl(1, se401, SE401_REQ_CAMERA_POWER, 1, NULL, 0);
436 	se401_sndctrl(1, se401, SE401_REQ_LED_CONTROL, 1, NULL, 0);
437 
438 	/* Set picture settings */
439 	se401_set_feature(se401, HV7131_REG_MODE_B, 0x05);/*windowed + pix intg */
440 	se401_send_pict(se401);
441 
442 	se401_send_size(se401, se401->cwidth, se401->cheight);
443 
444 	se401_sndctrl(1, se401, SE401_REQ_START_CONTINUOUS_CAPTURE, 0, NULL, 0);
445 
446 	/* Do some memory allocation */
447 	for (i=0; i<SE401_NUMFRAMES; i++) {
448 		se401->frame[i].data=se401->fbuf + i * se401->maxframesize;
449 		se401->frame[i].curpix=0;
450 	}
451 	for (i=0; i<SE401_NUMSBUF; i++) {
452 		se401->sbuf[i].data=kmalloc(SE401_PACKETSIZE, GFP_KERNEL);
453 		if (!se401->sbuf[i].data) {
454 			for(i = i - 1; i >= 0; i--) {
455 				kfree(se401->sbuf[i].data);
456 				se401->sbuf[i].data = NULL;
457 			}
458 			return -ENOMEM;
459 		}
460 	}
461 
462 	se401->bayeroffset=0;
463 	se401->scratch_next=0;
464 	se401->scratch_use=0;
465 	se401->scratch_overflow=0;
466 	for (i=0; i<SE401_NUMSCRATCH; i++) {
467 		se401->scratch[i].data=kmalloc(SE401_PACKETSIZE, GFP_KERNEL);
468 		if (!se401->scratch[i].data) {
469 			for(i = i - 1; i >= 0; i--) {
470 				kfree(se401->scratch[i].data);
471 				se401->scratch[i].data = NULL;
472 			}
473 			goto nomem_sbuf;
474 		}
475 		se401->scratch[i].state=BUFFER_UNUSED;
476 	}
477 
478 	for (i=0; i<SE401_NUMSBUF; i++) {
479 		urb=usb_alloc_urb(0, GFP_KERNEL);
480 		if(!urb) {
481 			for(i = i - 1; i >= 0; i--) {
482 				usb_kill_urb(se401->urb[i]);
483 				usb_free_urb(se401->urb[i]);
484 				se401->urb[i] = NULL;
485 			}
486 			goto nomem_scratch;
487 		}
488 
489 		usb_fill_bulk_urb(urb, se401->dev,
490 			usb_rcvbulkpipe(se401->dev, SE401_VIDEO_ENDPOINT),
491 			se401->sbuf[i].data, SE401_PACKETSIZE,
492 			se401_video_irq,
493 			se401);
494 
495 		se401->urb[i]=urb;
496 
497 		err=usb_submit_urb(se401->urb[i], GFP_KERNEL);
498 		if(err)
499 			err("urb burned down");
500 	}
501 
502 	se401->framecount=0;
503 
504 	return 0;
505 
506  nomem_scratch:
507 	for (i=0; i<SE401_NUMSCRATCH; i++) {
508 		kfree(se401->scratch[i].data);
509 		se401->scratch[i].data = NULL;
510 	}
511  nomem_sbuf:
512 	for (i=0; i<SE401_NUMSBUF; i++) {
513 		kfree(se401->sbuf[i].data);
514 		se401->sbuf[i].data = NULL;
515 	}
516 	return -ENOMEM;
517 }
518 
se401_stop_stream(struct usb_se401 * se401)519 static int se401_stop_stream(struct usb_se401 *se401)
520 {
521 	int i;
522 
523 	if (!se401->streaming || !se401->dev)
524 		return 1;
525 
526 	se401->streaming=0;
527 
528 	se401_sndctrl(1, se401, SE401_REQ_STOP_CONTINUOUS_CAPTURE, 0, NULL, 0);
529 
530 	se401_sndctrl(1, se401, SE401_REQ_LED_CONTROL, 0, NULL, 0);
531 	se401_sndctrl(1, se401, SE401_REQ_CAMERA_POWER, 0, NULL, 0);
532 
533 	for (i=0; i<SE401_NUMSBUF; i++) if (se401->urb[i]) {
534 		usb_kill_urb(se401->urb[i]);
535 		usb_free_urb(se401->urb[i]);
536 		se401->urb[i]=NULL;
537 		kfree(se401->sbuf[i].data);
538 	}
539 	for (i=0; i<SE401_NUMSCRATCH; i++) {
540 		kfree(se401->scratch[i].data);
541 		se401->scratch[i].data=NULL;
542 	}
543 
544 	return 0;
545 }
546 
se401_set_size(struct usb_se401 * se401,int width,int height)547 static int se401_set_size(struct usb_se401 *se401, int width, int height)
548 {
549 	int wasstreaming=se401->streaming;
550 	/* Check to see if we need to change */
551 	if (se401->cwidth==width && se401->cheight==height)
552 		return 0;
553 
554 	/* Check for a valid mode */
555 	if (!width || !height)
556 		return 1;
557 	if ((width & 1) || (height & 1))
558 		return 1;
559 	if (width>se401->width[se401->sizes-1])
560 		return 1;
561 	if (height>se401->height[se401->sizes-1])
562 		return 1;
563 
564 	/* Stop a current stream and start it again at the new size */
565 	if (wasstreaming)
566 		se401_stop_stream(se401);
567 	se401->cwidth=width;
568 	se401->cheight=height;
569 	if (wasstreaming)
570 		se401_start_stream(se401);
571 	return 0;
572 }
573 
574 
575 /****************************************************************************
576  *
577  * Video Decoding
578  *
579  ***************************************************************************/
580 
581 /*
582 	This shouldn't really be done in a v4l driver....
583 	But it does make the image look a lot more usable.
584 	Basically it lifts the dark pixels more than the light pixels.
585 */
enhance_picture(unsigned char * frame,int len)586 static inline void enhance_picture(unsigned char *frame, int len)
587 {
588 	while (len--) {
589 		*frame=(((*frame^255)*(*frame^255))/255)^255;
590 		frame++;
591 	}
592 }
593 
decode_JangGu_integrate(struct usb_se401 * se401,int data)594 static inline void decode_JangGu_integrate(struct usb_se401 *se401, int data)
595 {
596 	struct se401_frame *frame=&se401->frame[se401->curframe];
597 	int linelength=se401->cwidth*3;
598 
599 	if (frame->curlinepix >= linelength) {
600 		frame->curlinepix=0;
601 		frame->curline+=linelength;
602 	}
603 
604 	/* First three are absolute, all others relative.
605 	 * Format is rgb from right to left (mirrorred image),
606 	 * we flip it to get bgr from left to right. */
607 	if (frame->curlinepix < 3) {
608 		*(frame->curline-frame->curlinepix)=1+data*4;
609 	} else {
610 		*(frame->curline-frame->curlinepix)=
611 		    *(frame->curline-frame->curlinepix+3)+data*4;
612 	}
613 	frame->curlinepix++;
614 }
615 
decode_JangGu_vlc(struct usb_se401 * se401,unsigned char * data,int bit_exp,int packetlength)616 static inline void decode_JangGu_vlc (struct usb_se401 *se401, unsigned char *data, int bit_exp, int packetlength)
617 {
618 	int pos=0;
619 	int vlc_cod=0;
620 	int vlc_size=0;
621 	int vlc_data=0;
622 	int bit_cur;
623 	int bit;
624 	data+=4;
625 	while (pos < packetlength) {
626 		bit_cur=8;
627 		while (bit_cur && bit_exp) {
628 			bit=((*data)>>(bit_cur-1))&1;
629 			if (!vlc_cod) {
630 				if (bit) {
631 					vlc_size++;
632 				} else {
633 					if (!vlc_size) {
634 						decode_JangGu_integrate(se401, 0);
635 					} else {
636 						vlc_cod=2;
637 						vlc_data=0;
638 					}
639 				}
640 			} else {
641 				if (vlc_cod==2) {
642 					if (!bit)
643 						vlc_data =  -(1<<vlc_size) + 1;
644 					vlc_cod--;
645 				}
646 				vlc_size--;
647 				vlc_data+=bit<<vlc_size;
648 				if (!vlc_size) {
649 					decode_JangGu_integrate(se401, vlc_data);
650 					vlc_cod=0;
651 				}
652 			}
653 			bit_cur--;
654 			bit_exp--;
655 		}
656 		pos++;
657 		data++;
658 	}
659 }
660 
decode_JangGu(struct usb_se401 * se401,struct se401_scratch * buffer)661 static inline void decode_JangGu (struct usb_se401 *se401, struct se401_scratch *buffer)
662 {
663 	unsigned char *data=buffer->data;
664 	int len=buffer->length;
665 	int bit_exp=0, pix_exp=0, frameinfo=0, packetlength=0, size;
666 	int datapos=0;
667 
668 	/* New image? */
669 	if (!se401->frame[se401->curframe].curpix) {
670 		se401->frame[se401->curframe].curlinepix=0;
671 		se401->frame[se401->curframe].curline=
672 		    se401->frame[se401->curframe].data+
673 		    se401->cwidth*3-1;
674 		if (se401->frame[se401->curframe].grabstate==FRAME_READY)
675 			se401->frame[se401->curframe].grabstate=FRAME_GRABBING;
676 		se401->vlcdatapos=0;
677 	}
678 	while (datapos < len) {
679 		size=1024-se401->vlcdatapos;
680 		if (size+datapos > len)
681 			size=len-datapos;
682 		memcpy(se401->vlcdata+se401->vlcdatapos, data+datapos, size);
683 		se401->vlcdatapos+=size;
684 		packetlength=0;
685 		if (se401->vlcdatapos >= 4) {
686 			bit_exp=se401->vlcdata[3]+(se401->vlcdata[2]<<8);
687 			pix_exp=se401->vlcdata[1]+((se401->vlcdata[0]&0x3f)<<8);
688 			frameinfo=se401->vlcdata[0]&0xc0;
689 			packetlength=((bit_exp+47)>>4)<<1;
690 			if (packetlength > 1024) {
691 				se401->vlcdatapos=0;
692 				datapos=len;
693 				packetlength=0;
694 				se401->error++;
695 				se401->frame[se401->curframe].curpix=0;
696 			}
697 		}
698 		if (packetlength && se401->vlcdatapos >= packetlength) {
699 			decode_JangGu_vlc(se401, se401->vlcdata, bit_exp, packetlength);
700 			se401->frame[se401->curframe].curpix+=pix_exp*3;
701 			datapos+=size-(se401->vlcdatapos-packetlength);
702 			se401->vlcdatapos=0;
703 			if (se401->frame[se401->curframe].curpix>=se401->cwidth*se401->cheight*3) {
704 				if (se401->frame[se401->curframe].curpix==se401->cwidth*se401->cheight*3) {
705 					if (se401->frame[se401->curframe].grabstate==FRAME_GRABBING) {
706 						se401->frame[se401->curframe].grabstate=FRAME_DONE;
707 						se401->framecount++;
708 						se401->readcount++;
709 					}
710 					if (se401->frame[(se401->curframe+1)&(SE401_NUMFRAMES-1)].grabstate==FRAME_READY) {
711 						se401->curframe=(se401->curframe+1) & (SE401_NUMFRAMES-1);
712 					}
713 				} else {
714 					se401->error++;
715 				}
716 				se401->frame[se401->curframe].curpix=0;
717 				datapos=len;
718 			}
719 		} else {
720 			datapos+=size;
721 		}
722 	}
723 }
724 
decode_bayer(struct usb_se401 * se401,struct se401_scratch * buffer)725 static inline void decode_bayer (struct usb_se401 *se401, struct se401_scratch *buffer)
726 {
727 	unsigned char *data=buffer->data;
728 	int len=buffer->length;
729 	int offset=buffer->offset;
730 	int datasize=se401->cwidth*se401->cheight;
731 	struct se401_frame *frame=&se401->frame[se401->curframe];
732 
733 	unsigned char *framedata=frame->data, *curline, *nextline;
734 	int width=se401->cwidth;
735 	int blineoffset=0, bline;
736 	int linelength=width*3, i;
737 
738 
739 	if (frame->curpix==0) {
740 		if (frame->grabstate==FRAME_READY) {
741 			frame->grabstate=FRAME_GRABBING;
742 		}
743 		frame->curline=framedata+linelength;
744 		frame->curlinepix=0;
745 	}
746 
747 	if (offset!=frame->curpix) {
748 		/* Regard frame as lost :( */
749 		frame->curpix=0;
750 		se401->error++;
751 		return;
752 	}
753 
754 	/* Check if we have to much data */
755 	if (frame->curpix+len > datasize) {
756 		len=datasize-frame->curpix;
757 	}
758 	if (se401->cheight%4)
759 		blineoffset=1;
760 	bline=frame->curpix/se401->cwidth+blineoffset;
761 
762 	curline=frame->curline;
763 	nextline=curline+linelength;
764 	if (nextline >= framedata+datasize*3)
765 		nextline=curline;
766 	while (len) {
767 		if (frame->curlinepix>=width) {
768 			frame->curlinepix-=width;
769 			bline=frame->curpix/width+blineoffset;
770 			curline+=linelength*2;
771 			nextline+=linelength*2;
772 			if (curline >= framedata+datasize*3) {
773 				frame->curlinepix++;
774 				curline-=3;
775 				nextline-=3;
776 				len--;
777 				data++;
778 				frame->curpix++;
779 			}
780 			if (nextline >= framedata+datasize*3)
781 				nextline=curline;
782 		}
783 		if ((bline&1)) {
784 			if ((frame->curlinepix&1)) {
785 				*(curline+2)=*data;
786 				*(curline-1)=*data;
787 				*(nextline+2)=*data;
788 				*(nextline-1)=*data;
789 			} else {
790 				*(curline+1)=
791 					(*(curline+1)+*data)/2;
792 				*(curline-2)=
793 					(*(curline-2)+*data)/2;
794 				*(nextline+1)=*data;
795 				*(nextline-2)=*data;
796 			}
797 		} else {
798 			if ((frame->curlinepix&1)) {
799 				*(curline+1)=
800 					(*(curline+1)+*data)/2;
801 				*(curline-2)=
802 					(*(curline-2)+*data)/2;
803 				*(nextline+1)=*data;
804 				*(nextline-2)=*data;
805 			} else {
806 				*curline=*data;
807 				*(curline-3)=*data;
808 				*nextline=*data;
809 				*(nextline-3)=*data;
810 			}
811 		}
812 		frame->curlinepix++;
813 		curline-=3;
814 		nextline-=3;
815 		len--;
816 		data++;
817 		frame->curpix++;
818 	}
819 	frame->curline=curline;
820 
821 	if (frame->curpix>=datasize) {
822 		/* Fix the top line */
823 		framedata+=linelength;
824 		for (i=0; i<linelength; i++) {
825 			framedata--;
826 			*framedata=*(framedata+linelength);
827 		}
828 		/* Fix the left side (green is already present) */
829 		for (i=0; i<se401->cheight; i++) {
830 			*framedata=*(framedata+3);
831 			*(framedata+1)=*(framedata+4);
832 			*(framedata+2)=*(framedata+5);
833 			framedata+=linelength;
834 		}
835 		frame->curpix=0;
836 		frame->grabstate=FRAME_DONE;
837 		se401->framecount++;
838 		se401->readcount++;
839 		if (se401->frame[(se401->curframe+1)&(SE401_NUMFRAMES-1)].grabstate==FRAME_READY) {
840 			se401->curframe=(se401->curframe+1) & (SE401_NUMFRAMES-1);
841 		}
842 	}
843 }
844 
se401_newframe(struct usb_se401 * se401,int framenr)845 static int se401_newframe(struct usb_se401 *se401, int framenr)
846 {
847 	DECLARE_WAITQUEUE(wait, current);
848 	int errors=0;
849 
850 	while (se401->streaming &&
851 	    (se401->frame[framenr].grabstate==FRAME_READY ||
852 	     se401->frame[framenr].grabstate==FRAME_GRABBING) ) {
853 		if(!se401->frame[framenr].curpix) {
854 			errors++;
855 		}
856 		wait_interruptible(
857 		    se401->scratch[se401->scratch_use].state!=BUFFER_READY,
858 		    &se401->wq,
859 		    &wait
860 		);
861 		if (se401->nullpackets > SE401_MAX_NULLPACKETS) {
862 			se401->nullpackets=0;
863 			dev_info(&se401->dev->dev,
864 				 "too many null length packets, restarting capture\n");
865 			se401_stop_stream(se401);
866 			se401_start_stream(se401);
867 		} else {
868 			if (se401->scratch[se401->scratch_use].state!=BUFFER_READY) {
869 				se401->frame[framenr].grabstate=FRAME_ERROR;
870 				return -EIO;
871 			}
872 			se401->scratch[se401->scratch_use].state=BUFFER_BUSY;
873 			if (se401->format==FMT_JANGGU) {
874 				decode_JangGu(se401, &se401->scratch[se401->scratch_use]);
875 			} else {
876 				decode_bayer(se401, &se401->scratch[se401->scratch_use]);
877 			}
878 			se401->scratch[se401->scratch_use].state=BUFFER_UNUSED;
879 			se401->scratch_use++;
880 			if (se401->scratch_use>=SE401_NUMSCRATCH)
881 				se401->scratch_use=0;
882 			if (errors > SE401_MAX_ERRORS) {
883 				errors=0;
884 				dev_info(&se401->dev->dev,
885 					 "too many errors, restarting capture\n");
886 				se401_stop_stream(se401);
887 				se401_start_stream(se401);
888 			}
889 		}
890 	}
891 
892 	if (se401->frame[framenr].grabstate==FRAME_DONE)
893 		if (se401->enhance)
894 			enhance_picture(se401->frame[framenr].data, se401->cheight*se401->cwidth*3);
895 	return 0;
896 }
897 
usb_se401_remove_disconnected(struct usb_se401 * se401)898 static void usb_se401_remove_disconnected (struct usb_se401 *se401)
899 {
900 	int i;
901 
902 	se401->dev = NULL;
903 
904 	for (i=0; i<SE401_NUMSBUF; i++)
905 		if (se401->urb[i]) {
906 			usb_kill_urb(se401->urb[i]);
907 			usb_free_urb(se401->urb[i]);
908 			se401->urb[i] = NULL;
909 			kfree(se401->sbuf[i].data);
910 		}
911 	for (i=0; i<SE401_NUMSCRATCH; i++) {
912 		kfree(se401->scratch[i].data);
913 	}
914 	if (se401->inturb) {
915 		usb_kill_urb(se401->inturb);
916 		usb_free_urb(se401->inturb);
917 	}
918 	dev_info(&se401->dev->dev, "%s disconnected", se401->camera_name);
919 
920 	/* Free the memory */
921 	kfree(se401->width);
922 	kfree(se401->height);
923 	kfree(se401);
924 }
925 
926 
927 
928 /****************************************************************************
929  *
930  * Video4Linux
931  *
932  ***************************************************************************/
933 
934 
se401_open(struct file * file)935 static int se401_open(struct file *file)
936 {
937 	struct video_device *dev = video_devdata(file);
938 	struct usb_se401 *se401 = (struct usb_se401 *)dev;
939 	int err = 0;
940 
941 	lock_kernel();
942 	if (se401->user) {
943 		unlock_kernel();
944 		return -EBUSY;
945 	}
946 	se401->fbuf = rvmalloc(se401->maxframesize * SE401_NUMFRAMES);
947 	if (se401->fbuf)
948 		file->private_data = dev;
949 	else
950 		err = -ENOMEM;
951 	se401->user = !err;
952 	unlock_kernel();
953 
954 	return err;
955 }
956 
se401_close(struct file * file)957 static int se401_close(struct file *file)
958 {
959 	struct video_device *dev = file->private_data;
960 	struct usb_se401 *se401 = (struct usb_se401 *)dev;
961 	int i;
962 
963 	rvfree(se401->fbuf, se401->maxframesize * SE401_NUMFRAMES);
964 	if (se401->removed) {
965 		dev_info(&se401->dev->dev, "device unregistered\n");
966 		usb_se401_remove_disconnected(se401);
967 	} else {
968 		for (i=0; i<SE401_NUMFRAMES; i++)
969 			se401->frame[i].grabstate=FRAME_UNUSED;
970 		if (se401->streaming)
971 			se401_stop_stream(se401);
972 		se401->user=0;
973 	}
974 	file->private_data = NULL;
975 	return 0;
976 }
977 
se401_do_ioctl(struct file * file,unsigned int cmd,void * arg)978 static long se401_do_ioctl(struct file *file, unsigned int cmd, void *arg)
979 {
980 	struct video_device *vdev = file->private_data;
981 	struct usb_se401 *se401 = (struct usb_se401 *)vdev;
982 
983 	if (!se401->dev)
984 		return -EIO;
985 
986 	switch (cmd) {
987 	case VIDIOCGCAP:
988 	{
989 		struct video_capability *b = arg;
990 		strcpy(b->name, se401->camera_name);
991 		b->type = VID_TYPE_CAPTURE;
992 		b->channels = 1;
993 		b->audios = 0;
994 		b->maxwidth = se401->width[se401->sizes-1];
995 		b->maxheight = se401->height[se401->sizes-1];
996 		b->minwidth = se401->width[0];
997 		b->minheight = se401->height[0];
998 		return 0;
999 	}
1000 	case VIDIOCGCHAN:
1001 	{
1002 		struct video_channel *v = arg;
1003 
1004 		if (v->channel != 0)
1005 			return -EINVAL;
1006 		v->flags = 0;
1007 		v->tuners = 0;
1008 		v->type = VIDEO_TYPE_CAMERA;
1009 		strcpy(v->name, "Camera");
1010 		return 0;
1011 	}
1012 	case VIDIOCSCHAN:
1013 	{
1014 		struct video_channel *v = arg;
1015 
1016 		if (v->channel != 0)
1017 			return -EINVAL;
1018 		return 0;
1019 	}
1020 	case VIDIOCGPICT:
1021 	{
1022 		struct video_picture *p = arg;
1023 
1024 		se401_get_pict(se401, p);
1025 		return 0;
1026 	}
1027 	case VIDIOCSPICT:
1028 	{
1029 		struct video_picture *p = arg;
1030 
1031 		if (se401_set_pict(se401, p))
1032 			return -EINVAL;
1033 		return 0;
1034 	}
1035 	case VIDIOCSWIN:
1036 	{
1037 		struct video_window *vw = arg;
1038 
1039 		if (vw->flags)
1040 			return -EINVAL;
1041 		if (vw->clipcount)
1042 			return -EINVAL;
1043 		if (se401_set_size(se401, vw->width, vw->height))
1044 			return -EINVAL;
1045 		return 0;
1046 	}
1047 	case VIDIOCGWIN:
1048 	{
1049 		struct video_window *vw = arg;
1050 
1051 		vw->x = 0;               /* FIXME */
1052 		vw->y = 0;
1053 		vw->chromakey = 0;
1054 		vw->flags = 0;
1055 		vw->clipcount = 0;
1056 		vw->width = se401->cwidth;
1057 		vw->height = se401->cheight;
1058 		return 0;
1059 	}
1060 	case VIDIOCGMBUF:
1061 	{
1062 		struct video_mbuf *vm = arg;
1063 		int i;
1064 
1065 		memset(vm, 0, sizeof(*vm));
1066 		vm->size = SE401_NUMFRAMES * se401->maxframesize;
1067 		vm->frames = SE401_NUMFRAMES;
1068 		for (i=0; i<SE401_NUMFRAMES; i++)
1069 			vm->offsets[i] = se401->maxframesize * i;
1070 		return 0;
1071 	}
1072 	case VIDIOCMCAPTURE:
1073 	{
1074 		struct video_mmap *vm = arg;
1075 
1076 		if (vm->format != VIDEO_PALETTE_RGB24)
1077 			return -EINVAL;
1078 		if (vm->frame >= SE401_NUMFRAMES)
1079 			return -EINVAL;
1080 		if (se401->frame[vm->frame].grabstate != FRAME_UNUSED)
1081 			return -EBUSY;
1082 
1083 		/* Is this according to the v4l spec??? */
1084 		if (se401_set_size(se401, vm->width, vm->height))
1085 			return -EINVAL;
1086 		se401->frame[vm->frame].grabstate=FRAME_READY;
1087 
1088 		if (!se401->streaming)
1089 			se401_start_stream(se401);
1090 
1091 		/* Set the picture properties */
1092 		if (se401->framecount==0)
1093 			se401_send_pict(se401);
1094 		/* Calibrate the reset level after a few frames. */
1095 		if (se401->framecount%20==1)
1096 			se401_auto_resetlevel(se401);
1097 
1098 		return 0;
1099 	}
1100 	case VIDIOCSYNC:
1101 	{
1102 		int *frame = arg;
1103 		int ret=0;
1104 
1105 		if(*frame <0 || *frame >= SE401_NUMFRAMES)
1106 			return -EINVAL;
1107 
1108 		ret=se401_newframe(se401, *frame);
1109 		se401->frame[*frame].grabstate=FRAME_UNUSED;
1110 		return ret;
1111 	}
1112 	case VIDIOCGFBUF:
1113 	{
1114 		struct video_buffer *vb = arg;
1115 
1116 		memset(vb, 0, sizeof(*vb));
1117 		return 0;
1118 	}
1119 	case VIDIOCKEY:
1120 		return 0;
1121 	case VIDIOCCAPTURE:
1122 		return -EINVAL;
1123 	case VIDIOCSFBUF:
1124 		return -EINVAL;
1125 	case VIDIOCGTUNER:
1126 	case VIDIOCSTUNER:
1127 		return -EINVAL;
1128 	case VIDIOCGFREQ:
1129 	case VIDIOCSFREQ:
1130 		return -EINVAL;
1131 	case VIDIOCGAUDIO:
1132 	case VIDIOCSAUDIO:
1133 		return -EINVAL;
1134 	default:
1135 		return -ENOIOCTLCMD;
1136 	} /* end switch */
1137 
1138 	return 0;
1139 }
1140 
se401_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1141 static long se401_ioctl(struct file *file,
1142 		       unsigned int cmd, unsigned long arg)
1143 {
1144 	return video_usercopy(file, cmd, arg, se401_do_ioctl);
1145 }
1146 
se401_read(struct file * file,char __user * buf,size_t count,loff_t * ppos)1147 static ssize_t se401_read(struct file *file, char __user *buf,
1148 		     size_t count, loff_t *ppos)
1149 {
1150 	int realcount=count, ret=0;
1151 	struct video_device *dev = file->private_data;
1152 	struct usb_se401 *se401 = (struct usb_se401 *)dev;
1153 
1154 
1155 	if (se401->dev == NULL)
1156 		return -EIO;
1157 	if (realcount > se401->cwidth*se401->cheight*3)
1158 		realcount=se401->cwidth*se401->cheight*3;
1159 
1160 	/* Shouldn't happen: */
1161 	if (se401->frame[0].grabstate==FRAME_GRABBING)
1162 		return -EBUSY;
1163 	se401->frame[0].grabstate=FRAME_READY;
1164 	se401->frame[1].grabstate=FRAME_UNUSED;
1165 	se401->curframe=0;
1166 
1167 	if (!se401->streaming)
1168 		se401_start_stream(se401);
1169 
1170 	/* Set the picture properties */
1171 	if (se401->framecount==0)
1172 		se401_send_pict(se401);
1173 	/* Calibrate the reset level after a few frames. */
1174 	if (se401->framecount%20==1)
1175 		se401_auto_resetlevel(se401);
1176 
1177 	ret=se401_newframe(se401, 0);
1178 
1179 	se401->frame[0].grabstate=FRAME_UNUSED;
1180 	if (ret)
1181 		return ret;
1182 	if (copy_to_user(buf, se401->frame[0].data, realcount))
1183 		return -EFAULT;
1184 
1185 	return realcount;
1186 }
1187 
se401_mmap(struct file * file,struct vm_area_struct * vma)1188 static int se401_mmap(struct file *file, struct vm_area_struct *vma)
1189 {
1190 	struct video_device *dev = file->private_data;
1191 	struct usb_se401 *se401 = (struct usb_se401 *)dev;
1192 	unsigned long start = vma->vm_start;
1193 	unsigned long size  = vma->vm_end-vma->vm_start;
1194 	unsigned long page, pos;
1195 
1196 	mutex_lock(&se401->lock);
1197 
1198 	if (se401->dev == NULL) {
1199 		mutex_unlock(&se401->lock);
1200 		return -EIO;
1201 	}
1202 	if (size > (((SE401_NUMFRAMES * se401->maxframesize) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))) {
1203 		mutex_unlock(&se401->lock);
1204 		return -EINVAL;
1205 	}
1206 	pos = (unsigned long)se401->fbuf;
1207 	while (size > 0) {
1208 		page = vmalloc_to_pfn((void *)pos);
1209 		if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1210 			mutex_unlock(&se401->lock);
1211 			return -EAGAIN;
1212 		}
1213 		start += PAGE_SIZE;
1214 		pos += PAGE_SIZE;
1215 		if (size > PAGE_SIZE)
1216 			size -= PAGE_SIZE;
1217 		else
1218 			size = 0;
1219 	}
1220 	mutex_unlock(&se401->lock);
1221 
1222 	return 0;
1223 }
1224 
1225 static const struct v4l2_file_operations se401_fops = {
1226 	.owner =	THIS_MODULE,
1227 	.open =         se401_open,
1228 	.release =      se401_close,
1229 	.read =         se401_read,
1230 	.mmap =         se401_mmap,
1231 	.ioctl =        se401_ioctl,
1232 };
1233 static struct video_device se401_template = {
1234 	.name =         "se401 USB camera",
1235 	.fops =         &se401_fops,
1236 	.release = video_device_release_empty,
1237 };
1238 
1239 
1240 
1241 /***************************/
se401_init(struct usb_se401 * se401,int button)1242 static int se401_init(struct usb_se401 *se401, int button)
1243 {
1244 	int i=0, rc;
1245 	unsigned char cp[0x40];
1246 	char temp[200];
1247 
1248 	/* led on */
1249 	se401_sndctrl(1, se401, SE401_REQ_LED_CONTROL, 1, NULL, 0);
1250 
1251 	/* get camera descriptor */
1252 	rc=se401_sndctrl(0, se401, SE401_REQ_GET_CAMERA_DESCRIPTOR, 0, cp, sizeof(cp));
1253 	if (cp[1]!=0x41) {
1254 		err("Wrong descriptor type");
1255 		return 1;
1256 	}
1257 	sprintf (temp, "ExtraFeatures: %d", cp[3]);
1258 
1259 	se401->sizes=cp[4]+cp[5]*256;
1260 	se401->width=kmalloc(se401->sizes*sizeof(int), GFP_KERNEL);
1261 	if (!se401->width)
1262 		return 1;
1263 	se401->height=kmalloc(se401->sizes*sizeof(int), GFP_KERNEL);
1264 	if (!se401->height) {
1265 		kfree(se401->width);
1266 		return 1;
1267 	}
1268 	for (i=0; i<se401->sizes; i++) {
1269 		    se401->width[i]=cp[6+i*4+0]+cp[6+i*4+1]*256;
1270 		    se401->height[i]=cp[6+i*4+2]+cp[6+i*4+3]*256;
1271 	}
1272 	sprintf (temp, "%s Sizes:", temp);
1273 	for (i=0; i<se401->sizes; i++) {
1274 		sprintf(temp, "%s %dx%d", temp, se401->width[i], se401->height[i]);
1275 	}
1276 	dev_info(&se401->dev->dev, "%s\n", temp);
1277 	se401->maxframesize=se401->width[se401->sizes-1]*se401->height[se401->sizes-1]*3;
1278 
1279 	rc=se401_sndctrl(0, se401, SE401_REQ_GET_WIDTH, 0, cp, sizeof(cp));
1280 	se401->cwidth=cp[0]+cp[1]*256;
1281 	rc=se401_sndctrl(0, se401, SE401_REQ_GET_HEIGHT, 0, cp, sizeof(cp));
1282 	se401->cheight=cp[0]+cp[1]*256;
1283 
1284 	if (!(cp[2] & SE401_FORMAT_BAYER)) {
1285 		err("Bayer format not supported!");
1286 		return 1;
1287 	}
1288 	/* set output mode (BAYER) */
1289 	se401_sndctrl(1, se401, SE401_REQ_SET_OUTPUT_MODE, SE401_FORMAT_BAYER, NULL, 0);
1290 
1291 	rc=se401_sndctrl(0, se401, SE401_REQ_GET_BRT, 0, cp, sizeof(cp));
1292 	se401->brightness=cp[0]+cp[1]*256;
1293 	/* some default values */
1294 	se401->resetlevel=0x2d;
1295 	se401->rgain=0x20;
1296 	se401->ggain=0x20;
1297 	se401->bgain=0x20;
1298 	se401_set_exposure(se401, 20000);
1299 	se401->palette=VIDEO_PALETTE_RGB24;
1300 	se401->enhance=1;
1301 	se401->dropped=0;
1302 	se401->error=0;
1303 	se401->framecount=0;
1304 	se401->readcount=0;
1305 
1306 	/* Start interrupt transfers for snapshot button */
1307 	if (button) {
1308 		se401->inturb=usb_alloc_urb(0, GFP_KERNEL);
1309 		if (!se401->inturb) {
1310 			dev_info(&se401->dev->dev,
1311 				 "Allocation of inturb failed\n");
1312 			return 1;
1313 		}
1314 		usb_fill_int_urb(se401->inturb, se401->dev,
1315 		    usb_rcvintpipe(se401->dev, SE401_BUTTON_ENDPOINT),
1316 		    &se401->button, sizeof(se401->button),
1317 		    se401_button_irq,
1318 		    se401,
1319 		    8
1320 		);
1321 		if (usb_submit_urb(se401->inturb, GFP_KERNEL)) {
1322 			dev_info(&se401->dev->dev, "int urb burned down\n");
1323 			return 1;
1324 		}
1325 	} else
1326 		se401->inturb=NULL;
1327 
1328 	/* Flash the led */
1329 	se401_sndctrl(1, se401, SE401_REQ_CAMERA_POWER, 1, NULL, 0);
1330 	se401_sndctrl(1, se401, SE401_REQ_LED_CONTROL, 1, NULL, 0);
1331 	se401_sndctrl(1, se401, SE401_REQ_CAMERA_POWER, 0, NULL, 0);
1332 	se401_sndctrl(1, se401, SE401_REQ_LED_CONTROL, 0, NULL, 0);
1333 
1334 	return 0;
1335 }
1336 
se401_probe(struct usb_interface * intf,const struct usb_device_id * id)1337 static int se401_probe(struct usb_interface *intf,
1338 	const struct usb_device_id *id)
1339 {
1340 	struct usb_device *dev = interface_to_usbdev(intf);
1341 	struct usb_interface_descriptor *interface;
1342 	struct usb_se401 *se401;
1343 	char *camera_name=NULL;
1344 	int button=1;
1345 
1346 	/* We don't handle multi-config cameras */
1347 	if (dev->descriptor.bNumConfigurations != 1)
1348 		return -ENODEV;
1349 
1350 	interface = &intf->cur_altsetting->desc;
1351 
1352 	/* Is it an se401? */
1353 	if (le16_to_cpu(dev->descriptor.idVendor) == 0x03e8 &&
1354 	    le16_to_cpu(dev->descriptor.idProduct) == 0x0004) {
1355 		camera_name="Endpoints/Aox SE401";
1356 	} else if (le16_to_cpu(dev->descriptor.idVendor) == 0x0471 &&
1357 	    le16_to_cpu(dev->descriptor.idProduct) == 0x030b) {
1358 		camera_name="Philips PCVC665K";
1359 	} else if (le16_to_cpu(dev->descriptor.idVendor) == 0x047d &&
1360 	    le16_to_cpu(dev->descriptor.idProduct) == 0x5001) {
1361 		camera_name="Kensington VideoCAM 67014";
1362 	} else if (le16_to_cpu(dev->descriptor.idVendor) == 0x047d &&
1363 	    le16_to_cpu(dev->descriptor.idProduct) == 0x5002) {
1364 		camera_name="Kensington VideoCAM 6701(5/7)";
1365 	} else if (le16_to_cpu(dev->descriptor.idVendor) == 0x047d &&
1366 	    le16_to_cpu(dev->descriptor.idProduct) == 0x5003) {
1367 		camera_name="Kensington VideoCAM 67016";
1368 		button=0;
1369 	} else
1370 		return -ENODEV;
1371 
1372 	/* Checking vendor/product should be enough, but what the hell */
1373 	if (interface->bInterfaceClass != 0x00)
1374 		return -ENODEV;
1375 	if (interface->bInterfaceSubClass != 0x00)
1376 		return -ENODEV;
1377 
1378 	/* We found one */
1379 	dev_info(&intf->dev, "SE401 camera found: %s\n", camera_name);
1380 
1381 	if ((se401 = kzalloc(sizeof(*se401), GFP_KERNEL)) == NULL) {
1382 		err("couldn't kmalloc se401 struct");
1383 		return -ENOMEM;
1384 	}
1385 
1386 	se401->dev = dev;
1387 	se401->iface = interface->bInterfaceNumber;
1388 	se401->camera_name = camera_name;
1389 
1390 	dev_info(&intf->dev, "firmware version: %02x\n",
1391 		 le16_to_cpu(dev->descriptor.bcdDevice) & 255);
1392 
1393 	if (se401_init(se401, button)) {
1394 		kfree(se401);
1395 		return -EIO;
1396 	}
1397 
1398 	memcpy(&se401->vdev, &se401_template, sizeof(se401_template));
1399 	memcpy(se401->vdev.name, se401->camera_name, strlen(se401->camera_name));
1400 	init_waitqueue_head(&se401->wq);
1401 	mutex_init(&se401->lock);
1402 	wmb();
1403 
1404 	if (video_register_device(&se401->vdev, VFL_TYPE_GRABBER, video_nr) < 0) {
1405 		kfree(se401);
1406 		err("video_register_device failed");
1407 		return -EIO;
1408 	}
1409 	dev_info(&intf->dev, "registered new video device: video%d\n",
1410 		 se401->vdev.num);
1411 
1412 	usb_set_intfdata (intf, se401);
1413 	return 0;
1414 }
1415 
se401_disconnect(struct usb_interface * intf)1416 static void se401_disconnect(struct usb_interface *intf)
1417 {
1418 	struct usb_se401 *se401 = usb_get_intfdata (intf);
1419 
1420 	usb_set_intfdata (intf, NULL);
1421 	if (se401) {
1422 		video_unregister_device(&se401->vdev);
1423 		if (!se401->user){
1424 			usb_se401_remove_disconnected(se401);
1425 		} else {
1426 			se401->frame[0].grabstate = FRAME_ERROR;
1427 			se401->frame[0].grabstate = FRAME_ERROR;
1428 
1429 			se401->streaming = 0;
1430 
1431 			wake_up_interruptible(&se401->wq);
1432 			se401->removed = 1;
1433 		}
1434 	}
1435 }
1436 
1437 static struct usb_driver se401_driver = {
1438 	.name		= "se401",
1439 	.id_table	= device_table,
1440 	.probe		= se401_probe,
1441 	.disconnect	= se401_disconnect,
1442 };
1443 
1444 
1445 
1446 /****************************************************************************
1447  *
1448  *  Module routines
1449  *
1450  ***************************************************************************/
1451 
usb_se401_init(void)1452 static int __init usb_se401_init(void)
1453 {
1454 	printk(KERN_INFO "SE401 usb camera driver version %s registering\n", version);
1455 	if (flickerless)
1456 		if (flickerless!=50 && flickerless!=60) {
1457 			printk(KERN_ERR "Invallid flickerless value, use 0, 50 or 60.\n");
1458 			return -1;
1459 	}
1460 	return usb_register(&se401_driver);
1461 }
1462 
usb_se401_exit(void)1463 static void __exit usb_se401_exit(void)
1464 {
1465 	usb_deregister(&se401_driver);
1466 	printk(KERN_INFO "SE401 driver deregistered\frame");
1467 }
1468 
1469 module_init(usb_se401_init);
1470 module_exit(usb_se401_exit);
1471