mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			492 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Diff
		
	
	
| --- linux-4.9.37/drivers/usb/gadget/legacy/webcam.c	2017-07-12 16:42:41.000000000 +0300
 | |
| +++ linux-4.9.y/drivers/usb/gadget/legacy/webcam.c	2021-06-07 13:01:34.000000000 +0300
 | |
| @@ -26,11 +26,11 @@
 | |
|  module_param(streaming_interval, uint, S_IRUGO|S_IWUSR);
 | |
|  MODULE_PARM_DESC(streaming_interval, "1 - 16");
 | |
|  
 | |
| -static unsigned int streaming_maxpacket = 1024;
 | |
| +static unsigned int streaming_maxpacket = 3072;
 | |
|  module_param(streaming_maxpacket, uint, S_IRUGO|S_IWUSR);
 | |
|  MODULE_PARM_DESC(streaming_maxpacket, "1 - 1023 (FS), 1 - 3072 (hs/ss)");
 | |
|  
 | |
| -static unsigned int streaming_maxburst;
 | |
| +static unsigned int streaming_maxburst = 14;
 | |
|  module_param(streaming_maxburst, uint, S_IRUGO|S_IWUSR);
 | |
|  MODULE_PARM_DESC(streaming_maxburst, "0 - 15 (ss only)");
 | |
|  
 | |
| @@ -49,6 +49,17 @@
 | |
|  static char webcam_product_label[] = "Webcam gadget";
 | |
|  static char webcam_config_label[] = "Video";
 | |
|  
 | |
| +/* GUID of the UVC H.264 extension unit:
 | |
| +{A29E7641-DE04-47E3-8B2B-F4341AFF003B} */
 | |
| +#define GUID_UVCX_H264_XU {0x41, 0x76, 0x9E, 0xA2, 0x04, 0xDE, 0xE3, 0x47, \
 | |
| +				0x8B, 0x2B, 0xF4, 0x34, 0x1A, 0xFF, 0x00, 0x3B}
 | |
| +
 | |
| +#define UVC_GUID_BSP_CAMERA {0x91, 0x72, 0x1e, 0x9a, 0x43, 0x68, 0x83, 0x46, \
 | |
| +				0x6d, 0x92, 0x39, 0xbc, 0x79, 0x06, 0xee, 0x49}
 | |
| +
 | |
| +#define UVC_GUID_FORMAT_H264 {0x48, 0x32, 0x36, 0x34, 0x00, 0x00, 0x10, 0x00, \
 | |
| +				0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 | |
| +
 | |
|  /* string IDs are assigned dynamically */
 | |
|  
 | |
|  #define STRING_DESCRIPTION_IDX		USB_GADGET_FIRST_AVAIL_IDX
 | |
| @@ -77,7 +88,7 @@
 | |
|  static struct usb_device_descriptor webcam_device_descriptor = {
 | |
|  	.bLength		= USB_DT_DEVICE_SIZE,
 | |
|  	.bDescriptorType	= USB_DT_DEVICE,
 | |
| -	/* .bcdUSB = DYNAMIC */
 | |
| +	.bcdUSB			= cpu_to_le16(0x0200),
 | |
|  	.bDeviceClass		= USB_CLASS_MISC,
 | |
|  	.bDeviceSubClass	= 0x02,
 | |
|  	.bDeviceProtocol	= 0x01,
 | |
| @@ -97,7 +108,7 @@
 | |
|  	.bLength		= UVC_DT_HEADER_SIZE(1),
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VC_HEADER,
 | |
| -	.bcdUVC			= cpu_to_le16(0x0100),
 | |
| +	.bcdUVC			= cpu_to_le16(0x0110),
 | |
|  	.wTotalLength		= 0, /* dynamic */
 | |
|  	.dwClockFrequency	= cpu_to_le32(48000000),
 | |
|  	.bInCollection		= 0, /* dynamic */
 | |
| @@ -108,7 +119,7 @@
 | |
|  	.bLength		= UVC_DT_CAMERA_TERMINAL_SIZE(3),
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VC_INPUT_TERMINAL,
 | |
| -	.bTerminalID		= 1,
 | |
| +	.bTerminalID		= 2,
 | |
|  	.wTerminalType		= cpu_to_le16(0x0201),
 | |
|  	.bAssocTerminal		= 0,
 | |
|  	.iTerminal		= 0,
 | |
| @@ -116,8 +127,8 @@
 | |
|  	.wObjectiveFocalLengthMax	= cpu_to_le16(0),
 | |
|  	.wOcularFocalLength		= cpu_to_le16(0),
 | |
|  	.bControlSize		= 3,
 | |
| -	.bmControls[0]		= 2,
 | |
| -	.bmControls[1]		= 0,
 | |
| +	.bmControls[0]		= 0x1a,
 | |
| +	.bmControls[1]		= 0x00,
 | |
|  	.bmControls[2]		= 0,
 | |
|  };
 | |
