usbvc.h revision 7492:2387323b838f
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _SYS_USB_USBVC_H
27#define	_SYS_USB_USBVC_H
28
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34/* Video interface class code */
35#define	CC_VIDEO			0x0e
36
37/* Video interface subclass code */
38#define	SC_UNDEFINED			0x00
39#define	SC_VIDEOCONTROL 		0x01
40#define	SC_VIDEOSTREAMING		0x02
41#define	SC_VIDEO_INTERFACE_COLLECTION	0x03
42
43#define	PC_PROTOCOL_UNDEFINED		0x00
44
45/* Video class specific interface descriptor types */
46#define	CS_UNDEFINED			0x20
47#define	CS_DEVICE			0x21
48#define	CS_CONFIGURATION		0x22
49#define	CS_STRING			0x23
50#define	CS_INTERFACE			0x24
51#define	CS_ENDPOINT			0x25
52
53/* Video class specific, video control interface descriptor subtypes */
54#define	VC_DESCRIPTOR_UNDEFINED 	0x00
55#define	VC_HEADER			0x01
56#define	VC_INPUT_TERMINAL		0x02
57#define	VC_OUTPUT_TERMINAL		0x03
58#define	VC_SELECTOR_UNIT		0x04
59#define	VC_PROCESSING_UNIT		0x05
60#define	VC_EXTENSION_UNIT		0x06
61
62/* Video class specific, video stream interface descriptor subtypes */
63#define	VS_UNDEFINED			0x00
64#define	VS_INPUT_HEADER 		0x01
65#define	VS_OUTPUT_HEADER		0x02
66#define	VS_STILL_IMAGE_FRAME		0x03
67#define	VS_FORMAT_UNCOMPRESSED		0x04
68#define	VS_FRAME_UNCOMPRESSED		0x05
69#define	VS_FORMAT_MJPEG 		0x06
70#define	VS_FRAME_MJPEG			0x07
71#define	VS_FORMAT_MPEG2TS		0x0a
72#define	VS_FORMAT_DV			0x0c
73#define	VS_COLORFORMAT			0x0d
74#define	VS_FORMAT_FRAME_BASED		0x10
75#define	VS_FRAME_FRAME_BASED		0x11
76#define	VS_FORMAT_STREAM_BASED		0x12
77
78/* Endpoint type */
79#define	EP_UNDEFINED			0x00
80#define	EP_GENERAL			0x01
81#define	EP_ENDPOINT			0x02
82#define	EP_INTERRUPT			0x03
83
84/* Request codes, bRequest */
85#define	RC_UNDEFINED			0x00
86#define	SET_CUR 			0x01
87#define	GET_CUR 			0x81
88#define	GET_MIN 			0x82
89#define	GET_MAX 			0x83
90#define	GET_RES 			0x84
91#define	GET_LEN 			0x85
92#define	GET_INFO			0x86
93#define	GET_DEF 			0x87
94
95/* Control types of Video Control interface */
96#define	VC_CONTROL_UNDEFINED		0x00
97#define	VC_VIDEO_POWER_MODE_CONTROL	0x01
98#define	VC_REQUEST_ERROR_CODE_CONTROL	0x02
99
100/* Terminal controls */
101#define	TE_CONTROL_UNDEFINED		0x00
102
103/* Selector Unit controls */
104#define	SU_CONTROL_UNDEFINED		0x00
105#define	SU_INPUT_SELECT_CONTROL 	0x01
106
107/* Camera Terminal controls */
108#define	CT_CONTROL_UNDEFINED				0x00
109#define	CT_SCANNING_MODE_CONTROL			0x01
110#define	CT_AE_MODE_CONTROL				0x02
111#define	CT_AE_PRIORITY_CONTROL				0x03
112#define	CT_EXPOSURE_TIME_ABSOLUTE_CONTROL		0x04
113#define	CT_EXPOSURE_TIME_RELATIVE_CONTROL		0x05
114#define	CT_FOCUS_ABSOLUTE_CONTROL			0x06
115#define	CT_FOCUS_RELATIVE_CONTROL			0x07
116#define	CT_FOCUS_AUTO_CONTROL				0x08
117#define	CT_IRIS_ABSOLUTE_CONTROL			0x09
118#define	CT_IRIS_RELATIVE_CONTROL			0x0a
119#define	CT_ZOOM_ABSOLUTE_CONTROL			0x0b
120#define	CT_ZOOM_RELATIVE_CONTROL			0x0c
121#define	CT_PANTILT_ABSOLUTE_CONTROL			0x0d
122#define	CT_PANTILT_RELATIVE_CONTROL			0x0e
123#define	CT_ROLL_ABSOLUTE_CONTROL			0x0f
124#define	CT_ROLL_RELATIVE_CONTROL			0x10
125#define	CT_PRIVACY_CONTROL				0x11
126
127/* Processing Unit controls */
128#define	PU_CONTROL_UNDEFINED				0x00
129#define	PU_BACKLIGHT_COMPENSATION_CONTROL		0x01
130#define	PU_BRIGHTNESS_CONTROL				0x02
131#define	PU_CONTRAST_CONTROL				0x03
132#define	PU_GAIN_CONTROL 				0x04
133#define	PU_POWER_LINE_FREQUENCY_CONTROL 		0x05
134#define	PU_HUE_CONTROL					0x06
135#define	PU_SATURATION_CONTROL				0x07
136#define	PU_SHARPNESS_CONTROL				0x08
137#define	PU_GAMMA_CONTROL				0x09
138#define	PU_WHITE_BALANCE_TEMPERATURE_CONTROL		0x0a
139#define	PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL	0x0b
140#define	PU_WHITE_BALANCE_COMPONENT_CONTROL		0x0c
141#define	PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 	0x0d
142#define	PU_DIGITAL_MULTIPLIER_CONTROL			0x0e
143#define	PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL		0x0f
144#define	PU_HUE_AUTO_CONTROL				0x10
145#define	PU_ANALOG_VIDEO_STANDARD_CONTROL		0x11
146#define	PU_ANALOG_LOCK_STATUS_CONTROL			0x12
147
148/* VideoStreaming interface controls, wValue */
149#define	VS_CONTROL_UNDEFINED		0x00
150#define	VS_PROBE_CONTROL		0x01
151#define	VS_COMMIT_CONTROL		0x02
152#define	VS_STILL_PROBE_CONTROL		0x03
153#define	VS_STILL_COMMIT_CONTROL 	0x04
154#define	VS_STILL_IMAGE_TRIGGER_CONTROL	0x05
155#define	VS_STREAM_ERROR_CODE_CONTROL	0x06
156#define	VS_GENERATE_KEY_FRAME_CONTROL	0x07
157#define	VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
158#define	VS_SYNC_DELAY_CONTROL		0x09
159
160/* bmRequestType */
161#define	USBVC_SET_IF	0x21;
162#define	USBVC_GET_IF	0xA1;
163#define	USBVC_SET_EP	0x22;
164#define	USBVC_GET_EP	0xA2;
165
166/* Terminal types */
167#define	TT_VENDOR_SPECIFIC		0x0100
168#define	TT_STREAMING			0x0101
169
170/* Input Terminal types */
171#define	ITT_VENDOR_SPECIFIC		0x0200
172#define	ITT_CAMERA			0x0201
173#define	ITT_MEDIA_TRANSPORT_INPUT	0x0202
174
175/* Output Terminal types */
176#define	OTT_VENDOR_SPECIFIC		0x0300
177#define	OTT_DISPLAY			0x0301
178#define	OTT_MEDIA_TRANSPORT_OUTPUT	0x0302
179
180/* External terminal types */
181#define	EXTERNAL_VENDOR_SPECIFIC	0x0400
182#define	COMPOSITE_CONNECTOR		0x0401
183#define	SVIDEO_CONNECTOR		0x0402
184#define	COMPONENT_CONNECTOR		0x0403
185
186/*
187 * usb video class descriptors
188 */
189
190/* usb video class, video control interface, header descriptor */
191typedef struct usbvc_vc_header_descr {
192	uint8_t	bLength;
193	uint8_t	bDescriptorType;
194	uint8_t	bDescriptorSubtype;
195	uint8_t	bcdUVC[2];
196	uint8_t	wTotalLength[2];
197	uint8_t	dwClockFrequency[4];
198
199	/* Number of stream interfaces belong to this VC interface */
200	uint8_t	bInCollection;
201} usbvc_vc_header_descr_t;
202
203typedef struct usbvc_vc_header {
204	usbvc_vc_header_descr_t	*descr;
205
206	/* there might be multiple stream interface numbers */
207	uint8_t			*baInterfaceNr;
208} usbvc_vc_header_t;
209
210/* unit descriptor for all the three kinds of units */
211typedef struct usbvc_unit_descr {
212	uint8_t bLength;
213	uint8_t bDescriptorType;
214	uint8_t bDescriptorSubType;
215	uint8_t bUnitID;
216
217	union {
218		struct {
219			uint8_t bSourceID;
220			uint8_t wMaxMultiplier[2];
221			uint8_t bControlSize;
222		} processing;
223
224		struct {
225			uint8_t	bNrInPins;
226		} selector;
227
228		struct {
229			uint8_t	guidExtensionCode[16];
230			uint8_t	bNumControls;
231			uint8_t	bNrInPins;
232		} extension;
233	} unit;
234} usbvc_unit_descr_t;
235
236typedef struct usbvc_units {
237	/* Point to cvs_buf, for most elements of unit descriptor */
238	usbvc_unit_descr_t *descr;
239
240	uint8_t		*bmControls;	/* for processing or extention unit */
241	uint8_t		*baSourceID;	/* for selector or extention unit */
242	uint8_t		iSelector;	/* for selector  unit */
243	uint8_t		iProcessing;	/* for processing  unit */
244	uint8_t		bmVideoStandards; /* for processing unit */
245	uint8_t		bControlSize;	/* for extention unit */
246	uint8_t		iExtension;	/* for extention unit */
247	list_node_t	unit_node;
248} usbvc_units_t;
249
250/* Terminal descriptor for all the three kinds of video terminals */
251typedef struct		usbvc_term_descr {
252	uint8_t		bLength;
253	uint8_t		bDescriptorType;
254	uint8_t		bDescriptorSubType;
255	uint8_t		bTerminalID;
256	uint16_t	wTerminalType;
257	uint8_t		AssocTerminal;
258
259	union {
260		struct {
261			uint8_t iTerminal;
262		} input;
263
264		struct {
265			uint8_t	bSourceID;
266			uint8_t	iTerminal;
267		} output;
268
269		struct {
270			uint8_t		iTerminal;
271			uint16_t	wObjectiveFocalLengthMin;
272			uint16_t	wObjectiveFocalLengthMax;
273			uint16_t	wOcularFocalLength;
274			uint8_t		bControlSize;
275		} camera;
276	}term;
277} usbvc_term_descr_t;
278
279typedef struct usbvc_terms {
280	usbvc_term_descr_t	*descr;	/* interfaces for this cfg */
281
282	/* for input or output terminals, excluding camera terminals */
283	uint8_t			*bSpecific;
284
285	uint8_t			*bmControls;  /* for camera terminals only */
286	list_node_t		term_node;
287} usbvc_terms_t;
288
289/*
290 * Stream interface descriptors
291 */
292
293/* input header descriptor */
294typedef struct usbvc_input_header_descr {
295	uint8_t		bLength;
296	uint8_t		bDescriptorType;
297	uint8_t		bDescriptorSubType;
298	uint8_t		bNumFormats;
299	uint16_t	wTotalLength;
300	uint8_t		bEndpointAddress;
301	uint8_t		bmInfo;
302	uint8_t		bTerminalLink;
303	uint8_t		bStillCaptureMethod;
304	uint8_t		bTriggerSupport;
305	uint8_t		bTriggerUsage;
306	uint8_t		bControlSize;
307} usbvc_input_header_descr_t;
308
309/* UVC Spec: only one input header in one stream interface */
310typedef struct usbvc_input_header {
311	usbvc_input_header_descr_t	*descr;
312	uint8_t				*bmaControls;
313} usbvc_input_header_t;
314
315/* Do not support output video device at present */
316typedef struct usbvc_output_header_descr {
317	uint8_t		bLength;
318	uint8_t		bDescriptorType;
319	uint8_t		bDescriptorSubType;
320	uint8_t		bNumFormats;
321	uint16_t	wTotalLength;
322	uint8_t		bEndpointAddress;
323	uint8_t		bTerminalLink;
324	uint8_t		bControlSize;
325} usbvc_output_header_descr_t;
326
327typedef struct usbvc_output_header {
328	usbvc_output_header_descr_t	*descr;
329	uint8_t				*bmaControls;
330} usbvc_output_header_t;
331
332/*
333 * Except bDescriptorSubType value, MJPEG and uncompressed frame descriptor are
334 * all the same. So share one structure.
335 */
336typedef struct usbvc_frame_descr {
337	uint8_t bLength;
338	uint8_t bDescriptorType;
339	uint8_t bDescriptorSubType;
340	uint8_t bFrameIndex;
341	uint8_t bmCapabilities;
342	uint8_t wWidth[2];
343	uint8_t wHeight[2];
344	uint8_t dwMinBitRate[4];
345	uint8_t dwMaxBitRate[4];
346	uint8_t dwMaxVideoFrameBufferSize[4];
347	uint8_t dwDefaultFrameInterval[4];
348	uint8_t bFrameIntervalType;
349} usbvc_frame_descr_t;
350
351/*
352 * There may be several frame descriptors immediately follow a format
353 * descriptor.
354 */
355typedef struct usbvc_frames {
356	usbvc_frame_descr_t *descr;
357	uint32_t dwMinFrameInterval;	/* for continuous frame intervals */
358	uint32_t dwMaxFrameInterval;	/* for continuous frame intervals */
359	uint32_t dwFrameIntervalStep;	/* for continuous frame intervals */
360	uint8_t *dwFrameInterval;	/* for discrete frame intervals */
361} usbvc_frames_t;
362
363/* The first several fixed length fields of still image frame descriptor */
364typedef struct usbvc_still_image_frame_descr {
365	uint8_t	bLength;
366	uint8_t	bDescriptorType;
367	uint8_t	bDescriptorSubType;
368	uint8_t	bEndpointAddress;
369	uint8_t	bNumImageSizePatterns;
370} usbvc_still_image_frame_descr_t;
371
372/*
373 * Width and Hight of the still image.
374 * There might be multiple such value pairs in one still image frame descr.
375 */
376typedef struct width_height {
377	uint16_t wWidth;
378	uint16_t wHeight;
379} width_height_t;
380
381/*
382 * The whole still image frame descriptor.
383 * UVC Spec: only one still image descriptor for each format group.
384 */
385typedef struct usbvc_still_image_frame {
386	usbvc_still_image_frame_descr_t	*descr;
387	width_height_t			*width_height;
388	uint8_t				bNumCompressionPattern;
389	uint8_t				*bCompression;
390} usbvc_still_image_frame_t;
391
392/*
393 * All fields of this descr are fixed length.
394 * UVC Spec: only one color_matching_descr is allowed for a given format.
395 */
396typedef struct usbvc_color_matching_descr {
397	uint8_t	bLength;
398	uint8_t	bDescriptorType;
399	uint8_t	bDescriptorSubtype;
400	uint8_t	bColorPrimaries;
401	uint8_t	bTransferCharacteristics;
402	uint8_t	bMatrixCoefficients;
403} usbvc_color_matching_descr_t;
404
405/* Mjpeg and uncompressed format descriptor */
406typedef struct usbvc_format_descr {
407	uint8_t	bLength;
408	uint8_t	bDescriptorType;
409	uint8_t	bDescriptorSubType;
410	uint8_t	bFormatIndex;
411	uint8_t	bNumFrameDescriptors;
412	union {
413		struct {
414			uint8_t	bmFlags;
415			uint8_t	bDefaultFrameIndex;
416			uint8_t	bAspectRatioX;
417			uint8_t	bAspectRatioY;
418			uint8_t	bmInterlaceFlags;
419			uint8_t	bCopyProtect;
420		} mjpeg;
421
422		struct {
423			uint8_t	guidFormat[16];
424			uint8_t	bBitsPerPixel;
425			uint8_t	bDefaultFrameIndex;
426			uint8_t	bAspectRatioX;
427			uint8_t	bAspectRatioY;
428			uint8_t	bmInterlaceFlags;
429			uint8_t	bCopyProtect;
430		} uncompressed;
431	}fmt;
432} usbvc_format_descr_t;
433
434/*
435 *  usb video class requests
436 */
437typedef struct usbvc_vs_probe_commit {
438	uint8_t	bmHint[2];
439	uint8_t	bFormatIndex;
440	uint8_t	bFrameIndex;
441	uint8_t	dwFrameInterval[4];
442	uint8_t	wKeyFrameRate[2];
443	uint8_t	wPFrameRate[2];
444	uint8_t	wCompQuality[2];
445	uint8_t	wCompWindowSize[2];
446	uint8_t	wDelay[2];
447	uint8_t	dwMaxVideoFrameSize[4];
448	uint8_t	dwMaxPayloadTransferSize[4];
449	uint8_t	wClockFrequency[4];
450	uint8_t	bmFramingInfo;
451	uint8_t	bPreferedVersion;
452	uint8_t	bMinVersion;
453	uint8_t	bMaxVersion;
454} usbvc_vs_probe_commit_t;
455
456/* Table 2-1 of a sub video class spec: "uncompressed payload spec" */
457#define	USBVC_FORMAT_GUID_YUY2	{0x59, 0x55, 0x59, 0x32, 0x00, 0x00, 0x10, \
458				0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, \
459				0x9b, 0x71}
460#define	USBVC_FORMAT_GUID_NV12	{0x4e, 0x56, 0x31, 0x32, 0x00, 0x00, 0x10, \
461				0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, \
462				0x9b, 0x71}
463
464/* Stream frame's flag bits */
465#define	USBVC_STREAM_EOF	(1 << 1)
466#define	USBVC_STREAM_FID	(1 << 0)
467
468#ifdef __cplusplus
469}
470#endif
471
472#endif /* _SYS_USB_USBVC_H */
473