0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 #include <linux/sched/signal.h>
0076 #include <linux/signal.h>
0077 #include <linux/spinlock.h>
0078 #include <linux/errno.h>
0079 #include <linux/random.h>
0080 #include <linux/poll.h>
0081 #include <linux/init.h>
0082 #include <linux/slab.h>
0083 #include <linux/module.h>
0084 #include <linux/wait.h>
0085 #include <linux/mutex.h>
0086
0087 #include <linux/usb.h>
0088 #include <linux/fs.h>
0089
0090
0091
0092
0093 #define DRIVER_VERSION "v0.7.5 (30/10/2000)"
0094 #define DRIVER_AUTHOR "Henning Zabel <henning@uni-paderborn.de>"
0095 #define DRIVER_DESC "USB Driver for Mustek MDC800 Digital Camera"
0096
0097
0098 #define MDC800_VENDOR_ID 0x055f
0099 #define MDC800_PRODUCT_ID 0xa800
0100
0101
0102 #define TO_DOWNLOAD_GET_READY 1500
0103 #define TO_DOWNLOAD_GET_BUSY 1500
0104 #define TO_WRITE_GET_READY 1000
0105 #define TO_DEFAULT_COMMAND 5000
0106 #define TO_READ_FROM_IRQ TO_DEFAULT_COMMAND
0107 #define TO_GET_READY TO_DEFAULT_COMMAND
0108
0109
0110 #define MDC800_DEVICE_MINOR_BASE 32
0111
0112
0113
0114
0115
0116
0117
0118 typedef enum {
0119 NOT_CONNECTED, READY, WORKING, DOWNLOAD
0120 } mdc800_state;
0121
0122
0123
0124 struct mdc800_data
0125 {
0126 struct usb_device * dev;
0127 mdc800_state state;
0128
0129 unsigned int endpoint [4];
0130
0131 struct urb * irq_urb;
0132 wait_queue_head_t irq_wait;
0133 int irq_woken;
0134 char* irq_urb_buffer;
0135
0136 int camera_busy;
0137 int camera_request_ready;
0138 char camera_response [8];
0139
0140 struct urb * write_urb;
0141 char* write_urb_buffer;
0142 wait_queue_head_t write_wait;
0143 int written;
0144
0145
0146 struct urb * download_urb;
0147 char* download_urb_buffer;
0148 wait_queue_head_t download_wait;
0149 int downloaded;
0150 int download_left;
0151
0152
0153
0154 char out [64];
0155 int out_ptr;
0156 int out_count;
0157
0158 int open;
0159 struct mutex io_lock;
0160
0161 char in [8];
0162 int in_count;
0163
0164 int pic_index;
0165 int pic_len;
0166 int minor;
0167 };
0168
0169
0170
0171 static struct usb_endpoint_descriptor mdc800_ed [4] =
0172 {
0173 {
0174 .bLength = 0,
0175 .bDescriptorType = 0,
0176 .bEndpointAddress = 0x01,
0177 .bmAttributes = 0x02,
0178 .wMaxPacketSize = cpu_to_le16(8),
0179 .bInterval = 0,
0180 .bRefresh = 0,
0181 .bSynchAddress = 0,
0182 },
0183 {
0184 .bLength = 0,
0185 .bDescriptorType = 0,
0186 .bEndpointAddress = 0x82,
0187 .bmAttributes = 0x03,
0188 .wMaxPacketSize = cpu_to_le16(8),
0189 .bInterval = 0,
0190 .bRefresh = 0,
0191 .bSynchAddress = 0,
0192 },
0193 {
0194 .bLength = 0,
0195 .bDescriptorType = 0,
0196 .bEndpointAddress = 0x03,
0197 .bmAttributes = 0x02,
0198 .wMaxPacketSize = cpu_to_le16(64),
0199 .bInterval = 0,
0200 .bRefresh = 0,
0201 .bSynchAddress = 0,
0202 },
0203 {
0204 .bLength = 0,
0205 .bDescriptorType = 0,
0206 .bEndpointAddress = 0x84,
0207 .bmAttributes = 0x02,
0208 .wMaxPacketSize = cpu_to_le16(64),
0209 .bInterval = 0,
0210 .bRefresh = 0,
0211 .bSynchAddress = 0,
0212 },
0213 };
0214
0215
0216 static struct mdc800_data* mdc800;
0217
0218
0219
0220
0221
0222
0223 static int mdc800_endpoint_equals (struct usb_endpoint_descriptor *a,struct usb_endpoint_descriptor *b)
0224 {
0225 return (
0226 ( a->bEndpointAddress == b->bEndpointAddress )
0227 && ( a->bmAttributes == b->bmAttributes )
0228 && ( a->wMaxPacketSize == b->wMaxPacketSize )
0229 );
0230 }
0231
0232
0233
0234
0235
0236 static int mdc800_isBusy (char* ch)
0237 {
0238 int i=0;
0239 while (i<8)
0240 {
0241 if (ch [i] != (char)0x99)
0242 return 0;
0243 i++;
0244 }
0245 return 1;
0246 }
0247
0248
0249
0250
0251
0252 static int mdc800_isReady (char *ch)
0253 {
0254 int i=0;
0255 while (i<8)
0256 {
0257 if (ch [i] != (char)0xbb)
0258 return 0;
0259 i++;
0260 }
0261 return 1;
0262 }
0263
0264
0265
0266
0267
0268
0269 static void mdc800_usb_irq (struct urb *urb)
0270 {
0271 int data_received=0, wake_up;
0272 unsigned char* b=urb->transfer_buffer;
0273 struct mdc800_data* mdc800=urb->context;
0274 struct device *dev = &mdc800->dev->dev;
0275 int status = urb->status;
0276
0277 if (status >= 0) {
0278 if (mdc800_isBusy (b))
0279 {
0280 if (!mdc800->camera_busy)
0281 {
0282 mdc800->camera_busy=1;
0283 dev_dbg(dev, "gets busy\n");
0284 }
0285 }
0286 else
0287 {
0288 if (mdc800->camera_busy && mdc800_isReady (b))
0289 {
0290 mdc800->camera_busy=0;
0291 dev_dbg(dev, "gets ready\n");
0292 }
0293 }
0294 if (!(mdc800_isBusy (b) || mdc800_isReady (b)))
0295 {
0296
0297 dev_dbg(dev, "%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]);
0298
0299 memcpy (mdc800->camera_response,b,8);
0300 data_received=1;
0301 }
0302 }
0303 wake_up= ( mdc800->camera_request_ready > 0 )
0304 &&
0305 (
0306 ((mdc800->camera_request_ready == 1) && (!mdc800->camera_busy))
0307 ||
0308 ((mdc800->camera_request_ready == 2) && data_received)
0309 ||
0310 ((mdc800->camera_request_ready == 3) && (mdc800->camera_busy))
0311 ||
0312 (status < 0)
0313 );
0314
0315 if (wake_up)
0316 {
0317 mdc800->camera_request_ready=0;
0318 mdc800->irq_woken=1;
0319 wake_up (&mdc800->irq_wait);
0320 }
0321 }
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333 static int mdc800_usb_waitForIRQ (int mode, int msec)
0334 {
0335 mdc800->camera_request_ready=1+mode;
0336
0337 wait_event_timeout(mdc800->irq_wait, mdc800->irq_woken,
0338 msecs_to_jiffies(msec));
0339 mdc800->irq_woken = 0;
0340
0341 if (mdc800->camera_request_ready>0)
0342 {
0343 mdc800->camera_request_ready=0;
0344 dev_err(&mdc800->dev->dev, "timeout waiting for camera.\n");
0345 return -1;
0346 }
0347
0348 if (mdc800->state == NOT_CONNECTED)
0349 {
0350 printk(KERN_WARNING "mdc800: Camera gets disconnected "
0351 "during waiting for irq.\n");
0352 mdc800->camera_request_ready=0;
0353 return -2;
0354 }
0355
0356 return 0;
0357 }
0358
0359
0360
0361
0362
0363 static void mdc800_usb_write_notify (struct urb *urb)
0364 {
0365 struct mdc800_data* mdc800=urb->context;
0366 int status = urb->status;
0367
0368 if (status != 0)
0369 dev_err(&mdc800->dev->dev,
0370 "writing command fails (status=%i)\n", status);
0371 else
0372 mdc800->state=READY;
0373 mdc800->written = 1;
0374 wake_up (&mdc800->write_wait);
0375 }
0376
0377
0378
0379
0380
0381 static void mdc800_usb_download_notify (struct urb *urb)
0382 {
0383 struct mdc800_data* mdc800=urb->context;
0384 int status = urb->status;
0385
0386 if (status == 0) {
0387
0388 memcpy (mdc800->out, urb->transfer_buffer, 64);
0389 mdc800->out_count=64;
0390 mdc800->out_ptr=0;
0391 mdc800->download_left-=64;
0392 if (mdc800->download_left == 0)
0393 {
0394 mdc800->state=READY;
0395 }
0396 } else {
0397 dev_err(&mdc800->dev->dev,
0398 "request bytes fails (status:%i)\n", status);
0399 }
0400 mdc800->downloaded = 1;
0401 wake_up (&mdc800->download_wait);
0402 }
0403
0404
0405
0406
0407
0408
0409 static struct usb_driver mdc800_usb_driver;
0410 static const struct file_operations mdc800_device_ops;
0411 static struct usb_class_driver mdc800_class = {
0412 .name = "mdc800%d",
0413 .fops = &mdc800_device_ops,
0414 .minor_base = MDC800_DEVICE_MINOR_BASE,
0415 };
0416
0417
0418
0419
0420
0421 static int mdc800_usb_probe (struct usb_interface *intf,
0422 const struct usb_device_id *id)
0423 {
0424 int i,j;
0425 struct usb_host_interface *intf_desc;
0426 struct usb_device *dev = interface_to_usbdev (intf);
0427 int irq_interval=0;
0428 int retval;
0429
0430 dev_dbg(&intf->dev, "(%s) called.\n", __func__);
0431
0432
0433 if (mdc800->dev != NULL)
0434 {
0435 dev_warn(&intf->dev, "only one Mustek MDC800 is supported.\n");
0436 return -ENODEV;
0437 }
0438
0439 if (dev->descriptor.bNumConfigurations != 1)
0440 {
0441 dev_err(&intf->dev,
0442 "probe fails -> wrong Number of Configuration\n");
0443 return -ENODEV;
0444 }
0445 intf_desc = intf->cur_altsetting;
0446
0447 if (
0448 ( intf_desc->desc.bInterfaceClass != 0xff )
0449 || ( intf_desc->desc.bInterfaceSubClass != 0 )
0450 || ( intf_desc->desc.bInterfaceProtocol != 0 )
0451 || ( intf_desc->desc.bNumEndpoints != 4)
0452 )
0453 {
0454 dev_err(&intf->dev, "probe fails -> wrong Interface\n");
0455 return -ENODEV;
0456 }
0457
0458
0459 for (i=0; i<4; i++)
0460 {
0461 mdc800->endpoint[i]=-1;
0462 for (j=0; j<4; j++)
0463 {
0464 if (mdc800_endpoint_equals (&intf_desc->endpoint [j].desc,&mdc800_ed [i]))
0465 {
0466 mdc800->endpoint[i]=intf_desc->endpoint [j].desc.bEndpointAddress ;
0467 if (i==1)
0468 {
0469 irq_interval=intf_desc->endpoint [j].desc.bInterval;
0470 }
0471 }
0472 }
0473 if (mdc800->endpoint[i] == -1)
0474 {
0475 dev_err(&intf->dev, "probe fails -> Wrong Endpoints.\n");
0476 return -ENODEV;
0477 }
0478 }
0479
0480
0481 dev_info(&intf->dev, "Found Mustek MDC800 on USB.\n");
0482
0483 mutex_lock(&mdc800->io_lock);
0484
0485 retval = usb_register_dev(intf, &mdc800_class);
0486 if (retval) {
0487 dev_err(&intf->dev, "Not able to get a minor for this device.\n");
0488 mutex_unlock(&mdc800->io_lock);
0489 return -ENODEV;
0490 }
0491
0492 mdc800->dev=dev;
0493 mdc800->open=0;
0494
0495
0496 usb_fill_int_urb (
0497 mdc800->irq_urb,
0498 mdc800->dev,
0499 usb_rcvintpipe (mdc800->dev,mdc800->endpoint [1]),
0500 mdc800->irq_urb_buffer,
0501 8,
0502 mdc800_usb_irq,
0503 mdc800,
0504 irq_interval
0505 );
0506
0507 usb_fill_bulk_urb (
0508 mdc800->write_urb,
0509 mdc800->dev,
0510 usb_sndbulkpipe (mdc800->dev, mdc800->endpoint[0]),
0511 mdc800->write_urb_buffer,
0512 8,
0513 mdc800_usb_write_notify,
0514 mdc800
0515 );
0516
0517 usb_fill_bulk_urb (
0518 mdc800->download_urb,
0519 mdc800->dev,
0520 usb_rcvbulkpipe (mdc800->dev, mdc800->endpoint [3]),
0521 mdc800->download_urb_buffer,
0522 64,
0523 mdc800_usb_download_notify,
0524 mdc800
0525 );
0526
0527 mdc800->state=READY;
0528
0529 mutex_unlock(&mdc800->io_lock);
0530
0531 usb_set_intfdata(intf, mdc800);
0532 return 0;
0533 }
0534
0535
0536
0537
0538
0539 static void mdc800_usb_disconnect (struct usb_interface *intf)
0540 {
0541 struct mdc800_data* mdc800 = usb_get_intfdata(intf);
0542
0543 dev_dbg(&intf->dev, "(%s) called\n", __func__);
0544
0545 if (mdc800) {
0546 if (mdc800->state == NOT_CONNECTED)
0547 return;
0548
0549 usb_deregister_dev(intf, &mdc800_class);
0550
0551
0552
0553 mutex_lock(&mdc800->io_lock);
0554 mdc800->state=NOT_CONNECTED;
0555
0556 usb_kill_urb(mdc800->irq_urb);
0557 usb_kill_urb(mdc800->write_urb);
0558 usb_kill_urb(mdc800->download_urb);
0559 mutex_unlock(&mdc800->io_lock);
0560
0561 mdc800->dev = NULL;
0562 usb_set_intfdata(intf, NULL);
0563 }
0564 dev_info(&intf->dev, "Mustek MDC800 disconnected from USB.\n");
0565 }
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575 static int mdc800_getAnswerSize (char command)
0576 {
0577 switch ((unsigned char) command)
0578 {
0579 case 0x2a:
0580 case 0x49:
0581 case 0x51:
0582 case 0x0d:
0583 case 0x20:
0584 case 0x07:
0585 case 0x01:
0586 case 0x25:
0587 case 0x00:
0588 return 8;
0589
0590 case 0x05:
0591 case 0x3e:
0592 return mdc800->pic_len;
0593
0594 case 0x09:
0595 return 4096;
0596
0597 default:
0598 return 0;
0599 }
0600 }
0601
0602
0603
0604
0605
0606 static int mdc800_device_open (struct inode* inode, struct file *file)
0607 {
0608 int retval=0;
0609 int errn=0;
0610
0611 mutex_lock(&mdc800->io_lock);
0612
0613 if (mdc800->state == NOT_CONNECTED)
0614 {
0615 errn=-EBUSY;
0616 goto error_out;
0617 }
0618 if (mdc800->open)
0619 {
0620 errn=-EBUSY;
0621 goto error_out;
0622 }
0623
0624 mdc800->in_count=0;
0625 mdc800->out_count=0;
0626 mdc800->out_ptr=0;
0627 mdc800->pic_index=0;
0628 mdc800->pic_len=-1;
0629 mdc800->download_left=0;
0630
0631 mdc800->camera_busy=0;
0632 mdc800->camera_request_ready=0;
0633
0634 retval=0;
0635 mdc800->irq_urb->dev = mdc800->dev;
0636 retval = usb_submit_urb (mdc800->irq_urb, GFP_KERNEL);
0637 if (retval) {
0638 dev_err(&mdc800->dev->dev,
0639 "request USB irq fails (submit_retval=%i).\n", retval);
0640 errn = -EIO;
0641 goto error_out;
0642 }
0643
0644 mdc800->open=1;
0645 dev_dbg(&mdc800->dev->dev, "Mustek MDC800 device opened.\n");
0646
0647 error_out:
0648 mutex_unlock(&mdc800->io_lock);
0649 return errn;
0650 }
0651
0652
0653
0654
0655
0656 static int mdc800_device_release (struct inode* inode, struct file *file)
0657 {
0658 int retval=0;
0659
0660 mutex_lock(&mdc800->io_lock);
0661 if (mdc800->open && (mdc800->state != NOT_CONNECTED))
0662 {
0663 usb_kill_urb(mdc800->irq_urb);
0664 usb_kill_urb(mdc800->write_urb);
0665 usb_kill_urb(mdc800->download_urb);
0666 mdc800->open=0;
0667 }
0668 else
0669 {
0670 retval=-EIO;
0671 }
0672
0673 mutex_unlock(&mdc800->io_lock);
0674 return retval;
0675 }
0676
0677
0678
0679
0680
0681 static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t len, loff_t *pos)
0682 {
0683 size_t left=len, sts=len;
0684 char __user *ptr = buf;
0685 int retval;
0686
0687 mutex_lock(&mdc800->io_lock);
0688 if (mdc800->state == NOT_CONNECTED)
0689 {
0690 mutex_unlock(&mdc800->io_lock);
0691 return -EBUSY;
0692 }
0693 if (mdc800->state == WORKING)
0694 {
0695 printk(KERN_WARNING "mdc800: Illegal State \"working\""
0696 "reached during read ?!\n");
0697 mutex_unlock(&mdc800->io_lock);
0698 return -EBUSY;
0699 }
0700 if (!mdc800->open)
0701 {
0702 mutex_unlock(&mdc800->io_lock);
0703 return -EBUSY;
0704 }
0705
0706 while (left)
0707 {
0708 if (signal_pending (current))
0709 {
0710 mutex_unlock(&mdc800->io_lock);
0711 return -EINTR;
0712 }
0713
0714 sts=left > (mdc800->out_count-mdc800->out_ptr)?mdc800->out_count-mdc800->out_ptr:left;
0715
0716 if (sts <= 0)
0717 {
0718
0719 if (mdc800->state == DOWNLOAD)
0720 {
0721 mdc800->out_count=0;
0722 mdc800->out_ptr=0;
0723
0724
0725 mdc800->download_urb->dev = mdc800->dev;
0726 retval = usb_submit_urb (mdc800->download_urb, GFP_KERNEL);
0727 if (retval) {
0728 dev_err(&mdc800->dev->dev,
0729 "Can't submit download urb "
0730 "(retval=%i)\n", retval);
0731 mutex_unlock(&mdc800->io_lock);
0732 return len-left;
0733 }
0734 wait_event_timeout(mdc800->download_wait,
0735 mdc800->downloaded,
0736 msecs_to_jiffies(TO_DOWNLOAD_GET_READY));
0737 mdc800->downloaded = 0;
0738 if (mdc800->download_urb->status != 0)
0739 {
0740 dev_err(&mdc800->dev->dev,
0741 "request download-bytes fails "
0742 "(status=%i)\n",
0743 mdc800->download_urb->status);
0744 mutex_unlock(&mdc800->io_lock);
0745 return len-left;
0746 }
0747 }
0748 else
0749 {
0750
0751 mutex_unlock(&mdc800->io_lock);
0752 return -EIO;
0753 }
0754 }
0755 else
0756 {
0757
0758 if (copy_to_user(ptr, &mdc800->out [mdc800->out_ptr],
0759 sts)) {
0760 mutex_unlock(&mdc800->io_lock);
0761 return -EFAULT;
0762 }
0763 ptr+=sts;
0764 left-=sts;
0765 mdc800->out_ptr+=sts;
0766 }
0767 }
0768
0769 mutex_unlock(&mdc800->io_lock);
0770 return len-left;
0771 }
0772
0773
0774
0775
0776
0777
0778
0779
0780 static ssize_t mdc800_device_write (struct file *file, const char __user *buf, size_t len, loff_t *pos)
0781 {
0782 size_t i=0;
0783 int retval;
0784
0785 mutex_lock(&mdc800->io_lock);
0786 if (mdc800->state != READY)
0787 {
0788 mutex_unlock(&mdc800->io_lock);
0789 return -EBUSY;
0790 }
0791 if (!mdc800->open )
0792 {
0793 mutex_unlock(&mdc800->io_lock);
0794 return -EBUSY;
0795 }
0796
0797 while (i<len)
0798 {
0799 unsigned char c;
0800 if (signal_pending (current))
0801 {
0802 mutex_unlock(&mdc800->io_lock);
0803 return -EINTR;
0804 }
0805
0806 if(get_user(c, buf+i))
0807 {
0808 mutex_unlock(&mdc800->io_lock);
0809 return -EFAULT;
0810 }
0811
0812
0813 if (c == 0x55)
0814 {
0815 mdc800->in_count=0;
0816 mdc800->out_count=0;
0817 mdc800->out_ptr=0;
0818 mdc800->download_left=0;
0819 }
0820
0821
0822 if (mdc800->in_count < 8)
0823 {
0824 mdc800->in[mdc800->in_count] = c;
0825 mdc800->in_count++;
0826 }
0827 else
0828 {
0829 mutex_unlock(&mdc800->io_lock);
0830 return -EIO;
0831 }
0832
0833
0834 if (mdc800->in_count == 8)
0835 {
0836 int answersize;
0837
0838 if (mdc800_usb_waitForIRQ (0,TO_GET_READY))
0839 {
0840 dev_err(&mdc800->dev->dev,
0841 "Camera didn't get ready.\n");
0842 mutex_unlock(&mdc800->io_lock);
0843 return -EIO;
0844 }
0845
0846 answersize=mdc800_getAnswerSize (mdc800->in[1]);
0847
0848 mdc800->state=WORKING;
0849 memcpy (mdc800->write_urb->transfer_buffer, mdc800->in,8);
0850 mdc800->write_urb->dev = mdc800->dev;
0851 retval = usb_submit_urb (mdc800->write_urb, GFP_KERNEL);
0852 if (retval) {
0853 dev_err(&mdc800->dev->dev,
0854 "submitting write urb fails "
0855 "(retval=%i)\n", retval);
0856 mutex_unlock(&mdc800->io_lock);
0857 return -EIO;
0858 }
0859 wait_event_timeout(mdc800->write_wait, mdc800->written,
0860 msecs_to_jiffies(TO_WRITE_GET_READY));
0861 mdc800->written = 0;
0862 if (mdc800->state == WORKING)
0863 {
0864 usb_kill_urb(mdc800->write_urb);
0865 mutex_unlock(&mdc800->io_lock);
0866 return -EIO;
0867 }
0868
0869 switch ((unsigned char) mdc800->in[1])
0870 {
0871 case 0x05:
0872 case 0x3e:
0873 if (mdc800->pic_len < 0)
0874 {
0875 dev_err(&mdc800->dev->dev,
0876 "call 0x07 before "
0877 "0x05,0x3e\n");
0878 mdc800->state=READY;
0879 mutex_unlock(&mdc800->io_lock);
0880 return -EIO;
0881 }
0882 mdc800->pic_len=-1;
0883 fallthrough;
0884
0885 case 0x09:
0886 mdc800->download_left=answersize+64;
0887 mdc800->state=DOWNLOAD;
0888 mdc800_usb_waitForIRQ (0,TO_DOWNLOAD_GET_BUSY);
0889 break;
0890
0891
0892 default:
0893 if (answersize)
0894 {
0895
0896 if (mdc800_usb_waitForIRQ (1,TO_READ_FROM_IRQ))
0897 {
0898 dev_err(&mdc800->dev->dev, "requesting answer from irq fails\n");
0899 mutex_unlock(&mdc800->io_lock);
0900 return -EIO;
0901 }
0902
0903
0904
0905 memcpy (mdc800->out, mdc800->camera_response,8);
0906
0907
0908 memcpy (&mdc800->out[8], mdc800->camera_response,8);
0909
0910 mdc800->out_ptr=0;
0911 mdc800->out_count=16;
0912
0913
0914 if (mdc800->in [1] == (char) 0x07)
0915 {
0916 mdc800->pic_len=(int) 65536*(unsigned char) mdc800->camera_response[0]+256*(unsigned char) mdc800->camera_response[1]+(unsigned char) mdc800->camera_response[2];
0917
0918 dev_dbg(&mdc800->dev->dev, "cached imagesize = %i\n", mdc800->pic_len);
0919 }
0920
0921 }
0922 else
0923 {
0924 if (mdc800_usb_waitForIRQ (0,TO_DEFAULT_COMMAND))
0925 {
0926 dev_err(&mdc800->dev->dev, "Command Timeout.\n");
0927 mutex_unlock(&mdc800->io_lock);
0928 return -EIO;
0929 }
0930 }
0931 mdc800->state=READY;
0932 break;
0933 }
0934 }
0935 i++;
0936 }
0937 mutex_unlock(&mdc800->io_lock);
0938 return i;
0939 }
0940
0941
0942
0943
0944
0945
0946
0947 static const struct file_operations mdc800_device_ops =
0948 {
0949 .owner = THIS_MODULE,
0950 .read = mdc800_device_read,
0951 .write = mdc800_device_write,
0952 .open = mdc800_device_open,
0953 .release = mdc800_device_release,
0954 .llseek = noop_llseek,
0955 };
0956
0957
0958
0959 static const struct usb_device_id mdc800_table[] = {
0960 { USB_DEVICE(MDC800_VENDOR_ID, MDC800_PRODUCT_ID) },
0961 { }
0962 };
0963
0964 MODULE_DEVICE_TABLE (usb, mdc800_table);
0965
0966
0967
0968 static struct usb_driver mdc800_usb_driver =
0969 {
0970 .name = "mdc800",
0971 .probe = mdc800_usb_probe,
0972 .disconnect = mdc800_usb_disconnect,
0973 .id_table = mdc800_table
0974 };
0975
0976
0977
0978
0979
0980
0981
0982 static int __init usb_mdc800_init (void)
0983 {
0984 int retval = -ENODEV;
0985
0986 mdc800=kzalloc (sizeof (struct mdc800_data), GFP_KERNEL);
0987 if (!mdc800)
0988 goto cleanup_on_fail;
0989
0990 mdc800->dev = NULL;
0991 mdc800->state=NOT_CONNECTED;
0992 mutex_init (&mdc800->io_lock);
0993
0994 init_waitqueue_head (&mdc800->irq_wait);
0995 init_waitqueue_head (&mdc800->write_wait);
0996 init_waitqueue_head (&mdc800->download_wait);
0997
0998 mdc800->irq_woken = 0;
0999 mdc800->downloaded = 0;
1000 mdc800->written = 0;
1001
1002 mdc800->irq_urb_buffer=kmalloc (8, GFP_KERNEL);
1003 if (!mdc800->irq_urb_buffer)
1004 goto cleanup_on_fail;
1005 mdc800->write_urb_buffer=kmalloc (8, GFP_KERNEL);
1006 if (!mdc800->write_urb_buffer)
1007 goto cleanup_on_fail;
1008 mdc800->download_urb_buffer=kmalloc (64, GFP_KERNEL);
1009 if (!mdc800->download_urb_buffer)
1010 goto cleanup_on_fail;
1011
1012 mdc800->irq_urb=usb_alloc_urb (0, GFP_KERNEL);
1013 if (!mdc800->irq_urb)
1014 goto cleanup_on_fail;
1015 mdc800->download_urb=usb_alloc_urb (0, GFP_KERNEL);
1016 if (!mdc800->download_urb)
1017 goto cleanup_on_fail;
1018 mdc800->write_urb=usb_alloc_urb (0, GFP_KERNEL);
1019 if (!mdc800->write_urb)
1020 goto cleanup_on_fail;
1021
1022
1023 retval = usb_register(&mdc800_usb_driver);
1024 if (retval)
1025 goto cleanup_on_fail;
1026
1027 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
1028 DRIVER_DESC "\n");
1029
1030 return 0;
1031
1032
1033
1034 cleanup_on_fail:
1035
1036 if (mdc800 != NULL)
1037 {
1038 printk(KERN_ERR "mdc800: can't alloc memory!\n");
1039
1040 kfree(mdc800->download_urb_buffer);
1041 kfree(mdc800->write_urb_buffer);
1042 kfree(mdc800->irq_urb_buffer);
1043
1044 usb_free_urb(mdc800->write_urb);
1045 usb_free_urb(mdc800->download_urb);
1046 usb_free_urb(mdc800->irq_urb);
1047
1048 kfree (mdc800);
1049 }
1050 mdc800 = NULL;
1051 return retval;
1052 }
1053
1054
1055 static void __exit usb_mdc800_cleanup (void)
1056 {
1057 usb_deregister (&mdc800_usb_driver);
1058
1059 usb_free_urb (mdc800->irq_urb);
1060 usb_free_urb (mdc800->download_urb);
1061 usb_free_urb (mdc800->write_urb);
1062
1063 kfree (mdc800->irq_urb_buffer);
1064 kfree (mdc800->write_urb_buffer);
1065 kfree (mdc800->download_urb_buffer);
1066
1067 kfree (mdc800);
1068 mdc800 = NULL;
1069 }
1070
1071 module_init (usb_mdc800_init);
1072 module_exit (usb_mdc800_cleanup);
1073
1074 MODULE_AUTHOR( DRIVER_AUTHOR );
1075 MODULE_DESCRIPTION( DRIVER_DESC );
1076 MODULE_LICENSE("GPL");
1077