Lines Matching +full:frame +full:- +full:buffer
2 * uvc_driver.c -- USB Video Class driver
4 * Copyright (C) 2005-2010
20 * software. If your user-space application doesn't support YUYV or MJPEG, fix
21 * it :-). Please note that the MJPEG data have been stripped from their
38 #include <media/v4l2-common.h>
48 static unsigned int uvc_quirks_param = -1;
52 /* ------------------------------------------------------------------------
98 .name = "Greyscale (8-bit)",
103 .name = "Greyscale (16-bit)",
124 /* ------------------------------------------------------------------------
134 for (i = 0; i < alts->desc.bNumEndpoints; ++i) { in uvc_find_endpoint()
135 ep = &alts->endpoint[i]; in uvc_find_endpoint()
136 if (ep->desc.bEndpointAddress == epaddr) in uvc_find_endpoint()
176 * arbitrary parameters to remove non-significative terms from the simple
207 r = x - an[n] * y; in uvc_simplify_fraction()
216 for (i = n; i > 0; --i) { in uvc_simplify_fraction()
218 y = an[i-1] * y + x; in uvc_simplify_fraction()
227 /* Convert a fraction to a frame interval in 100ns multiples. The idea here is
237 numerator/denominator >= ((uint32_t)-1)/10000000) in uvc_fraction_to_interval()
238 return (uint32_t)-1; in uvc_fraction_to_interval()
245 while (numerator > ((uint32_t)-1)/multiplier) { in uvc_fraction_to_interval()
253 /* ------------------------------------------------------------------------
261 list_for_each_entry(entity, &dev->entities, list) { in uvc_entity_by_id()
262 if (entity->id == id) in uvc_entity_by_id()
275 entity = list_entry(&dev->entities, struct uvc_entity, list); in uvc_entity_by_reference()
277 list_for_each_entry_continue(entity, &dev->entities, list) { in uvc_entity_by_reference()
278 for (i = 0; i < entity->bNrInPins; ++i) in uvc_entity_by_reference()
279 if (entity->baSourceID[i] == id) in uvc_entity_by_reference()
290 list_for_each_entry(stream, &dev->streams, list) { in uvc_stream_by_id()
291 if (stream->header.bTerminalLink == id) in uvc_stream_by_id()
298 /* ------------------------------------------------------------------------
304 __u32 **intervals, unsigned char *buffer, int buflen) in uvc_parse_format() argument
306 struct usb_interface *intf = streaming->intf; in uvc_parse_format()
307 struct usb_host_interface *alts = intf->cur_altsetting; in uvc_parse_format()
309 struct uvc_frame *frame; in uvc_parse_format() local
310 const unsigned char *start = buffer; in uvc_parse_format()
315 format->type = buffer[2]; in uvc_parse_format()
316 format->index = buffer[3]; in uvc_parse_format()
318 switch (buffer[2]) { in uvc_parse_format()
321 n = buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED ? 27 : 28; in uvc_parse_format()
325 dev->udev->devnum, in uvc_parse_format()
326 alts->desc.bInterfaceNumber); in uvc_parse_format()
327 return -EINVAL; in uvc_parse_format()
331 fmtdesc = uvc_format_by_guid(&buffer[5]); in uvc_parse_format()
334 strlcpy(format->name, fmtdesc->name, in uvc_parse_format()
335 sizeof format->name); in uvc_parse_format()
336 format->fcc = fmtdesc->fcc; in uvc_parse_format()
339 &buffer[5]); in uvc_parse_format()
340 snprintf(format->name, sizeof(format->name), "%pUl\n", in uvc_parse_format()
341 &buffer[5]); in uvc_parse_format()
342 format->fcc = 0; in uvc_parse_format()
345 format->bpp = buffer[21]; in uvc_parse_format()
346 if (buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED) { in uvc_parse_format()
350 if (buffer[27]) in uvc_parse_format()
351 format->flags = UVC_FMT_FLAG_COMPRESSED; in uvc_parse_format()
359 dev->udev->devnum, in uvc_parse_format()
360 alts->desc.bInterfaceNumber); in uvc_parse_format()
361 return -EINVAL; in uvc_parse_format()
364 strlcpy(format->name, "MJPEG", sizeof format->name); in uvc_parse_format()
365 format->fcc = V4L2_PIX_FMT_MJPEG; in uvc_parse_format()
366 format->flags = UVC_FMT_FLAG_COMPRESSED; in uvc_parse_format()
367 format->bpp = 0; in uvc_parse_format()
375 dev->udev->devnum, in uvc_parse_format()
376 alts->desc.bInterfaceNumber); in uvc_parse_format()
377 return -EINVAL; in uvc_parse_format()
380 switch (buffer[8] & 0x7f) { in uvc_parse_format()
382 strlcpy(format->name, "SD-DV", sizeof format->name); in uvc_parse_format()
385 strlcpy(format->name, "SDL-DV", sizeof format->name); in uvc_parse_format()
388 strlcpy(format->name, "HD-DV", sizeof format->name); in uvc_parse_format()
393 dev->udev->devnum, in uvc_parse_format()
394 alts->desc.bInterfaceNumber, buffer[8]); in uvc_parse_format()
395 return -EINVAL; in uvc_parse_format()
398 strlcat(format->name, buffer[8] & (1 << 7) ? " 60Hz" : " 50Hz", in uvc_parse_format()
399 sizeof format->name); in uvc_parse_format()
401 format->fcc = V4L2_PIX_FMT_DV; in uvc_parse_format()
402 format->flags = UVC_FMT_FLAG_COMPRESSED | UVC_FMT_FLAG_STREAM; in uvc_parse_format()
403 format->bpp = 0; in uvc_parse_format()
406 /* Create a dummy frame descriptor. */ in uvc_parse_format()
407 frame = &format->frame[0]; in uvc_parse_format()
408 memset(&format->frame[0], 0, sizeof format->frame[0]); in uvc_parse_format()
409 frame->bFrameIntervalType = 1; in uvc_parse_format()
410 frame->dwDefaultFrameInterval = 1; in uvc_parse_format()
411 frame->dwFrameInterval = *intervals; in uvc_parse_format()
413 format->nframes = 1; in uvc_parse_format()
422 dev->udev->devnum, alts->desc.bInterfaceNumber, in uvc_parse_format()
423 buffer[2]); in uvc_parse_format()
424 return -EINVAL; in uvc_parse_format()
427 uvc_trace(UVC_TRACE_DESCR, "Found format %s.\n", format->name); in uvc_parse_format()
429 buflen -= buffer[0]; in uvc_parse_format()
430 buffer += buffer[0]; in uvc_parse_format()
432 /* Parse the frame descriptors. Only uncompressed, MJPEG and frame in uvc_parse_format()
433 * based formats have frame descriptors. in uvc_parse_format()
435 while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && in uvc_parse_format()
436 buffer[2] == ftype) { in uvc_parse_format()
437 frame = &format->frame[format->nframes]; in uvc_parse_format()
439 n = buflen > 25 ? buffer[25] : 0; in uvc_parse_format()
441 n = buflen > 21 ? buffer[21] : 0; in uvc_parse_format()
447 "interface %d FRAME error\n", dev->udev->devnum, in uvc_parse_format()
448 alts->desc.bInterfaceNumber); in uvc_parse_format()
449 return -EINVAL; in uvc_parse_format()
452 frame->bFrameIndex = buffer[3]; in uvc_parse_format()
453 frame->bmCapabilities = buffer[4]; in uvc_parse_format()
454 frame->wWidth = get_unaligned_le16(&buffer[5]); in uvc_parse_format()
455 frame->wHeight = get_unaligned_le16(&buffer[7]); in uvc_parse_format()
456 frame->dwMinBitRate = get_unaligned_le32(&buffer[9]); in uvc_parse_format()
457 frame->dwMaxBitRate = get_unaligned_le32(&buffer[13]); in uvc_parse_format()
459 frame->dwMaxVideoFrameBufferSize = in uvc_parse_format()
460 get_unaligned_le32(&buffer[17]); in uvc_parse_format()
461 frame->dwDefaultFrameInterval = in uvc_parse_format()
462 get_unaligned_le32(&buffer[21]); in uvc_parse_format()
463 frame->bFrameIntervalType = buffer[25]; in uvc_parse_format()
465 frame->dwMaxVideoFrameBufferSize = 0; in uvc_parse_format()
466 frame->dwDefaultFrameInterval = in uvc_parse_format()
467 get_unaligned_le32(&buffer[17]); in uvc_parse_format()
468 frame->bFrameIntervalType = buffer[21]; in uvc_parse_format()
470 frame->dwFrameInterval = *intervals; in uvc_parse_format()
474 * value to 1.1x the actual frame size to hardwiring the in uvc_parse_format()
478 * value from the frame size. in uvc_parse_format()
480 if (!(format->flags & UVC_FMT_FLAG_COMPRESSED)) in uvc_parse_format()
481 frame->dwMaxVideoFrameBufferSize = format->bpp in uvc_parse_format()
482 * frame->wWidth * frame->wHeight / 8; in uvc_parse_format()
490 interval = get_unaligned_le32(&buffer[26+4*i]); in uvc_parse_format()
494 /* Make sure that the default frame interval stays between in uvc_parse_format()
497 n -= frame->bFrameIntervalType ? 1 : 2; in uvc_parse_format()
498 frame->dwDefaultFrameInterval = in uvc_parse_format()
499 min(frame->dwFrameInterval[n], in uvc_parse_format()
500 max(frame->dwFrameInterval[0], in uvc_parse_format()
501 frame->dwDefaultFrameInterval)); in uvc_parse_format()
503 if (dev->quirks & UVC_QUIRK_RESTRICT_FRAME_RATE) { in uvc_parse_format()
504 frame->bFrameIntervalType = 1; in uvc_parse_format()
505 frame->dwFrameInterval[0] = in uvc_parse_format()
506 frame->dwDefaultFrameInterval; in uvc_parse_format()
509 uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n", in uvc_parse_format()
510 frame->wWidth, frame->wHeight, in uvc_parse_format()
511 10000000/frame->dwDefaultFrameInterval, in uvc_parse_format()
512 (100000000/frame->dwDefaultFrameInterval)%10); in uvc_parse_format()
514 format->nframes++; in uvc_parse_format()
515 buflen -= buffer[0]; in uvc_parse_format()
516 buffer += buffer[0]; in uvc_parse_format()
519 if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && in uvc_parse_format()
520 buffer[2] == UVC_VS_STILL_IMAGE_FRAME) { in uvc_parse_format()
521 buflen -= buffer[0]; in uvc_parse_format()
522 buffer += buffer[0]; in uvc_parse_format()
525 if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && in uvc_parse_format()
526 buffer[2] == UVC_VS_COLORFORMAT) { in uvc_parse_format()
530 dev->udev->devnum, in uvc_parse_format()
531 alts->desc.bInterfaceNumber); in uvc_parse_format()
532 return -EINVAL; in uvc_parse_format()
535 format->colorspace = uvc_colorspace(buffer[3]); in uvc_parse_format()
537 buflen -= buffer[0]; in uvc_parse_format()
538 buffer += buffer[0]; in uvc_parse_format()
541 return buffer - start; in uvc_parse_format()
549 struct uvc_frame *frame; in uvc_parse_streaming() local
550 struct usb_host_interface *alts = &intf->altsetting[0]; in uvc_parse_streaming()
551 unsigned char *_buffer, *buffer = alts->extra; in uvc_parse_streaming() local
552 int _buflen, buflen = alts->extralen; in uvc_parse_streaming()
557 int ret = -EINVAL; in uvc_parse_streaming()
559 if (intf->cur_altsetting->desc.bInterfaceSubClass in uvc_parse_streaming()
562 "video streaming interface\n", dev->udev->devnum, in uvc_parse_streaming()
563 intf->altsetting[0].desc.bInterfaceNumber); in uvc_parse_streaming()
564 return -EINVAL; in uvc_parse_streaming()
569 "claimed\n", dev->udev->devnum, in uvc_parse_streaming()
570 intf->altsetting[0].desc.bInterfaceNumber); in uvc_parse_streaming()
571 return -EINVAL; in uvc_parse_streaming()
577 return -EINVAL; in uvc_parse_streaming()
580 mutex_init(&streaming->mutex); in uvc_parse_streaming()
581 streaming->dev = dev; in uvc_parse_streaming()
582 streaming->intf = usb_get_intf(intf); in uvc_parse_streaming()
583 streaming->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; in uvc_parse_streaming()
585 /* The Pico iMage webcam has its class-specific interface descriptors in uvc_parse_streaming()
589 for (i = 0; i < alts->desc.bNumEndpoints; ++i) { in uvc_parse_streaming()
590 struct usb_host_endpoint *ep = &alts->endpoint[i]; in uvc_parse_streaming()
592 if (ep->extralen == 0) in uvc_parse_streaming()
595 if (ep->extralen > 2 && in uvc_parse_streaming()
596 ep->extra[1] == USB_DT_CS_INTERFACE) { in uvc_parse_streaming()
599 buffer = alts->endpoint[i].extra; in uvc_parse_streaming()
600 buflen = alts->endpoint[i].extralen; in uvc_parse_streaming()
607 while (buflen > 2 && buffer[1] != USB_DT_CS_INTERFACE) { in uvc_parse_streaming()
608 buflen -= buffer[0]; in uvc_parse_streaming()
609 buffer += buffer[0]; in uvc_parse_streaming()
613 uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming " in uvc_parse_streaming()
619 switch (buffer[2]) { in uvc_parse_streaming()
621 streaming->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in uvc_parse_streaming()
626 streaming->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in uvc_parse_streaming()
632 "%d HEADER descriptor not found.\n", dev->udev->devnum, in uvc_parse_streaming()
633 alts->desc.bInterfaceNumber); in uvc_parse_streaming()
637 p = buflen >= 4 ? buffer[3] : 0; in uvc_parse_streaming()
638 n = buflen >= size ? buffer[size-1] : 0; in uvc_parse_streaming()
643 dev->udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_streaming()
647 streaming->header.bNumFormats = p; in uvc_parse_streaming()
648 streaming->header.bEndpointAddress = buffer[6]; in uvc_parse_streaming()
649 if (buffer[2] == UVC_VS_INPUT_HEADER) { in uvc_parse_streaming()
650 streaming->header.bmInfo = buffer[7]; in uvc_parse_streaming()
651 streaming->header.bTerminalLink = buffer[8]; in uvc_parse_streaming()
652 streaming->header.bStillCaptureMethod = buffer[9]; in uvc_parse_streaming()
653 streaming->header.bTriggerSupport = buffer[10]; in uvc_parse_streaming()
654 streaming->header.bTriggerUsage = buffer[11]; in uvc_parse_streaming()
656 streaming->header.bTerminalLink = buffer[7]; in uvc_parse_streaming()
658 streaming->header.bControlSize = n; in uvc_parse_streaming()
660 streaming->header.bmaControls = kmemdup(&buffer[size], p * n, in uvc_parse_streaming()
662 if (streaming->header.bmaControls == NULL) { in uvc_parse_streaming()
663 ret = -ENOMEM; in uvc_parse_streaming()
667 buflen -= buffer[0]; in uvc_parse_streaming()
668 buffer += buffer[0]; in uvc_parse_streaming()
670 _buffer = buffer; in uvc_parse_streaming()
673 /* Count the format and frame descriptors. */ in uvc_parse_streaming()
683 /* DV format has no frame descriptor. We will create a in uvc_parse_streaming()
684 * dummy frame descriptor with a dummy frame interval. in uvc_parse_streaming()
695 dev->udev->devnum, in uvc_parse_streaming()
696 alts->desc.bInterfaceNumber, _buffer[2]); in uvc_parse_streaming()
713 _buflen -= _buffer[0]; in uvc_parse_streaming()
720 dev->udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_streaming()
724 size = nformats * sizeof *format + nframes * sizeof *frame in uvc_parse_streaming()
728 ret = -ENOMEM; in uvc_parse_streaming()
732 frame = (struct uvc_frame *)&format[nformats]; in uvc_parse_streaming()
733 interval = (__u32 *)&frame[nframes]; in uvc_parse_streaming()
735 streaming->format = format; in uvc_parse_streaming()
736 streaming->nformats = nformats; in uvc_parse_streaming()
739 while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) { in uvc_parse_streaming()
740 switch (buffer[2]) { in uvc_parse_streaming()
745 format->frame = frame; in uvc_parse_streaming()
747 &interval, buffer, buflen); in uvc_parse_streaming()
751 frame += format->nframes; in uvc_parse_streaming()
754 buflen -= ret; in uvc_parse_streaming()
755 buffer += ret; in uvc_parse_streaming()
762 buflen -= buffer[0]; in uvc_parse_streaming()
763 buffer += buffer[0]; in uvc_parse_streaming()
769 dev->udev->devnum, alts->desc.bInterfaceNumber, buflen); in uvc_parse_streaming()
772 for (i = 0; i < intf->num_altsetting; ++i) { in uvc_parse_streaming()
774 alts = &intf->altsetting[i]; in uvc_parse_streaming()
776 streaming->header.bEndpointAddress); in uvc_parse_streaming()
780 psize = le16_to_cpu(ep->desc.wMaxPacketSize); in uvc_parse_streaming()
782 if (psize > streaming->maxpsize) in uvc_parse_streaming()
783 streaming->maxpsize = psize; in uvc_parse_streaming()
786 list_add_tail(&streaming->list, &dev->streams); in uvc_parse_streaming()
792 kfree(streaming->format); in uvc_parse_streaming()
793 kfree(streaming->header.bmaControls); in uvc_parse_streaming()
806 extra_size = ALIGN(extra_size, sizeof(*entity->pads)); in uvc_alloc_entity()
807 num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1; in uvc_alloc_entity()
808 size = sizeof(*entity) + extra_size + sizeof(*entity->pads) * num_pads in uvc_alloc_entity()
814 entity->id = id; in uvc_alloc_entity()
815 entity->type = type; in uvc_alloc_entity()
817 entity->num_links = 0; in uvc_alloc_entity()
818 entity->num_pads = num_pads; in uvc_alloc_entity()
819 entity->pads = ((void *)(entity + 1)) + extra_size; in uvc_alloc_entity()
822 entity->pads[i].flags = MEDIA_PAD_FL_SINK; in uvc_alloc_entity()
824 entity->pads[num_pads-1].flags = MEDIA_PAD_FL_SOURCE; in uvc_alloc_entity()
826 entity->bNrInPins = num_inputs; in uvc_alloc_entity()
827 entity->baSourceID = (__u8 *)(&entity->pads[num_pads]); in uvc_alloc_entity()
832 /* Parse vendor-specific extensions. */
834 const unsigned char *buffer, int buflen) in uvc_parse_vendor_control() argument
836 struct usb_device *udev = dev->udev; in uvc_parse_vendor_control()
837 struct usb_host_interface *alts = dev->intf->cur_altsetting; in uvc_parse_vendor_control()
842 switch (le16_to_cpu(dev->udev->descriptor.idVendor)) { in uvc_parse_vendor_control()
844 if (buffer[1] != 0x41 || buffer[2] != 0x01) in uvc_parse_vendor_control()
855 * ---------------------------------------------------------- in uvc_parse_vendor_control()
858 * ---------------------------------------------------------- in uvc_parse_vendor_control()
865 * ---------------------------------------------------------- in uvc_parse_vendor_control()
867 * ---------------------------------------------------------- in uvc_parse_vendor_control()
871 * ---------------------------------------------------------- in uvc_parse_vendor_control()
873 p = buflen >= 22 ? buffer[21] : 0; in uvc_parse_vendor_control()
874 n = buflen >= 25 + p ? buffer[22+p] : 0; in uvc_parse_vendor_control()
879 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_vendor_control()
883 unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3], in uvc_parse_vendor_control()
886 return -ENOMEM; in uvc_parse_vendor_control()
888 memcpy(unit->extension.guidExtensionCode, &buffer[4], 16); in uvc_parse_vendor_control()
889 unit->extension.bNumControls = buffer[20]; in uvc_parse_vendor_control()
890 memcpy(unit->baSourceID, &buffer[22], p); in uvc_parse_vendor_control()
891 unit->extension.bControlSize = buffer[22+p]; in uvc_parse_vendor_control()
892 unit->extension.bmControls = (__u8 *)unit + sizeof(*unit); in uvc_parse_vendor_control()
893 unit->extension.bmControlsType = (__u8 *)unit + sizeof(*unit) in uvc_parse_vendor_control()
895 memcpy(unit->extension.bmControls, &buffer[23+p], 2*n); in uvc_parse_vendor_control()
897 if (buffer[24+p+2*n] != 0) in uvc_parse_vendor_control()
898 usb_string(udev, buffer[24+p+2*n], unit->name, in uvc_parse_vendor_control()
899 sizeof unit->name); in uvc_parse_vendor_control()
901 sprintf(unit->name, "Extension %u", buffer[3]); in uvc_parse_vendor_control()
903 list_add_tail(&unit->list, &dev->entities); in uvc_parse_vendor_control()
912 const unsigned char *buffer, int buflen) in uvc_parse_standard_control() argument
914 struct usb_device *udev = dev->udev; in uvc_parse_standard_control()
917 struct usb_host_interface *alts = dev->intf->cur_altsetting; in uvc_parse_standard_control()
921 switch (buffer[2]) { in uvc_parse_standard_control()
923 n = buflen >= 12 ? buffer[11] : 0; in uvc_parse_standard_control()
927 "interface %d HEADER error\n", udev->devnum, in uvc_parse_standard_control()
928 alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
929 return -EINVAL; in uvc_parse_standard_control()
932 dev->uvc_version = get_unaligned_le16(&buffer[3]); in uvc_parse_standard_control()
933 dev->clock_frequency = get_unaligned_le32(&buffer[7]); in uvc_parse_standard_control()
937 intf = usb_ifnum_to_if(udev, buffer[12+i]); in uvc_parse_standard_control()
941 udev->devnum, i); in uvc_parse_standard_control()
953 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
954 return -EINVAL; in uvc_parse_standard_control()
960 type = get_unaligned_le16(&buffer[4]); in uvc_parse_standard_control()
964 "type 0x%04x, skipping\n", udev->devnum, in uvc_parse_standard_control()
965 alts->desc.bInterfaceNumber, in uvc_parse_standard_control()
966 buffer[3], type); in uvc_parse_standard_control()
975 n = buflen >= 15 ? buffer[14] : 0; in uvc_parse_standard_control()
979 n = buflen >= 9 ? buffer[8] : 0; in uvc_parse_standard_control()
980 p = buflen >= 10 + n ? buffer[9+n] : 0; in uvc_parse_standard_control()
987 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
988 return -EINVAL; in uvc_parse_standard_control()
991 term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3], in uvc_parse_standard_control()
994 return -ENOMEM; in uvc_parse_standard_control()
997 term->camera.bControlSize = n; in uvc_parse_standard_control()
998 term->camera.bmControls = (__u8 *)term + sizeof *term; in uvc_parse_standard_control()
999 term->camera.wObjectiveFocalLengthMin = in uvc_parse_standard_control()
1000 get_unaligned_le16(&buffer[8]); in uvc_parse_standard_control()
1001 term->camera.wObjectiveFocalLengthMax = in uvc_parse_standard_control()
1002 get_unaligned_le16(&buffer[10]); in uvc_parse_standard_control()
1003 term->camera.wOcularFocalLength = in uvc_parse_standard_control()
1004 get_unaligned_le16(&buffer[12]); in uvc_parse_standard_control()
1005 memcpy(term->camera.bmControls, &buffer[15], n); in uvc_parse_standard_control()
1008 term->media.bControlSize = n; in uvc_parse_standard_control()
1009 term->media.bmControls = (__u8 *)term + sizeof *term; in uvc_parse_standard_control()
1010 term->media.bTransportModeSize = p; in uvc_parse_standard_control()
1011 term->media.bmTransportModes = (__u8 *)term in uvc_parse_standard_control()
1013 memcpy(term->media.bmControls, &buffer[9], n); in uvc_parse_standard_control()
1014 memcpy(term->media.bmTransportModes, &buffer[10+n], p); in uvc_parse_standard_control()
1017 if (buffer[7] != 0) in uvc_parse_standard_control()
1018 usb_string(udev, buffer[7], term->name, in uvc_parse_standard_control()
1019 sizeof term->name); in uvc_parse_standard_control()
1021 sprintf(term->name, "Camera %u", buffer[3]); in uvc_parse_standard_control()
1023 sprintf(term->name, "Media %u", buffer[3]); in uvc_parse_standard_control()
1025 sprintf(term->name, "Input %u", buffer[3]); in uvc_parse_standard_control()
1027 list_add_tail(&term->list, &dev->entities); in uvc_parse_standard_control()
1034 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1035 return -EINVAL; in uvc_parse_standard_control()
1041 type = get_unaligned_le16(&buffer[4]); in uvc_parse_standard_control()
1045 "type 0x%04x, skipping\n", udev->devnum, in uvc_parse_standard_control()
1046 alts->desc.bInterfaceNumber, buffer[3], type); in uvc_parse_standard_control()
1050 term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3], in uvc_parse_standard_control()
1053 return -ENOMEM; in uvc_parse_standard_control()
1055 memcpy(term->baSourceID, &buffer[7], 1); in uvc_parse_standard_control()
1057 if (buffer[8] != 0) in uvc_parse_standard_control()
1058 usb_string(udev, buffer[8], term->name, in uvc_parse_standard_control()
1059 sizeof term->name); in uvc_parse_standard_control()
1061 sprintf(term->name, "Output %u", buffer[3]); in uvc_parse_standard_control()
1063 list_add_tail(&term->list, &dev->entities); in uvc_parse_standard_control()
1067 p = buflen >= 5 ? buffer[4] : 0; in uvc_parse_standard_control()
1072 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1073 return -EINVAL; in uvc_parse_standard_control()
1076 unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0); in uvc_parse_standard_control()
1078 return -ENOMEM; in uvc_parse_standard_control()
1080 memcpy(unit->baSourceID, &buffer[5], p); in uvc_parse_standard_control()
1082 if (buffer[5+p] != 0) in uvc_parse_standard_control()
1083 usb_string(udev, buffer[5+p], unit->name, in uvc_parse_standard_control()
1084 sizeof unit->name); in uvc_parse_standard_control()
1086 sprintf(unit->name, "Selector %u", buffer[3]); in uvc_parse_standard_control()
1088 list_add_tail(&unit->list, &dev->entities); in uvc_parse_standard_control()
1092 n = buflen >= 8 ? buffer[7] : 0; in uvc_parse_standard_control()
1093 p = dev->uvc_version >= 0x0110 ? 10 : 9; in uvc_parse_standard_control()
1098 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1099 return -EINVAL; in uvc_parse_standard_control()
1102 unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n); in uvc_parse_standard_control()
1104 return -ENOMEM; in uvc_parse_standard_control()
1106 memcpy(unit->baSourceID, &buffer[4], 1); in uvc_parse_standard_control()
1107 unit->processing.wMaxMultiplier = in uvc_parse_standard_control()
1108 get_unaligned_le16(&buffer[5]); in uvc_parse_standard_control()
1109 unit->processing.bControlSize = buffer[7]; in uvc_parse_standard_control()
1110 unit->processing.bmControls = (__u8 *)unit + sizeof *unit; in uvc_parse_standard_control()
1111 memcpy(unit->processing.bmControls, &buffer[8], n); in uvc_parse_standard_control()
1112 if (dev->uvc_version >= 0x0110) in uvc_parse_standard_control()
1113 unit->processing.bmVideoStandards = buffer[9+n]; in uvc_parse_standard_control()
1115 if (buffer[8+n] != 0) in uvc_parse_standard_control()
1116 usb_string(udev, buffer[8+n], unit->name, in uvc_parse_standard_control()
1117 sizeof unit->name); in uvc_parse_standard_control()
1119 sprintf(unit->name, "Processing %u", buffer[3]); in uvc_parse_standard_control()
1121 list_add_tail(&unit->list, &dev->entities); in uvc_parse_standard_control()
1125 p = buflen >= 22 ? buffer[21] : 0; in uvc_parse_standard_control()
1126 n = buflen >= 24 + p ? buffer[22+p] : 0; in uvc_parse_standard_control()
1131 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1132 return -EINVAL; in uvc_parse_standard_control()
1135 unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n); in uvc_parse_standard_control()
1137 return -ENOMEM; in uvc_parse_standard_control()
1139 memcpy(unit->extension.guidExtensionCode, &buffer[4], 16); in uvc_parse_standard_control()
1140 unit->extension.bNumControls = buffer[20]; in uvc_parse_standard_control()
1141 memcpy(unit->baSourceID, &buffer[22], p); in uvc_parse_standard_control()
1142 unit->extension.bControlSize = buffer[22+p]; in uvc_parse_standard_control()
1143 unit->extension.bmControls = (__u8 *)unit + sizeof *unit; in uvc_parse_standard_control()
1144 memcpy(unit->extension.bmControls, &buffer[23+p], n); in uvc_parse_standard_control()
1146 if (buffer[23+p+n] != 0) in uvc_parse_standard_control()
1147 usb_string(udev, buffer[23+p+n], unit->name, in uvc_parse_standard_control()
1148 sizeof unit->name); in uvc_parse_standard_control()
1150 sprintf(unit->name, "Extension %u", buffer[3]); in uvc_parse_standard_control()
1152 list_add_tail(&unit->list, &dev->entities); in uvc_parse_standard_control()
1157 "descriptor (%u)\n", buffer[2]); in uvc_parse_standard_control()
1166 struct usb_host_interface *alts = dev->intf->cur_altsetting; in uvc_parse_control()
1167 unsigned char *buffer = alts->extra; in uvc_parse_control() local
1168 int buflen = alts->extralen; in uvc_parse_control()
1177 if (uvc_parse_vendor_control(dev, buffer, buflen) || in uvc_parse_control()
1178 buffer[1] != USB_DT_CS_INTERFACE) in uvc_parse_control()
1181 if ((ret = uvc_parse_standard_control(dev, buffer, buflen)) < 0) in uvc_parse_control()
1185 buflen -= buffer[0]; in uvc_parse_control()
1186 buffer += buffer[0]; in uvc_parse_control()
1189 /* Check if the optional status endpoint is present. Built-in iSight in uvc_parse_control()
1194 if (alts->desc.bNumEndpoints == 1 && in uvc_parse_control()
1195 !(dev->quirks & UVC_QUIRK_BUILTIN_ISIGHT)) { in uvc_parse_control()
1196 struct usb_host_endpoint *ep = &alts->endpoint[0]; in uvc_parse_control()
1197 struct usb_endpoint_descriptor *desc = &ep->desc; in uvc_parse_control()
1200 le16_to_cpu(desc->wMaxPacketSize) >= 8 && in uvc_parse_control()
1201 desc->bInterval != 0) { in uvc_parse_control()
1203 "(addr %02x).\n", desc->bEndpointAddress); in uvc_parse_control()
1204 dev->int_ep = ep; in uvc_parse_control()
1211 /* ------------------------------------------------------------------------
1219 * - one or more Output Terminals (USB Streaming or Display)
1220 * - zero or one Processing Unit
1221 * - zero, one or more single-input Selector Units
1222 * - zero or one multiple-input Selector Units, provided all inputs are
1224 * - zero, one or mode single-input Extension Units
1225 * - one or more Input Terminals (Camera, External or USB Streaming)
1229 * ITT_*(0) -> +---------+ +---------+ +---------+ -> TT_STREAMING(0)
1230 * ... | SU{0,1} | -> | PU{0,1} | -> | XU{0,n} | ...
1231 * ITT_*(n) -> +---------+ +---------+ +---------+ -> TT_STREAMING(n)
1233 * +---------+ +---------+ -> OTT_*(0)
1234 * TT_STREAMING -> | PU{0,1} | -> | XU{0,n} | ...
1235 * +---------+ +---------+ -> OTT_*(n)
1238 * Extension Units connected to the main chain as single-unit branches are
1239 * also supported. Single-input Selector Units are ignored.
1247 printk(" <- XU %d", entity->id); in uvc_scan_chain_entity()
1249 if (entity->bNrInPins != 1) { in uvc_scan_chain_entity()
1251 "than 1 input pin.\n", entity->id); in uvc_scan_chain_entity()
1252 return -1; in uvc_scan_chain_entity()
1259 printk(" <- PU %d", entity->id); in uvc_scan_chain_entity()
1261 if (chain->processing != NULL) { in uvc_scan_chain_entity()
1264 return -1; in uvc_scan_chain_entity()
1267 chain->processing = entity; in uvc_scan_chain_entity()
1272 printk(" <- SU %d", entity->id); in uvc_scan_chain_entity()
1274 /* Single-input selector units are ignored. */ in uvc_scan_chain_entity()
1275 if (entity->bNrInPins == 1) in uvc_scan_chain_entity()
1278 if (chain->selector != NULL) { in uvc_scan_chain_entity()
1281 return -1; in uvc_scan_chain_entity()
1284 chain->selector = entity; in uvc_scan_chain_entity()
1291 printk(" <- IT %d\n", entity->id); in uvc_scan_chain_entity()
1299 printk(" OT %d", entity->id); in uvc_scan_chain_entity()
1306 printk(" <- IT %d\n", entity->id); in uvc_scan_chain_entity()
1309 printk(" OT %d", entity->id); in uvc_scan_chain_entity()
1317 return -1; in uvc_scan_chain_entity()
1320 list_add_tail(&entity->chain, &chain->entities); in uvc_scan_chain_entity()
1335 forward = uvc_entity_by_reference(chain->dev, entity->id, in uvc_scan_chain_forward()
1344 if (forward->bNrInPins != 1) { in uvc_scan_chain_forward()
1347 entity->id); in uvc_scan_chain_forward()
1348 return -EINVAL; in uvc_scan_chain_forward()
1351 list_add_tail(&forward->chain, &chain->entities); in uvc_scan_chain_forward()
1354 printk(" (->"); in uvc_scan_chain_forward()
1356 printk(" XU %d", forward->id); in uvc_scan_chain_forward()
1367 "terminal %u.\n", forward->id); in uvc_scan_chain_forward()
1368 return -EINVAL; in uvc_scan_chain_forward()
1371 list_add_tail(&forward->chain, &chain->entities); in uvc_scan_chain_forward()
1374 printk(" (->"); in uvc_scan_chain_forward()
1376 printk(" OT %d", forward->id); in uvc_scan_chain_forward()
1393 int id = -EINVAL, i; in uvc_scan_chain_backward()
1398 id = entity->baSourceID[0]; in uvc_scan_chain_backward()
1402 /* Single-input selector units are ignored. */ in uvc_scan_chain_backward()
1403 if (entity->bNrInPins == 1) { in uvc_scan_chain_backward()
1404 id = entity->baSourceID[0]; in uvc_scan_chain_backward()
1409 printk(" <- IT"); in uvc_scan_chain_backward()
1411 chain->selector = entity; in uvc_scan_chain_backward()
1412 for (i = 0; i < entity->bNrInPins; ++i) { in uvc_scan_chain_backward()
1413 id = entity->baSourceID[i]; in uvc_scan_chain_backward()
1414 term = uvc_entity_by_id(chain->dev, id); in uvc_scan_chain_backward()
1418 "input terminal\n", entity->id, i); in uvc_scan_chain_backward()
1419 return -1; in uvc_scan_chain_backward()
1423 printk(" %d", term->id); in uvc_scan_chain_backward()
1425 list_add_tail(&term->chain, &chain->entities); in uvc_scan_chain_backward()
1442 id = UVC_ENTITY_IS_OTERM(entity) ? entity->baSourceID[0] : 0; in uvc_scan_chain_backward()
1451 entity = uvc_entity_by_id(chain->dev, id); in uvc_scan_chain_backward()
1455 return -EINVAL; in uvc_scan_chain_backward()
1474 if (entity->chain.next || entity->chain.prev) { in uvc_scan_chain()
1476 "entity %d already in chain.\n", entity->id); in uvc_scan_chain()
1477 return -EINVAL; in uvc_scan_chain()
1482 return -EINVAL; in uvc_scan_chain()
1486 return -EINVAL; in uvc_scan_chain()
1491 return -EINVAL; in uvc_scan_chain()
1498 char *buffer) in uvc_print_terms() argument
1502 char *p = buffer; in uvc_print_terms()
1515 p += sprintf(p, "%u", term->id); in uvc_print_terms()
1518 return p - buffer; in uvc_print_terms()
1523 static char buffer[43]; in uvc_print_chain() local
1524 char *p = buffer; in uvc_print_chain()
1526 p += uvc_print_terms(&chain->entities, UVC_TERM_INPUT, p); in uvc_print_chain()
1527 p += sprintf(p, " -> "); in uvc_print_chain()
1528 uvc_print_terms(&chain->entities, UVC_TERM_OUTPUT, p); in uvc_print_chain()
1530 return buffer; in uvc_print_chain()
1543 list_for_each_entry(term, &dev->entities, list) { in uvc_scan_device()
1552 if (term->chain.next || term->chain.prev) in uvc_scan_device()
1557 return -ENOMEM; in uvc_scan_device()
1559 INIT_LIST_HEAD(&chain->entities); in uvc_scan_device()
1560 mutex_init(&chain->ctrl_mutex); in uvc_scan_device()
1561 chain->dev = dev; in uvc_scan_device()
1571 list_add_tail(&chain->list, &dev->chains); in uvc_scan_device()
1574 if (list_empty(&dev->chains)) { in uvc_scan_device()
1576 return -1; in uvc_scan_device()
1582 /* ------------------------------------------------------------------------
1600 usb_put_intf(dev->intf); in uvc_delete()
1601 usb_put_dev(dev->udev); in uvc_delete()
1606 if (dev->vdev.dev) in uvc_delete()
1607 v4l2_device_unregister(&dev->vdev); in uvc_delete()
1609 if (media_devnode_is_registered(&dev->mdev.devnode)) in uvc_delete()
1610 media_device_unregister(&dev->mdev); in uvc_delete()
1613 list_for_each_safe(p, n, &dev->chains) { in uvc_delete()
1619 list_for_each_safe(p, n, &dev->entities) { in uvc_delete()
1625 if (entity->vdev) { in uvc_delete()
1626 video_device_release(entity->vdev); in uvc_delete()
1627 entity->vdev = NULL; in uvc_delete()
1632 list_for_each_safe(p, n, &dev->streams) { in uvc_delete()
1636 streaming->intf); in uvc_delete()
1637 usb_put_intf(streaming->intf); in uvc_delete()
1638 kfree(streaming->format); in uvc_delete()
1639 kfree(streaming->header.bmaControls); in uvc_delete()
1649 struct uvc_device *dev = stream->dev; in uvc_release()
1654 if (atomic_dec_and_test(&dev->nstreams)) in uvc_release()
1670 atomic_inc(&dev->nstreams); in uvc_unregister_video()
1672 list_for_each_entry(stream, &dev->streams, list) { in uvc_unregister_video()
1673 if (stream->vdev == NULL) in uvc_unregister_video()
1676 video_unregister_device(stream->vdev); in uvc_unregister_video()
1677 stream->vdev = NULL; in uvc_unregister_video()
1685 if (atomic_dec_and_test(&dev->nstreams)) in uvc_unregister_video()
1712 return -ENOMEM; in uvc_register_video()
1715 /* We already hold a reference to dev->udev. The video device will be in uvc_register_video()
1719 vdev->v4l2_dev = &dev->vdev; in uvc_register_video()
1720 vdev->fops = &uvc_fops; in uvc_register_video()
1721 vdev->release = uvc_release; in uvc_register_video()
1722 strlcpy(vdev->name, dev->name, sizeof vdev->name); in uvc_register_video()
1727 stream->vdev = vdev; in uvc_register_video()
1730 ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); in uvc_register_video()
1734 stream->vdev = NULL; in uvc_register_video()
1739 atomic_inc(&dev->nstreams); in uvc_register_video()
1753 list_for_each_entry(term, &chain->entities, chain) { in uvc_register_terms()
1757 stream = uvc_stream_by_id(dev, term->id); in uvc_register_terms()
1760 "for terminal %u.", term->id); in uvc_register_terms()
1764 stream->chain = chain; in uvc_register_terms()
1769 term->vdev = stream->vdev; in uvc_register_terms()
1780 list_for_each_entry(chain, &dev->chains, list) { in uvc_register_chains()
1797 /* ------------------------------------------------------------------------
1808 if (id->idVendor && id->idProduct) in uvc_probe()
1810 "(%04x:%04x)\n", udev->devpath, id->idVendor, in uvc_probe()
1811 id->idProduct); in uvc_probe()
1814 udev->devpath); in uvc_probe()
1818 return -ENOMEM; in uvc_probe()
1820 INIT_LIST_HEAD(&dev->entities); in uvc_probe()
1821 INIT_LIST_HEAD(&dev->chains); in uvc_probe()
1822 INIT_LIST_HEAD(&dev->streams); in uvc_probe()
1823 atomic_set(&dev->nstreams, 0); in uvc_probe()
1824 atomic_set(&dev->users, 0); in uvc_probe()
1825 atomic_set(&dev->nmappings, 0); in uvc_probe()
1827 dev->udev = usb_get_dev(udev); in uvc_probe()
1828 dev->intf = usb_get_intf(intf); in uvc_probe()
1829 dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; in uvc_probe()
1830 dev->quirks = (uvc_quirks_param == -1) in uvc_probe()
1831 ? id->driver_info : uvc_quirks_param; in uvc_probe()
1833 if (udev->product != NULL) in uvc_probe()
1834 strlcpy(dev->name, udev->product, sizeof dev->name); in uvc_probe()
1836 snprintf(dev->name, sizeof dev->name, in uvc_probe()
1838 le16_to_cpu(udev->descriptor.idVendor), in uvc_probe()
1839 le16_to_cpu(udev->descriptor.idProduct)); in uvc_probe()
1849 dev->uvc_version >> 8, dev->uvc_version & 0xff, in uvc_probe()
1850 udev->product ? udev->product : "<unnamed>", in uvc_probe()
1851 le16_to_cpu(udev->descriptor.idVendor), in uvc_probe()
1852 le16_to_cpu(udev->descriptor.idProduct)); in uvc_probe()
1854 if (dev->quirks != id->driver_info) { in uvc_probe()
1856 "parameter for testing purpose.\n", dev->quirks); in uvc_probe()
1858 "linux-uvc-devel mailing list.\n"); in uvc_probe()
1863 dev->mdev.dev = &intf->dev; in uvc_probe()
1864 strlcpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model)); in uvc_probe()
1865 if (udev->serial) in uvc_probe()
1866 strlcpy(dev->mdev.serial, udev->serial, in uvc_probe()
1867 sizeof(dev->mdev.serial)); in uvc_probe()
1868 strcpy(dev->mdev.bus_info, udev->devpath); in uvc_probe()
1869 dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); in uvc_probe()
1870 dev->mdev.driver_version = LINUX_VERSION_CODE; in uvc_probe()
1871 if (media_device_register(&dev->mdev) < 0) in uvc_probe()
1874 dev->vdev.mdev = &dev->mdev; in uvc_probe()
1876 if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) in uvc_probe()
1907 return -ENODEV; in uvc_probe()
1919 if (intf->cur_altsetting->desc.bInterfaceSubClass == in uvc_disconnect()
1923 dev->state |= UVC_DEV_DISCONNECTED; in uvc_disconnect()
1934 intf->cur_altsetting->desc.bInterfaceNumber); in uvc_suspend()
1937 if (intf->cur_altsetting->desc.bInterfaceSubClass == in uvc_suspend()
1941 list_for_each_entry(stream, &dev->streams, list) { in uvc_suspend()
1942 if (stream->intf == intf) in uvc_suspend()
1948 return -EINVAL; in uvc_suspend()
1957 intf->cur_altsetting->desc.bInterfaceNumber); in __uvc_resume()
1959 if (intf->cur_altsetting->desc.bInterfaceSubClass == in __uvc_resume()
1971 list_for_each_entry(stream, &dev->streams, list) { in __uvc_resume()
1972 if (stream->intf == intf) in __uvc_resume()
1978 return -EINVAL; in __uvc_resume()
1991 /* ------------------------------------------------------------------------
1995 static int uvc_clock_param_get(char *buffer, struct kernel_param *kp) in uvc_clock_param_get() argument
1998 return sprintf(buffer, "CLOCK_MONOTONIC"); in uvc_clock_param_get()
2000 return sprintf(buffer, "CLOCK_REALTIME"); in uvc_clock_param_get()
2013 return -EINVAL; in uvc_clock_param_set()
2030 /* ------------------------------------------------------------------------
2058 /* Microsoft Lifecam NX-6000 */
2067 /* Microsoft Lifecam VX-7000 */
2142 /* Apple Built-In iSight */
2188 /* ViMicro - Minoru3D */
2197 /* ViMicro Venus - Minoru3D */
2325 /* Manta MM-353 Plako */