34 #include <linux/module.h>
35 #include <linux/init.h>
36 #include <linux/kernel.h>
37 #include <linux/version.h>
38 #include <linux/errno.h>
39 #include <linux/slab.h>
40 #include <linux/kref.h>
43 #include <linux/usb.h>
44 #include <media/v4l2-common.h>
45 #include <media/v4l2-ioctl.h>
138 struct usb_device *udev;
143 if (dev->isoc_init_ok)
155 STK_ERROR(
"Failed to allocate URB %d\n", i);
160 dev->isobuf[i].urb = urb;
165 if (dev->isobuf[i].urb != NULL)
166 usb_free_urb(dev->isobuf[i].urb);
168 dev->isobuf[i].urb = NULL;
177 urb = dev->isobuf[i].urb;
182 urb->transfer_flags = URB_ISO_ASAP;
183 urb->transfer_buffer = dev->isobuf[i].data;
187 urb->start_frame = 0;
201 ret = usb_submit_urb(dev->isobuf[i].urb, GFP_KERNEL);
204 STK_ERROR(
"isoc_init() submit_urb %d failed with error %d\n", i, ret);
206 STK_DEBUG(
"URB 0x%p submitted.\n", dev->isobuf[i].urb);
237 dev->isoc_init_ok = 1;
262 unsigned char *fill = NULL;
263 unsigned char *iso_buf = NULL;
273 STK_ERROR(
"isoc_handler called with NULL device !\n");
277 if (urb->status == -ENOENT || urb->status == -ECONNRESET) {
278 STK_DEBUG(
"URB unlinked synchronuously !\n");
282 if (urb->status != -EINPROGRESS && urb->status != 0) {
287 switch(urb->status) {
289 errmsg =
"Buffer error (overrun)";
293 errmsg =
"Stalled (device not responding)";
297 errmsg =
"Babble (bad cable?)";
301 errmsg =
"Bit-stuff error (bad cable?)";
305 errmsg =
"CRC/Timeout (could be anything)";
309 errmsg =
"NAK (device does not respond)";
313 STK_ERROR(
"isoc_handler() called with status %d [%s].\n", urb->status, errmsg);
319 urb->dev = dev->
udev;
320 ret = usb_submit_urb(urb, GFP_ATOMIC);
323 STK_ERROR(
"Error (%d) re-submitting urb in stk11xx_isoc_handler.\n", ret);
329 framebuf = dev->fill_frame;
331 if (framebuf == NULL) {
332 STK_ERROR(
"isoc_handler without valid fill frame !\n");
336 urb->dev = dev->
udev;
337 ret = usb_submit_urb(urb, GFP_ATOMIC);
340 STK_ERROR(
"Error (%d) re-submitting urb in stk11xx_isoc_handler.\n", ret);
346 fill = framebuf->data + framebuf->filled;
353 for (i=0; i<urb->number_of_packets; i++) {
354 framestatus = urb->iso_frame_desc[i].status;
355 framelen = urb->iso_frame_desc[i].actual_length;
356 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
358 if (framestatus == 0) {
370 if (*iso_buf & 0x80) {
377 framebuf->odd =
true;
379 framebuf->odd =
false;
383 if (framelen - skip + framebuf->filled > dev->frame_size) {
384 STK_ERROR(
"Frame buffer overflow %d %d %d!\n",
385 framelen, framelen-skip+framebuf->filled, dev->frame_size);
390 memcpy(fill, iso_buf + skip, framelen - skip);
391 fill += framelen - skip;
395 framebuf->filled += framelen - skip;
398 STK_STREAM(
"URB : Length = %d - Skip = %d - Buffer size = %d\n",
399 framelen, skip, framebuf->filled);
403 if (framebuf->filled > 0) {
405 if (framebuf->filled < dev->frame_size)
409 if (framebuf->errors == 0) {
417 framebuf = dev->fill_frame;
418 framebuf->filled = 0;
419 framebuf->errors = 0;
420 fill = framebuf->data;
425 STK_ERROR(
"Iso frame %d of USB has error %d\n", i, framestatus);
432 urb->dev = dev->
udev;
434 ret = usb_submit_urb(urb, GFP_ATOMIC);
437 STK_ERROR(
"Error (%d) re-submitting urb in stk11xx_isoc_handler.\n", ret);
458 if (dev->isoc_init_ok == 0)
465 urb = dev->isobuf[i].urb;
468 if (dev->isoc_init_ok)
472 dev->isobuf[i].urb = NULL;
477 dev->isoc_init_ok = 0;
495 struct usb_device *udev = dev->
udev;
497 result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
499 USB_TYPE_STANDARD | USB_DIR_OUT | USB_RECIP_DEVICE,
500 USB_DEVICE_REMOTE_WAKEUP,
527 struct usb_device *udev = dev->
udev;
529 result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
530 USB_REQ_SET_CONFIGURATION,
531 USB_TYPE_STANDARD | USB_DIR_OUT | USB_RECIP_DEVICE,
533 udev->config[0].desc.bConfigurationValue,
541 STK_DEBUG(
"SET CONFIGURATION %d\n", udev->config[0].desc.bConfigurationValue);
561 struct usb_device *udev = dev->
udev;
563 result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
565 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
573 STK_ERROR(
"Write registry fails %02X = %02X", index, value);
594 struct usb_device *udev = dev->
udev;
598 result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
600 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
608 STK_ERROR(
"Read registry fails %02X", index);
627 case SYNTEK_STK_0408:
640 case SYNTEK_STK_M811:
641 case SYNTEK_STK_A311:
652 case SYNTEK_STK_A821:
653 case SYNTEK_STK_AA11:
664 case SYNTEK_STK_6A31:
665 case SYNTEK_STK_6A33:
666 case SYNTEK_STK_0500:
677 case SYNTEK_STK_6A51:
678 case SYNTEK_STK_6D51:
679 case SYNTEK_STK_6A54:
729 struct usb_device *udev = interface_to_usbdev(interface);
730 struct usb_host_interface *iface_desc;
731 struct usb_endpoint_descriptor *endpoint;
735 vendor_id = le16_to_cpu(udev->descriptor.idVendor);
736 product_id = le16_to_cpu(udev->descriptor.idProduct);
739 STK_DEBUG(
"Probe function called with VendorID=%04X, ProductID=%04X and InterfaceNumber=%d\n",
740 vendor_id, product_id, interface->cur_altsetting->desc.bInterfaceNumber);
745 if (interface->cur_altsetting->desc.bInterfaceNumber > 0)
750 switch (product_id) {
752 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
753 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0xA311.\n");
754 webcam_model = SYNTEK_STK_A311;
759 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
760 STK_INFO(
"Syntek AVStream USB2.0 VGA WebCam - Product ID 0xA821.\n");
761 webcam_model = SYNTEK_STK_A821;
766 STK_INFO(
"Syntek AVStream USB2.0 VGA WebCam - Product ID 0xAA11.\n");
767 STK_INFO(
"Using code for Product ID AxA821\n");
768 webcam_model = SYNTEK_STK_AA11;
773 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
774 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x6A31.\n");
775 webcam_model = SYNTEK_STK_6A31;
780 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
781 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x6A33.\n");
782 webcam_model = SYNTEK_STK_6A33;
787 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
788 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x6A51.\n");
789 webcam_model = SYNTEK_STK_6A51;
794 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
795 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x6A54.\n");
796 webcam_model = SYNTEK_STK_6A54;
801 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
802 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x6D51.\n");
803 webcam_model = SYNTEK_STK_6D51;
808 STK_ERROR(
"usb_stk11xx_probe failed ! Camera product 0x%04X is not supported.\n",
809 le16_to_cpu(udev->descriptor.idProduct));
814 switch (product_id) {
816 STK_INFO(
"Syntek USB2.0 - STK-1160 based device found.\n");
817 STK_INFO(
"Syntek AVStream USB2.0 Video Capture - Product ID 0x0408.\n");
818 webcam_model = SYNTEK_STK_0408;
823 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
824 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x0500.\n");
825 webcam_model = SYNTEK_STK_0500;
830 STK_INFO(
"Syntek USB2.0 - STK-1135 based webcam found.\n");
831 STK_INFO(
"Syntek AVStream USB2.0 1.3M WebCam - Product ID 0x0501.\n");
832 webcam_model = SYNTEK_STK_M811;
837 STK_ERROR(
"usb_stk11xx_probe failed ! Camera product 0x%04X is not supported.\n",
838 le16_to_cpu(udev->descriptor.idProduct));
846 dev = kzalloc(
sizeof(
struct usb_stk11xx), GFP_KERNEL);
856 sema_init(&dev->
mutex,1);
858 init_MUTEX(&dev->
mutex);
871 dev->
release = le16_to_cpu(udev->descriptor.bcdDevice);
875 bNumInterfaces = udev->config->desc.bNumInterfaces;
876 STK_INFO(
"Number of interfaces : %d\n", bNumInterfaces);
894 iface_desc = interface->cur_altsetting;
896 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
897 endpoint = &iface_desc->endpoint[i].desc;
900 && ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
901 && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
903 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
910 && ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
911 && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_ISOC)) {
913 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
921 STK_ERROR(
"Could not find both int-in and isoc-in endpoints");
933 dev->
vdev = video_device_alloc();
955 usb_set_intfdata(interface, dev);
975 struct usb_stk11xx *dev = usb_get_intfdata(interface);
977 STK_INFO(
"Syntek USB2.0 Camera disconnected\n");
981 STK_INFO(
"Disconnected while webcam is in use !\n");
982 dev->error_status = EPIPE;
998 usb_set_intfdata(interface, NULL);
1066 .name =
"usb_stk11xx_driver",
1153 if (fps < 9 || fps > 30) {
1154 STK_ERROR(
"Framerate out of bounds [10-30] !\n");
1215 STK_ERROR(
"usb_register failed ! Error number %d\n", result);
1228 STK_INFO(
"usb_stk11xx_exit: Syntek USB2.0 webcam driver shutdown\n");
int usb_stk11xx_isoc_init(struct usb_stk11xx *dev)
Initilize an isochronous pipe.
MODULE_VERSION(DRIVER_VERSION)
Define the version of the driver.
#define USB_STK_6A51_PRODUCT_ID
int v4l_stk11xx_unregister_video_device(struct usb_stk11xx *dev)
Unregister the video device.
static struct usb_device_id stk11xx_table[]
int dev_stk11xx_camera_off(struct usb_stk11xx *dev)
This function switchs off the camera.
MODULE_DEVICE_TABLE(usb, stk11xx_table)
static void __exit usb_stk11xx_exit(void)
Close the driver.
int dev_stk11xx_camera_on(struct usb_stk11xx *dev)
This function switchs on the camera.
MODULE_LICENSE("GPL")
Driver is under licence GPL.
static int default_whiteness
#define USB_STK_0408_PRODUCT_ID
static struct usb_driver usb_stk11xx_driver
MODULE_DESCRIPTION(DRIVER_DESC)
Define the description of the driver.
MODULE_AUTHOR(DRIVER_AUTHOR)
Driver is written by Nicolas VIVIEN.
#define USB_SYNTEK1_VENDOR_ID
#define STK_DEBUG(str, args...)
wait_queue_head_t wait_frame
#define STK_ERROR(str, args...)
module_init(usb_stk11xx_init)
Module initialize.
void usb_stk11xx_isoc_cleanup(struct usb_stk11xx *dev)
Clean-up all the ISOC buffers.
module_param(fps, int, 0444)
Module frame per second parameter.
#define USB_STK_6A33_PRODUCT_ID
MODULE_SUPPORTED_DEVICE(DRIVER_SUPPORT)
List of supported device.
void stk11xx_remove_sysfs_files(struct video_device *vdev)
Remove the 'sys' entries.
int usb_stk11xx_set_configuration(struct usb_stk11xx *dev)
Send the message SET_CONFIGURATION.
static int usb_stk11xx_probe(struct usb_interface *interface, const struct usb_device_id *id)
Load the driver.
#define STK_STREAM(str, args...)
struct stk11xx_video vsettings
#define USB_STK_6A31_PRODUCT_ID
void usb_stk11xx_isoc_handler(struct urb *urb)
ISOC handler.
#define ISO_FRAMES_PER_DESC
static int default_colour
int stk11xx_next_frame(struct usb_stk11xx *dev)
Prepare the next frame.
#define USB_STK_AA11_PRODUCT_ID
static void usb_stk11xx_disconnect(struct usb_interface *interface)
This function is called when the device is disconnected or when the kernel module is unloaded...
#define USB_STK_6D51_PRODUCT_ID
#define STK11XX_PERCENT(x, y)
MODULE_PARM_DESC(fps,"Frames per second [5-30]")
Description of 'fps' parameter.
__u8 isoc_in_endpointAddr
#define USB_STK_0500_PRODUCT_ID
#define USB_STK_6A54_PRODUCT_ID
MODULE_INFO(url, DRIVER_URL)
Driver homepage URL.
struct video_device * vdev
int stk11xx_create_sysfs_files(struct video_device *vdev)
Create the 'sys' entries.
int usb_stk11xx_set_feature(struct usb_stk11xx *dev, int index)
Send the message SET_FEATURE and choose the interface.
static int __init usb_stk11xx_init(void)
Initialize the driver.
#define STK11XX_FRAME_SIZE
static int default_brightness
#define USB_STK_0501_PRODUCT_ID
#define ISO_MAX_FRAME_SIZE
module_exit(usb_stk11xx_exit)
Module exit.
static int default_contrast
#define USB_SYNTEK2_VENDOR_ID
#define STK_INFO(str, args...)
int usb_stk11xx_write_registry(struct usb_stk11xx *dev, __u16 index, __u16 value)
Write a 16-bits value to a 16-bits register.
#define USB_STK_A821_PRODUCT_ID
struct usb_interface * interface
int usb_stk11xx_read_registry(struct usb_stk11xx *dev, __u16 index, int *value)
Read a 16-bits value from a 16-bits register.
Driver for Syntek USB video camera.
int dev_stk11xx_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
static int usb_stk11xx_default_settings(struct usb_stk11xx *dev)
Set the default value about the video settings.
#define USB_STK_A311_PRODUCT_ID
int v4l_stk11xx_register_video_device(struct usb_stk11xx *dev)
Register the video device.