1beacf11bSopenharmony_ci/* ---------------------------------------------------------------------------- 2beacf11bSopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2017-2019. All rights reserved. 3beacf11bSopenharmony_ci * Description: LiteOS USB Driver UVC Protocol HeadFile 4beacf11bSopenharmony_ci * Author: huangjieliang 5beacf11bSopenharmony_ci * Create: 2017-04-17 6beacf11bSopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 7beacf11bSopenharmony_ci * are permitted provided that the following conditions are met: 8beacf11bSopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 9beacf11bSopenharmony_ci * conditions and the following disclaimer. 10beacf11bSopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 11beacf11bSopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 12beacf11bSopenharmony_ci * provided with the distribution. 13beacf11bSopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 14beacf11bSopenharmony_ci * to endorse or promote products derived from this software without specific prior written 15beacf11bSopenharmony_ci * permission. 16beacf11bSopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17beacf11bSopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 18beacf11bSopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19beacf11bSopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 20beacf11bSopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21beacf11bSopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22beacf11bSopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23beacf11bSopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24beacf11bSopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25beacf11bSopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26beacf11bSopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27beacf11bSopenharmony_ci * --------------------------------------------------------------------------- */ 28beacf11bSopenharmony_ci/* ---------------------------------------------------------------------------- 29beacf11bSopenharmony_ci * Notice of Export Control Law 30beacf11bSopenharmony_ci * =============================================== 31beacf11bSopenharmony_ci * Huawei LiteOS may be subject to applicable export control laws and regulations, which might 32beacf11bSopenharmony_ci * include those applicable to Huawei LiteOS of U.S. and the country in which you are located. 33beacf11bSopenharmony_ci * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such 34beacf11bSopenharmony_ci * applicable export control laws and regulations. 35beacf11bSopenharmony_ci * --------------------------------------------------------------------------- */ 36beacf11bSopenharmony_ci 37beacf11bSopenharmony_ci#ifndef _F_UVC_GADGET_H 38beacf11bSopenharmony_ci#define _F_UVC_GADGET_H 39beacf11bSopenharmony_ci 40beacf11bSopenharmony_ci#include "gadget/usbd_video.h" 41beacf11bSopenharmony_ci#include "gadget/composite.h" 42beacf11bSopenharmony_ci#include "gadget/usbdev.h" 43beacf11bSopenharmony_ci#include "implementation/freebsd_sys.h" 44beacf11bSopenharmony_ci#include "usb.h" 45beacf11bSopenharmony_ci#include "usb_endian.h" 46beacf11bSopenharmony_ci#include <linux/spinlock.h> 47beacf11bSopenharmony_ci 48beacf11bSopenharmony_ci#ifdef __cplusplus 49beacf11bSopenharmony_ci#if __cplusplus 50beacf11bSopenharmony_ciextern "C" { 51beacf11bSopenharmony_ci#endif /* __cplusplus */ 52beacf11bSopenharmony_ci#endif /* __cplusplus */ 53beacf11bSopenharmony_ci 54beacf11bSopenharmony_ci/* 55beacf11bSopenharmony_ci * USB Video Class -- Class-specific VC Interface Header Descriptor 56beacf11bSopenharmony_ci * Refer to USB Video Class Specification 1.5, section 3.7.2 57beacf11bSopenharmony_ci */ 58beacf11bSopenharmony_ci 59beacf11bSopenharmony_cistruct uvc_vc_header_descriptor 60beacf11bSopenharmony_ci{ 61beacf11bSopenharmony_ci u8 bLength; 62beacf11bSopenharmony_ci u8 bDescriptorType; 63beacf11bSopenharmony_ci u8 bDescriptorSubtype; 64beacf11bSopenharmony_ci u16 bcdUVC; 65beacf11bSopenharmony_ci u16 wTotalLength; 66beacf11bSopenharmony_ci u32 dwClockFrequency; 67beacf11bSopenharmony_ci u8 bInCollection; 68beacf11bSopenharmony_ci u8 bInterfaceNr; 69beacf11bSopenharmony_ci} __attribute__((packed)); 70beacf11bSopenharmony_ci 71beacf11bSopenharmony_ci/* 72beacf11bSopenharmony_ci * UVC Video Class-specific Descriptor Types, UVC spec. 1.5, section A.4 73beacf11bSopenharmony_ci */ 74beacf11bSopenharmony_ci 75beacf11bSopenharmony_ci#define USB_UVC_CS_UNDEFINED 0x20 76beacf11bSopenharmony_ci#define USB_UVC_CS_DEVICE 0x21 77beacf11bSopenharmony_ci#define USB_UVC_CS_CONFIGURATION 0x22 78beacf11bSopenharmony_ci#define USB_UVC_CS_STRING 0x23 79beacf11bSopenharmony_ci#define USB_UVC_CS_INTERFACE 0x24 80beacf11bSopenharmony_ci#define USB_UVC_CS_ENDPOINT 0x25 81beacf11bSopenharmony_ci 82beacf11bSopenharmony_ci/* 83beacf11bSopenharmony_ci * UVC Video Class-specific Descriptor Subtypes, UVC spec. 1.5, section A.5 84beacf11bSopenharmony_ci */ 85beacf11bSopenharmony_ci 86beacf11bSopenharmony_ci#define UVC_VC_DESCRIPTOR_UNDEFINED 0x0 87beacf11bSopenharmony_ci#define UVC_VC_HEADER 0x1 88beacf11bSopenharmony_ci#define UVC_VC_INPUT_TERMINAL 0x2 89beacf11bSopenharmony_ci#define UVC_VC_OUTPUT_TERMINAL 0x3 90beacf11bSopenharmony_ci#define UVC_VC_SELECTOR_UNIT 0x4 91beacf11bSopenharmony_ci#define UVC_VC_PROCESSING_UNIT 0x5 92beacf11bSopenharmony_ci#define UVC_VC_EXTENSION_UNIT 0x6 93beacf11bSopenharmony_ci#define UVC_VC_ENCODING_UNIT 0x7 94beacf11bSopenharmony_ci 95beacf11bSopenharmony_ci/* 96beacf11bSopenharmony_ci * UVC input terminal descriptor, refer to UVC Specification 97beacf11bSopenharmony_ci * 1.5, section 3.7.2.1 for the details 98beacf11bSopenharmony_ci */ 99beacf11bSopenharmony_ci 100beacf11bSopenharmony_cistruct uvc_it_descriptor 101beacf11bSopenharmony_ci{ 102beacf11bSopenharmony_ci u8 bLength; 103beacf11bSopenharmony_ci u8 bDescriptorType; 104beacf11bSopenharmony_ci u8 bDescriptorSubtype; 105beacf11bSopenharmony_ci u8 bTerminalID; 106beacf11bSopenharmony_ci u16 wTerminalType; 107beacf11bSopenharmony_ci u8 bAssocTerminal; 108beacf11bSopenharmony_ci u8 iTerminal; 109beacf11bSopenharmony_ci} __attribute__((packed)); 110beacf11bSopenharmony_ci 111beacf11bSopenharmony_ci/* 112beacf11bSopenharmony_ci * UVC output terminal descriptor, refer to UVC specification 113beacf11bSopenharmony_ci * 1.5, section 3.7.2.2 for the details 114beacf11bSopenharmony_ci */ 115beacf11bSopenharmony_ci 116beacf11bSopenharmony_cistruct uvc_ot_descriptor 117beacf11bSopenharmony_ci{ 118beacf11bSopenharmony_ci u8 bLength; 119beacf11bSopenharmony_ci u8 bDescriptorType; 120beacf11bSopenharmony_ci u8 bDescriptorSubtype; 121beacf11bSopenharmony_ci u8 bTerminalID; 122beacf11bSopenharmony_ci u16 wTerminalType; 123beacf11bSopenharmony_ci u8 bAssocTerminal; 124beacf11bSopenharmony_ci u8 bSourceID; 125beacf11bSopenharmony_ci u8 iTerminal; 126beacf11bSopenharmony_ci} __attribute__((packed)); 127beacf11bSopenharmony_ci 128beacf11bSopenharmony_ci/* 129beacf11bSopenharmony_ci * USB Terminal types, UVC spec. 1.5, section B.1 130beacf11bSopenharmony_ci */ 131beacf11bSopenharmony_ci 132beacf11bSopenharmony_ci#define USB_UVC_TT_VENDOR_SPECIFIC 0x0100 133beacf11bSopenharmony_ci#define USB_UVC_TT_STREAMING 0x0101 134beacf11bSopenharmony_ci 135beacf11bSopenharmony_ci/* 136beacf11bSopenharmony_ci * UVC camera terminal descriptor, refer to UVC specification 137beacf11bSopenharmony_ci * 1.5, section 3.7.2.3 for the details 138beacf11bSopenharmony_ci */ 139beacf11bSopenharmony_ci 140beacf11bSopenharmony_cistruct uvc_ct_descriptor 141beacf11bSopenharmony_ci{ 142beacf11bSopenharmony_ci u8 bLength; 143beacf11bSopenharmony_ci u8 bDescriptorType; 144beacf11bSopenharmony_ci u8 bDescriptorSubtype; 145beacf11bSopenharmony_ci u8 bTerminalID; 146beacf11bSopenharmony_ci u16 wTerminalType; 147beacf11bSopenharmony_ci u8 bAssocTerminal; 148beacf11bSopenharmony_ci u8 iTerminal; 149beacf11bSopenharmony_ci u16 wObjectiveFocalLengthMin; 150beacf11bSopenharmony_ci u16 wObjectiveFocalLengthMax; 151beacf11bSopenharmony_ci u16 wOcularFocalLength; 152beacf11bSopenharmony_ci u8 bControlSize; 153beacf11bSopenharmony_ci u8 bmControls[3]; 154beacf11bSopenharmony_ci} __attribute__((packed)); 155beacf11bSopenharmony_ci 156beacf11bSopenharmony_ci/* 157beacf11bSopenharmony_ci * Camera Terminal Control Selectors, UVC spec. 1.5, section A.9.4 158beacf11bSopenharmony_ci */ 159beacf11bSopenharmony_ci 160beacf11bSopenharmony_ci#define USBD_UVC_CT_CONTROL_UNDEFINED 0x00 161beacf11bSopenharmony_ci#define USBD_UVC_CT_SCANNING_MODE_CONTROL 0x01 162beacf11bSopenharmony_ci#define USBD_UVC_CT_AE_MODE_CONTROL 0x02 163beacf11bSopenharmony_ci#define USBD_UVC_CT_AE_PRIORITY_CONTROL 0x03 164beacf11bSopenharmony_ci#define USBD_UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 165beacf11bSopenharmony_ci#define USBD_UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 166beacf11bSopenharmony_ci#define USBD_UVC_CT_FOCUS_ABSOLUTE_CONTROL 0x06 167beacf11bSopenharmony_ci#define USBD_UVC_CT_FOCUS_RELATIVE_CONTROL 0x07 168beacf11bSopenharmony_ci#define USBD_UVC_CT_FOCUS_AUTO_CONTROL 0x08 169beacf11bSopenharmony_ci#define USBD_UVC_CT_IRIS_ABSOLUTE_CONTROL 0x09 170beacf11bSopenharmony_ci#define USBD_UVC_CT_IRIS_RELATIVE_CONTROL 0x0a 171beacf11bSopenharmony_ci#define USBD_UVC_CT_ZOOM_ABSOLUTE_CONTROL 0x0b 172beacf11bSopenharmony_ci#define USBD_UVC_CT_ZOOM_RELATIVE_CONTROL 0x0c 173beacf11bSopenharmony_ci#define USBD_UVC_CT_PANTILT_ABSOLUTE_CONTROL 0x0d 174beacf11bSopenharmony_ci#define USBD_UVC_CT_PANTILT_RELATIVE_CONTROL 0x0e 175beacf11bSopenharmony_ci#define USBD_UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f 176beacf11bSopenharmony_ci#define USBD_UVC_CT_ROLL_RELATIVE_CONTROL 0x10 177beacf11bSopenharmony_ci#define USBD_UVC_CT_PRIVACY_CONTROL 0x11 178beacf11bSopenharmony_ci#define USBD_UVC_CT_FOCUS_SIMPLE_CONTROL 0x12 179beacf11bSopenharmony_ci#define USBD_UVC_CT_WINDOW_CONTROL 0x13 180beacf11bSopenharmony_ci#define USBD_UVC_CT_REGION_OF_INTEREST_CONTROL 0x14 181beacf11bSopenharmony_ci 182beacf11bSopenharmony_ci/* 183beacf11bSopenharmony_ci * Input Terminal Types, UVC spec. 1.5, section B.2 184beacf11bSopenharmony_ci */ 185beacf11bSopenharmony_ci 186beacf11bSopenharmony_ci#define USB_UVC_ITT_VENDOR_SPECIFIC 0x0200 187beacf11bSopenharmony_ci#define USB_UVC_ITT_CAMERA 0x0201 188beacf11bSopenharmony_ci#define USB_UVC_ITT_MEDIA_TRANSPORT_INPUT 0x0202 189beacf11bSopenharmony_ci 190beacf11bSopenharmony_ci/* 191beacf11bSopenharmony_ci * Selector Unit Descriptor, UVC spec., section 3.7.2.4 192beacf11bSopenharmony_ci */ 193beacf11bSopenharmony_ci 194beacf11bSopenharmony_ci#define DEFINE_UVC_SELECTOR_DESCRIPTOR(p_) \ 195beacf11bSopenharmony_cistruct uvc_selector_descriptor ## p_ \ 196beacf11bSopenharmony_ci{ \ 197beacf11bSopenharmony_ci u8 bLength; \ 198beacf11bSopenharmony_ci u8 bDescriptorType; \ 199beacf11bSopenharmony_ci u8 bDescriptorSubtype; \ 200beacf11bSopenharmony_ci u8 bUnitID; \ 201beacf11bSopenharmony_ci u8 bNrInPins; \ 202beacf11bSopenharmony_ci u8 baSourceID[p_]; \ 203beacf11bSopenharmony_ci u8 iSelector; \ 204beacf11bSopenharmony_ci} __attribute__((packed)) 205beacf11bSopenharmony_ci 206beacf11bSopenharmony_ciDEFINE_UVC_SELECTOR_DESCRIPTOR(2); 207beacf11bSopenharmony_ci 208beacf11bSopenharmony_ci/* 209beacf11bSopenharmony_ci * Processing Unit Descriptor, UVC spec. 1.5, section 3.7.2.5 210beacf11bSopenharmony_ci */ 211beacf11bSopenharmony_ci 212beacf11bSopenharmony_cistruct uvc_processing_descriptor 213beacf11bSopenharmony_ci{ 214beacf11bSopenharmony_ci u8 bLength; 215beacf11bSopenharmony_ci u8 bDescriptorType; 216beacf11bSopenharmony_ci u8 bDescriptorSubtype; 217beacf11bSopenharmony_ci u8 bUnitID; 218beacf11bSopenharmony_ci u8 bSourceID; 219beacf11bSopenharmony_ci u16 wMaxMultiplier; 220beacf11bSopenharmony_ci u8 bControlSize; 221beacf11bSopenharmony_ci u8 bmControls[3]; 222beacf11bSopenharmony_ci u8 iProcessing; 223beacf11bSopenharmony_ci u8 bmVideoStandards; 224beacf11bSopenharmony_ci} __attribute__((packed)); 225beacf11bSopenharmony_ci 226beacf11bSopenharmony_ci/* 227beacf11bSopenharmony_ci * UVC Processing Unit Control Selectors, UVC spec. 1.5, section A.9.5 228beacf11bSopenharmony_ci */ 229beacf11bSopenharmony_ci 230beacf11bSopenharmony_ci#define USBD_UVC_PU_CONTROL_UNDEFINED 0x00 231beacf11bSopenharmony_ci#define USBD_UVC_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 232beacf11bSopenharmony_ci#define USBD_UVC_PU_BRIGHTNESS_CONTROL 0x02 233beacf11bSopenharmony_ci#define USBD_UVC_PU_CONTRAST_CONTROL 0x03 234beacf11bSopenharmony_ci#define USBD_UVC_PU_GAIN_CONTROL 0x04 235beacf11bSopenharmony_ci#define USBD_UVC_PU_POWER_LINE_FREQUENCY_CONTROL 0x05 236beacf11bSopenharmony_ci#define USBD_UVC_PU_HUE_CONTROL 0x06 237beacf11bSopenharmony_ci#define USBD_UVC_PU_SATURATION_CONTROL 0x07 238beacf11bSopenharmony_ci#define USBD_UVC_PU_SHARPNESS_CONTROL 0x08 239beacf11bSopenharmony_ci#define USBD_UVC_PU_GAMMA_CONTROL 0x09 240beacf11bSopenharmony_ci#define USBD_UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a 241beacf11bSopenharmony_ci#define USBD_UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTORL 0x0b 242beacf11bSopenharmony_ci#define USBD_UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c 243beacf11bSopenharmony_ci#define USBD_UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d 244beacf11bSopenharmony_ci#define USBD_UVC_PU_DIGITAL_MULTIPLIER_CONTROL 0x0e 245beacf11bSopenharmony_ci#define USBD_UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f 246beacf11bSopenharmony_ci#define USBD_UVC_PU_HUE_AUTO_CONTROL 0x10 247beacf11bSopenharmony_ci#define USBD_UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 248beacf11bSopenharmony_ci#define USBD_UVC_PU_ANALOG_LOCK_STATUS_CONTROL 0x12 249beacf11bSopenharmony_ci#define USBD_UVC_PU_CONTRAST_AUTO_CONTROL 0x13 250beacf11bSopenharmony_ci 251beacf11bSopenharmony_ci/* 252beacf11bSopenharmony_ci * UVC Extension Unit Descriptor, UVC spec. 1.5, section 3.7.2.7 253beacf11bSopenharmony_ci */ 254beacf11bSopenharmony_ci 255beacf11bSopenharmony_ci#define DECLARE_UVC_EXTENSION_UNIT(p_, n_) \ 256beacf11bSopenharmony_cistruct uvc_extension_unit_descriptor ## p_ ## x ## n_ \ 257beacf11bSopenharmony_ci{ \ 258beacf11bSopenharmony_ci u8 bLength; \ 259beacf11bSopenharmony_ci u8 bDescriptorType; \ 260beacf11bSopenharmony_ci u8 bDescriptorSubtype; \ 261beacf11bSopenharmony_ci u8 bUnitID; \ 262beacf11bSopenharmony_ci u8 guidExtensionCode[16]; \ 263beacf11bSopenharmony_ci u8 bNumControls; \ 264beacf11bSopenharmony_ci u8 bNrInPins; \ 265beacf11bSopenharmony_ci u8 baSourceID[ p_ ]; \ 266beacf11bSopenharmony_ci u8 bControlSize; \ 267beacf11bSopenharmony_ci u8 bmControls[ n_ ]; \ 268beacf11bSopenharmony_ci u8 iExtension; \ 269beacf11bSopenharmony_ci} __attribute__((packed)) 270beacf11bSopenharmony_ci 271beacf11bSopenharmony_ciDECLARE_UVC_EXTENSION_UNIT(1, 2); 272beacf11bSopenharmony_ci 273beacf11bSopenharmony_ci/* 274beacf11bSopenharmony_ci * UVC Video Streaming interface header descriptor, UVC spec., section 3.9.2.1 275beacf11bSopenharmony_ci */ 276beacf11bSopenharmony_ci 277beacf11bSopenharmony_cistruct uvc_vs_header_descriptor 278beacf11bSopenharmony_ci{ 279beacf11bSopenharmony_ci u8 bLength; 280beacf11bSopenharmony_ci u8 bDescriptorType; 281beacf11bSopenharmony_ci u8 bDescriptorSubtype; 282beacf11bSopenharmony_ci u8 bNumFormats; 283beacf11bSopenharmony_ci u16 wTotalLength; 284beacf11bSopenharmony_ci u8 bEndpointAddress; 285beacf11bSopenharmony_ci u8 bmInfo; 286beacf11bSopenharmony_ci u8 bTerminalLink; 287beacf11bSopenharmony_ci u8 bStillCaptureMethod; 288beacf11bSopenharmony_ci u8 bTriggerSupport; 289beacf11bSopenharmony_ci u8 bTriggerUsage; 290beacf11bSopenharmony_ci u8 bControlSize; 291beacf11bSopenharmony_ci u8 bmaControls[3][1]; 292beacf11bSopenharmony_ci} __attribute__((packed)); 293beacf11bSopenharmony_ci 294beacf11bSopenharmony_ci/* 295beacf11bSopenharmony_ci * UVC stream Header definitions, refer to `USB_Video_Payload_H264_1.5, section 2.2 296beacf11bSopenharmony_ci */ 297beacf11bSopenharmony_ci 298beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_FID 0x01 299beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_EOF 0x02 300beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_PTS 0x04 301beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_SCR 0x08 302beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_EOS 0x10 303beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_STI 0x20 304beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_ERR 0x40 305beacf11bSopenharmony_ci#define UVC_STREAM_HEADER_EOH 0x80 306beacf11bSopenharmony_ci 307beacf11bSopenharmony_ci/* 308beacf11bSopenharmony_ci * Video Class-specific VS interface Descriptor Subtypes, UVC spec. 1.5, section A.6 309beacf11bSopenharmony_ci */ 310beacf11bSopenharmony_ci 311beacf11bSopenharmony_ci#define USB_UVC_VS_UNDEFINED 0x00 312beacf11bSopenharmony_ci#define USB_UVC_VS_INPUT_HEADER 0x01 313beacf11bSopenharmony_ci#define USB_UVC_VS_OUTPUT_HEADER 0x02 314beacf11bSopenharmony_ci#define USB_UVC_VS_STILL_IMAGE_FRAME 0x03 315beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_UNCOMPRESSED 0x04 316beacf11bSopenharmony_ci#define USB_UVC_VS_FRAME_UNCOMPRESSED 0x05 317beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_MJPEG 0x06 318beacf11bSopenharmony_ci#define USB_UVC_VS_FRAME_MJPEG 0x07 319beacf11bSopenharmony_ci 320beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_MPEG2TS 0x0a 321beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_DV 0x0c 322beacf11bSopenharmony_ci#define USB_UVC_VS_COLOR_FORMAT 0x0d 323beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_FRAME_BASED 0x10 324beacf11bSopenharmony_ci#define USB_UVC_VS_FRAME_FRAME_BASED 0x11 325beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_STREAM_BASED 0x12 326beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_H264 0x13 327beacf11bSopenharmony_ci 328beacf11bSopenharmony_ci#define USB_UVC_VS_FRAME_H264 0x14 329beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_H264_SIMULCAST 0x15 330beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_VP8 0x16 331beacf11bSopenharmony_ci#define USB_UVC_VS_FRAME_VP8 0x17 332beacf11bSopenharmony_ci#define USB_UVC_VS_FORMAT_VP8_SIMULCAST 0x18 333beacf11bSopenharmony_ci 334beacf11bSopenharmony_ci/* 335beacf11bSopenharmony_ci * UVC uncompressed video frame descriptor, USB Video Payload Uncompressed 1.5, section 3.1.2 336beacf11bSopenharmony_ci */ 337beacf11bSopenharmony_ci 338beacf11bSopenharmony_ci#define DEFINE_UVC_UNCOMPRESSED_FRAME_DESCRIPTOR(p_) \ 339beacf11bSopenharmony_cistruct uvc_uncompressed_frame_descriptor ## p_ \ 340beacf11bSopenharmony_ci{ \ 341beacf11bSopenharmony_ci u8 bLength; \ 342beacf11bSopenharmony_ci u8 bDescriptorType; \ 343beacf11bSopenharmony_ci u8 bDescriptorSubtype; \ 344beacf11bSopenharmony_ci u8 bFrameIndex; \ 345beacf11bSopenharmony_ci u8 bmCapabilities; \ 346beacf11bSopenharmony_ci u16 wWidth; \ 347beacf11bSopenharmony_ci u16 wHeight; \ 348beacf11bSopenharmony_ci u32 dwMinBitRate; \ 349beacf11bSopenharmony_ci u32 dwMaxBitRate; \ 350beacf11bSopenharmony_ci u32 dwMaxVideoFrameBufferSize; \ 351beacf11bSopenharmony_ci u32 dwDefaultFrameInterval; \ 352beacf11bSopenharmony_ci u8 bFrameIntervalType; \ 353beacf11bSopenharmony_ci u32 dwFrameInterval[p_]; \ 354beacf11bSopenharmony_ci} __attribute__((packed)) 355beacf11bSopenharmony_ci 356beacf11bSopenharmony_ciDEFINE_UVC_UNCOMPRESSED_FRAME_DESCRIPTOR(3); 357beacf11bSopenharmony_ci 358beacf11bSopenharmony_ci/* 359beacf11bSopenharmony_ci * UVC uncompressed video format descriptor, USB Video Payload Uncompressed 1.5, section 3.1.1 360beacf11bSopenharmony_ci */ 361beacf11bSopenharmony_ci 362beacf11bSopenharmony_cistruct uvc_uncompressed_format_descriptor 363beacf11bSopenharmony_ci{ 364beacf11bSopenharmony_ci u8 bLength; 365beacf11bSopenharmony_ci u8 bDescriptorType; 366beacf11bSopenharmony_ci u8 bDescriptorSubtype; 367beacf11bSopenharmony_ci u8 bFormatIndex; 368beacf11bSopenharmony_ci u8 bNumFrameDescriptors; 369beacf11bSopenharmony_ci u8 guidFormat[16]; 370beacf11bSopenharmony_ci u8 bBitsPerPixel; 371beacf11bSopenharmony_ci u8 bDefaultFrameIndex; 372beacf11bSopenharmony_ci u8 bAspectRatioX; 373beacf11bSopenharmony_ci u8 bAspectRatioY; 374beacf11bSopenharmony_ci u8 bmInterlaceFlags; 375beacf11bSopenharmony_ci u8 bCopyProtect; 376beacf11bSopenharmony_ci} __attribute__((packed)); 377beacf11bSopenharmony_ci 378beacf11bSopenharmony_ci/* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */ 379beacf11bSopenharmony_ci 380beacf11bSopenharmony_cistruct uvc_format_mjpeg 381beacf11bSopenharmony_ci{ 382beacf11bSopenharmony_ci u8 bLength; 383beacf11bSopenharmony_ci u8 bDescriptorType; 384beacf11bSopenharmony_ci u8 bDescriptorSubType; 385beacf11bSopenharmony_ci u8 bFormatIndex; 386beacf11bSopenharmony_ci u8 bNumFrameDescriptors; 387beacf11bSopenharmony_ci u8 bmFlags; 388beacf11bSopenharmony_ci u8 bDefaultFrameIndex; 389beacf11bSopenharmony_ci u8 bAspectRatioX; 390beacf11bSopenharmony_ci u8 bAspectRatioY; 391beacf11bSopenharmony_ci u8 bmInterfaceFlags; 392beacf11bSopenharmony_ci u8 bCopyProtect; 393beacf11bSopenharmony_ci} __attribute__((packed)); 394beacf11bSopenharmony_ci 395beacf11bSopenharmony_ci/* 396beacf11bSopenharmony_ci * UVC stream based format descriptor 397beacf11bSopenharmony_ci * USB_Video_Payload_Stream_Based_1.1, section 3.1.1 398beacf11bSopenharmony_ci * USB_Video_Payload_Stream_Based_1.5, section 3.1.1 399beacf11bSopenharmony_ci */ 400beacf11bSopenharmony_ci 401beacf11bSopenharmony_cistruct uvc_stream_based_format_descriptor 402beacf11bSopenharmony_ci{ 403beacf11bSopenharmony_ci u8 bLength; 404beacf11bSopenharmony_ci u8 bDescriptorType; 405beacf11bSopenharmony_ci u8 bDescriptorSubtype; 406beacf11bSopenharmony_ci u8 bFormatIndex; 407beacf11bSopenharmony_ci u8 guidFormat[16]; 408beacf11bSopenharmony_ci u32 dwPacketLength; 409beacf11bSopenharmony_ci} __attribute__((packed)); 410beacf11bSopenharmony_ci 411beacf11bSopenharmony_ci/* 412beacf11bSopenharmony_ci * frame based Payload Video Format Descriptor, USB_Video_Payload_Frame_Based_1.1, section 3.1.1 413beacf11bSopenharmony_ci */ 414beacf11bSopenharmony_ci 415beacf11bSopenharmony_cistruct uvc_frame_based_format_descriptor 416beacf11bSopenharmony_ci{ 417beacf11bSopenharmony_ci u8 bLength; 418beacf11bSopenharmony_ci u8 bDescriptorType; 419beacf11bSopenharmony_ci u8 bDescriptorSubtype; 420beacf11bSopenharmony_ci u8 bFormatIndex; 421beacf11bSopenharmony_ci u8 bNumFrameDescriptors; 422beacf11bSopenharmony_ci u8 guidFormat[16]; 423beacf11bSopenharmony_ci u8 bBitsPerPixel; 424beacf11bSopenharmony_ci u8 bDefaultFrameIndex; 425beacf11bSopenharmony_ci u8 bAspectRatioX; 426beacf11bSopenharmony_ci u8 bAspectRatioY; 427beacf11bSopenharmony_ci u8 bmInterlaceFlags; 428beacf11bSopenharmony_ci u8 bCopyProtect; 429beacf11bSopenharmony_ci u8 bVariableSize; 430beacf11bSopenharmony_ci} __attribute__((packed)); 431beacf11bSopenharmony_ci 432beacf11bSopenharmony_ci/* 433beacf11bSopenharmony_ci * Frame Based payload Video Frame Descriptors, USB_Video_Payload_Frame_Based_1.1, section 3.1.2 434beacf11bSopenharmony_ci */ 435beacf11bSopenharmony_ci 436beacf11bSopenharmony_ci#define DECLARE_UVC_FRAME_BASED_FRAME_DESCRITPROR(n_) \ 437beacf11bSopenharmony_cistruct uvc_frame_based_frame_descriptor ## n_ \ 438beacf11bSopenharmony_ci{ \ 439beacf11bSopenharmony_ci u8 bLength; \ 440beacf11bSopenharmony_ci u8 bDescriptorType; \ 441beacf11bSopenharmony_ci u8 bDescriptorSubtype; \ 442beacf11bSopenharmony_ci u8 bFrameIndex; \ 443beacf11bSopenharmony_ci u8 bmCapabilities; \ 444beacf11bSopenharmony_ci u16 wWidth; \ 445beacf11bSopenharmony_ci u16 wHeight; \ 446beacf11bSopenharmony_ci u32 dwMinBitRate; \ 447beacf11bSopenharmony_ci u32 dwMaxBitRate; \ 448beacf11bSopenharmony_ci u32 dwDefaultFrameInterval; \ 449beacf11bSopenharmony_ci u8 bFrameIntervalType; \ 450beacf11bSopenharmony_ci u32 dwBytesPerLine; \ 451beacf11bSopenharmony_ci u32 dwFrameInterval[n_]; \ 452beacf11bSopenharmony_ci} __attribute__((packed)) 453beacf11bSopenharmony_ci 454beacf11bSopenharmony_ciDECLARE_UVC_FRAME_BASED_FRAME_DESCRITPROR(3); 455beacf11bSopenharmony_ci 456beacf11bSopenharmony_ci/* 457beacf11bSopenharmony_ci * H.264 Payload Video Format Descriptor, USB_Video_Payload_H264_1.5, section 3.1.1 458beacf11bSopenharmony_ci */ 459beacf11bSopenharmony_ci 460beacf11bSopenharmony_cistruct uvc_h264_format_descriptor 461beacf11bSopenharmony_ci{ 462beacf11bSopenharmony_ci u8 bLength; 463beacf11bSopenharmony_ci u8 bDescriptorType; 464beacf11bSopenharmony_ci u8 bDescriptorSubtype; 465beacf11bSopenharmony_ci u8 bFormatIndex; 466beacf11bSopenharmony_ci u8 bNumFrameDescriptors; 467beacf11bSopenharmony_ci u8 bDefaultFrameIndex; 468beacf11bSopenharmony_ci u8 bMaxCodecConfigDelay; 469beacf11bSopenharmony_ci u8 bmSupportedSliceModes; 470beacf11bSopenharmony_ci u8 bmSupportedSyncFrameTypes; 471beacf11bSopenharmony_ci u8 bResolutionScaling; 472beacf11bSopenharmony_ci u8 Reserved1; 473beacf11bSopenharmony_ci u8 bmSupportedRateControlModes; 474beacf11bSopenharmony_ci u16 wMaxMBperSec_No[4]; 475beacf11bSopenharmony_ci u16 wMaxMBperSec_Temp[4]; 476beacf11bSopenharmony_ci u16 wMaxMBperSec_Qual[4]; 477beacf11bSopenharmony_ci u16 wMaxMBperSec_Spat[4]; 478beacf11bSopenharmony_ci u16 wMaxMBperSec_Full[4]; 479beacf11bSopenharmony_ci} __attribute__((packed)); 480beacf11bSopenharmony_ci 481beacf11bSopenharmony_ci/* 482beacf11bSopenharmony_ci * H.264 Payload Video Frame Descriptor, section 3.1.2 483beacf11bSopenharmony_ci */ 484beacf11bSopenharmony_ci 485beacf11bSopenharmony_ci#define DECLARE_UVC_H264_FRAME_DESCRIPTOR(n_) \ 486beacf11bSopenharmony_cistruct uvc_h264_frame_descriptor ## n_ \ 487beacf11bSopenharmony_ci{ \ 488beacf11bSopenharmony_ci u8 bLength; \ 489beacf11bSopenharmony_ci u8 bDescriptorType; \ 490beacf11bSopenharmony_ci u8 bDescriptorSubtype; \ 491beacf11bSopenharmony_ci u8 bFrameIndex; \ 492beacf11bSopenharmony_ci u16 wWidth; \ 493beacf11bSopenharmony_ci u16 wHeight; \ 494beacf11bSopenharmony_ci u16 wSARwidth; \ 495beacf11bSopenharmony_ci u16 wSARheight; \ 496beacf11bSopenharmony_ci u16 wProfile; \ 497beacf11bSopenharmony_ci u8 bLevelIDC; \ 498beacf11bSopenharmony_ci u16 wConstrainedToolset; \ 499beacf11bSopenharmony_ci u32 bmSupportedUsages; \ 500beacf11bSopenharmony_ci u16 bmCapabilities; \ 501beacf11bSopenharmony_ci u32 bmSVCCapabilities; \ 502beacf11bSopenharmony_ci u32 bmMVCCapabilities; \ 503beacf11bSopenharmony_ci u32 dwMinBitRate; \ 504beacf11bSopenharmony_ci u32 dwMaxBitRate; \ 505beacf11bSopenharmony_ci u32 dwDefaultFrameInterval; \ 506beacf11bSopenharmony_ci u8 bNumFrameIntervals; \ 507beacf11bSopenharmony_ci u8 dwFrameIntervals[n_]; \ 508beacf11bSopenharmony_ci} __attribute__((packed)) 509beacf11bSopenharmony_ci 510beacf11bSopenharmony_ciDECLARE_UVC_H264_FRAME_DESCRIPTOR(1); 511beacf11bSopenharmony_ci 512beacf11bSopenharmony_ci#define DECLARE_UVC_MJPEG_FRAME_DESCRIPTOR(n_) \ 513beacf11bSopenharmony_cistruct uvc_mjpg_frame_descriptor ## n_ \ 514beacf11bSopenharmony_ci{ \ 515beacf11bSopenharmony_ci u8 bLength; \ 516beacf11bSopenharmony_ci u8 bDescriptorType; \ 517beacf11bSopenharmony_ci u8 bDescriptorSubType; \ 518beacf11bSopenharmony_ci u8 bFrameIndex; \ 519beacf11bSopenharmony_ci u8 bmCapabilities; \ 520beacf11bSopenharmony_ci u16 wWidth; \ 521beacf11bSopenharmony_ci u16 wHeight; \ 522beacf11bSopenharmony_ci u32 dwMinBitRate; \ 523beacf11bSopenharmony_ci u32 dwMaxBitRate; \ 524beacf11bSopenharmony_ci u32 dwMaxVideoFrameBufferSize; \ 525beacf11bSopenharmony_ci u32 dwDefaultFrameInterval; \ 526beacf11bSopenharmony_ci u8 bFrameIntervalType; \ 527beacf11bSopenharmony_ci u32 dwFrameInterval[n_]; \ 528beacf11bSopenharmony_ci} __attribute__ ((packed)) 529beacf11bSopenharmony_ci 530beacf11bSopenharmony_ciDECLARE_UVC_MJPEG_FRAME_DESCRIPTOR(1); 531beacf11bSopenharmony_ci 532beacf11bSopenharmony_ci/* 533beacf11bSopenharmony_ci * UVC color-matching descriptor, UVC spec., section 3.9.2.6 534beacf11bSopenharmony_ci */ 535beacf11bSopenharmony_ci 536beacf11bSopenharmony_cistruct uvc_color_matching_descriptor 537beacf11bSopenharmony_ci{ 538beacf11bSopenharmony_ci u8 bLength; 539beacf11bSopenharmony_ci u8 bDescriptorType; 540beacf11bSopenharmony_ci u8 bDescriptorSubtype; 541beacf11bSopenharmony_ci u8 bColorPrimaries; 542beacf11bSopenharmony_ci u8 bTransferCharacteristics; 543beacf11bSopenharmony_ci u8 bMatrixCoefficients; 544beacf11bSopenharmony_ci} __attribute__((packed)); 545beacf11bSopenharmony_ci 546beacf11bSopenharmony_ci/* Color Primaries and the reference white */ 547beacf11bSopenharmony_ci 548beacf11bSopenharmony_ci#define UVC_COLOR_UNSPECIFIED 0x0 549beacf11bSopenharmony_ci#define UVC_COLOR_BT709_SRGB 0x1 550beacf11bSopenharmony_ci#define UVC_COLOR_BT4702M 0x2 551beacf11bSopenharmony_ci#define UVC_COLOR_BT4702BG 0x3 552beacf11bSopenharmony_ci#define UVC_COLOR_SMPTE_170M 0x4 553beacf11bSopenharmony_ci#define UVC_COLOR_SMPTE_240M 0x5 554beacf11bSopenharmony_ci 555beacf11bSopenharmony_ci/* Color transfer characteristics, gamma function ??? */ 556beacf11bSopenharmony_ci 557beacf11bSopenharmony_ci#define UVC_COLOR_LINEAR 0x6 558beacf11bSopenharmony_ci#define UVC_COLOR_SRGB 0x7 559beacf11bSopenharmony_ci 560beacf11bSopenharmony_ci/* Matrix Coefficients */ 561beacf11bSopenharmony_ci 562beacf11bSopenharmony_ci#define UVC_COLOR_MC_UNSPECIFIED 0x0 563beacf11bSopenharmony_ci#define UVC_COLOR_MC_BT709 0x1 564beacf11bSopenharmony_ci#define UVC_COLOR_MC_FCC 0x2 565beacf11bSopenharmony_ci#define UVC_COLOR_MC_BT4702BG 0x3 566beacf11bSopenharmony_ci#define UVC_COLOR_MC_SMPTE_170M 0x4 567beacf11bSopenharmony_ci#define UVC_COLOR_MC_SMPTE_240M 0x5 568beacf11bSopenharmony_ci 569beacf11bSopenharmony_ci#define fourcc(a, b, c, d) \ 570beacf11bSopenharmony_ci ((u32)(a) | ((u32)(b) << 8) | ((u32)(c) << 16) | ((u32)(d) << 24)) 571beacf11bSopenharmony_ci 572beacf11bSopenharmony_ci#define V4L2_PIX_FMT_YUYV fourcc('Y', 'U', 'Y', 'V') /* 16 YUV 4:2:2 */ 573beacf11bSopenharmony_ci#define V4L2_PIX_FMT_MJPEG fourcc('M', 'J', 'P', 'G') /* Motion-JPEG */ 574beacf11bSopenharmony_ci#define V4L2_PIX_FMT_H264 fourcc('H', '2', '6', '4') /* H264 with start codes */ 575beacf11bSopenharmony_ci 576beacf11bSopenharmony_ci/* 577beacf11bSopenharmony_ci * UVC VideoControl interrupt endpoint descriptor, UVC spec. 1.5, section 3.8.2.2 578beacf11bSopenharmony_ci */ 579beacf11bSopenharmony_ci 580beacf11bSopenharmony_cistruct uvc_vc_int_endpoint_descriptor 581beacf11bSopenharmony_ci{ 582beacf11bSopenharmony_ci u8 bLength; 583beacf11bSopenharmony_ci u8 bDescriptorType; 584beacf11bSopenharmony_ci u8 bDescriptorSubtype; 585beacf11bSopenharmony_ci u16 wMaxTransferSize; 586beacf11bSopenharmony_ci} __attribute__((packed)); 587beacf11bSopenharmony_ci 588beacf11bSopenharmony_ci/* 589beacf11bSopenharmony_ci * Video Class-specific Endpoint Descriptor Subtypes, UVC spec. 1.5, section A.7 590beacf11bSopenharmony_ci */ 591beacf11bSopenharmony_ci 592beacf11bSopenharmony_ci#define UVC_EP_UNDEFINED 0x0 593beacf11bSopenharmony_ci#define UVC_EP_GENERAL 0x1 594beacf11bSopenharmony_ci#define UVC_EP_ENDPOINT 0x2 595beacf11bSopenharmony_ci#define UVC_EP_INTERRUPT 0x3 596beacf11bSopenharmony_ci 597beacf11bSopenharmony_ci/* 598beacf11bSopenharmony_ci * VideoStreaming Interface Control Selectors, UVC spec. 1.5, section A.9.8 599beacf11bSopenharmony_ci */ 600beacf11bSopenharmony_ci 601beacf11bSopenharmony_ci#define USB_UVC_VS_CONTROL_UNDEFINED 0x00 602beacf11bSopenharmony_ci#define USB_UVC_VS_PROBE_CONTROL 0x01 603beacf11bSopenharmony_ci#define USB_UVC_VS_COMMIT_CONTROL 0x02 604beacf11bSopenharmony_ci#define USB_UVC_VS_STILL_PROBE_CONTROL 0x03 605beacf11bSopenharmony_ci#define USB_UVC_VS_STILL_COMMIT_CONTROL 0x04 606beacf11bSopenharmony_ci#define USB_UVC_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 607beacf11bSopenharmony_ci#define USB_UVC_VS_STREAM_ERROR_CODE_CONTROL 0x06 608beacf11bSopenharmony_ci#define USB_UVC_VS_GENERATE_KEY_FRAME_CONTROL 0x07 609beacf11bSopenharmony_ci#define USB_UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 610beacf11bSopenharmony_ci#define USB_UVC_VS_SYNCH_DELAY_CONTROL 0x09 611beacf11bSopenharmony_ci 612beacf11bSopenharmony_ci#define USB_UVC_INTERFACE_CONTROL 0x0 613beacf11bSopenharmony_ci#define USB_UVC_INTERFACE_STREAMING 0x1 614beacf11bSopenharmony_ci 615beacf11bSopenharmony_ci/* 616beacf11bSopenharmony_ci * Video Class-specific Request Codes, UVC spec. 1.5, section A.8 617beacf11bSopenharmony_ci */ 618beacf11bSopenharmony_ci 619beacf11bSopenharmony_ci#define UVC_RC_SETCUR 0x01 620beacf11bSopenharmony_ci#define UVC_RC_SETCUR_ALL 0x11 621beacf11bSopenharmony_ci#define UVC_RC_GETCUR 0x81 622beacf11bSopenharmony_ci#define UVC_RC_GETMIN 0x82 623beacf11bSopenharmony_ci#define UVC_RC_GETMAX 0x83 624beacf11bSopenharmony_ci#define UVC_RC_GETRES 0x84 625beacf11bSopenharmony_ci#define UVC_RC_GETLEN 0x85 626beacf11bSopenharmony_ci#define UVC_RC_GETINFO 0x86 627beacf11bSopenharmony_ci#define UVC_RC_GETDEF 0x87 628beacf11bSopenharmony_ci#define UVC_RC_GETCUR_ALL 0x91 629beacf11bSopenharmony_ci#define UVC_RC_GETMIN_ALL 0x92 630beacf11bSopenharmony_ci#define UVC_RC_GETMAX_ALL 0x93 631beacf11bSopenharmony_ci#define UVC_RC_GETRES_ALL 0x94 632beacf11bSopenharmony_ci#define UVC_RC_GETDEF_ALL 0x95 633beacf11bSopenharmony_ci 634beacf11bSopenharmony_ci/* 635beacf11bSopenharmony_ci * Video probe and commit controls, UVC spec. 1.1, section 4.3.1.1 636beacf11bSopenharmony_ci */ 637beacf11bSopenharmony_ci 638beacf11bSopenharmony_cistruct uvc_probe_commit_control1_1 639beacf11bSopenharmony_ci{ 640beacf11bSopenharmony_ci u16 bmHint; 641beacf11bSopenharmony_ci u8 bFormatIndex; 642beacf11bSopenharmony_ci u8 bFrameIndex; 643beacf11bSopenharmony_ci u32 dwFrameInterval; 644beacf11bSopenharmony_ci u16 wKeyFrameRate; 645beacf11bSopenharmony_ci u16 wPFrameRate; 646beacf11bSopenharmony_ci u16 wCompQuality; 647beacf11bSopenharmony_ci u16 wCompWindowSize; 648beacf11bSopenharmony_ci u16 wDelay; 649beacf11bSopenharmony_ci u32 dwMaxVideoFrameSize; 650beacf11bSopenharmony_ci u32 dwMaxPayloadTransferSize; 651beacf11bSopenharmony_ci u32 dwClockFrequency; 652beacf11bSopenharmony_ci u8 bmFramingInfo; 653beacf11bSopenharmony_ci u8 bPreferedVersion; 654beacf11bSopenharmony_ci u8 bMinVersion; 655beacf11bSopenharmony_ci u8 bMaxVersion; 656beacf11bSopenharmony_ci} __attribute__ ((packed)); 657beacf11bSopenharmony_ci 658beacf11bSopenharmony_ci/* 659beacf11bSopenharmony_ci * Video probe and commit controls, UVC spec. 1.5, section 4.3.1.1 660beacf11bSopenharmony_ci */ 661beacf11bSopenharmony_ci 662beacf11bSopenharmony_cistruct uvc_probe_commit_control1_5 663beacf11bSopenharmony_ci{ 664beacf11bSopenharmony_ci u16 bmHint; 665beacf11bSopenharmony_ci u8 bFormatIndex; 666beacf11bSopenharmony_ci u8 bFrameIndex; 667beacf11bSopenharmony_ci u32 dwFrameInterval; 668beacf11bSopenharmony_ci u16 wKeyFrameRate; 669beacf11bSopenharmony_ci u16 wPFrameRate; 670beacf11bSopenharmony_ci u16 wCompQuality; 671beacf11bSopenharmony_ci u16 wCompWindowSize; 672beacf11bSopenharmony_ci u16 wDelay; 673beacf11bSopenharmony_ci u32 dwMaxVideoFrameSize; 674beacf11bSopenharmony_ci u32 dwMaxPayloadTransferSize; 675beacf11bSopenharmony_ci u32 dwClockFrequency; 676beacf11bSopenharmony_ci u8 bmFramingInfo; 677beacf11bSopenharmony_ci u8 bPreferedVersion; 678beacf11bSopenharmony_ci u8 bMinVersion; 679beacf11bSopenharmony_ci u8 bMaxVersion; 680beacf11bSopenharmony_ci u8 bUsage; 681beacf11bSopenharmony_ci u8 bBitDepthLuma; 682beacf11bSopenharmony_ci u8 bmSettings; 683beacf11bSopenharmony_ci u8 bMaxNumberOfRefFramesPlus1; 684beacf11bSopenharmony_ci u8 bmRateControlModes; 685beacf11bSopenharmony_ci u8 bmLayoutPerStream; 686beacf11bSopenharmony_ci} __attribute__((packed)); 687beacf11bSopenharmony_ci 688beacf11bSopenharmony_cienum stream_status 689beacf11bSopenharmony_ci{ 690beacf11bSopenharmony_ci STREAM_ON = 0, 691beacf11bSopenharmony_ci STREAM_OFF, 692beacf11bSopenharmony_ci}; 693beacf11bSopenharmony_ci 694beacf11bSopenharmony_cistruct uvc_probe_t 695beacf11bSopenharmony_ci{ 696beacf11bSopenharmony_ci u8 set; 697beacf11bSopenharmony_ci u8 get; 698beacf11bSopenharmony_ci u8 max; 699beacf11bSopenharmony_ci u8 min; 700beacf11bSopenharmony_ci}; 701beacf11bSopenharmony_ci 702beacf11bSopenharmony_cistruct uvc_dev_s 703beacf11bSopenharmony_ci{ 704beacf11bSopenharmony_ci uint8_t *descs; /* pointer to the concatenated descriptors */ 705beacf11bSopenharmony_ci uint32_t desl; /* length of all descriptors */ 706beacf11bSopenharmony_ci uint32_t control; /* Class-specific control request value */ 707beacf11bSopenharmony_ci struct uvc_probe_commit_control1_1 probe; /* probe control structure */ 708beacf11bSopenharmony_ci struct uvc_probe_commit_control1_1 commit; /* probe control structure */ 709beacf11bSopenharmony_ci struct usbdev_ep_s *ctrl_ep; /* control transfer endpoint */ 710beacf11bSopenharmony_ci struct usbdev_ep_s *vs_ep; /* Video Streaming endpoint */ 711beacf11bSopenharmony_ci 712beacf11bSopenharmony_ci struct usbdev_req_s ctrlreq; /* control request */ 713beacf11bSopenharmony_ci struct usbdev_req_s vc_ctrlreq; /* Video Control request */ 714beacf11bSopenharmony_ci struct usbdev_req_s streamreq; /* Video Streaming request */ 715beacf11bSopenharmony_ci uint32_t dyn_fc; /* dynamic format change, non-zero indicates that format change occurred */ 716beacf11bSopenharmony_ci 717beacf11bSopenharmony_ci uint8_t *stream_buf; /* Buffer used for stream transfer */ 718beacf11bSopenharmony_ci 719beacf11bSopenharmony_ci struct uvc_uncompressed_frame_descriptor3 *frame_desc; /* pointer to the frame descriptor */ 720beacf11bSopenharmony_ci int connected; /* Connected to USB host? */ 721beacf11bSopenharmony_ci 722beacf11bSopenharmony_ci void *uvc_handle; /* UVC transmission handle */ 723beacf11bSopenharmony_ci uint32_t fid; /* Frame Identifier */ 724beacf11bSopenharmony_ci uint64_t last_complete; /* Last Video stream complete tick */ 725beacf11bSopenharmony_ci 726beacf11bSopenharmony_ci struct uvc_format_info format_info; 727beacf11bSopenharmony_ci uint32_t bulk_size; 728beacf11bSopenharmony_ci uint32_t imgsize; 729beacf11bSopenharmony_ci struct uvc_probe_t probe_status; 730beacf11bSopenharmony_ci 731beacf11bSopenharmony_ci uint32_t zero_packet_flag; 732beacf11bSopenharmony_ci enum stream_status transfer_status; 733beacf11bSopenharmony_ci spinlock_t lock; 734beacf11bSopenharmony_ci uint32_t event_id; 735beacf11bSopenharmony_ci uint32_t unit_id; 736beacf11bSopenharmony_ci}; 737beacf11bSopenharmony_ci 738beacf11bSopenharmony_cistruct uvc_driver_s 739beacf11bSopenharmony_ci{ 740beacf11bSopenharmony_ci struct usbdevclass_driver_s drvr; 741beacf11bSopenharmony_ci struct uvc_dev_s *dev; 742beacf11bSopenharmony_ci}; 743beacf11bSopenharmony_ci 744beacf11bSopenharmony_ci/* private UVC device driver instance structure */ 745beacf11bSopenharmony_ci 746beacf11bSopenharmony_cistruct uvc_softc 747beacf11bSopenharmony_ci{ 748beacf11bSopenharmony_ci struct uvc_dev_s dev; 749beacf11bSopenharmony_ci struct uvc_driver_s drvr; 750beacf11bSopenharmony_ci} __attribute__((packed)); 751beacf11bSopenharmony_ci 752beacf11bSopenharmony_ci/* 753beacf11bSopenharmony_ci * structure used when transimitting video stream with nocp method 754beacf11bSopenharmony_ci */ 755beacf11bSopenharmony_ci 756beacf11bSopenharmony_cistruct nocp_reserve 757beacf11bSopenharmony_ci{ 758beacf11bSopenharmony_ci uint8_t *res; /* pointer to the reserved data */ 759beacf11bSopenharmony_ci uint32_t resl; /* reserved data length */ 760beacf11bSopenharmony_ci#define NOCP_RESERVE_MAX 0x4 761beacf11bSopenharmony_ci uint8_t res_buf[NOCP_RESERVE_MAX]; /* reserved data */ 762beacf11bSopenharmony_ci}; 763beacf11bSopenharmony_ci 764beacf11bSopenharmony_ci/* 765beacf11bSopenharmony_ci * UVC handle structure, includes various related information to 766beacf11bSopenharmony_ci * transmit video stream over USB protocol. 767beacf11bSopenharmony_ci */ 768beacf11bSopenharmony_ci 769beacf11bSopenharmony_cistruct uvc_handle 770beacf11bSopenharmony_ci{ 771beacf11bSopenharmony_ci u32 vid_w; /* Video Frame width in pixels */ 772beacf11bSopenharmony_ci u32 vid_h; /* Video Frame height in pixels */ 773beacf11bSopenharmony_ci u32 vid_f; /* Video Frame format */ 774beacf11bSopenharmony_ci u32 state; /* state of UVC handle */ 775beacf11bSopenharmony_ci uvc_continue_func copy_func; /* video transmission video frame copy function */ 776beacf11bSopenharmony_ci uvc_continue_func next_func; /* video transmission video next frame function */ 777beacf11bSopenharmony_ci void *_priv; /* video transmission private pointer */ 778beacf11bSopenharmony_ci 779beacf11bSopenharmony_ci u32 retransmission; 780beacf11bSopenharmony_ci u32 used; 781beacf11bSopenharmony_ci u32 offset; 782beacf11bSopenharmony_ci 783beacf11bSopenharmony_ci u32 frame_off; /* transfer offset in a single video frame */ 784beacf11bSopenharmony_ci struct uvc_transfer_data tdata; /* transfer data information */ 785beacf11bSopenharmony_ci struct nocp_reserve reserve; /* reserve structure */ 786beacf11bSopenharmony_ci struct uvc_dev_s *fuvc; /* pointer to the UVC function structure */ 787beacf11bSopenharmony_ci}; 788beacf11bSopenharmony_ci 789beacf11bSopenharmony_ci/* 790beacf11bSopenharmony_ci * function to check whether we've already connected to USB host, 791beacf11bSopenharmony_ci * return zero if not yet connected, non-zero if connected. 792beacf11bSopenharmony_ci */ 793beacf11bSopenharmony_ci 794beacf11bSopenharmony_ciextern int fuvc_host_connected(struct uvc_dev_s *fuvc); 795beacf11bSopenharmony_ci 796beacf11bSopenharmony_ci/* 797beacf11bSopenharmony_ci * function to initiate video stream transmission 798beacf11bSopenharmony_ci */ 799beacf11bSopenharmony_ci 800beacf11bSopenharmony_ciextern int fuvc_transfer_initiate(struct uvc_dev_s *fuvc); 801beacf11bSopenharmony_ci 802beacf11bSopenharmony_cistruct uvc_isoc_transfer 803beacf11bSopenharmony_ci{ 804beacf11bSopenharmony_ci uint8_t *data; /* where the data should be copied or stored */ 805beacf11bSopenharmony_ci u32 length; /* length of data expected or valid */ 806beacf11bSopenharmony_ci u32 reserved; /* how much data should be reserved */ 807beacf11bSopenharmony_ci u32 res_next; /* how much data expected to be reserved upon next request */ 808beacf11bSopenharmony_ci u32 last; /* last piece of data in the frame? */ 809beacf11bSopenharmony_ci}; 810beacf11bSopenharmony_ci 811beacf11bSopenharmony_ci/* 812beacf11bSopenharmony_ci * transfer continue function, defined in `usbd_video.c 813beacf11bSopenharmony_ci */ 814beacf11bSopenharmony_ci 815beacf11bSopenharmony_ciextern int uvc_continue_transfer(struct uvc_dev_s *fuvc, struct uvc_isoc_transfer *tran); 816beacf11bSopenharmony_ciextern void uvc_delete_mutex(void); 817beacf11bSopenharmony_ciextern bool uvc_is_running(void); 818beacf11bSopenharmony_ciextern int uvc_stream_init(struct uvc_dev_s *fuvc); 819beacf11bSopenharmony_ci 820beacf11bSopenharmony_cistruct fuvc_frame_info 821beacf11bSopenharmony_ci{ 822beacf11bSopenharmony_ci uint32_t width; 823beacf11bSopenharmony_ci uint32_t height; 824beacf11bSopenharmony_ci uint32_t intervals[8]; 825beacf11bSopenharmony_ci}; 826beacf11bSopenharmony_ci 827beacf11bSopenharmony_cistruct fuvc_format_info 828beacf11bSopenharmony_ci{ 829beacf11bSopenharmony_ci uint32_t fcc; 830beacf11bSopenharmony_ci const struct fuvc_frame_info *frames; 831beacf11bSopenharmony_ci}; 832beacf11bSopenharmony_ci 833beacf11bSopenharmony_ciextern void fuvc_frame_descriptors_get(struct fuvc_format_info *format_info); 834beacf11bSopenharmony_ciextern void fuvc_fill_streaming_control(struct uvc_dev_s *fuvc, struct uvc_probe_commit_control1_1 *ctrl, 835beacf11bSopenharmony_ci int iframe, int iformat); 836beacf11bSopenharmony_ciextern void usbdev_uvc_initialize_sub(struct composite_devdesc_s *dev, int ifnobase, int minor); 837beacf11bSopenharmony_ciextern void usbclass_uvc_stream_ep_reset(struct uvc_dev_s *fuvc); 838beacf11bSopenharmony_ciextern struct usb_endpoint_descriptor g_fuvc_hs_bulk_streaming_ep; 839beacf11bSopenharmony_ciextern struct usb_endpoint_descriptor g_fuvc_hs_isoc_streaming_ep; 840beacf11bSopenharmony_ciextern volatile unsigned int g_start_transfer; 841beacf11bSopenharmony_ciextern EVENT_CB_S g_uvc_event; 842beacf11bSopenharmony_ciextern void uvc_unit_control_register(void); 843beacf11bSopenharmony_ci 844beacf11bSopenharmony_ci#ifdef __cplusplus 845beacf11bSopenharmony_ci#if __cplusplus 846beacf11bSopenharmony_ci} 847beacf11bSopenharmony_ci#endif /* __cplusplus */ 848beacf11bSopenharmony_ci#endif /* __cplusplus */ 849beacf11bSopenharmony_ci 850beacf11bSopenharmony_ci#endif 851