Lines Matching +full:camera +full:- +full:command +full:- +full:set
1 // SPDX-License-Identifier: GPL-2.0+
3 * copyright (C) 1999/2000 by Henning Zabel <henning@uni-paderborn.de>
8 * USB-Kernel Driver for the Mustek MDC800 Digital Camera
9 * (c) 1999/2000 Henning Zabel <henning@uni-paderborn.de>
13 * To use the Camera you must support the USB Protocol of the camera
18 * The driver supports only one camera.
35 * Fixed: Setting urb->dev before submitting urb.
40 * bugfix : The mdc800->state field gets set to READY after the
42 * driver running like the camera is connected and causes some
50 * The mdc800 driver gets assigned the USB Minor 32-47. The Registration
66 * Either with the dev->bus->ops->bulk... or with callback function.
94 #define DRIVER_AUTHOR "Henning Zabel <henning@uni-paderborn.de>"
95 #define DRIVER_DESC "USB Driver for Mustek MDC800 Digital Camera"
136 int camera_busy; // is camera busy ?
158 int open; // Camera device open ?
159 struct mutex io_lock; // IO -lock
161 char in [8]; // Command Input Buffer
164 int pic_index; // Cache for the Imagesize (-1 for nothing cached )
226 ( a->bEndpointAddress == b->bEndpointAddress ) in mdc800_endpoint_equals()
227 && ( a->bmAttributes == b->bmAttributes ) in mdc800_endpoint_equals()
228 && ( a->wMaxPacketSize == b->wMaxPacketSize ) in mdc800_endpoint_equals()
234 * Checks whether the camera responds busy
250 * Checks whether the Camera is ready
272 unsigned char* b=urb->transfer_buffer; in mdc800_usb_irq()
273 struct mdc800_data* mdc800=urb->context; in mdc800_usb_irq()
274 struct device *dev = &mdc800->dev->dev; in mdc800_usb_irq()
275 int status = urb->status; in mdc800_usb_irq()
280 if (!mdc800->camera_busy) in mdc800_usb_irq()
282 mdc800->camera_busy=1; in mdc800_usb_irq()
288 if (mdc800->camera_busy && mdc800_isReady (b)) in mdc800_usb_irq()
290 mdc800->camera_busy=0; in mdc800_usb_irq()
299 memcpy (mdc800->camera_response,b,8); in mdc800_usb_irq()
303 wake_up= ( mdc800->camera_request_ready > 0 ) in mdc800_usb_irq()
306 ((mdc800->camera_request_ready == 1) && (!mdc800->camera_busy)) in mdc800_usb_irq()
308 ((mdc800->camera_request_ready == 2) && data_received) in mdc800_usb_irq()
310 ((mdc800->camera_request_ready == 3) && (mdc800->camera_busy)) in mdc800_usb_irq()
317 mdc800->camera_request_ready=0; in mdc800_usb_irq()
318 mdc800->irq_woken=1; in mdc800_usb_irq()
319 wake_up (&mdc800->irq_wait); in mdc800_usb_irq()
325 * Waits a while until the irq responds that camera is ready
327 * mode : 0: Wait for camera gets ready
329 * 2: Wait for camera gets busy
335 mdc800->camera_request_ready=1+mode; in mdc800_usb_waitForIRQ()
337 wait_event_timeout(mdc800->irq_wait, mdc800->irq_woken, in mdc800_usb_waitForIRQ()
339 mdc800->irq_woken = 0; in mdc800_usb_waitForIRQ()
341 if (mdc800->camera_request_ready>0) in mdc800_usb_waitForIRQ()
343 mdc800->camera_request_ready=0; in mdc800_usb_waitForIRQ()
344 dev_err(&mdc800->dev->dev, "timeout waiting for camera.\n"); in mdc800_usb_waitForIRQ()
345 return -1; in mdc800_usb_waitForIRQ()
348 if (mdc800->state == NOT_CONNECTED) in mdc800_usb_waitForIRQ()
350 printk(KERN_WARNING "mdc800: Camera gets disconnected " in mdc800_usb_waitForIRQ()
352 mdc800->camera_request_ready=0; in mdc800_usb_waitForIRQ()
353 return -2; in mdc800_usb_waitForIRQ()
365 struct mdc800_data* mdc800=urb->context; in mdc800_usb_write_notify()
366 int status = urb->status; in mdc800_usb_write_notify()
369 dev_err(&mdc800->dev->dev, in mdc800_usb_write_notify()
370 "writing command fails (status=%i)\n", status); in mdc800_usb_write_notify()
372 mdc800->state=READY; in mdc800_usb_write_notify()
373 mdc800->written = 1; in mdc800_usb_write_notify()
374 wake_up (&mdc800->write_wait); in mdc800_usb_write_notify()
383 struct mdc800_data* mdc800=urb->context; in mdc800_usb_download_notify()
384 int status = urb->status; in mdc800_usb_download_notify()
388 memcpy (mdc800->out, urb->transfer_buffer, 64); in mdc800_usb_download_notify()
389 mdc800->out_count=64; in mdc800_usb_download_notify()
390 mdc800->out_ptr=0; in mdc800_usb_download_notify()
391 mdc800->download_left-=64; in mdc800_usb_download_notify()
392 if (mdc800->download_left == 0) in mdc800_usb_download_notify()
394 mdc800->state=READY; in mdc800_usb_download_notify()
397 dev_err(&mdc800->dev->dev, in mdc800_usb_download_notify()
400 mdc800->downloaded = 1; in mdc800_usb_download_notify()
401 wake_up (&mdc800->download_wait); in mdc800_usb_download_notify()
406 Probing for the Camera
430 dev_dbg(&intf->dev, "(%s) called.\n", __func__); in mdc800_usb_probe()
433 if (mdc800->dev != NULL) in mdc800_usb_probe()
435 dev_warn(&intf->dev, "only one Mustek MDC800 is supported.\n"); in mdc800_usb_probe()
436 return -ENODEV; in mdc800_usb_probe()
439 if (dev->descriptor.bNumConfigurations != 1) in mdc800_usb_probe()
441 dev_err(&intf->dev, in mdc800_usb_probe()
442 "probe fails -> wrong Number of Configuration\n"); in mdc800_usb_probe()
443 return -ENODEV; in mdc800_usb_probe()
445 intf_desc = intf->cur_altsetting; in mdc800_usb_probe()
448 ( intf_desc->desc.bInterfaceClass != 0xff ) in mdc800_usb_probe()
449 || ( intf_desc->desc.bInterfaceSubClass != 0 ) in mdc800_usb_probe()
450 || ( intf_desc->desc.bInterfaceProtocol != 0 ) in mdc800_usb_probe()
451 || ( intf_desc->desc.bNumEndpoints != 4) in mdc800_usb_probe()
454 dev_err(&intf->dev, "probe fails -> wrong Interface\n"); in mdc800_usb_probe()
455 return -ENODEV; in mdc800_usb_probe()
461 mdc800->endpoint[i]=-1; in mdc800_usb_probe()
464 if (mdc800_endpoint_equals (&intf_desc->endpoint [j].desc,&mdc800_ed [i])) in mdc800_usb_probe()
466 mdc800->endpoint[i]=intf_desc->endpoint [j].desc.bEndpointAddress ; in mdc800_usb_probe()
469 irq_interval=intf_desc->endpoint [j].desc.bInterval; in mdc800_usb_probe()
473 if (mdc800->endpoint[i] == -1) in mdc800_usb_probe()
475 dev_err(&intf->dev, "probe fails -> Wrong Endpoints.\n"); in mdc800_usb_probe()
476 return -ENODEV; in mdc800_usb_probe()
481 dev_info(&intf->dev, "Found Mustek MDC800 on USB.\n"); in mdc800_usb_probe()
483 mutex_lock(&mdc800->io_lock); in mdc800_usb_probe()
487 dev_err(&intf->dev, "Not able to get a minor for this device.\n"); in mdc800_usb_probe()
488 mutex_unlock(&mdc800->io_lock); in mdc800_usb_probe()
489 return -ENODEV; in mdc800_usb_probe()
492 mdc800->dev=dev; in mdc800_usb_probe()
493 mdc800->open=0; in mdc800_usb_probe()
497 mdc800->irq_urb, in mdc800_usb_probe()
498 mdc800->dev, in mdc800_usb_probe()
499 usb_rcvintpipe (mdc800->dev,mdc800->endpoint [1]), in mdc800_usb_probe()
500 mdc800->irq_urb_buffer, in mdc800_usb_probe()
508 mdc800->write_urb, in mdc800_usb_probe()
509 mdc800->dev, in mdc800_usb_probe()
510 usb_sndbulkpipe (mdc800->dev, mdc800->endpoint[0]), in mdc800_usb_probe()
511 mdc800->write_urb_buffer, in mdc800_usb_probe()
518 mdc800->download_urb, in mdc800_usb_probe()
519 mdc800->dev, in mdc800_usb_probe()
520 usb_rcvbulkpipe (mdc800->dev, mdc800->endpoint [3]), in mdc800_usb_probe()
521 mdc800->download_urb_buffer, in mdc800_usb_probe()
527 mdc800->state=READY; in mdc800_usb_probe()
529 mutex_unlock(&mdc800->io_lock); in mdc800_usb_probe()
543 dev_dbg(&intf->dev, "(%s) called\n", __func__); in mdc800_usb_disconnect()
546 if (mdc800->state == NOT_CONNECTED) in mdc800_usb_disconnect()
553 mutex_lock(&mdc800->io_lock); in mdc800_usb_disconnect()
554 mdc800->state=NOT_CONNECTED; in mdc800_usb_disconnect()
556 usb_kill_urb(mdc800->irq_urb); in mdc800_usb_disconnect()
557 usb_kill_urb(mdc800->write_urb); in mdc800_usb_disconnect()
558 usb_kill_urb(mdc800->download_urb); in mdc800_usb_disconnect()
559 mutex_unlock(&mdc800->io_lock); in mdc800_usb_disconnect()
561 mdc800->dev = NULL; in mdc800_usb_disconnect()
564 dev_info(&intf->dev, "Mustek MDC800 disconnected from USB.\n"); in mdc800_usb_disconnect()
573 * This Function calc the Answersize for a command.
575 static int mdc800_getAnswerSize (char command) in mdc800_getAnswerSize() argument
577 switch ((unsigned char) command) in mdc800_getAnswerSize()
592 return mdc800->pic_len; in mdc800_getAnswerSize()
611 mutex_lock(&mdc800->io_lock); in mdc800_device_open()
613 if (mdc800->state == NOT_CONNECTED) in mdc800_device_open()
615 errn=-EBUSY; in mdc800_device_open()
618 if (mdc800->open) in mdc800_device_open()
620 errn=-EBUSY; in mdc800_device_open()
624 mdc800->in_count=0; in mdc800_device_open()
625 mdc800->out_count=0; in mdc800_device_open()
626 mdc800->out_ptr=0; in mdc800_device_open()
627 mdc800->pic_index=0; in mdc800_device_open()
628 mdc800->pic_len=-1; in mdc800_device_open()
629 mdc800->download_left=0; in mdc800_device_open()
631 mdc800->camera_busy=0; in mdc800_device_open()
632 mdc800->camera_request_ready=0; in mdc800_device_open()
634 mdc800->irq_urb->dev = mdc800->dev; in mdc800_device_open()
635 retval = usb_submit_urb (mdc800->irq_urb, GFP_KERNEL); in mdc800_device_open()
637 dev_err(&mdc800->dev->dev, in mdc800_device_open()
639 errn = -EIO; in mdc800_device_open()
643 mdc800->open=1; in mdc800_device_open()
644 dev_dbg(&mdc800->dev->dev, "Mustek MDC800 device opened.\n"); in mdc800_device_open()
647 mutex_unlock(&mdc800->io_lock); in mdc800_device_open()
653 * Close the Camera and release Memory
659 mutex_lock(&mdc800->io_lock); in mdc800_device_release()
660 if (mdc800->open && (mdc800->state != NOT_CONNECTED)) in mdc800_device_release()
662 usb_kill_urb(mdc800->irq_urb); in mdc800_device_release()
663 usb_kill_urb(mdc800->write_urb); in mdc800_device_release()
664 usb_kill_urb(mdc800->download_urb); in mdc800_device_release()
665 mdc800->open=0; in mdc800_device_release()
669 retval=-EIO; in mdc800_device_release()
672 mutex_unlock(&mdc800->io_lock); in mdc800_device_release()
686 mutex_lock(&mdc800->io_lock); in mdc800_device_read()
687 if (mdc800->state == NOT_CONNECTED) in mdc800_device_read()
689 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
690 return -EBUSY; in mdc800_device_read()
692 if (mdc800->state == WORKING) in mdc800_device_read()
696 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
697 return -EBUSY; in mdc800_device_read()
699 if (!mdc800->open) in mdc800_device_read()
701 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
702 return -EBUSY; in mdc800_device_read()
709 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
710 return -EINTR; in mdc800_device_read()
713 sts=left > (mdc800->out_count-mdc800->out_ptr)?mdc800->out_count-mdc800->out_ptr:left; in mdc800_device_read()
718 if (mdc800->state == DOWNLOAD) in mdc800_device_read()
720 mdc800->out_count=0; in mdc800_device_read()
721 mdc800->out_ptr=0; in mdc800_device_read()
723 /* Download -> Request new bytes */ in mdc800_device_read()
724 mdc800->download_urb->dev = mdc800->dev; in mdc800_device_read()
725 retval = usb_submit_urb (mdc800->download_urb, GFP_KERNEL); in mdc800_device_read()
727 dev_err(&mdc800->dev->dev, in mdc800_device_read()
730 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
731 return len-left; in mdc800_device_read()
733 wait_event_timeout(mdc800->download_wait, in mdc800_device_read()
734 mdc800->downloaded, in mdc800_device_read()
736 mdc800->downloaded = 0; in mdc800_device_read()
737 if (mdc800->download_urb->status != 0) in mdc800_device_read()
739 dev_err(&mdc800->dev->dev, in mdc800_device_read()
740 "request download-bytes fails " in mdc800_device_read()
742 mdc800->download_urb->status); in mdc800_device_read()
743 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
744 return len-left; in mdc800_device_read()
749 /* No more bytes -> that's an error*/ in mdc800_device_read()
750 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
751 return -EIO; in mdc800_device_read()
757 if (copy_to_user(ptr, &mdc800->out [mdc800->out_ptr], in mdc800_device_read()
759 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
760 return -EFAULT; in mdc800_device_read()
763 left-=sts; in mdc800_device_read()
764 mdc800->out_ptr+=sts; in mdc800_device_read()
768 mutex_unlock(&mdc800->io_lock); in mdc800_device_read()
769 return len-left; in mdc800_device_read()
775 * If a 8Byte Command is received, it will be send to the camera.
777 * just waits until the camera becomes ready.
784 mutex_lock(&mdc800->io_lock); in mdc800_device_write()
785 if (mdc800->state != READY) in mdc800_device_write()
787 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
788 return -EBUSY; in mdc800_device_write()
790 if (!mdc800->open ) in mdc800_device_write()
792 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
793 return -EBUSY; in mdc800_device_write()
801 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
802 return -EINTR; in mdc800_device_write()
807 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
808 return -EFAULT; in mdc800_device_write()
811 /* check for command start */ in mdc800_device_write()
814 mdc800->in_count=0; in mdc800_device_write()
815 mdc800->out_count=0; in mdc800_device_write()
816 mdc800->out_ptr=0; in mdc800_device_write()
817 mdc800->download_left=0; in mdc800_device_write()
820 /* save command byte */ in mdc800_device_write()
821 if (mdc800->in_count < 8) in mdc800_device_write()
823 mdc800->in[mdc800->in_count] = c; in mdc800_device_write()
824 mdc800->in_count++; in mdc800_device_write()
828 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
829 return -EIO; in mdc800_device_write()
832 /* Command Buffer full ? -> send it to camera */ in mdc800_device_write()
833 if (mdc800->in_count == 8) in mdc800_device_write()
839 dev_err(&mdc800->dev->dev, in mdc800_device_write()
840 "Camera didn't get ready.\n"); in mdc800_device_write()
841 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
842 return -EIO; in mdc800_device_write()
845 answersize=mdc800_getAnswerSize (mdc800->in[1]); in mdc800_device_write()
847 mdc800->state=WORKING; in mdc800_device_write()
848 memcpy (mdc800->write_urb->transfer_buffer, mdc800->in,8); in mdc800_device_write()
849 mdc800->write_urb->dev = mdc800->dev; in mdc800_device_write()
850 retval = usb_submit_urb (mdc800->write_urb, GFP_KERNEL); in mdc800_device_write()
852 dev_err(&mdc800->dev->dev, in mdc800_device_write()
855 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
856 return -EIO; in mdc800_device_write()
858 wait_event_timeout(mdc800->write_wait, mdc800->written, in mdc800_device_write()
860 mdc800->written = 0; in mdc800_device_write()
861 if (mdc800->state == WORKING) in mdc800_device_write()
863 usb_kill_urb(mdc800->write_urb); in mdc800_device_write()
864 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
865 return -EIO; in mdc800_device_write()
868 switch ((unsigned char) mdc800->in[1]) in mdc800_device_write()
872 if (mdc800->pic_len < 0) in mdc800_device_write()
874 dev_err(&mdc800->dev->dev, in mdc800_device_write()
877 mdc800->state=READY; in mdc800_device_write()
878 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
879 return -EIO; in mdc800_device_write()
881 mdc800->pic_len=-1; in mdc800_device_write()
885 mdc800->download_left=answersize+64; in mdc800_device_write()
886 mdc800->state=DOWNLOAD; in mdc800_device_write()
897 dev_err(&mdc800->dev->dev, "requesting answer from irq fails\n"); in mdc800_device_write()
898 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
899 return -EIO; in mdc800_device_write()
904 memcpy (mdc800->out, mdc800->camera_response,8); in mdc800_device_write()
907 memcpy (&mdc800->out[8], mdc800->camera_response,8); in mdc800_device_write()
909 mdc800->out_ptr=0; in mdc800_device_write()
910 mdc800->out_count=16; in mdc800_device_write()
912 /* Cache the Imagesize, if command was getImageSize */ in mdc800_device_write()
913 if (mdc800->in [1] == (char) 0x07) in mdc800_device_write()
915 …mdc800->pic_len=(int) 65536*(unsigned char) mdc800->camera_response[0]+256*(unsigned char) mdc800-… in mdc800_device_write()
917 dev_dbg(&mdc800->dev->dev, "cached imagesize = %i\n", mdc800->pic_len); in mdc800_device_write()
925 dev_err(&mdc800->dev->dev, "Command Timeout.\n"); in mdc800_device_write()
926 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
927 return -EIO; in mdc800_device_write()
930 mdc800->state=READY; in mdc800_device_write()
936 mutex_unlock(&mdc800->io_lock); in mdc800_device_write()
983 int retval = -ENODEV; in usb_mdc800_init()
989 mdc800->dev = NULL; in usb_mdc800_init()
990 mdc800->state=NOT_CONNECTED; in usb_mdc800_init()
991 mutex_init (&mdc800->io_lock); in usb_mdc800_init()
993 init_waitqueue_head (&mdc800->irq_wait); in usb_mdc800_init()
994 init_waitqueue_head (&mdc800->write_wait); in usb_mdc800_init()
995 init_waitqueue_head (&mdc800->download_wait); in usb_mdc800_init()
997 mdc800->irq_woken = 0; in usb_mdc800_init()
998 mdc800->downloaded = 0; in usb_mdc800_init()
999 mdc800->written = 0; in usb_mdc800_init()
1001 mdc800->irq_urb_buffer=kmalloc (8, GFP_KERNEL); in usb_mdc800_init()
1002 if (!mdc800->irq_urb_buffer) in usb_mdc800_init()
1004 mdc800->write_urb_buffer=kmalloc (8, GFP_KERNEL); in usb_mdc800_init()
1005 if (!mdc800->write_urb_buffer) in usb_mdc800_init()
1007 mdc800->download_urb_buffer=kmalloc (64, GFP_KERNEL); in usb_mdc800_init()
1008 if (!mdc800->download_urb_buffer) in usb_mdc800_init()
1011 mdc800->irq_urb=usb_alloc_urb (0, GFP_KERNEL); in usb_mdc800_init()
1012 if (!mdc800->irq_urb) in usb_mdc800_init()
1014 mdc800->download_urb=usb_alloc_urb (0, GFP_KERNEL); in usb_mdc800_init()
1015 if (!mdc800->download_urb) in usb_mdc800_init()
1017 mdc800->write_urb=usb_alloc_urb (0, GFP_KERNEL); in usb_mdc800_init()
1018 if (!mdc800->write_urb) in usb_mdc800_init()
1039 kfree(mdc800->download_urb_buffer); in usb_mdc800_init()
1040 kfree(mdc800->write_urb_buffer); in usb_mdc800_init()
1041 kfree(mdc800->irq_urb_buffer); in usb_mdc800_init()
1043 usb_free_urb(mdc800->write_urb); in usb_mdc800_init()
1044 usb_free_urb(mdc800->download_urb); in usb_mdc800_init()
1045 usb_free_urb(mdc800->irq_urb); in usb_mdc800_init()
1058 usb_free_urb (mdc800->irq_urb); in usb_mdc800_cleanup()
1059 usb_free_urb (mdc800->download_urb); in usb_mdc800_cleanup()
1060 usb_free_urb (mdc800->write_urb); in usb_mdc800_cleanup()
1062 kfree (mdc800->irq_urb_buffer); in usb_mdc800_cleanup()
1063 kfree (mdc800->write_urb_buffer); in usb_mdc800_cleanup()
1064 kfree (mdc800->download_urb_buffer); in usb_mdc800_cleanup()