2 * cpia_usb CPiA USB driver
4 * Supports CPiA based parallel port Video Camera's.
6 * Copyright (C) 1999 Jochen Scharrlach <Jochen.Scharrlach@schwaben.de>
7 * Copyright (C) 1999, 2000 Johannes Erdfelt <johannes@erdfelt.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /* define _CPIA_DEBUG_ for verbose debug output (see cpia.h) */
25 /* #define _CPIA_DEBUG_ 1 */
27 #include <linux/module.h>
28 #include <linux/kernel.h>
29 #include <linux/init.h>
30 #include <linux/wait.h>
31 #include <linux/list.h>
32 #include <linux/slab.h>
33 #include <linux/vmalloc.h>
34 #include <linux/usb.h>
38 #define USB_REQ_CPIA_GRAB_FRAME 0xC1
39 #define USB_REQ_CPIA_UPLOAD_FRAME 0xC2
40 #define WAIT_FOR_NEXT_FRAME 0
41 #define FORCE_FRAME_UPLOAD 1
43 #define FRAMES_PER_DESC 10
44 #define FRAME_SIZE_PER_DESC 960 /* Shouldn't be hardcoded */
45 #define CPIA_NUMSBUF 2
46 #define STREAM_BUF_SIZE (PAGE_SIZE * 4)
47 #define SCRATCH_BUF_SIZE (STREAM_BUF_SIZE * 2)
54 #define FRAMEBUF_LEN (CPIA_MAX_FRAME_SIZE+100)
55 enum framebuf_status
{
64 enum framebuf_status status
;
65 u8 data
[FRAMEBUF_LEN
];
66 struct framebuf
*next
;
70 /* Device structure */
71 struct usb_device
*dev
;
74 wait_queue_head_t wq_stream
;
76 int cursbuf
; /* Current receiving sbuf */
77 struct cpia_sbuf sbuf
[CPIA_NUMSBUF
]; /* Double buffering */
82 struct framebuf
*buffers
[3];
83 struct framebuf
*curbuff
, *workbuff
;
86 static int cpia_usb_open(void *privdata
);
87 static int cpia_usb_registerCallback(void *privdata
, void (*cb
) (void *cbdata
),
89 static int cpia_usb_transferCmd(void *privdata
, u8
*command
, u8
*data
);
90 static int cpia_usb_streamStart(void *privdata
);
91 static int cpia_usb_streamStop(void *privdata
);
92 static int cpia_usb_streamRead(void *privdata
, u8
*frame
, int noblock
);
93 static int cpia_usb_close(void *privdata
);
95 #define ABOUT "USB driver for Vision CPiA based cameras"
97 static struct cpia_camera_ops cpia_usb_ops
= {
99 cpia_usb_registerCallback
,
100 cpia_usb_transferCmd
,
101 cpia_usb_streamStart
,
109 static LIST_HEAD(cam_list
);
110 static spinlock_t cam_list_lock_usb
;
112 static void cpia_usb_complete(struct urb
*urb
, struct pt_regs
*regs
)
116 struct usb_cpia
*ucpia
;
118 if (!urb
|| !urb
->context
)
121 ucpia
= (struct usb_cpia
*) urb
->context
;
123 if (!ucpia
->dev
|| !ucpia
->streaming
|| !ucpia
->present
|| !ucpia
->open
)
126 if (ucpia
->workbuff
->status
== FRAME_EMPTY
) {
127 ucpia
->workbuff
->status
= FRAME_READING
;
128 ucpia
->workbuff
->length
= 0;
131 for (i
= 0; i
< urb
->number_of_packets
; i
++) {
132 int n
= urb
->iso_frame_desc
[i
].actual_length
;
133 int st
= urb
->iso_frame_desc
[i
].status
;
135 cdata
= urb
->transfer_buffer
+ urb
->iso_frame_desc
[i
].offset
;
138 printk(KERN_DEBUG
"cpia data error: [%d] len=%d, status=%X\n", i
, n
, st
);
140 if (FRAMEBUF_LEN
< ucpia
->workbuff
->length
+ n
) {
141 printk(KERN_DEBUG
"cpia: scratch buf overflow!scr_len: %d, n: %d\n", ucpia
->workbuff
->length
, n
);
146 if ((ucpia
->workbuff
->length
> 0) ||
147 (0x19 == cdata
[0] && 0x68 == cdata
[1])) {
148 memcpy(ucpia
->workbuff
->data
+ ucpia
->workbuff
->length
, cdata
, n
);
149 ucpia
->workbuff
->length
+= n
;
151 DBG("Ignoring packet!\n");
153 if (ucpia
->workbuff
->length
> 4 &&
154 0xff == ucpia
->workbuff
->data
[ucpia
->workbuff
->length
-1] &&
155 0xff == ucpia
->workbuff
->data
[ucpia
->workbuff
->length
-2] &&
156 0xff == ucpia
->workbuff
->data
[ucpia
->workbuff
->length
-3] &&
157 0xff == ucpia
->workbuff
->data
[ucpia
->workbuff
->length
-4]) {
158 ucpia
->workbuff
->status
= FRAME_READY
;
159 ucpia
->curbuff
= ucpia
->workbuff
;
160 ucpia
->workbuff
= ucpia
->workbuff
->next
;
161 ucpia
->workbuff
->status
= FRAME_EMPTY
;
162 ucpia
->workbuff
->length
= 0;
164 if (waitqueue_active(&ucpia
->wq_stream
))
165 wake_up_interruptible(&ucpia
->wq_stream
);
171 urb
->dev
= ucpia
->dev
;
172 if ((i
= usb_submit_urb(urb
, GFP_ATOMIC
)) != 0)
173 printk(KERN_ERR
"%s: usb_submit_urb ret %d\n", __FUNCTION__
, i
);
176 static int cpia_usb_open(void *privdata
)
178 struct usb_cpia
*ucpia
= (struct usb_cpia
*) privdata
;
180 int ret
, retval
= 0, fx
, err
;
185 ucpia
->sbuf
[0].data
= kmalloc(FRAMES_PER_DESC
* FRAME_SIZE_PER_DESC
, GFP_KERNEL
);
186 if (!ucpia
->sbuf
[0].data
)
189 ucpia
->sbuf
[1].data
= kmalloc(FRAMES_PER_DESC
* FRAME_SIZE_PER_DESC
, GFP_KERNEL
);
190 if (!ucpia
->sbuf
[1].data
) {
195 ret
= usb_set_interface(ucpia
->dev
, ucpia
->iface
, 3);
197 printk(KERN_ERR
"cpia_usb_open: usb_set_interface error (ret = %d)\n", ret
);
202 ucpia
->buffers
[0]->status
= FRAME_EMPTY
;
203 ucpia
->buffers
[0]->length
= 0;
204 ucpia
->buffers
[1]->status
= FRAME_EMPTY
;
205 ucpia
->buffers
[1]->length
= 0;
206 ucpia
->buffers
[2]->status
= FRAME_EMPTY
;
207 ucpia
->buffers
[2]->length
= 0;
208 ucpia
->curbuff
= ucpia
->buffers
[0];
209 ucpia
->workbuff
= ucpia
->buffers
[1];
211 /* We double buffer the Iso lists, and also know the polling
212 * interval is every frame (1 == (1 << (bInterval -1))).
214 urb
= usb_alloc_urb(FRAMES_PER_DESC
, GFP_KERNEL
);
216 printk(KERN_ERR
"cpia_init_isoc: usb_alloc_urb 0\n");
221 ucpia
->sbuf
[0].urb
= urb
;
222 urb
->dev
= ucpia
->dev
;
223 urb
->context
= ucpia
;
224 urb
->pipe
= usb_rcvisocpipe(ucpia
->dev
, 1);
225 urb
->transfer_flags
= URB_ISO_ASAP
;
226 urb
->transfer_buffer
= ucpia
->sbuf
[0].data
;
227 urb
->complete
= cpia_usb_complete
;
228 urb
->number_of_packets
= FRAMES_PER_DESC
;
230 urb
->transfer_buffer_length
= FRAME_SIZE_PER_DESC
* FRAMES_PER_DESC
;
231 for (fx
= 0; fx
< FRAMES_PER_DESC
; fx
++) {
232 urb
->iso_frame_desc
[fx
].offset
= FRAME_SIZE_PER_DESC
* fx
;
233 urb
->iso_frame_desc
[fx
].length
= FRAME_SIZE_PER_DESC
;
236 urb
= usb_alloc_urb(FRAMES_PER_DESC
, GFP_KERNEL
);
238 printk(KERN_ERR
"cpia_init_isoc: usb_alloc_urb 1\n");
243 ucpia
->sbuf
[1].urb
= urb
;
244 urb
->dev
= ucpia
->dev
;
245 urb
->context
= ucpia
;
246 urb
->pipe
= usb_rcvisocpipe(ucpia
->dev
, 1);
247 urb
->transfer_flags
= URB_ISO_ASAP
;
248 urb
->transfer_buffer
= ucpia
->sbuf
[1].data
;
249 urb
->complete
= cpia_usb_complete
;
250 urb
->number_of_packets
= FRAMES_PER_DESC
;
252 urb
->transfer_buffer_length
= FRAME_SIZE_PER_DESC
* FRAMES_PER_DESC
;
253 for (fx
= 0; fx
< FRAMES_PER_DESC
; fx
++) {
254 urb
->iso_frame_desc
[fx
].offset
= FRAME_SIZE_PER_DESC
* fx
;
255 urb
->iso_frame_desc
[fx
].length
= FRAME_SIZE_PER_DESC
;
258 /* queue the ISO urbs, and resubmit in the completion handler */
259 err
= usb_submit_urb(ucpia
->sbuf
[0].urb
, GFP_KERNEL
);
261 printk(KERN_ERR
"cpia_init_isoc: usb_submit_urb 0 ret %d\n",
265 err
= usb_submit_urb(ucpia
->sbuf
[1].urb
, GFP_KERNEL
);
267 printk(KERN_ERR
"cpia_init_isoc: usb_submit_urb 1 ret %d\n",
272 ucpia
->streaming
= 1;
277 error_urb1
: /* free urb 1 */
278 usb_free_urb(ucpia
->sbuf
[1].urb
);
279 ucpia
->sbuf
[1].urb
= NULL
;
280 error_urb0
: /* free urb 0 */
281 usb_free_urb(ucpia
->sbuf
[0].urb
);
282 ucpia
->sbuf
[0].urb
= NULL
;
284 kfree (ucpia
->sbuf
[1].data
);
285 ucpia
->sbuf
[1].data
= NULL
;
287 kfree (ucpia
->sbuf
[0].data
);
288 ucpia
->sbuf
[0].data
= NULL
;
294 // convenience functions
297 /****************************************************************************
301 ***************************************************************************/
302 static int WritePacket(struct usb_device
*udev
, const u8
*packet
, u8
*buf
, size_t size
)
307 return usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0),
308 packet
[1] + (packet
[0] << 8),
309 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
310 packet
[2] + (packet
[3] << 8),
311 packet
[4] + (packet
[5] << 8), buf
, size
, HZ
);
314 /****************************************************************************
318 ***************************************************************************/
319 static int ReadPacket(struct usb_device
*udev
, u8
*packet
, u8
*buf
, size_t size
)
321 if (!packet
|| size
<= 0)
324 return usb_control_msg(udev
, usb_rcvctrlpipe(udev
, 0),
325 packet
[1] + (packet
[0] << 8),
326 USB_DIR_IN
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
327 packet
[2] + (packet
[3] << 8),
328 packet
[4] + (packet
[5] << 8), buf
, size
, HZ
);
331 static int cpia_usb_transferCmd(void *privdata
, u8
*command
, u8
*data
)
335 struct usb_cpia
*ucpia
= (struct usb_cpia
*)privdata
;
336 struct usb_device
*udev
= ucpia
->dev
;
339 DBG("Internal driver error: udev is NULL\n");
344 DBG("Internal driver error: command is NULL\n");
348 databytes
= (((int)command
[7])<<8) | command
[6];
350 if (command
[0] == DATA_IN
) {
354 DBG("Internal driver error: data is NULL\n");
358 err
= ReadPacket(udev
, command
, buffer
, 8);
362 memcpy(data
, buffer
, databytes
);
363 } else if(command
[0] == DATA_OUT
)
364 WritePacket(udev
, command
, data
, databytes
);
366 DBG("Unexpected first byte of command: %x\n", command
[0]);
373 static int cpia_usb_registerCallback(void *privdata
, void (*cb
) (void *cbdata
),
379 static int cpia_usb_streamStart(void *privdata
)
384 static int cpia_usb_streamStop(void *privdata
)
389 static int cpia_usb_streamRead(void *privdata
, u8
*frame
, int noblock
)
391 struct usb_cpia
*ucpia
= (struct usb_cpia
*) privdata
;
392 struct framebuf
*mybuff
;
394 if (!ucpia
|| !ucpia
->present
)
397 if (ucpia
->curbuff
->status
!= FRAME_READY
)
398 interruptible_sleep_on(&ucpia
->wq_stream
);
400 DBG("Frame already waiting!\n");
402 mybuff
= ucpia
->curbuff
;
407 if (mybuff
->status
!= FRAME_READY
|| mybuff
->length
< 4) {
408 DBG("Something went wrong!\n");
412 memcpy(frame
, mybuff
->data
, mybuff
->length
);
413 mybuff
->status
= FRAME_EMPTY
;
415 /* DBG("read done, %d bytes, Header: %x/%x, Footer: %x%x%x%x\n", */
416 /* mybuff->length, frame[0], frame[1], */
417 /* frame[mybuff->length-4], frame[mybuff->length-3], */
418 /* frame[mybuff->length-2], frame[mybuff->length-1]); */
420 return mybuff
->length
;
423 static void cpia_usb_free_resources(struct usb_cpia
*ucpia
, int try)
425 if (!ucpia
->streaming
)
428 ucpia
->streaming
= 0;
430 /* Set packet size to 0 */
434 ret
= usb_set_interface(ucpia
->dev
, ucpia
->iface
, 0);
436 printk(KERN_ERR
"usb_set_interface error (ret = %d)\n", ret
);
441 /* Unschedule all of the iso td's */
442 if (ucpia
->sbuf
[1].urb
) {
443 usb_unlink_urb(ucpia
->sbuf
[1].urb
);
444 usb_free_urb(ucpia
->sbuf
[1].urb
);
445 ucpia
->sbuf
[1].urb
= NULL
;
448 if (ucpia
->sbuf
[1].data
) {
449 kfree(ucpia
->sbuf
[1].data
);
450 ucpia
->sbuf
[1].data
= NULL
;
453 if (ucpia
->sbuf
[0].urb
) {
454 usb_unlink_urb(ucpia
->sbuf
[0].urb
);
455 usb_free_urb(ucpia
->sbuf
[0].urb
);
456 ucpia
->sbuf
[0].urb
= NULL
;
459 if (ucpia
->sbuf
[0].data
) {
460 kfree(ucpia
->sbuf
[0].data
);
461 ucpia
->sbuf
[0].data
= NULL
;
465 static int cpia_usb_close(void *privdata
)
467 struct usb_cpia
*ucpia
= (struct usb_cpia
*) privdata
;
474 /* ucpia->present = 0 protects against trying to reset the
475 * alt setting if camera is physically disconnected while open */
476 cpia_usb_free_resources(ucpia
, ucpia
->present
);
481 int cpia_usb_init(void)
483 /* return -ENODEV; */
487 /* Probing and initializing */
489 static int cpia_probe(struct usb_interface
*intf
,
490 const struct usb_device_id
*id
)
492 struct usb_device
*udev
= interface_to_usbdev(intf
);
493 struct usb_host_interface
*interface
;
494 struct usb_cpia
*ucpia
;
495 struct cam_data
*cam
;
498 /* A multi-config CPiA camera? */
499 if (udev
->descriptor
.bNumConfigurations
!= 1)
502 interface
= intf
->cur_altsetting
;
504 printk(KERN_INFO
"USB CPiA camera found\n");
506 ucpia
= kmalloc(sizeof(*ucpia
), GFP_KERNEL
);
508 printk(KERN_ERR
"couldn't kmalloc cpia struct\n");
512 memset(ucpia
, 0, sizeof(*ucpia
));
515 ucpia
->iface
= interface
->desc
.bInterfaceNumber
;
516 init_waitqueue_head(&ucpia
->wq_stream
);
518 ucpia
->buffers
[0] = vmalloc(sizeof(*ucpia
->buffers
[0]));
519 if (!ucpia
->buffers
[0]) {
520 printk(KERN_ERR
"couldn't vmalloc frame buffer 0\n");
524 ucpia
->buffers
[1] = vmalloc(sizeof(*ucpia
->buffers
[1]));
525 if (!ucpia
->buffers
[1]) {
526 printk(KERN_ERR
"couldn't vmalloc frame buffer 1\n");
530 ucpia
->buffers
[2] = vmalloc(sizeof(*ucpia
->buffers
[2]));
531 if (!ucpia
->buffers
[2]) {
532 printk(KERN_ERR
"couldn't vmalloc frame buffer 2\n");
536 ucpia
->buffers
[0]->next
= ucpia
->buffers
[1];
537 ucpia
->buffers
[1]->next
= ucpia
->buffers
[2];
538 ucpia
->buffers
[2]->next
= ucpia
->buffers
[0];
540 ret
= usb_set_interface(udev
, ucpia
->iface
, 0);
542 printk(KERN_ERR
"cpia_probe: usb_set_interface error (ret = %d)\n", ret
);
546 /* Before register_camera, important */
549 cam
= cpia_register_camera(&cpia_usb_ops
, ucpia
);
551 LOG("failed to cpia_register_camera\n");
555 spin_lock( &cam_list_lock_usb
);
556 list_add( &cam
->cam_data_list
, &cam_list
);
557 spin_unlock( &cam_list_lock_usb
);
559 usb_set_intfdata(intf
, cam
);
563 vfree(ucpia
->buffers
[2]);
564 ucpia
->buffers
[2] = NULL
;
566 vfree(ucpia
->buffers
[1]);
567 ucpia
->buffers
[1] = NULL
;
569 vfree(ucpia
->buffers
[0]);
570 ucpia
->buffers
[0] = NULL
;
576 static void cpia_disconnect(struct usb_interface
*intf
);
578 static struct usb_device_id cpia_id_table
[] = {
579 { USB_DEVICE(0x0553, 0x0002) },
580 { USB_DEVICE(0x0813, 0x0001) },
581 { } /* Terminating entry */
584 MODULE_DEVICE_TABLE (usb
, cpia_id_table
);
585 MODULE_LICENSE("GPL");
588 static struct usb_driver cpia_driver
= {
589 .owner
= THIS_MODULE
,
592 .disconnect
= cpia_disconnect
,
593 .id_table
= cpia_id_table
,
596 static void cpia_disconnect(struct usb_interface
*intf
)
598 struct cam_data
*cam
= usb_get_intfdata(intf
);
599 struct usb_cpia
*ucpia
;
600 struct usb_device
*udev
;
602 usb_set_intfdata(intf
, NULL
);
606 ucpia
= (struct usb_cpia
*) cam
->lowlevel_data
;
607 spin_lock( &cam_list_lock_usb
);
608 list_del(&cam
->cam_data_list
);
609 spin_unlock( &cam_list_lock_usb
);
613 cpia_unregister_camera(cam
);
615 cpia_usb_close(cam
->lowlevel_data
);
617 ucpia
->curbuff
->status
= FRAME_ERROR
;
619 if (waitqueue_active(&ucpia
->wq_stream
))
620 wake_up_interruptible(&ucpia
->wq_stream
);
622 udev
= interface_to_usbdev(intf
);
624 ucpia
->curbuff
= ucpia
->workbuff
= NULL
;
626 if (ucpia
->buffers
[2]) {
627 vfree(ucpia
->buffers
[2]);
628 ucpia
->buffers
[2] = NULL
;
631 if (ucpia
->buffers
[1]) {
632 vfree(ucpia
->buffers
[1]);
633 ucpia
->buffers
[1] = NULL
;
636 if (ucpia
->buffers
[0]) {
637 vfree(ucpia
->buffers
[0]);
638 ucpia
->buffers
[0] = NULL
;
641 cam
->lowlevel_data
= NULL
;
645 static int __init
usb_cpia_init(void)
647 printk(KERN_INFO
"%s v%d.%d.%d\n",ABOUT
,
648 CPIA_USB_MAJ_VER
,CPIA_USB_MIN_VER
,CPIA_USB_PATCH_VER
);
650 spin_lock_init(&cam_list_lock_usb
);
651 return usb_register(&cpia_driver
);
654 static void __exit
usb_cpia_cleanup(void)
656 usb_deregister(&cpia_driver
);
660 module_init (usb_cpia_init
);
661 module_exit (usb_cpia_cleanup
);