Enabling UVC Metadata attributes with Ubuntu 18.04 98/189698/1
authorEvgeni Raikhel <evgeni.raikhel@intel.com>
Tue, 24 Jul 2018 04:53:19 +0000 (13:53 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 20 Sep 2018 02:49:49 +0000 (11:49 +0900)
(Bionic Beaver) and Kernel version 4.15

Signed-off-by: Evgeni Raikhel <evgeni.raikhel@intel.com>
back-ported by Inki from : https://github.com/IntelRealSense/librealsense/tree/master/scripts
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I604d7bccd0a40cdfe584d7d7991bf1d9d171fea3

drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvc_video.c
drivers/media/usb/uvc/uvcvideo.h

index c9c8ebe..df1a11d 100644 (file)
@@ -2613,6 +2613,141 @@ static struct usb_device_id uvc_ids[] = {
          .bInterfaceSubClass   = 1,
          .bInterfaceProtocol   = 0,
          .driver_info          = UVC_QUIRK_FORCE_Y8 },
+       /* Intel D400/PSR depth camera*/
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0ad1,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D410/ASR depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0ad2,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D415/ASRC depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0ad3,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D430/AWG depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0ad4,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+       /* Intel D450/AWGT depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0ad5,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+       /* Intel D420/PWG depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0af6,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+       /* Intel D420_MM/PWGT depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0afe,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D410_MM/ASRT depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0aff,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D400_MM/PSRT depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0b00,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D430_MM/AWGCT depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0b01,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D460/DS5U depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0b03,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D435/AWGC depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0b07,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel SR300 depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0aa5,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel D405 S depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0b0c,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
+         /* Intel L500 depth camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor                     = 0x8086,
+         .idProduct            = 0x0b0d,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_APPEND_UVC_HEADER },
        /* Generic USB Video Class */
        { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },
        {}
index 20ccc9d..3a7329b 100644 (file)
@@ -1221,9 +1221,12 @@ static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream,
        if (stream->bulk.header_size == 0 && !stream->bulk.skip_payload) {
                do {
                        ret = uvc_video_decode_start(stream, buf, mem, len);
-                       if (ret == -EAGAIN)
+                       if (ret == -EAGAIN) {
+                               if (stream->dev->quirks & UVC_QUIRK_APPEND_UVC_HEADER)
+                                       uvc_video_decode_data(stream, buf, stream->bulk.header,256);
                                buf = uvc_queue_next_buffer(&stream->queue,
                                                            buf);
+                       }
                } while (ret == -EAGAIN);
 
                /* If an error occurred skip the rest of the payload. */
@@ -1255,9 +1258,13 @@ static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream,
                if (!stream->bulk.skip_payload && buf != NULL) {
                        uvc_video_decode_end(stream, buf, stream->bulk.header,
                                stream->bulk.payload_size);
-                       if (buf->state == UVC_BUF_STATE_READY)
+                       if (buf->state == UVC_BUF_STATE_READY) {
+                               if (stream->dev->quirks & UVC_QUIRK_APPEND_UVC_HEADER)
+                                       uvc_video_decode_data(stream, buf, stream->bulk.header,
+                                                             stream->bulk.header_size);
                                buf = uvc_queue_next_buffer(&stream->queue,
                                                            buf);
+                       }
                }
 
                stream->bulk.header_size = 0;
index 333280f..f0a1710 100644 (file)
 /* Maximum number of packets per URB. */
 #define UVC_MAX_PACKETS                32
 /* Maximum status buffer size in bytes of interrupt URB. */
-#define UVC_MAX_STATUS_SIZE    16
+#define UVC_MAX_STATUS_SIZE    32
 
 #define UVC_CTRL_CONTROL_TIMEOUT       300
 #define UVC_CTRL_STREAMING_TIMEOUT     5000
 #define UVC_QUIRK_RESTRICT_FRAME_RATE  0x00000200
 #define UVC_QUIRK_RESTORE_CTRLS_ON_INIT        0x00000400
 #define UVC_QUIRK_FORCE_Y8             0x00000800
+#define UVC_QUIRK_APPEND_UVC_HEADER    0x00001000
 
 /* Format flags */
 #define UVC_FMT_FLAG_COMPRESSED                0x00000001