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