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