~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/drivers/usb/mdc800.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * copyright (C) 1999/2000 by Henning Zabel <henning@uni-paderborn.de>
  3  *
  4  * This program is free software; you can redistribute it and/or modify it
  5  * under the terms of the GNU General Public License as published by the
  6  * Free Software Foundation; either version 2 of the License, or (at your
  7  * option) any later version.
  8  *
  9  * This program is distributed in the hope that it will be useful, but
 10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 11  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * for more details.
 13  *
 14  * You should have received a copy of the GNU General Public License
 15  * along with this program; if not, write to the Free Software Foundation,
 16  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 17  */
 18 
 19 
 20 /*
 21  *      USB-Kernel Driver for the Mustek MDC800 Digital Camera
 22  *      (c) 1999/2000 Henning Zabel <henning@uni-paderborn.de>
 23  *
 24  *
 25  * The driver brings the USB functions of the MDC800 to Linux.
 26  * To use the Camera you must support the USB Protocoll of the camera
 27  * to the Kernel Node.
 28  * The Driver uses a misc device Node. Create it with :
 29  * mknod /dev/mustek c 180 32
 30  *
 31  * The driver supports only one camera.
 32  *
 33  * version 0.7.5
 34  * Fixed potential SMP races with Spinlocks.
 35  * Thanks to Oliver Neukum <oliver.neukum@lrz.uni-muenchen.de> who 
 36  * noticed the race conditions.
 37  * (30/10/2000)
 38  *
 39  * Fixed: Setting urb->dev before submitting urb.
 40  * by Greg KH <greg@kroah.com>
 41  * (13/10/2000)
 42  *
 43  * version 0.7.3
 44  * bugfix : The mdc800->state field gets set to READY after the
 45  * the diconnect function sets it to NOT_CONNECTED. This makes the
 46  * driver running like the camera is connected and causes some
 47  * hang ups.
 48  *
 49  * version 0.7.1
 50  * MOD_INC and MOD_DEC are changed in usb_probe to prevent load/unload
 51  * problems when compiled as Module.
 52  * (04/04/2000)
 53  *
 54  * The mdc800 driver gets assigned the USB Minor 32-47. The Registration
 55  * was updated to use these values.
 56  * (26/03/2000)
 57  *
 58  * The Init und Exit Module Function are updated.
 59  * (01/03/2000)
 60  *
 61  * version 0.7.0
 62  * Rewrite of the driver : The driver now uses URB's. The old stuff
 63  * has been removed.
 64  *
 65  * version 0.6.0
 66  * Rewrite of this driver: The Emulation of the rs232 protocoll
 67  * has been removed from the driver. A special executeCommand function
 68  * for this driver is included to gphoto.
 69  * The driver supports two kind of communication to bulk endpoints.
 70  * Either with the dev->bus->ops->bulk... or with callback function.
 71  * (09/11/1999)
 72  *
 73  * version 0.5.0:
 74  * first Version that gets a version number. Most of the needed
 75  * functions work.
 76  * (20/10/1999)
 77  */
 78 
 79 #include <linux/version.h>
 80 #include <linux/sched.h>
 81 #include <linux/signal.h>
 82 #include <linux/spinlock.h>
 83 #include <linux/errno.h>
 84 #include <linux/random.h>
 85 #include <linux/poll.h>
 86 #include <linux/init.h>
 87 #include <linux/malloc.h>
 88 #include <linux/module.h>
 89 #include <linux/smp_lock.h>
 90 
 91 #include <linux/usb.h>
 92 
 93 #define VERSION         "0.7.5"
 94 #define RELEASE_DATE    "(30/10/2000)"
 95 
 96 /* Vendor and Product Information */
 97 #define MDC800_VENDOR_ID        0x055f
 98 #define MDC800_PRODUCT_ID       0xa800
 99 
