- patches.arch/x86_mce_intel_decode_physical_address.patch:
[linux-flexiantxendom0-3.2.10.git] / drivers / usb / gadget / f_uvc.h
1 /*
2  *      f_uvc.h  --  USB Video Class Gadget driver
3  *
4  *      Copyright (C) 2009-2010
5  *          Laurent Pinchart (laurent.pinchart@ideasonboard.com)
6  *
7  *      This program is free software; you can redistribute it and/or modify
8  *      it under the terms of the GNU General Public License as published by
9  *      the Free Software Foundation; either version 2 of the License, or
10  *      (at your option) any later version.
11  *
12  */
13
14 #ifndef _F_UVC_H_
15 #define _F_UVC_H_
16
17 #include <linux/usb/composite.h>
18
19 #define USB_CLASS_VIDEO_CONTROL         1
20 #define USB_CLASS_VIDEO_STREAMING       2
21
22 struct uvc_descriptor_header {
23         __u8  bLength;
24         __u8  bDescriptorType;
25         __u8  bDescriptorSubType;
26 } __attribute__ ((packed));
27
28 struct uvc_header_descriptor {
29         __u8  bLength;
30         __u8  bDescriptorType;
31         __u8  bDescriptorSubType;
32         __u16 bcdUVC;
33         __u16 wTotalLength;
34         __u32 dwClockFrequency;
35         __u8  bInCollection;
36         __u8  baInterfaceNr[];
37 } __attribute__((__packed__));
38
39 #define UVC_HEADER_DESCRIPTOR(n)        uvc_header_descriptor_##n
40
41 #define DECLARE_UVC_HEADER_DESCRIPTOR(n)                        \
42 struct UVC_HEADER_DESCRIPTOR(n) {                               \
43         __u8  bLength;                                          \
44         __u8  bDescriptorType;                                  \
45         __u8  bDescriptorSubType;                               \
46         __u16 bcdUVC;                                           \
47         __u16 wTotalLength;                                     \
48         __u32 dwClockFrequency;                                 \
49         __u8  bInCollection;                                    \
50         __u8  baInterfaceNr[n];                                 \
51 } __attribute__ ((packed))
52
53 struct uvc_input_terminal_descriptor {
54         __u8  bLength;
55         __u8  bDescriptorType;
56         __u8  bDescriptorSubType;
57         __u8  bTerminalID;
58         __u16 wTerminalType;
59         __u8  bAssocTerminal;
60         __u8  iTerminal;
61 } __attribute__((__packed__));
62
63 struct uvc_output_terminal_descriptor {
64         __u8  bLength;
65         __u8  bDescriptorType;
66         __u8  bDescriptorSubType;
67         __u8  bTerminalID;
68         __u16 wTerminalType;
69         __u8  bAssocTerminal;
70         __u8  bSourceID;
71         __u8  iTerminal;
72 } __attribute__((__packed__));
73
74 struct uvc_camera_terminal_descriptor {
75         __u8  bLength;
76         __u8  bDescriptorType;
77         __u8  bDescriptorSubType;
78         __u8  bTerminalID;
79         __u16 wTerminalType;
80         __u8  bAssocTerminal;
81         __u8  iTerminal;
82         __u16 wObjectiveFocalLengthMin;
83         __u16 wObjectiveFocalLengthMax;
84         __u16 wOcularFocalLength;
85         __u8  bControlSize;
86         __u8  bmControls[3];
87 } __attribute__((__packed__));
88
89 struct uvc_selector_unit_descriptor {
90         __u8  bLength;
91         __u8  bDescriptorType;
92         __u8  bDescriptorSubType;
93         __u8  bUnitID;
94         __u8  bNrInPins;
95         __u8  baSourceID[0];
96         __u8  iSelector;
97 } __attribute__((__packed__));
98
99 #define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
100         uvc_selector_unit_descriptor_##n
101
102 #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n)                 \
103 struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) {                        \
104         __u8  bLength;                                          \
105         __u8  bDescriptorType;                                  \
106         __u8  bDescriptorSubType;                               \
107         __u8  bUnitID;                                          \
108         __u8  bNrInPins;                                        \
109         __u8  baSourceID[n];                                    \
110         __u8  iSelector;                                        \
111 } __attribute__ ((packed))
112
113 struct uvc_processing_unit_descriptor {
114         __u8  bLength;
115         __u8  bDescriptorType;
116         __u8  bDescriptorSubType;
117         __u8  bUnitID;
118         __u8  bSourceID;
119         __u16 wMaxMultiplier;
120         __u8  bControlSize;
121         __u8  bmControls[2];
122         __u8  iProcessing;
123 } __attribute__((__packed__));
124
125 struct uvc_extension_unit_descriptor {
126         __u8  bLength;
127         __u8  bDescriptorType;
128         __u8  bDescriptorSubType;
129         __u8  bUnitID;
130         __u8  guidExtensionCode[16];
131         __u8  bNumControls;
132         __u8  bNrInPins;
133         __u8  baSourceID[0];
134         __u8  bControlSize;
135         __u8  bmControls[0];
136         __u8  iExtension;
137 } __attribute__((__packed__));
138
139 #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
140         uvc_extension_unit_descriptor_##p_##n
141
142 #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n)             \
143 struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) {                    \
144         __u8  bLength;                                          \
145         __u8  bDescriptorType;                                  \
146         __u8  bDescriptorSubType;                               \
147         __u8  bUnitID;                                          \
148         __u8  guidExtensionCode[16];                            \
149         __u8  bNumControls;                                     \
150         __u8  bNrInPins;                                        \
151         __u8  baSourceID[p];                                    \
152         __u8  bControlSize;                                     \
153         __u8  bmControls[n];                                    \
154         __u8  iExtension;                                       \
155 } __attribute__ ((packed))
156
157 struct uvc_control_endpoint_descriptor {
158         __u8  bLength;
159         __u8  bDescriptorType;
160         __u8  bDescriptorSubType;
161         __u16 wMaxTransferSize;
162 } __attribute__((__packed__));
163
164 #define UVC_DT_HEADER                           1
165 #define UVC_DT_INPUT_TERMINAL                   2
166 #define UVC_DT_OUTPUT_TERMINAL                  3
167 #define UVC_DT_SELECTOR_UNIT                    4
168 #define UVC_DT_PROCESSING_UNIT                  5
169 #define UVC_DT_EXTENSION_UNIT                   6
170
171 #define UVC_DT_HEADER_SIZE(n)                   (12+(n))
172 #define UVC_DT_INPUT_TERMINAL_SIZE              8
173 #define UVC_DT_OUTPUT_TERMINAL_SIZE             9
174 #define UVC_DT_CAMERA_TERMINAL_SIZE(n)          (15+(n))
175 #define UVC_DT_SELECTOR_UNIT_SIZE(n)            (6+(n))
176 #define UVC_DT_PROCESSING_UNIT_SIZE(n)          (9+(n))
177 #define UVC_DT_EXTENSION_UNIT_SIZE(p,n)         (24+(p)+(n))
178 #define UVC_DT_CONTROL_ENDPOINT_SIZE            5
179
180 struct uvc_input_header_descriptor {
181         __u8  bLength;
182         __u8  bDescriptorType;
183         __u8  bDescriptorSubType;
184         __u8  bNumFormats;
185         __u16 wTotalLength;
186         __u8  bEndpointAddress;
187         __u8  bmInfo;
188         __u8  bTerminalLink;
189         __u8  bStillCaptureMethod;
190         __u8  bTriggerSupport;
191         __u8  bTriggerUsage;
192         __u8  bControlSize;
193         __u8  bmaControls[];
194 } __attribute__((__packed__));
195
196 #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
197         uvc_input_header_descriptor_##n_##p
198
199 #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p)               \
200 struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) {                      \
201         __u8  bLength;                                          \
202         __u8  bDescriptorType;                                  \
203         __u8  bDescriptorSubType;                               \
204         __u8  bNumFormats;                                      \
205         __u16 wTotalLength;                                     \
206         __u8  bEndpointAddress;                                 \
207         __u8  bmInfo;                                           \
208         __u8  bTerminalLink;                                    \
209         __u8  bStillCaptureMethod;                              \
210         __u8  bTriggerSupport;                                  \
211         __u8  bTriggerUsage;                                    \
212         __u8  bControlSize;                                     \
213         __u8  bmaControls[p][n];                                \
214 } __attribute__ ((packed))
215
216 struct uvc_output_header_descriptor {
217         __u8  bLength;
218         __u8  bDescriptorType;
219         __u8  bDescriptorSubType;
220         __u8  bNumFormats;
221         __u16 wTotalLength;
222         __u8  bEndpointAddress;
223         __u8  bTerminalLink;
224         __u8  bControlSize;
225         __u8  bmaControls[];
226 } __attribute__((__packed__));
227
228 #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
229         uvc_output_header_descriptor_##n_##p
230
231 #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p)              \
232 struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) {                     \
233         __u8  bLength;                                          \
234         __u8  bDescriptorType;                                  \
235         __u8  bDescriptorSubType;                               \
236         __u8  bNumFormats;                                      \
237         __u16 wTotalLength;                                     \
238         __u8  bEndpointAddress;                                 \
239         __u8  bTerminalLink;                                    \
240         __u8  bControlSize;                                     \
241         __u8  bmaControls[p][n];                                \
242 } __attribute__ ((packed))
243
244 struct uvc_format_uncompressed {
245         __u8  bLength;
246         __u8  bDescriptorType;
247         __u8  bDescriptorSubType;
248         __u8  bFormatIndex;
249         __u8  bNumFrameDescriptors;
250         __u8  guidFormat[16];
251         __u8  bBitsPerPixel;
252         __u8  bDefaultFrameIndex;
253         __u8  bAspectRatioX;
254         __u8  bAspectRatioY;
255         __u8  bmInterfaceFlags;
256         __u8  bCopyProtect;
257 } __attribute__((__packed__));
258
259 struct uvc_frame_uncompressed {
260         __u8  bLength;
261         __u8  bDescriptorType;
262         __u8  bDescriptorSubType;
263         __u8  bFrameIndex;
264         __u8  bmCapabilities;
265         __u16 wWidth;
266         __u16 wHeight;
267         __u32 dwMinBitRate;
268         __u32 dwMaxBitRate;
269         __u32 dwMaxVideoFrameBufferSize;
270         __u32 dwDefaultFrameInterval;
271         __u8  bFrameIntervalType;
272         __u32 dwFrameInterval[];
273 } __attribute__((__packed__));
274
275 #define UVC_FRAME_UNCOMPRESSED(n) \
276         uvc_frame_uncompressed_##n
277
278 #define DECLARE_UVC_FRAME_UNCOMPRESSED(n)                       \
279 struct UVC_FRAME_UNCOMPRESSED(n) {                              \
280         __u8  bLength;                                          \
281         __u8  bDescriptorType;                                  \
282         __u8  bDescriptorSubType;                               \
283         __u8  bFrameIndex;                                      \
284         __u8  bmCapabilities;                                   \
285         __u16 wWidth;                                           \
286         __u16 wHeight;                                          \
287         __u32 dwMinBitRate;                                     \
288         __u32 dwMaxBitRate;                                     \
289         __u32 dwMaxVideoFrameBufferSize;                        \
290         __u32 dwDefaultFrameInterval;                           \
291         __u8  bFrameIntervalType;                               \
292         __u32 dwFrameInterval[n];                               \
293 } __attribute__ ((packed))
294
295 struct uvc_format_mjpeg {
296         __u8  bLength;
297         __u8  bDescriptorType;
298         __u8  bDescriptorSubType;
299         __u8  bFormatIndex;
300         __u8  bNumFrameDescriptors;
301         __u8  bmFlags;
302         __u8  bDefaultFrameIndex;
303         __u8  bAspectRatioX;
304         __u8  bAspectRatioY;
305         __u8  bmInterfaceFlags;
306         __u8  bCopyProtect;
307 } __attribute__((__packed__));
308
309 struct uvc_frame_mjpeg {
310         __u8  bLength;
311         __u8  bDescriptorType;
312         __u8  bDescriptorSubType;
313         __u8  bFrameIndex;
314         __u8  bmCapabilities;
315         __u16 wWidth;
316         __u16 wHeight;
317         __u32 dwMinBitRate;
318         __u32 dwMaxBitRate;
319         __u32 dwMaxVideoFrameBufferSize;
320         __u32 dwDefaultFrameInterval;
321         __u8  bFrameIntervalType;
322         __u32 dwFrameInterval[];
323 } __attribute__((__packed__));
324
325 #define UVC_FRAME_MJPEG(n) \
326         uvc_frame_mjpeg_##n
327
328 #define DECLARE_UVC_FRAME_MJPEG(n)                              \
329 struct UVC_FRAME_MJPEG(n) {                                     \
330         __u8  bLength;                                          \
331         __u8  bDescriptorType;                                  \
332         __u8  bDescriptorSubType;                               \
333         __u8  bFrameIndex;                                      \
334         __u8  bmCapabilities;                                   \
335         __u16 wWidth;                                           \
336         __u16 wHeight;                                          \
337         __u32 dwMinBitRate;                                     \
338         __u32 dwMaxBitRate;                                     \
339         __u32 dwMaxVideoFrameBufferSize;                        \
340         __u32 dwDefaultFrameInterval;                           \
341         __u8  bFrameIntervalType;                               \
342         __u32 dwFrameInterval[n];                               \
343 } __attribute__ ((packed))
344
345 struct uvc_color_matching_descriptor {
346         __u8  bLength;
347         __u8  bDescriptorType;
348         __u8  bDescriptorSubType;
349         __u8  bColorPrimaries;
350         __u8  bTransferCharacteristics;
351         __u8  bMatrixCoefficients;
352 } __attribute__((__packed__));
353
354 #define UVC_DT_INPUT_HEADER                     1
355 #define UVC_DT_OUTPUT_HEADER                    2
356 #define UVC_DT_FORMAT_UNCOMPRESSED              4
357 #define UVC_DT_FRAME_UNCOMPRESSED               5
358 #define UVC_DT_FORMAT_MJPEG                     6
359 #define UVC_DT_FRAME_MJPEG                      7
360 #define UVC_DT_COLOR_MATCHING                   13
361
362 #define UVC_DT_INPUT_HEADER_SIZE(n, p)          (13+(n*p))
363 #define UVC_DT_OUTPUT_HEADER_SIZE(n, p)         (9+(n*p))
364 #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE         27
365 #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n)       (26+4*(n))
366 #define UVC_DT_FORMAT_MJPEG_SIZE                11
367 #define UVC_DT_FRAME_MJPEG_SIZE(n)              (26+4*(n))
368 #define UVC_DT_COLOR_MATCHING_SIZE              6
369
370 extern int uvc_bind_config(struct usb_configuration *c,
371                            const struct uvc_descriptor_header * const *control,
372                            const struct uvc_descriptor_header * const *fs_streaming,
373                            const struct uvc_descriptor_header * const *hs_streaming);
374
375 #endif /* _F_UVC_H_ */
376