1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88#include <linux/version.h>
89#include <linux/sched.h>
90#include <linux/signal.h>
91#include <linux/spinlock.h>
92#include <linux/errno.h>
93#include <linux/random.h>
94#include <linux/poll.h>
95#include <linux/init.h>
96#include <linux/slab.h>
97#include <linux/module.h>
98#include <linux/smp_lock.h>
99
100#include <linux/usb.h>
101
102
103
104
105#define DRIVER_VERSION "v0.7.5 (30/10/2000)"
106#define DRIVER_AUTHOR "Henning Zabel <henning@uni-paderborn.de>"
107#define DRIVER_DESC "USB Driver for Mustek MDC800 Digital Camera"
108
109
110#define MDC800_VENDOR_ID 0x055f
111#define MDC800_PRODUCT_ID 0xa800
112
113
114#define TO_DOWNLOAD_GET_READY 1500
115#define TO_DOWNLOAD_GET_BUSY 1500
116#define TO_WRITE_GET_READY 1000
117#define TO_DEFAULT_COMMAND 5000
118#define TO_READ_FROM_IRQ TO_DEFAULT_COMMAND
119#define TO_GET_READY TO_DEFAULT_COMMAND
120
121
122#define MDC800_DEVICE_MINOR_BASE 32
123
124
125
126
127
128
129
130typedef enum {
131 NOT_CONNECTED, READY, WORKING, DOWNLOAD
132} mdc800_state;
133
134
135
136struct mdc800_data
137{
138 struct usb_device * dev;
139 mdc800_state state;
140
141 unsigned int endpoint [4];
142
143 struct urb * irq_urb;
144 wait_queue_head_t irq_wait;
145 int irq_woken;
146 char* irq_urb_buffer;
147
148 int camera_busy;
149 int camera_request_ready;
150 char camera_response [8];
151
152 struct urb * write_urb;
153 char* write_urb_buffer;
154 wait_queue_head_t write_wait;
155 int written;
156
157
158 struct urb * download_urb;
159 char* download_urb_buffer;
160 wait_queue_head_t download_wait;
161 int downloaded;
162 int download_left;
163
164
165
166 char out [64];
167 int out_ptr;
168 int out_count;
169
170 int open;
171 struct semaphore io_lock;
172
173 char in [8];
174 int in_count;
175
176 int pic_index;
177 int pic_len;
178};
179
180
181
182static struct usb_endpoint_descriptor mdc800_ed [4] =
183{
184 { 0,0, 0x01, 0x02, 8, 0,0,0 },
185 { 0,0, 0x82, 0x03, 8, 0,0,0 },
186 { 0,0, 0x03, 0x02, 64, 0,0,0 },
187 { 0,0, 0x84, 0x02, 64, 0,0,0 }
188};
189
190
191
192static struct mdc800_data* mdc800=0;
193
194
195
196
197
198
199static int mdc800_endpoint_equals (struct usb_endpoint_descriptor *a,struct usb_endpoint_descriptor *b)
200{
201 return (
202 ( a->bEndpointAddress == b->bEndpointAddress )
203 && ( a->bmAttributes == b->bmAttributes )
204 && ( a->wMaxPacketSize == b->wMaxPacketSize )
205 );
206}
207
208
209
210
211
212static int mdc800_isBusy (char* ch)
213{
214 int i=0;
215 while (i<8)
216 {
217 if (ch [i] != (char)0x99)
218 return 0;
219 i++;
220 }
221 return 1;
222}
223
224
225
226
227
228static int mdc800_isReady (char *ch)
229{
230 int i=0;
231 while (i<8)
232 {
233 if (ch [i] != (char)0xbb)
234 return 0;
235 i++;
236 }
237 return 1;
238}
239
240
241
242
243
244
245static void mdc800_usb_irq (struct urb *urb)
246{
247 int data_received=0, wake_up;
248 unsigned char* b=urb->transfer_buffer;
249 struct mdc800_data* mdc800=urb->context;
250
251 if (urb->status >= 0)
252 {
253
254
255
256 if (mdc800_isBusy (b))
257 {
258 if (!mdc800->camera_busy)
259 {
260 mdc800->camera_busy=1;
261 dbg ("gets busy");
262 }
263 }
264 else
265 {
266 if (mdc800->camera_busy && mdc800_isReady (b))
267 {
268 mdc800->camera_busy=0;
269 dbg ("gets ready");
270 }
271 }
272 if (!(mdc800_isBusy (b) || mdc800_isReady (b)))
273 {
274
275 dbg ("%i %i %i %i %i %i %i %i ",b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7]);
276
277 memcpy (mdc800->camera_response,b,8);
278 data_received=1;
279 }
280 }
281 wake_up= ( mdc800->camera_request_ready > 0 )
282 &&
283 (
284 ((mdc800->camera_request_ready == 1) && (!mdc800->camera_busy))
285 ||
286 ((mdc800->camera_request_ready == 2) && data_received)
287 ||
288 ((mdc800->camera_request_ready == 3) && (mdc800->camera_busy))
289 ||
290 (urb->status < 0)
291 );
292
293 if (wake_up)
294 {
295 mdc800->camera_request_ready=0;
296 mdc800->irq_woken=1;
297 wake_up_interruptible (&mdc800->irq_wait);
298 }
299}
300
301
302
303
304
305
306
307
308
309
310
311static int mdc800_usb_waitForIRQ (int mode, int msec)
312{
313 DECLARE_WAITQUEUE(wait, current);
314
315 mdc800->camera_request_ready=1+mode;
316
317 add_wait_queue(&mdc800->irq_wait, &wait);
318 set_current_state(TASK_INTERRUPTIBLE);
319 if (!mdc800->irq_woken)
320 {
321 schedule_timeout (msec*HZ/1000);
322 }
323 remove_wait_queue(&mdc800->irq_wait, &wait);
324 set_current_state(TASK_RUNNING);
325 mdc800->irq_woken = 0;
326
327 if (mdc800->camera_request_ready>0)
328 {
329 mdc800->camera_request_ready=0;
330 err ("timeout waiting for camera.");
331 return -1;
332 }
333
334 if (mdc800->state == NOT_CONNECTED)
335 {
336 warn ("Camera gets disconnected during waiting for irq.");
337 mdc800->camera_request_ready=0;
338 return -2;
339 }
340
341 return 0;
342}
343
344
345
346
347
348static void mdc800_usb_write_notify (struct urb *urb)
349{
350 struct mdc800_data* mdc800=urb->context;
351
352 if (urb->status != 0)
353 {
354 err ("writing command fails (status=%i)", urb->status);
355 }
356 else
357 {
358 mdc800->state=READY;
359 }
360 mdc800->written = 1;
361 wake_up_interruptible (&mdc800->write_wait);
362}
363
364
365
366
367
368static void mdc800_usb_download_notify (struct urb *urb)
369{
370 struct mdc800_data* mdc800=urb->context;
371
372 if (urb->status == 0)
373 {
374
375 memcpy (mdc800->out, urb->transfer_buffer, 64);
376 mdc800->out_count=64;
377 mdc800->out_ptr=0;
378 mdc800->download_left-=64;
379 if (mdc800->download_left == 0)
380 {
381 mdc800->state=READY;
382 }
383 }
384 else
385 {
386 err ("request bytes fails (status:%i)", urb->status);
387 }
388 mdc800->downloaded = 1;
389 wake_up_interruptible (&mdc800->download_wait);
390}
391
392
393
394
395
396
397static struct usb_driver mdc800_usb_driver;
398
399
400
401
402static void* mdc800_usb_probe (struct usb_device *dev ,unsigned int ifnum,
403 const struct usb_device_id *id)
404{
405 int i,j;
406 struct usb_interface_descriptor *intf_desc;
407 int irq_interval=0;
408
409 dbg ("(mdc800_usb_probe) called.");
410
411
412 if (mdc800->dev != 0)
413 {
414 warn ("only one Mustek MDC800 is supported.");
415 return 0;
416 }
417
418 if (dev->descriptor.bNumConfigurations != 1)
419 {
420 err ("probe fails -> wrong Number of Configuration");
421 return 0;
422 }
423 intf_desc=&dev->actconfig->interface[ifnum].altsetting[0];
424
425 if (
426 ( intf_desc->bInterfaceClass != 0xff )
427 || ( intf_desc->bInterfaceSubClass != 0 )
428 || ( intf_desc->bInterfaceProtocol != 0 )
429 || ( intf_desc->bNumEndpoints != 4)
430 )
431 {
432 err ("probe fails -> wrong Interface");
433 return 0;
434 }
435
436
437 for (i=0; i<4; i++)
438 {
439 mdc800->endpoint[i]=-1;
440 for (j=0; j<4; j++)
441 {
442 if (mdc800_endpoint_equals (&intf_desc->endpoint [j],&mdc800_ed [i]))
443 {
444 mdc800->endpoint[i]=intf_desc->endpoint [j].bEndpointAddress ;
445 if (i==1)
446 {
447 irq_interval=intf_desc->endpoint [j].bInterval;
448 }
449
450 continue;
451 }
452 }
453 if (mdc800->endpoint[i] == -1)
454 {
455 err ("probe fails -> Wrong Endpoints.");
456 return 0;
457 }
458 }
459
460
461 usb_driver_claim_interface (&mdc800_usb_driver, &dev->actconfig->interface[ifnum], mdc800);
462 if (usb_set_interface (dev, ifnum, 0) < 0)
463 {
464 err ("MDC800 Configuration fails.");
465 return 0;
466 }
467
468 info ("Found Mustek MDC800 on USB.");
469
470 down (&mdc800->io_lock);
471
472 mdc800->dev=dev;
473 mdc800->open=0;
474
475
476 FILL_INT_URB (
477 mdc800->irq_urb,
478 mdc800->dev,
479 usb_rcvintpipe (mdc800->dev,mdc800->endpoint [1]),
480 mdc800->irq_urb_buffer,
481 8,
482 mdc800_usb_irq,
483 mdc800,
484 irq_interval
485 );
486
487 FILL_BULK_URB (
488 mdc800->write_urb,
489 mdc800->dev,
490 usb_sndbulkpipe (mdc800->dev, mdc800->endpoint[0]),
491 mdc800->write_urb_buffer,
492 8,
493 mdc800_usb_write_notify,
494 mdc800
495 );
496
497 FILL_BULK_URB (
498 mdc800->download_urb,
499 mdc800->dev,
500 usb_rcvbulkpipe (mdc800->dev, mdc800->endpoint [3]),
501 mdc800->download_urb_buffer,
502 64,
503 mdc800_usb_download_notify,
504 mdc800
505 );
506
507 mdc800->state=READY;
508
509 up (&mdc800->io_lock);
510
511 return mdc800;
512}
513
514
515
516
517
518static void mdc800_usb_disconnect (struct usb_device *dev,void* ptr)
519{
520 struct mdc800_data* mdc800=(struct mdc800_data*) ptr;
521
522 dbg ("(mdc800_usb_disconnect) called");
523
524 if (mdc800->state == NOT_CONNECTED)
525 return;
526
527 mdc800->state=NOT_CONNECTED;
528
529 usb_unlink_urb (mdc800->irq_urb);
530 usb_unlink_urb (mdc800->write_urb);
531 usb_unlink_urb (mdc800->download_urb);
532
533 usb_driver_release_interface (&mdc800_usb_driver, &dev->actconfig->interface[1]);
534
535 mdc800->dev=0;
536 info ("Mustek MDC800 disconnected from USB.");
537}
538
539
540
541
542
543
544
545
546
547static int mdc800_getAnswerSize (char command)
548{
549 switch ((unsigned char) command)
550 {
551 case 0x2a:
552 case 0x49:
553 case 0x51:
554 case 0x0d:
555 case 0x20:
556 case 0x07:
557 case 0x01:
558 case 0x25:
559 case 0x00:
560 return 8;
561
562 case 0x05:
563 case 0x3e:
564 return mdc800->pic_len;
565
566 case 0x09:
567 return 4096;
568
569 default:
570 return 0;
571 }
572}
573
574
575
576
577
578static int mdc800_device_open (struct inode* inode, struct file *file)
579{
580 int retval=0;
581 int errn=0;
582
583 down (&mdc800->io_lock);
584
585 if (mdc800->state == NOT_CONNECTED)
586 {
587 errn=-EBUSY;
588 goto error_out;
589 }
590 if (mdc800->open)
591 {
592 errn=-EBUSY;
593 goto error_out;
594 }
595
596 mdc800->in_count=0;
597 mdc800->out_count=0;
598 mdc800->out_ptr=0;
599 mdc800->pic_index=0;
600 mdc800->pic_len=-1;
601 mdc800->download_left=0;
602
603 mdc800->camera_busy=0;
604 mdc800->camera_request_ready=0;
605
606 retval=0;
607 mdc800->irq_urb->dev = mdc800->dev;
608 if (usb_submit_urb (mdc800->irq_urb))
609 {
610 err ("request USB irq fails (submit_retval=%i urb_status=%i).",retval, mdc800->irq_urb->status);
611 errn = -EIO;
612 goto error_out;
613 }
614
615 mdc800->open=1;
616 dbg ("Mustek MDC800 device opened.");
617
618error_out:
619 up (&mdc800->io_lock);
620 return errn;
621}
622
623
624
625
626
627static int mdc800_device_release (struct inode* inode, struct file *file)
628{
629 int retval=0;
630 dbg ("Mustek MDC800 device closed.");
631
632 down (&mdc800->io_lock);
633 if (mdc800->open && (mdc800->state != NOT_CONNECTED))
634 {
635 usb_unlink_urb (mdc800->irq_urb);
636 usb_unlink_urb (mdc800->write_urb);
637 usb_unlink_urb (mdc800->download_urb);
638 mdc800->open=0;
639 }
640 else
641 {
642 retval=-EIO;
643 }
644
645 up(&mdc800->io_lock);
646 return retval;
647}
648
649
650
651
652
653static ssize_t mdc800_device_read (struct file *file, char *buf, size_t len, loff_t *pos)
654{
655 size_t left=len, sts=len;
656 char* ptr=buf;
657 DECLARE_WAITQUEUE(wait, current);
658
659 down (&mdc800->io_lock);
660 if (mdc800->state == NOT_CONNECTED)
661 {
662 up (&mdc800->io_lock);
663 return -EBUSY;
664 }
665 if (mdc800->state == WORKING)
666 {
667 warn ("Illegal State \"working\" reached during read ?!");
668 up (&mdc800->io_lock);
669 return -EBUSY;
670 }
671 if (!mdc800->open)
672 {
673 up (&mdc800->io_lock);
674 return -EBUSY;
675 }
676
677 while (left)
678 {
679 if (signal_pending (current))
680 {
681 up (&mdc800->io_lock);
682 return -EINTR;
683 }
684
685 sts=left > (mdc800->out_count-mdc800->out_ptr)?mdc800->out_count-mdc800->out_ptr:left;
686
687 if (sts <= 0)
688 {
689
690 if (mdc800->state == DOWNLOAD)
691 {
692 mdc800->out_count=0;
693 mdc800->out_ptr=0;
694
695
696 mdc800->download_urb->dev = mdc800->dev;
697 if (usb_submit_urb (mdc800->download_urb))
698 {
699 err ("Can't submit download urb (status=%i)",mdc800->download_urb->status);
700 up (&mdc800->io_lock);
701 return len-left;
702 }
703 add_wait_queue(&mdc800->download_wait, &wait);
704 set_current_state(TASK_INTERRUPTIBLE);
705 if (!mdc800->downloaded)
706 {
707 schedule_timeout (TO_DOWNLOAD_GET_READY*HZ/1000);
708 }
709 set_current_state(TASK_RUNNING);
710 remove_wait_queue(&mdc800->download_wait, &wait);
711 mdc800->downloaded = 0;
712 if (mdc800->download_urb->status != 0)
713 {
714 err ("request download-bytes fails (status=%i)",mdc800->download_urb->status);
715 up (&mdc800->io_lock);
716 return len-left;
717 }
718 }
719 else
720 {
721
722 up (&mdc800->io_lock);
723 return -EIO;
724 }
725 }
726 else
727 {
728
729 if (copy_to_user(ptr, &mdc800->out [mdc800->out_ptr], sts)) {
730 up (&mdc800->io_lock);
731 return -EFAULT;
732 }
733 ptr+=sts;
734 left-=sts;
735 mdc800->out_ptr+=sts;
736 }
737 }
738
739 up (&mdc800->io_lock);
740 return len-left;
741}
742
743
744
745
746
747
748
749
750static ssize_t mdc800_device_write (struct file *file, const char *buf, size_t len, loff_t *pos)
751{
752 size_t i=0;
753 DECLARE_WAITQUEUE(wait, current);
754
755 down (&mdc800->io_lock);
756 if (mdc800->state != READY)
757 {
758 up (&mdc800->io_lock);
759 return -EBUSY;
760 }
761 if (!mdc800->open )
762 {
763 up (&mdc800->io_lock);
764 return -EBUSY;
765 }
766
767 while (i<len)
768 {
769 unsigned char c;
770 if (signal_pending (current))
771 {
772 up (&mdc800->io_lock);
773 return -EINTR;
774 }
775
776 if(get_user(c, buf+i))
777 {
778 up(&mdc800->io_lock);
779 return -EFAULT;
780 }
781
782
783 if (c == 0x55)
784 {
785 mdc800->in_count=0;
786 mdc800->out_count=0;
787 mdc800->out_ptr=0;
788 mdc800->download_left=0;
789 }
790
791
792 if (mdc800->in_count < 8)
793 {
794 mdc800->in[mdc800->in_count] = c;
795 mdc800->in_count++;
796 }
797 else
798 {
799 up (&mdc800->io_lock);
800 return -EIO;
801 }
802
803
804 if (mdc800->in_count == 8)
805 {
806 int answersize;
807
808 if (mdc800_usb_waitForIRQ (0,TO_GET_READY))
809 {
810 err ("Camera didn't get ready.\n");
811 up (&mdc800->io_lock);
812 return -EIO;
813 }
814
815 answersize=mdc800_getAnswerSize (mdc800->in[1]);
816
817 mdc800->state=WORKING;
818 memcpy (mdc800->write_urb->transfer_buffer, mdc800->in,8);
819 mdc800->write_urb->dev = mdc800->dev;
820 if (usb_submit_urb (mdc800->write_urb))
821 {
822 err ("submitting write urb fails (status=%i)", mdc800->write_urb->status);
823 up (&mdc800->io_lock);
824 return -EIO;
825 }
826 add_wait_queue(&mdc800->write_wait, &wait);
827 set_current_state(TASK_INTERRUPTIBLE);
828 if (!mdc800->written)
829 {
830 schedule_timeout (TO_WRITE_GET_READY*HZ/1000);
831 }
832 set_current_state(TASK_RUNNING);
833 remove_wait_queue(&mdc800->write_wait, &wait);
834 mdc800->written = 0;
835 if (mdc800->state == WORKING)
836 {
837 usb_unlink_urb (mdc800->write_urb);
838 up (&mdc800->io_lock);
839 return -EIO;
840 }
841
842 switch ((unsigned char) mdc800->in[1])
843 {
844 case 0x05:
845 case 0x3e:
846 if (mdc800->pic_len < 0)
847 {
848 err ("call 0x07 before 0x05,0x3e");
849 mdc800->state=READY;
850 up (&mdc800->io_lock);
851 return -EIO;
852 }
853 mdc800->pic_len=-1;
854
855 case 0x09:
856 mdc800->download_left=answersize+64;
857 mdc800->state=DOWNLOAD;
858 mdc800_usb_waitForIRQ (0,TO_DOWNLOAD_GET_BUSY);
859 break;
860
861
862 default:
863 if (answersize)
864 {
865
866 if (mdc800_usb_waitForIRQ (1,TO_READ_FROM_IRQ))
867 {
868 err ("requesting answer from irq fails");
869 up (&mdc800->io_lock);
870 return -EIO;
871 }
872
873
874
875 memcpy (mdc800->out, mdc800->camera_response,8);
876
877
878 memcpy (&mdc800->out[8], mdc800->camera_response,8);
879
880 mdc800->out_ptr=0;
881 mdc800->out_count=16;
882
883
884 if (mdc800->in [1] == (char) 0x07)
885 {
886 mdc800->pic_len=(int) 65536*(unsigned char) mdc800->camera_response[0]+256*(unsigned char) mdc800->camera_response[1]+(unsigned char) mdc800->camera_response[2];
887
888 dbg ("cached imagesize = %i",mdc800->pic_len);
889 }
890
891 }
892 else
893 {
894 if (mdc800_usb_waitForIRQ (0,TO_DEFAULT_COMMAND))
895 {
896 err ("Command Timeout.");
897 up (&mdc800->io_lock);
898 return -EIO;
899 }
900 }
901 mdc800->state=READY;
902 break;
903 }
904 }
905 i++;
906 }
907 up (&mdc800->io_lock);
908 return i;
909}
910
911
912
913
914
915
916
917static struct file_operations mdc800_device_ops =
918{
919 owner: THIS_MODULE,
920 read: mdc800_device_read,
921 write: mdc800_device_write,
922 open: mdc800_device_open,
923 release: mdc800_device_release,
924};
925
926
927
928static struct usb_device_id mdc800_table [] = {
929 { USB_DEVICE(MDC800_VENDOR_ID, MDC800_PRODUCT_ID) },
930 { }
931};
932
933MODULE_DEVICE_TABLE (usb, mdc800_table);
934
935
936
937static struct usb_driver mdc800_usb_driver =
938{
939 name: "mdc800",
940 probe: mdc800_usb_probe,
941 disconnect: mdc800_usb_disconnect,
942 fops: &mdc800_device_ops,
943 minor: MDC800_DEVICE_MINOR_BASE,
944 id_table: mdc800_table
945};
946
947
948
949
950
951
952
953#define try(A) if ((A) == 0) goto cleanup_on_fail;
954#define try_free_mem(A) if (A != 0) { kfree (A); A=0; }
955#define try_free_urb(A) if (A != 0) { usb_free_urb (A); A=0; }
956
957int __init usb_mdc800_init (void)
958{
959
960 try (mdc800=kmalloc (sizeof (struct mdc800_data), GFP_KERNEL));
961
962 memset(mdc800, 0, sizeof(struct mdc800_data));
963 mdc800->dev=0;
964 mdc800->open=0;
965 mdc800->state=NOT_CONNECTED;
966 init_MUTEX (&mdc800->io_lock);
967
968 init_waitqueue_head (&mdc800->irq_wait);
969 init_waitqueue_head (&mdc800->write_wait);
970 init_waitqueue_head (&mdc800->download_wait);
971
972 mdc800->irq_woken = 0;
973 mdc800->downloaded = 0;
974 mdc800->written = 0;
975
976 try (mdc800->irq_urb_buffer=kmalloc (8, GFP_KERNEL));
977 try (mdc800->write_urb_buffer=kmalloc (8, GFP_KERNEL));
978 try (mdc800->download_urb_buffer=kmalloc (64, GFP_KERNEL));
979
980 try (mdc800->irq_urb=usb_alloc_urb (0));
981 try (mdc800->download_urb=usb_alloc_urb (0));
982 try (mdc800->write_urb=usb_alloc_urb (0));
983
984
985 if (usb_register (&mdc800_usb_driver) < 0)
986 goto cleanup_on_fail;
987
988 info (DRIVER_VERSION ":" DRIVER_DESC);
989
990 return 0;
991
992
993
994cleanup_on_fail:
995
996 if (mdc800 != 0)
997 {
998 err ("can't alloc memory!");
999
1000 try_free_mem (mdc800->download_urb_buffer);
1001 try_free_mem (mdc800->write_urb_buffer);
1002 try_free_mem (mdc800->irq_urb_buffer);
1003
1004 try_free_urb (mdc800->write_urb);
1005 try_free_urb (mdc800->download_urb);
1006 try_free_urb (mdc800->irq_urb);
1007
1008 kfree (mdc800);
1009 }
1010 mdc800=0;
1011 return -1;
1012}
1013
1014
1015void __exit usb_mdc800_cleanup (void)
1016{
1017 usb_deregister (&mdc800_usb_driver);
1018
1019 usb_free_urb (mdc800->irq_urb);
1020 usb_free_urb (mdc800->download_urb);
1021 usb_free_urb (mdc800->write_urb);
1022
1023 kfree (mdc800->irq_urb_buffer);
1024 kfree (mdc800->write_urb_buffer);
1025 kfree (mdc800->download_urb_buffer);
1026
1027 kfree (mdc800);
1028 mdc800=0;
1029}
1030
1031module_init (usb_mdc800_init);
1032module_exit (usb_mdc800_cleanup);
1033
1034MODULE_AUTHOR( DRIVER_AUTHOR );
1035MODULE_DESCRIPTION( DRIVER_DESC );
1036MODULE_LICENSE("GPL");
1037
1038