100 /* Timeouts (msec) */
101 #define TO_DOWNLOAD_GET_READY           1500
102 #define TO_DOWNLOAD_GET_BUSY            1500
103 #define TO_WRITE_GET_READY              1000
104 #define TO_DEFAULT_COMMAND              5000
105 #define TO_READ_FROM_IRQ                TO_DEFAULT_COMMAND
106 #define TO_GET_READY                    TO_DEFAULT_COMMAND
107 
108 /* Minor Number of the device (create with mknod /dev/mustek c 180 32) */
109 #define MDC800_DEVICE_MINOR_BASE 32
110 
111 
112 /**************************************************************************
113         Data and structs
114 ***************************************************************************/
115 
116 
117 typedef enum {
118         NOT_CONNECTED, READY, WORKING, DOWNLOAD
119 } mdc800_state;
120 
121 
122 /* Data for the driver */
123 struct mdc800_data
124 {
125         struct usb_device *     dev;                    // Device Data
126         mdc800_state            state;
127 
128         unsigned int            endpoint [4];
129 
130         purb_t                  irq_urb;
131         wait_queue_head_t       irq_wait;
132         char*                   irq_urb_buffer;
133 
134         int                     camera_busy;          // is camera busy ?
135         int                     camera_request_ready; // Status to synchronize with irq
136         char                    camera_response [8];  // last Bytes send after busy
137 
138         purb_t                  write_urb;
139         char*                   write_urb_buffer;
140         wait_queue_head_t       write_wait;
141 
142 
143         purb_t                  download_urb;
144         char*                   download_urb_buffer;
145         wait_queue_head_t       download_wait;
146         int                     download_left;          // Bytes left to download ?
147 
148 
149         /* Device Data */
150         char                    out [64];       // Answer Buffer
151         int                     out_ptr;        // Index to the first not readen byte
152         int                     out_count;      // Bytes in the buffer
153 
154         int                     open;           // Camera device open ?
155         spinlock_t              io_lock;        // IO -lock     
156 
157         char                    in [8];         // Command Input Buffer
158         int                     in_count;
159 
160         int                     pic_index;      // Cache for the Imagesize (-1 for nothing cached )
161         int                     pic_len;
162 };
163 
164 
165 /* Specification of the Endpoints */
166 static struct usb_endpoint_descriptor mdc800_ed [4] =
167 {
168         { 0,0, 0x01, 0x02,  8, 0,0,0 },
169         { 0,0, 0x82, 0x03,  8, 0,0,0 },
170         { 0,0, 0x03, 0x02, 64, 0,0,0 },
171         { 0,0, 0x84, 0x02, 64, 0,0,0 }
172 };
173 
174 
175 /* The Variable used by the driver */
176 static struct mdc800_data* mdc800=0;
177 
178 
179 /***************************************************************************
180         The USB Part of the driver
181 ****************************************************************************/
182 
183 static int mdc800_endpoint_equals (struct usb_endpoint_descriptor *a,struct usb_endpoint_descriptor *b)
184 {
185         return (
186                    ( a->bEndpointAddress == b->bEndpointAddress )
187                 && ( a->bmAttributes     == b->bmAttributes     )
188                 && ( a->wMaxPacketSize   == b->wMaxPacketSize   )
189         );
190 }
191 
192 
193 /*
194  * Checks wether the camera responds busy
195  */
196 static int mdc800_isBusy (char* ch)
197 {
198         int i=0;
199         while (i<8)
200         {
201                 if (ch [i] != (char)0x99)
202                         return 0;
203                 i++;
204         }
205         return 1;
206 }
207 
208 
209 /*
210  * Checks wether the Camera is ready
211  */
212 static int mdc800_isReady (char *ch)
213 {
214         int i=0;
215         while (i<8)
216         {
217                 if (ch [i] != (char)0xbb)
218                         return 0;
219                 i++;
220         }
221         return 1;
222 }
223 
224 
225 
226 /*
227  * USB IRQ Handler for InputLine
228  */
229 static void mdc800_usb_irq (struct urb *urb)
230 {
231         int data_received=0, wake_up;
232         unsigned char* b=urb->transfer_buffer;
233         struct mdc800_data* mdc800=urb->context;
234 
235         if (urb->status >= 0)
236         {
237 
238                 //dbg ("%i %i %i %i %i %i %i %i \n",b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7]);
239 
240                 if (mdc800_isBusy (b))
241                 {
242                         if (!mdc800->camera_busy)
243                         {
244                                 mdc800->camera_busy=1;
245                                 dbg ("gets busy");
246                         }
247                 }
248                 else
249                 {
250                         if (mdc800->camera_busy && mdc800_isReady (b))
251                         {
252                                 mdc800->camera_busy=0;
253                                 dbg ("gets ready");
254                         }
255                 }
256                 if (!(mdc800_isBusy (b) || mdc800_isReady (b)))
257                 {
258                         /* Store Data in camera_answer field */
259                         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]);
260 
261                         memcpy (mdc800->camera_response,b,8);
262                         data_received=1;
263                 }
264         }
265         wake_up= ( mdc800->camera_request_ready > 0 )
266                 &&
267                 (
268                         ((mdc800->camera_request_ready == 1) && (!mdc800->camera_busy))
269                 ||
270                         ((mdc800->camera_request_ready == 2) && data_received)
271                 ||
272                         ((mdc800->camera_request_ready == 3) && (mdc800->camera_busy))
273                 ||
274                         (urb->status < 0)
275                 );
276 
277         if (wake_up)
278         {
279                 mdc800->camera_request_ready=0;
280                 wake_up_interruptible (&mdc800->irq_wait);
281         }
282 }
283 
284 
285 /*
286  * Waits a while until the irq responds that camera is ready
287  *
288  *  mode : 0: Wait for camera gets ready
289  *         1: Wait for receiving data
290  *         2: Wait for camera gets busy
291  *
292  * msec: Time to wait
293  */
294 static int mdc800_usb_waitForIRQ (int mode, int msec)
295 {
296         mdc800->camera_request_ready=1+mode;
297 
298         interruptible_sleep_on_timeout (&mdc800->irq_wait, msec*HZ/1000);
299 
300         if (mdc800->camera_request_ready>0)
301         {
302                 mdc800->camera_request_ready=0;
303                 err ("timeout waiting for camera.");
304                 return -1;
305         }
306         
307         if (mdc800->state == NOT_CONNECTED)
308         {
309                 warn ("Camera gets disconnected during waiting for irq.");
310                 mdc800->camera_request_ready=0;
311                 return -2;
312         }
313         
314         return 0;
315 }
316 
317 
318 /*
319  * The write_urb callback function
320  */
321 static void mdc800_usb_write_notify (struct urb *urb)
322 {
323         struct mdc800_data* mdc800=urb->context;
324 
325         if (urb->status != 0)
326         {
327                 err ("writing command fails (status=%i)", urb->status);
328         }
329         else
330         {       
331                 mdc800->state=READY;
332         }
333         wake_up_interruptible (&mdc800->write_wait);
334 }
335 
336 
337 /*
338  * The download_urb callback function
339  */
340 static void mdc800_usb_download_notify (struct urb *urb)
341 {
342         struct mdc800_data* mdc800=urb->context;
343 
344         if (urb->status == 0)
345         {
346                 /* Fill output buffer with these data */
347                 memcpy (mdc800->out,  urb->transfer_buffer, 64);
348                 mdc800->out_count=64;
349                 mdc800->out_ptr=0;
350                 mdc800->download_left-=64;
351                 if (mdc800->download_left == 0)
352                 {
353                         mdc800->state=READY;
354                 }
355         }
356         else
357         {
358                 err ("request bytes fails (status:%i)", urb->status);
359         }
360         wake_up_interruptible (&mdc800->download_wait);
361 }
362 
363 
364 /***************************************************************************
365         Probing for the Camera
366  ***************************************************************************/
367 
368 static struct usb_driver mdc800_usb_driver;
369 
370 /*
371  * Callback to search the Mustek MDC800 on the USB Bus
372  */
373 static void* mdc800_usb_probe (struct usb_device *dev ,unsigned int ifnum,
374                                const struct usb_device_id *id)
375 {
376         int i,j;
377         struct usb_interface_descriptor *intf_desc;
378         int irq_interval=0;
379 
380         dbg ("(mdc800_usb_probe) called.");
381 
382 
383         if (mdc800->dev != 0)
384         {
385                 warn ("only one Mustek MDC800 is supported.");
386                 return 0;
387         }
388 
389         if (dev->descriptor.bNumConfigurations != 1)
390         {
391                 err ("probe fails -> wrong Number of Configuration");
392                 return 0;
393         }
394         intf_desc=&dev->actconfig->interface[ifnum].altsetting[0];
395 
396         if (
397                         ( intf_desc->bInterfaceClass != 0xff )
398                 ||      ( intf_desc->bInterfaceSubClass != 0 )
399                 || ( intf_desc->bInterfaceProtocol != 0 )
400                 || ( intf_desc->bNumEndpoints != 4)
401         )
402         {
403                 err ("probe fails -> wrong Interface");
404                 return 0;
405         }
406 
407         /* Check the Endpoints */
408         for (i=0; i<4; i++)
409         {
410                 mdc800->endpoint[i]=-1;
411                 for (j=0; j<4; j++)
412                 {
413                         if (mdc800_endpoint_equals (&intf_desc->endpoint [j],&mdc800_ed [i]))
414                         {
415                                 mdc800->endpoint[i]=intf_desc->endpoint [j].bEndpointAddress ;
416                                 if (i==1)
417                                 {
418                                         irq_interval=intf_desc->endpoint [j].bInterval;
419                                 }
420 
421                                 continue;
422                         }
423                 }
424                 if (mdc800->endpoint[i] == -1)
425                 {
426                         err ("probe fails -> Wrong Endpoints.");
427                         return 0;
428                 }
429         }
430 
431 
432         usb_driver_claim_interface (&mdc800_usb_driver, &dev->actconfig->interface[ifnum], mdc800);
433         if (usb_set_interface (dev, ifnum, 0) < 0)
434         {
435                 err ("MDC800 Configuration fails.");
436                 return 0;
437         }
438 
439         info ("Found Mustek MDC800 on USB.");
440 
441         spin_lock (&mdc800->io_lock);
442 
443         mdc800->dev=dev;
444         mdc800->open=0;
445 
446         /* Setup URB Structs */
447         FILL_INT_URB (
448                 mdc800->irq_urb,
449                 mdc800->dev,
450                 usb_rcvintpipe (mdc800->dev,mdc800->endpoint [1]),
451                 mdc800->irq_urb_buffer,
452                 8,
453                 mdc800_usb_irq,
454                 mdc800,
455                 irq_interval
456         );
457 
458         FILL_BULK_URB (
459                 mdc800->write_urb,
460                 mdc800->dev,
461                 usb_sndbulkpipe (mdc800->dev, mdc800->endpoint[0]),
462                 mdc800->write_urb_buffer,
463                 8,
464                 mdc800_usb_write_notify,
465                 mdc800
466         );
467 
468         FILL_BULK_URB (
469                 mdc800->download_urb,
470                 mdc800->dev,
471                 usb_rcvbulkpipe (mdc800->dev, mdc800->endpoint [3]),
472                 mdc800->download_urb_buffer,
473                 64,
474                 mdc800_usb_download_notify,
475                 mdc800
476         );
477 
478         mdc800->state=READY;
479 
480         spin_unlock (&mdc800->io_lock);
481         
482         return mdc800;
483 }
484 
485 
486 /*
487  * Disconnect USB device (maybe the MDC800)
488  */
489 static void mdc800_usb_disconnect (struct usb_device *dev,void* ptr)
490 {
491         struct mdc800_data* mdc800=(struct mdc800_data*) ptr;
492 
493         dbg ("(mdc800_usb_disconnect) called");
494 
495         if (mdc800->state == NOT_CONNECTED)
496                 return;
497         
498         mdc800->state=NOT_CONNECTED;
499 
500         usb_unlink_urb (mdc800->irq_urb);
501         usb_unlink_urb (mdc800->write_urb);
502         usb_unlink_urb (mdc800->download_urb);
503 
504         usb_driver_release_interface (&mdc800_usb_driver, &dev->actconfig->interface[1]);
505 
506         mdc800->dev=0;
507         info ("Mustek MDC800 disconnected from USB.");
508 }
509 
510 
511 /***************************************************************************
512         The Misc device Part (file_operations)
513 ****************************************************************************/
514 
515 /*
516  * This Function calc the Answersize for a command.
517  */
518 static int mdc800_getAnswerSize (char command)
519 {
520         switch ((unsigned char) command)
521         {
522                 case 0x2a:
523                 case 0x49:
524                 case 0x51:
525                 case 0x0d:
526                 case 0x20:
527                 case 0x07:
528                 case 0x01:
529                 case 0x25:
530                 case 0x00:
531                         return 8;
532 
533                 case 0x05:
534                 case 0x3e:
535                         return mdc800->pic_len;
536 
537                 case 0x09:
538                         return 4096;
539 
540                 default:
541                         return 0;
542         }
543 }
544 
545 
546 /*
547  * Init the device: (1) alloc mem (2) Increase MOD Count ..
548  */
549 static int mdc800_device_open (struct inode* inode, struct file *file)
550 {
551         int retval=0;
552         int errn=0;
553 
554         spin_lock (&mdc800->io_lock);
555         
556         if (mdc800->state == NOT_CONNECTED)
557         {
558                 errn=-EBUSY;
559                 goto error_out;
560         }
561         if (mdc800->open)
562         {
563                 errn=-EBUSY;
564                 goto error_out;
565         }
566 
567         mdc800->in_count=0;
568         mdc800->out_count=0;
569         mdc800->out_ptr=0;
570         mdc800->pic_index=0;
571         mdc800->pic_len=-1;
572         mdc800->download_left=0;
573 
574         mdc800->camera_busy=0;
575         mdc800->camera_request_ready=0;
576 
577         retval=0;
578         mdc800->irq_urb->dev = mdc800->dev;
579         if (usb_submit_urb (mdc800->irq_urb))
580         {
581                 err ("request USB irq fails (submit_retval=%i urb_status=%i).",retval, mdc800->irq_urb->status);
582                 errn = -EIO;
583                 goto error_out;
584         }
585 
586         mdc800->open=1;
587         dbg ("Mustek MDC800 device opened.");
588 
589 error_out:
590         spin_unlock (&mdc800->io_lock);
591         return errn;
592 }
593 
594 
595 /*
596  * Close the Camera and release Memory
597  */
598 static int mdc800_device_release (struct inode* inode, struct file *file)
599 {
600         int retval=0;
601         dbg ("Mustek MDC800 device closed.");
602 
603         spin_lock (&mdc800->io_lock);
604         if (mdc800->open && (mdc800->state != NOT_CONNECTED))
605         {
606                 mdc800->open=0;
607                 usb_unlink_urb (mdc800->irq_urb);
608                 usb_unlink_urb (mdc800->write_urb);
609                 usb_unlink_urb (mdc800->download_urb);
610         }
611         else
612         {
613                 retval=-EIO;
614         }
615         spin_unlock (&mdc800->io_lock);
616 
617         return retval;
618 }
619 
620 
621 /*
622  * The Device read callback Function
623  */
624 static ssize_t mdc800_device_read (struct file *file, char *buf, size_t len, loff_t *pos)
625 {
626         int   left=len, sts=len; /* single transfer size */
627         char* ptr=buf;
628 
629         spin_lock (&mdc800->io_lock);
630         if (mdc800->state == NOT_CONNECTED)
631         {
632                 spin_unlock (&mdc800->io_lock);
633                 return -EBUSY;
634         }
635         if (mdc800->state == WORKING)
636         {
637                 warn ("Illegal State \"working\" reached during read ?!");
638                 spin_unlock (&mdc800->io_lock);
639                 return -EBUSY;
640         }
641         if (!mdc800->open)
642         {
643                 spin_unlock (&mdc800->io_lock);
644                 return -EBUSY;
645         }
646 
647         while (left)
648         {
649                 if (signal_pending (current)) 
650                 {
651                         spin_unlock (&mdc800->io_lock);
652                         return -EINTR;
653                 }
654 
655                 sts=left > (mdc800->out_count-mdc800->out_ptr)?mdc800->out_count-mdc800->out_ptr:left;
656 
657                 if (sts <= 0)
658                 {
659                         /* Too less Data in buffer */
660                         if (mdc800->state == DOWNLOAD)
661                         {
662                                 mdc800->out_count=0;
663                                 mdc800->out_ptr=0;
664 
665                                 /* Download -> Request new bytes */
666                                 mdc800->download_urb->dev = mdc800->dev;
667                                 if (usb_submit_urb (mdc800->download_urb))
668                                 {
669                                         err ("Can't submit download urb (status=%i)",mdc800->download_urb->status);
670                                         spin_unlock (&mdc800->io_lock);
671                                         return len-left;
672                                 }
673                                 interruptible_sleep_on_timeout (&mdc800->download_wait, TO_DOWNLOAD_GET_READY*HZ/1000);
674                                 if (mdc800->download_urb->status != 0)
675                                 {
676                                         err ("request download-bytes fails (status=%i)",mdc800->download_urb->status);
677                                         spin_unlock (&mdc800->io_lock);
678                                         return len-left;
679                                 }
680                         }
681                         else
682                         {
683                                 /* No more bytes -> that's an error*/
684                                 spin_unlock (&mdc800->io_lock);
685                                 return -EIO;
686                         }
687                 }
688                 else
689                 {
690                         /* memcpy Bytes */
691                         memcpy (ptr, &mdc800->out [mdc800->out_ptr], sts);
692                         ptr+=sts;
693                         left-=sts;
694                         mdc800->out_ptr+=sts;
695                 }
696         }
697 
698         spin_unlock (&mdc800->io_lock);
699         return len-left;
700 }
701 
702 
703 /*
704  * The Device write callback Function
705  * If a 8Byte Command is received, it will be send to the camera.
706  * After this the driver initiates the request for the answer or
707  * just waits until the camera becomes ready.
708  */
709 static ssize_t mdc800_device_write (struct file *file, const char *buf, size_t len, loff_t *pos)
710 {
711         int i=0;
712 
713         spin_lock (&mdc800->io_lock);
714         if (mdc800->state != READY)
715         {
716                 spin_unlock (&mdc800->io_lock);
717                 return -EBUSY;
718         }
719         if (!mdc800->open )
720         {
721                 spin_unlock (&mdc800->io_lock);
722                 return -EBUSY;
723         }
724 
725         while (i<len)
726         {
727                 if (signal_pending (current)) 
728                 {
729                         spin_unlock (&mdc800->io_lock);
730                         return -EINTR;
731                 }
732 
733                 /* check for command start */
734                 if (buf [i] == (char) 0x55)
735                 {
736                         mdc800->in_count=0;
737                         mdc800->out_count=0;
738                         mdc800->out_ptr=0;
739                         mdc800->download_left=0;
740                 }
741 
742                 /* save command byte */
743                 if (mdc800->in_count < 8)
744                 {
745                         mdc800->in[mdc800->in_count]=buf[i];
746                         mdc800->in_count++;
747                 }
748                 else
749                 {
750                         err ("Command is to long !\n");
751                         spin_unlock (&mdc800->io_lock);
752                         return -EIO;
753                 }
754 
755                 /* Command Buffer full ? -> send it to camera */
756                 if (mdc800->in_count == 8)
757                 {
758                         int answersize;
759 
760                         if (mdc800_usb_waitForIRQ (0,TO_GET_READY))
761                         {
762                                 err ("Camera didn't get ready.\n");
763                                 spin_unlock (&mdc800->io_lock);
764                                 return -EIO;
765                         }
766 
767                         answersize=mdc800_getAnswerSize (mdc800->in[1]);
768 
769                         mdc800->state=WORKING;
770                         memcpy (mdc800->write_urb->transfer_buffer, mdc800->in,8);
771                         mdc800->write_urb->dev = mdc800->dev;
772                         if (usb_submit_urb (mdc800->write_urb))
773                         {
774                                 err ("submitting write urb fails (status=%i)", mdc800->write_urb->status);
775                                 spin_unlock (&mdc800->io_lock);
776                                 return -EIO;
777                         }
778                         interruptible_sleep_on_timeout (&mdc800->write_wait, TO_WRITE_GET_READY*HZ/1000);
779                         if (mdc800->state == WORKING)
780                         {
781                                 usb_unlink_urb (mdc800->write_urb);
782                                 spin_unlock (&mdc800->io_lock);
783                                 return -EIO;
784                         }
785 
786                         switch ((unsigned char) mdc800->in[1])
787                         {
788                                 case 0x05: /* Download Image */
789                                 case 0x3e: /* Take shot in Fine Mode (WCam Mode) */
790                                         if (mdc800->pic_len < 0)
791                                         {
792                                                 err ("call 0x07 before 0x05,0x3e");
793                                                 mdc800->state=READY;
794                                                 spin_unlock (&mdc800->io_lock);
795                                                 return -EIO;
796                                         }
797                                         mdc800->pic_len=-1;
798 
799                                 case 0x09: /* Download Thumbnail */
800                                         mdc800->download_left=answersize+64;
801                                         mdc800->state=DOWNLOAD;
802                                         mdc800_usb_waitForIRQ (0,TO_DOWNLOAD_GET_BUSY);
803                                         break;
804 
805 
806                                 default:
807                                         if (answersize)
808                                         {
809 
810                                                 if (mdc800_usb_waitForIRQ (1,TO_READ_FROM_IRQ))
811                                                 {
812                                                         err ("requesting answer from irq fails");
813                                                         spin_unlock (&mdc800->io_lock);
814                                                         return -EIO;
815                                                 }
816 
817                                                 /* Write dummy data, (this is ugly but part of the USB Protokoll */
818                                                 /* if you use endpoint 1 as bulk and not as irq */
819                                                 memcpy (mdc800->out, mdc800->camera_response,8);
820 
821                                                 /* This is the interpreted answer */
822                                                 memcpy (&mdc800->out[8], mdc800->camera_response,8);
823 
824                                                 mdc800->out_ptr=0;
825                                                 mdc800->out_count=16;
826 
827                                                 /* Cache the Imagesize, if command was getImageSize */
828                                                 if (mdc800->in [1] == (char) 0x07)
829                                                 {
830                                                         mdc800->pic_len=(int) 65536*(unsigned char) mdc800->camera_response[0]+256*(unsigned char) mdc800->camera_response[1]+(unsigned char) mdc800->camera_response[2];
831 
832                                                         dbg ("cached imagesize = %i",mdc800->pic_len);
833                                                 }
834 
835                                         }
836                                         else
837                                         {
838                                                 if (mdc800_usb_waitForIRQ (0,TO_DEFAULT_COMMAND))
839                                                 {
840                                                         err ("Command Timeout.");
841                                                         spin_unlock (&mdc800->io_lock);
842                                                         return -EIO;
843                                                 }
844                                         }
845                                         mdc800->state=READY;
846                                         break;
847                         }
848                 }
849                 i++;
850         }
851         spin_unlock (&mdc800->io_lock);
852         return i;
853 }
854 
855 
856 /***************************************************************************
857         Init and Cleanup this driver (Structs and types)
858 ****************************************************************************/
859 
860 /* File Operations of this drivers */
861 static struct file_operations mdc800_device_ops =
862 {
863         owner:          THIS_MODULE,
864         read:           mdc800_device_read,
865         write:          mdc800_device_write,
866         open:           mdc800_device_open,
867         release:        mdc800_device_release,
868 };
869 
870 
871 
872 static struct usb_device_id mdc800_table [] = {
873         { USB_DEVICE(MDC800_VENDOR_ID, MDC800_PRODUCT_ID) },
874         { }                                             /* Terminating entry */
875 };
876 
877 MODULE_DEVICE_TABLE (usb, mdc800_table);
878 /*
879  * USB Driver Struct for this device
880  */
881 static struct usb_driver mdc800_usb_driver =
882 {
883         name:           "mdc800",
884         probe:          mdc800_usb_probe,
885         disconnect:     mdc800_usb_disconnect,
886         fops:           &mdc800_device_ops,
887         minor:          MDC800_DEVICE_MINOR_BASE,
888         id_table:       mdc800_table
889 };
890 
891 
892 
893 /************************************************************************
894         Init and Cleanup this driver (Main Functions)
895 *************************************************************************/
896 
897 #define try(A)           if ((A) == 0) goto cleanup_on_fail;
898 #define try_free_mem(A)  if (A != 0) { kfree (A); A=0; }
899 #define try_free_urb(A)  if (A != 0) { usb_free_urb (A); A=0; }
900 
901 int __init usb_mdc800_init (void)
902 {
903         /* Allocate Memory */
904         try (mdc800=kmalloc (sizeof (struct mdc800_data), GFP_KERNEL));
905 
906         memset(mdc800, 0, sizeof(struct mdc800_data));
907         mdc800->dev=0;
908         mdc800->open=0;
909         mdc800->state=NOT_CONNECTED;
910         spin_lock_init (&mdc800->io_lock);
911 
912         init_waitqueue_head (&mdc800->irq_wait);
913         init_waitqueue_head (&mdc800->write_wait);
914         init_waitqueue_head (&mdc800->download_wait);
915 
916         try (mdc800->irq_urb_buffer=kmalloc (8, GFP_KERNEL));
917         try (mdc800->write_urb_buffer=kmalloc (8, GFP_KERNEL));
918         try (mdc800->download_urb_buffer=kmalloc (64, GFP_KERNEL));
919 
920         try (mdc800->irq_urb=usb_alloc_urb (0));
921         try (mdc800->download_urb=usb_alloc_urb (0));
922         try (mdc800->write_urb=usb_alloc_urb (0));
923 
924         /* Register the driver */
925         if (usb_register (&mdc800_usb_driver) < 0)
926                 goto cleanup_on_fail;
927 
928         info ("Mustek Digital Camera Driver " VERSION " (MDC800)");
929         info (RELEASE_DATE " Henning Zabel <henning@uni-paderborn.de>");
930 
931         return 0;
932 
933         /* Clean driver up, when something fails */
934 
935 cleanup_on_fail:
936 
937         if (mdc800 != 0)
938         {
939                 err ("can't alloc memory!");
940 
941                 try_free_mem (mdc800->download_urb_buffer);
942                 try_free_mem (mdc800->write_urb_buffer);
943                 try_free_mem (mdc800->irq_urb_buffer);
944 
945                 try_free_urb (mdc800->write_urb);
946                 try_free_urb (mdc800->download_urb);
947                 try_free_urb (mdc800->irq_urb);
948 
949                 kfree (mdc800);
950         }
951         mdc800=0;
952         return -1;
953 }
954 
955 
956 void __exit usb_mdc800_cleanup (void)
957 {
958         usb_deregister (&mdc800_usb_driver);
959 
960         usb_free_urb (mdc800->irq_urb);
961         usb_free_urb (mdc800->download_urb);
962         usb_free_urb (mdc800->write_urb);
963 
964         kfree (mdc800->irq_urb_buffer);
965         kfree (mdc800->write_urb_buffer);
966         kfree (mdc800->download_urb_buffer);
967 
968         kfree (mdc800);
969         mdc800=0;
970 }
971 
972 
973 MODULE_AUTHOR ("Henning Zabel <henning@uni-paderborn.de>");
974 MODULE_DESCRIPTION ("USB Driver for Mustek MDC800 Digital Camera");
975 
976 module_init (usb_mdc800_init);
977 module_exit (usb_mdc800_cleanup);
978 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.