|  
 | |
| @@ -125,15 +136,45 @@
 | |
|  	.bLength		= UVC_DT_PROCESSING_UNIT_SIZE(2),
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VC_PROCESSING_UNIT,
 | |
| -	.bUnitID		= 2,
 | |
| +	.bUnitID		= 5,
 | |
|  	.bSourceID		= 1,
 | |
|  	.wMaxMultiplier		= cpu_to_le16(16*1024),
 | |
|  	.bControlSize		= 2,
 | |
| -	.bmControls[0]		= 1,
 | |
| -	.bmControls[1]		= 0,
 | |
| +	.bmControls[0]		= 0xff,
 | |
| +	.bmControls[1]		= 0xff,
 | |
|  	.iProcessing		= 0,
 | |
|  };
 | |
|  
 | |
| +static const struct UVC_EXTENSION_UNIT_DESCRIPTOR(1, 2) uvc_xu_h264_desc = {
 | |
| +	.bLength		= UVC_DT_EXTENSION_UNIT_SIZE(1, 2),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VC_EXTENSION_UNIT,
 | |
| +	.bUnitID		= 10,
 | |
| +	.guidExtensionCode	= GUID_UVCX_H264_XU,
 | |
| +	.bNumControls		= 15,
 | |
| +	.bNrInPins		= 1,
 | |
| +	.baSourceID[0]		= 2,
 | |
| +	.bControlSize		= 2,
 | |
| +	.bmControls[0]		= 0xff,
 | |
| +	.bmControls[1]		= 0xff,
 | |
| +	.iExtension		= 0,
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_EXTENSION_UNIT_DESCRIPTOR(1, 2) uvc_xu_camera_desc = {
 | |
| +	.bLength		= UVC_DT_EXTENSION_UNIT_SIZE(1, 2),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VC_EXTENSION_UNIT,
 | |
| +	.bUnitID		= 0x11,
 | |
| +	.guidExtensionCode	= UVC_GUID_BSP_CAMERA,
 | |
| +	.bNumControls		= 15,
 | |
| +	.bNrInPins		= 1,
 | |
| +	.baSourceID[0]		= 10,
 | |
| +	.bControlSize		= 2,
 | |
| +	.bmControls[0]		= 0xff,
 | |
| +	.bmControls[1]		= 0xff,
 | |
| +	.iExtension		= 0,
 | |
| +};
 | |
| +
 | |
|  static const struct uvc_output_terminal_descriptor uvc_output_terminal = {
 | |
|  	.bLength		= UVC_DT_OUTPUT_TERMINAL_SIZE,
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| @@ -141,7 +182,7 @@
 | |
|  	.bTerminalID		= 3,
 | |
|  	.wTerminalType		= cpu_to_le16(0x0101),
 | |
|  	.bAssocTerminal		= 0,
 | |
| -	.bSourceID		= 2,
 | |
| +	.bSourceID		= 0x11,
 | |
|  	.iTerminal		= 0,
 | |
|  };
 | |
|  
 | |
| @@ -169,11 +210,18 @@
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VS_FORMAT_UNCOMPRESSED,
 | |
|  	.bFormatIndex		= 1,
 | |
| -	.bNumFrameDescriptors	= 2,
 | |
| +	.bNumFrameDescriptors	= 3,
 | |
| +#ifndef CONFIG_GOKE_MC
 | |
|  	.guidFormat		=
 | |
|  		{ 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00,
 | |
|  		 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71},
 | |
|  	.bBitsPerPixel		= 16,
 | |
| +#else
 | |
| +	.guidFormat		= {
 | |
| +		 'N',  'V',  '2',  '1', 0x00, 0x00, 0x10, 0x00,
 | |
| +		 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71},
 | |
| +	.bBitsPerPixel		= 12,
 | |
| +#endif
 | |
|  	.bDefaultFrameIndex	= 1,
 | |
|  	.bAspectRatioX		= 0,
 | |
|  	.bAspectRatioY		= 0,
 | |
| @@ -184,22 +232,24 @@
 | |
|  DECLARE_UVC_FRAME_UNCOMPRESSED(1);
 | |
|  DECLARE_UVC_FRAME_UNCOMPRESSED(3);
 | |
|  
 | |
| -static const struct UVC_FRAME_UNCOMPRESSED(3) uvc_frame_yuv_360p = {
 | |
| -	.bLength		= UVC_DT_FRAME_UNCOMPRESSED_SIZE(3),
 | |
| +static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_360p = {
 | |
| +	.bLength		= UVC_DT_FRAME_UNCOMPRESSED_SIZE(1),
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VS_FRAME_UNCOMPRESSED,
 | |
|  	.bFrameIndex		= 1,
 | |
|  	.bmCapabilities		= 0,
 | |
|  	.wWidth			= cpu_to_le16(640),
 | |
|  	.wHeight		= cpu_to_le16(360),
 | |
| -	.dwMinBitRate		= cpu_to_le32(18432000),
 | |
| +	.dwMinBitRate		= cpu_to_le32(55296000),
 | |
|  	.dwMaxBitRate		= cpu_to_le32(55296000),
 | |
| +#ifndef CONFIG_GOKE_MC
 | |
|  	.dwMaxVideoFrameBufferSize	= cpu_to_le32(460800),
 | |
| -	.dwDefaultFrameInterval	= cpu_to_le32(666666),
 | |
| -	.bFrameIntervalType	= 3,
 | |
| -	.dwFrameInterval[0]	= cpu_to_le32(666666),
 | |
| -	.dwFrameInterval[1]	= cpu_to_le32(1000000),
 | |
| -	.dwFrameInterval[2]	= cpu_to_le32(5000000),
 | |
| +#else
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(345600),
 | |
| +#endif
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
|  };
 | |
|  
 | |
|  static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_720p = {
 | |
| @@ -212,10 +262,54 @@
 | |
|  	.wHeight		= cpu_to_le16(720),
 | |
|  	.dwMinBitRate		= cpu_to_le32(29491200),
 | |
|  	.dwMaxBitRate		= cpu_to_le32(29491200),
 | |
| +#ifndef CONFIG_GOKE_MC
 | |
|  	.dwMaxVideoFrameBufferSize	= cpu_to_le32(1843200),
 | |
| -	.dwDefaultFrameInterval	= cpu_to_le32(5000000),
 | |
| +#else
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(1382400),
 | |
| +#endif
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_1080p = {
 | |
| +	.bLength		= UVC_DT_FRAME_UNCOMPRESSED_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_UNCOMPRESSED,
 | |
| +	.bFrameIndex		= 3,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(1920),
 | |
| +	.wHeight		= cpu_to_le16(1080),
 | |
| +	.dwMinBitRate		= cpu_to_le32(29491200),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(29491200),
 | |
| +#ifndef CONFIG_GOKE_MC
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(4147200),
 | |
| +#else
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(3110400),
 | |
| +#endif
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
|  	.bFrameIntervalType	= 1,
 | |
| -	.dwFrameInterval[0]	= cpu_to_le32(5000000),
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_2160p = {
 | |
| +	.bLength		= UVC_DT_FRAME_UNCOMPRESSED_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_UNCOMPRESSED,
 | |
| +	.bFrameIndex		= 4,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(3840),
 | |
| +	.wHeight		= cpu_to_le16(2160),
 | |
| +	.dwMinBitRate		= cpu_to_le32(29491200),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(29491200),
 | |
| +#ifndef CONFIG_GOKE_MC
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(16588800),
 | |
| +#else
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(12441600),
 | |
| +#endif
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
|  };
 | |
|  
 | |
|  static const struct uvc_format_mjpeg uvc_format_mjpg = {
 | |
| @@ -223,7 +317,7 @@
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VS_FORMAT_MJPEG,
 | |
|  	.bFormatIndex		= 2,
 | |
| -	.bNumFrameDescriptors	= 2,
 | |
| +	.bNumFrameDescriptors	= 4,
 | |
|  	.bmFlags		= 0,
 | |
|  	.bDefaultFrameIndex	= 1,
 | |
|  	.bAspectRatioX		= 0,
 | |
| @@ -235,22 +329,20 @@
 | |
|  DECLARE_UVC_FRAME_MJPEG(1);
 | |
|  DECLARE_UVC_FRAME_MJPEG(3);
 | |
|  
 | |
| -static const struct UVC_FRAME_MJPEG(3) uvc_frame_mjpg_360p = {
 | |
| -	.bLength		= UVC_DT_FRAME_MJPEG_SIZE(3),
 | |
| +static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_360p = {
 | |
| +	.bLength		= UVC_DT_FRAME_MJPEG_SIZE(1),
 | |
|  	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
|  	.bDescriptorSubType	= UVC_VS_FRAME_MJPEG,
 | |
|  	.bFrameIndex		= 1,
 | |
|  	.bmCapabilities		= 0,
 | |
|  	.wWidth			= cpu_to_le16(640),
 | |
|  	.wHeight		= cpu_to_le16(360),
 | |
| -	.dwMinBitRate		= cpu_to_le32(18432000),
 | |
| -	.dwMaxBitRate		= cpu_to_le32(55296000),
 | |
| +	.dwMinBitRate		= cpu_to_le32(10240000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(10240000),
 | |
|  	.dwMaxVideoFrameBufferSize	= cpu_to_le32(460800),
 | |
| -	.dwDefaultFrameInterval	= cpu_to_le32(666666),
 | |
| -	.bFrameIntervalType	= 3,
 | |
| -	.dwFrameInterval[0]	= cpu_to_le32(666666),
 | |
| -	.dwFrameInterval[1]	= cpu_to_le32(1000000),
 | |
| -	.dwFrameInterval[2]	= cpu_to_le32(5000000),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
|  };
 | |
|  
 | |
|  static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_720p = {
 | |
| @@ -261,12 +353,125 @@
 | |
|  	.bmCapabilities		= 0,
 | |
|  	.wWidth			= cpu_to_le16(1280),
 | |
|  	.wHeight		= cpu_to_le16(720),
 | |
| -	.dwMinBitRate		= cpu_to_le32(29491200),
 | |
| -	.dwMaxBitRate		= cpu_to_le32(29491200),
 | |
| +	.dwMinBitRate		= cpu_to_le32(20480000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(20480000),
 | |
|  	.dwMaxVideoFrameBufferSize	= cpu_to_le32(1843200),
 | |
| -	.dwDefaultFrameInterval	= cpu_to_le32(5000000),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
|  	.bFrameIntervalType	= 1,
 | |
| -	.dwFrameInterval[0]	= cpu_to_le32(5000000),
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_1080p = {
 | |
| +	.bLength		= UVC_DT_FRAME_MJPEG_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_MJPEG,
 | |
| +	.bFrameIndex		= 3,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(1920),
 | |
| +	.wHeight		= cpu_to_le16(1080),
 | |
| +	.dwMinBitRate		= cpu_to_le32(40960000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(40960000),
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(4147200),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_2160p = {
 | |
| +	.bLength		= UVC_DT_FRAME_MJPEG_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_MJPEG,
 | |
| +	.bFrameIndex		= 4,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(3840),
 | |
| +	.wHeight		= cpu_to_le16(2160),
 | |
| +	.dwMinBitRate		= cpu_to_le32(61440000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(61440000),
 | |
| +	.dwMaxVideoFrameBufferSize	= cpu_to_le32(16588800),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct uvc_frame_based_format_desc uvc_frame_based_format_desc = {
 | |
| +	.bLength		= UVC_DT_FRAME_BASED_FORMAT_SIZE,
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FORMAT_FRAME_BASED,
 | |
| +	.bFormatIndex		= 3,
 | |
| +	.bNumFrameDescriptors	= 4,
 | |
| +	.guidFormat	= UVC_GUID_FORMAT_H264,
 | |
| +	.bBitsPerPixel	= 16,
 | |
| +	.bDefaultFrameIndex	= 1,
 | |
| +	.bAspectRatioX		= 0,
 | |
| +	.bAspectRatioY		= 0,
 | |
| +	.bmInterfaceFlags	= 0,
 | |
| +	.bCopyProtect		= 0,
 | |
| +	.bVariableSize	= 1,
 | |
| +};
 | |
| +DECLARE_UVC_FRAME_BASED(1);
 | |
| +static const struct UVC_FRAME_BASED(1) uvc_frame_based_360p = {
 | |
| +	.bLength		= UVC_DT_FRAME_BASED_FRAME_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_FRAME_BASED,
 | |
| +	.bFrameIndex		= 1,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(640),
 | |
| +	.wHeight		= cpu_to_le16(360),
 | |
| +	.dwMinBitRate		= cpu_to_le32(8192000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(8192000),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwBytesPerLine	= 0,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_FRAME_BASED(1) uvc_frame_based_720p = {
 | |
| +	.bLength		= UVC_DT_FRAME_BASED_FRAME_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_FRAME_BASED,
 | |
| +	.bFrameIndex		= 2,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(1280),
 | |
| +	.wHeight		= cpu_to_le16(720),
 | |
| +	.dwMinBitRate		= cpu_to_le32(10240000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(10240000),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwBytesPerLine	= 0,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +static const struct UVC_FRAME_BASED(1) uvc_frame_based_1080p = {
 | |
| +	.bLength		= UVC_DT_FRAME_BASED_FRAME_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_FRAME_BASED,
 | |
| +	.bFrameIndex		= 3,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(1920),
 | |
| +	.wHeight		= cpu_to_le16(1080),
 | |
| +	.dwMinBitRate		= cpu_to_le32(15360000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(15360000),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwBytesPerLine	= 0,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
| +};
 | |
| +
 | |
| +
 | |
| +static const struct UVC_FRAME_BASED(1) uvc_frame_based_2160p = {
 | |
| +	.bLength		= UVC_DT_FRAME_BASED_FRAME_SIZE(1),
 | |
| +	.bDescriptorType	= USB_DT_CS_INTERFACE,
 | |
| +	.bDescriptorSubType	= UVC_VS_FRAME_FRAME_BASED,
 | |
| +	.bFrameIndex		= 4,
 | |
| +	.bmCapabilities		= 0,
 | |
| +	.wWidth			= cpu_to_le16(3840),
 | |
| +	.wHeight		= cpu_to_le16(2160),
 | |
| +	.dwMinBitRate		= cpu_to_le32(30720000),
 | |
| +	.dwMaxBitRate		= cpu_to_le32(30720000),
 | |
| +	.dwDefaultFrameInterval	= cpu_to_le32(333333),
 | |
| +	.bFrameIntervalType	= 1,
 | |
| +	.dwBytesPerLine	= 0,
 | |
| +	.dwFrameInterval[0]	= cpu_to_le32(333333),
 | |
|  };
 | |
|  
 | |
|  static const struct uvc_color_matching_descriptor uvc_color_matching = {
 | |
| @@ -282,6 +487,8 @@
 | |
|  	(const struct uvc_descriptor_header *) &uvc_control_header,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_camera_terminal,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_processing,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_xu_h264_desc,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_xu_camera_desc,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_output_terminal,
 | |
|  	NULL,
 | |
|  };
 | |
| @@ -290,6 +497,8 @@
 | |
|  	(const struct uvc_descriptor_header *) &uvc_control_header,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_camera_terminal,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_processing,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_xu_h264_desc,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_xu_camera_desc,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_output_terminal,
 | |
|  	NULL,
 | |
|  };
 | |
| @@ -298,10 +507,19 @@
 | |
|  	(const struct uvc_descriptor_header *) &uvc_input_header,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_format_yuv,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_yuv_360p,
 | |
| -	(const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_1080p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_2160p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_format_mjpg,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_1080p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_2160p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_format_desc,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_360p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_1080p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_2160p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_color_matching,
 | |
|  	NULL,
 | |
|  };
 | |
| @@ -310,22 +528,41 @@
 | |
|  	(const struct uvc_descriptor_header *) &uvc_input_header,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_format_yuv,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_yuv_360p,
 | |
| -	(const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_1080p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_2160p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_format_mjpg,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_1080p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_2160p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_format_desc,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_360p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_1080p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_2160p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_color_matching,
 | |
|  	NULL,
 | |
|  };
 | |
|  
 | |
| +
 | |
|  static const struct uvc_descriptor_header * const uvc_ss_streaming_cls[] = {
 | |
|  	(const struct uvc_descriptor_header *) &uvc_input_header,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_format_yuv,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_yuv_360p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_yuv_1080p,
 | |
| +//	(const struct uvc_descriptor_header *) &uvc_frame_yuv_2160p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_format_mjpg,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_1080p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_mjpg_2160p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_format_desc,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_360p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_720p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_1080p,
 | |
| +	(const struct uvc_descriptor_header *) &uvc_frame_based_2160p,
 | |
|  	(const struct uvc_descriptor_header *) &uvc_color_matching,
 | |
|  	NULL,
 | |
|  };
 |