[haiku-commits] haiku: hrev53615 - headers/os/drivers/usb

  • From: Adrien Destugues <pulkomandy@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 5 Dec 2019 05:55:33 -0500 (EST)

hrev53615 adds 1 changeset to branch 'master'
old head: 09b40d1634f72ff933450f9c2f1d7c722b744cd9
new head: f57d609e9b5632bb75cc20337df099f337acb08f
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=f57d609e9b56+%5E09b40d1634f7

----------------------------------------------------------------------------

f57d609e9b56: USB_Video.h: add more definitions from the spec.
  
  fixes #5940
  
  Change-Id: Idb9ae8dfdaa9f0fab43be3767bf97e1c87245940
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/1022
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

                                           [ brjhaiku <brjhaiku@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev53615
Commit:      f57d609e9b5632bb75cc20337df099f337acb08f
URL:         https://git.haiku-os.org/haiku/commit/?id=f57d609e9b56
Author:      brjhaiku <brjhaiku@xxxxxxxxx>
Date:        Sat Feb  9 21:38:31 2019 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec  5 10:55:29 2019 UTC

Ticket:      https://dev.haiku-os.org/ticket/5940

----------------------------------------------------------------------------

1 file changed, 644 insertions(+), 11 deletions(-)
headers/os/drivers/usb/USB_video.h | 655 ++++++++++++++++++++++++++++++++-

----------------------------------------------------------------------------

diff --git a/headers/os/drivers/usb/USB_video.h 
b/headers/os/drivers/usb/USB_video.h
index 2c3fb00f6e..cca3119145 100644
--- a/headers/os/drivers/usb/USB_video.h
+++ b/headers/os/drivers/usb/USB_video.h
@@ -11,16 +11,21 @@
 // Based on specification for UVC version 1.5.
 
 
+#include <BeBuild.h>   // for _PACKED definition
+#include <lendian_bitfield.h>
 #include <SupportDefs.h>
 
 
-#define USB_VIDEO_DEVICE_CLASS                         0x0E
+enum { // Video Interface Class Code
+       USB_VIDEO_INTERFACE_VIDEO_CLASS         = 0x0e
+};
+
 
 enum { // Video Interface Subclasses
        USB_VIDEO_INTERFACE_UNDEFINED_SUBCLASS          = 0x00,
        USB_VIDEO_INTERFACE_VIDEOCONTROL_SUBCLASS       = 0x01,
-       USB_VIDEO_INTERFACE_VIDEOSTREAMING_SUBCLASS,
-       USB_VIDEO_INTERFACE_COLLECTION_SUBCLASS,
+       USB_VIDEO_INTERFACE_VIDEOSTREAMING_SUBCLASS = 0x02,
+       USB_VIDEO_INTERFACE_COLLECTION_SUBCLASS         = 0x03,
 };
 
 
@@ -63,7 +68,7 @@ enum { // Video Class-Specific VideoStreaming Interface 
descriptor subtypes
        USB_VIDEO_VS_FRAME_MJPEG                                        = 0x07,
        USB_VIDEO_VS_FORMAT_MPEG2TS                                     = 0x0a,
        USB_VIDEO_VS_FORMAT_DV                                          = 0x0c,
-       USB_VIDEO_VS_COLORFORMAT                                        = 0x0d,
+       USB_VIDDE_VS_COLORFORMAT                                        = 0x0d,
        USB_VIDEO_VS_FORMAT_FRAME_BASED                         = 0x10,
        USB_VIDEO_VS_FRAME_FRAME_BASED                          = 0x11,
        USB_VIDEO_VS_FORMAT_STREAM_BASED                        = 0x12,
@@ -76,6 +81,20 @@ enum { // Video Class-Specific VideoStreaming Interface 
descriptor subtypes
 };
 
 
+enum { // Video Streaming Interface Control Selectors
+       USB_VIDEO_VS_CONTROL_UNDEFINED                          = 0x00,
+       USB_VIDEO_VS_PROBE_CONTROL                                      = 0x01,
+       USB_VIDEO_VS_COMMIT_CONTROL                                     = 0x02,
+       USB_VIDEO_VS_STILL_PROBE_CONTROL                        = 0x03,
+       USB_VIDEO_VS_STILL_COMMIT_CONTROL                       = 0x04,
+       USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL        = 0x05,
+       USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL          = 0x06,
+       USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL         = 0x07,
+       USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL       = 0x08,
+       USB_VIDEO_VS_SYNCH_DELAY_CONTROL                        = 0x09
+};
+
+
 enum {
        // USB Terminal Types
        USB_VIDEO_VENDOR_USB_IO                                         = 0x100,
@@ -96,7 +115,7 @@ enum {
 };
 
 
-enum {
+enum { // Video Class-Specific Endpoint Descriptor Subtypes
        EP_SUBTYPE_UNDEFINED                                            = 0x00,
        EP_SUBTYPE_GENERAL                                                      
= 0x01,
        EP_SUBTYPE_ENDPOINT                                                     
= 0x02,
@@ -104,8 +123,189 @@ enum {
 };
 
 
-// Class Specific Video Control Interface Header
-// 1.5: Table 3-3 p.48
+enum { // Terminal Control Selectors
+       USB_VIDEO_TE_CONTROL_UNDEFINED                          = 0x00
+};
+
+
+enum { // Selector Unit Control Selectors
+       USB_VIDEO_SU_CONTROL_UNDEFINED                          = 0x00,
+       USB_VIDEO_SU_INPUT_SELECT_CONTROL                       = 0x01
+};
+
+
+enum { // Video Class-Specific Request Codes
+       USB_VIDEO_RC_UNDEFINED                                          = 0x00,
+       USB_VIDEO_RC_SET_CUR                                            = 0x01,
+       USB_VIDEO_RC_GET_CUR                                            = 0x81,
+       USB_VIDEO_RC_GET_MIN                                            = 0x82,
+       USB_VIDEO_RC_GET_MAX                                            = 0x83,
+       USB_VIDEO_RC_GET_RES                                            = 0x84,
+       USB_VIDEO_RC_GET_LEN                                            = 0x85,
+       USB_VIDEO_RC_GET_INFO                                           = 0x86,
+       USB_VIDEO_RC_GET_DEF                                            = 0x87
+};
+
+
+enum { // Camera Terminal Control Selectors
+       USB_VIDEO_CT_CONTROL_UNDEFINED                          = 0x00,
+       USB_VIDEO_CT_SCANNING_MODE_CONTROL                      = 0x01,
+       USB_VIDEO_CT_AE_MODE_CONTROL                            = 0x02,
+       USB_VIDEO_CT_AE_PRIORITY_CONTROL                        = 0x03,
+       USB_VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL = 0x04,
+       USB_VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL = 0x05,
+       USB_VIDEO_CT_FOCUS_ABSOLUTE_CONTROL             = 0x06,
+       USB_VIDEO_CT_FOCUS_RELATIVE_CONTROL             = 0x07,
+       USB_VIDEO_CT_FOCUS_AUTO_CONTROL                         = 0x08,
+       USB_VIDEO_CT_IRIS_ABSOLUTE_CONTROL                      = 0x09,
+       USB_VIDEO_CT_IRIS_RELATIVE_CONTROL                      = 0x0A,
+       USB_VIDEO_CT_ZOOM_ABSOLUTE_CONTROL                      = 0x0B,
+       USB_VIDEO_CT_ZOOM_RELATIVE_CONTROL                      = 0x0C,
+       USB_VIDEO_CT_PANTILT_ABSOLUTE_CONTROL           = 0x0D,
+       USB_VIDEO_CT_PANTILT_RELATIVE_CONTROL           = 0x0E,
+       USB_VIDEO_CT_ROLL_ABSOLUTE_CONTROL                      = 0x0F,
+       USB_VIDEO_CT_ROLL_RELATIVE_CONTROL                      = 0x10,
+       USB_VIDEO_CT_PRIVACY_CONTROL                            = 0x11
+};
+
+
+enum { // Processing Unit Control Selectors
+       USB_VIDEO_PU_CONTROL_UNDEFINED                                          
        = 0x00,
+       USB_VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL                     = 0x01, 
+       USB_VIDEO_PU_BRIGHTNESS_CONTROL                                         
        = 0x02,
+       USB_VIDEO_PU_CONTRAST_CONTROL                                           
        = 0x03,
+       USB_VIDEO_PU_GAIN_CONTROL                                               
                = 0x04,
+       USB_VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL                               
= 0x05,
+       USB_VIDEO_PU_HUE_CONTROL                                                
                = 0x06,
+       USB_VIDEO_PU_SATURATION_CONTROL                                         
        = 0x07, 
+       USB_VIDEO_PU_SHARPNESS_CONTROL                                          
        = 0x08,
+       USB_VIDEO_PU_GAMMA_CONTROL                                              
                = 0x09,
+       USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL                  = 0x0A,
+       USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL     = 0x0B,
+       USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_COMPONENT_CONTROL        = 0x0C,
+       USB_VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL               = 0x0D,
+       USB_VIDEO_PU_DIGITAL_MULTIPLEXER_CONTROL                                
= 0x0E,
+       USB_VIDEO_PU_DIGITAL_MULTIPLEXER_LIMIT_CONTROL                  = 0x0F,
+       USB_VIDEO_PU_HUE_AUTO_CONTROL                                           
        = 0x10,
+       USB_VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL                              
= 0x11,
+       USB_VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL                                 
= 0x12
+};
+
+
+enum { // Extension Unit Control Selectors
+       USB_VIDEO_XU_CONTROL_UNDEFINED = 0x00
+};
+
+
+typedef struct {
+       /* The orignator bitfield of the status_type struct can have the
+       following values: 0 = reserved, 1 = VideoControl interface,
+       2 = VideoStreaming interface. */
+       struct status_type {
+               LBITFIELD8_2 (
+                               originator: 4,
+                               reserved: 4
+                            );
+       } status_type;
+       /* The second common status_packet_format field orignator includes ID of
+        * the Terminal, Unit or Interface that reports the interrupt. */
+       uint8 originator;
+       union {
+               struct videocontrol_interface_as_orignator {
+                       /* If the orginator bitfield value is 1 (VideoControl 
interface)
+                        * then third field of the status_packet_format is 
event field that
+                        * includes value 0x00 for control change. Other values
+                        * (0x01 - 0xFF) are reserved. */
+                       uint8 event;
+                       /* The fourth field selector reports the Control 
Selector of the
+                        * control that have issued the interrupt. */
+                       uint8 selector;
+                       /* The fifth field attribute specifies the type of 
control change:
+                        * 0x00 is Control value change, 0x01 is Control info 
change,
+                        * 0x02 is Control failure change
+                        * and values 0x03 - 0xFF are reserved. */
+                       uint8 attribute;
+                       /* After that can be several value fields that can 
include values
+                        * 0x00, 0x01 and 0x02. */
+                       uint8 value[0];
+               } videocontrol_interface_as_orignator;
+               struct videostreaming_interface_as_originator {
+                       /* If the originator bitfield value is 2 
(VideoStreaming interface)
+                        * then third field of the status_packet_format is 
event field that
+                        * can have value 0x00 (Button Press)
+                        * or values 0x01 - 0xFF (Stream errors). */
+                       uint8 event;
+                       /* If event value is 0x00 (Button Press) there is only 
one value
+                        * field. It can include values 0x00 (Button released)
+                        * or 0x01 (Button pressed). If event value was some 
Stream error
+                        * value, then there can be several value fields. */
+                       uint8* value;
+               } videostreaming_interface_as_originator;
+       } originators;
+} _PACKED usb_video_status_packet_format;
+
+
+typedef struct {
+       uint8 length; // 9 bytes
+       uint8 descriptor_type;
+       uint8 interface_number;
+       uint8 alternate_setting;
+       uint8 num_endpoints;
+       uint8 interface_class;
+       uint8 interface_sub_class;
+       uint8 interface_protocol;
+               // Not used. Must be set to USB_VIDEO_PC_PROTOCOL_UNDEFINED
+       uint8 interface;
+} _PACKED usb_video_standard_vc_interface_descriptor;
+
+
+typedef struct {
+       uint8 length; // 8 bytes
+       uint8 descriptor_type;
+       uint8 first_interface;
+       uint8 interface_count;
+       uint8 function_class;
+       uint8 function_sub_class;
+       uint8 function_protocol;
+               // Not used. Must be set to USB_VIDEO_PC_PROTOCOL_UNDEFINED
+       uint8 function;
+} _PACKED usb_video_standard_video_interface_collection_iad;
+
+
+typedef struct {
+       uint8 length; // 6 bytes + nr_in_pins
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 unit_id;
+       uint8 nr_in_pins;
+       uint8* source_id;
+       uint8 selector;
+} _PACKED usb_video_selector_unit_descriptor;
+
+
+typedef struct {
+       uint8 header_length;
+       struct header_info {
+               LBITFIELD8_8 (
+                               frame_id: 1,
+                               end_of_frame: 1,
+                               presentation_time: 1,
+                               source_clock_reference: 1,
+                               reserved: 1,
+                               still_image: 1,
+                               error: 1,
+                               end_of_header: 1
+                            );
+       } _header_info;
+} _PACKED usb_video_payload_header_format;
+
+
+typedef struct {
+       uint32 presentation_time;
+       uint8 source_clock[6];
+} _PACKED usb_video_payload_header_format_extended_fields;
+
+
 typedef struct {
        uint8   length;
        uint8   descriptor_type;                // USB_AUDIO_CS_INTERFACE
@@ -118,6 +318,80 @@ typedef struct {
 } _PACKED usb_videocontrol_header_descriptor;
 
 
+typedef struct {
+       uint8 length; // 24 bytes + nr_in_pins + control_size
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 unit_id;
+       uint8 guid_extension_code[16];
+       uint8 num_controls;
+       uint8 nr_in_pins;
+       uint8 source_id[0];
+#if 0
+       // Remaining part of the structure can't be encoded because source_id 
has
+       // a variable size
+       uint8 control_size;
+       struct controls {
+               LBITFIELD8_8 (
+                               vendor_specific0 : 1,
+                               vendor_specific1 : 1,
+                               vendor_specific2 : 1,
+                               vendor_specific3 : 1,
+                               vendor_specific4 : 1,
+                               vendor_specific5 : 1,
+                               vendor_specific6 : 1,
+                               vendor_specific7 : 1
+                            );
+       } * _controls;
+       uint8 extension;
+#endif
+} _PACKED usb_video_extension_unit_descriptor;
+
+
+typedef struct {
+       uint8 length; // 7 bytes
+       uint8 descriptor_type;
+       struct end_point_address {
+               LBITFIELD8_3 (
+                               endpoint_number: 4, // Determined by the 
designer
+                               reserved: 3, // Reserved. Set to zero.
+                               direction: 1 // 0 = OUT, 1 = IN
+                            );
+       } _end_point_address;
+       struct attributes {
+               LBITFIELD8_3 (
+                               transfer_type: 2, // Must be set to 11 
(Interrupt)
+                               synchronization_type: 2, // Must be set to 00 
(None)
+                               reserved: 4 // Reserved. Must be set to zero
+                            );
+       } _attributes;
+       uint16 max_packet_size;
+       uint8 interval;
+} _PACKED usb_video_vc_interrupt_endpoint_descriptor;
+
+
+typedef struct {
+       uint8 length; // 9 bytes
+       uint8 descriptor_type;
+       uint8 interface_number;
+       uint8 alternate_setting;
+       uint8 num_endpoints;
+       uint8 interface_class;
+       uint8 interface_sub_class;
+       uint8 interface_protocol;
+               // Not used. Must be set to USB_VIDEO_PC_PROTOCOL_UNDEFINED
+       uint8 interface;
+} _PACKED usb_video_standard_vs_interface_descriptor;
+
+
+typedef struct {
+       uint8 length; // 5 bytes
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint16 max_transfer_size;
+} _PACKED usb_video_class_specific_vc_interrupt_endpoint_descriptor;
+
+
 // Input Terminal Descriptor
 // 1.5: Table 3-4, page 50
 typedef struct {
@@ -141,6 +415,51 @@ typedef struct {
 } _PACKED usb_video_input_terminal_descriptor;
 
 
+typedef struct {
+       uint8 length; // 13 bytes + (num_formats*control_size)
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 num_formats;
+       uint16 total_length;
+       struct endpoint_address {
+               LBITFIELD8_3 (
+                               endpoint_number: 4, // Determined by the 
designer
+                               reserved: 3, // Set to zero.
+                               direction: 1 // 0 = OUT, 1 = IN
+                            );
+       }  _endpoint_address;
+       struct info {
+               LBITFIELD8_2 (
+                               dynamic_format_change_support: 1,
+                               reserved: 7 // Set to zero.
+                            );
+       } _info;
+       uint8 terminal_link;
+       uint8 still_capture_method;
+       uint8 trigger_support;
+       uint8 trigger_usage;
+       uint8 control_size;
+       struct ma_controls {
+               // For four first bits, a bit set to 1 indicates that the named 
field
+               // is supported by the Video Probe and Commit Control when
+               // its format_index is 1:
+               LBITFIELD8_7 (
+                               key_frame_rate: 1,
+                               p_frame_rate: 1,
+                               comp_quality: 1,
+                               comp_window_size: 1,
+                               // For the next two bits, a bit set to 1 
indicates that the named
+                               // control is supported by the device when
+                               // format_index is 1:
+                               generate_key_frame: 1,
+                               update_frame_segment: 1,
+                               reserved: 2 // (control_size*8-1): Set to zero.
+                            );
+       } * _ma_controls;
+} _PACKED usb_video_class_specific_vs_interface_input_header_descriptor;
+
+
+
 // Output terminal descriptor
 // 1.5: Table 3-5, page 51
 typedef struct {
@@ -155,6 +474,36 @@ typedef struct {
 } _PACKED usb_video_output_terminal_descriptor;
 
 
+typedef struct {
+       uint8 length; // 9 + (num_formats*control_size)
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 num_formats;
+       uint16 total_length;
+       struct endpoint_address {
+               LBITFIELD8_3 (
+                               endpoint_number: 4, // Determined by the 
designer
+                               reserved: 3, // Set to zero.
+                               direction: 1 // 0 = OUT
+                            );
+       } _endpoint_address;
+       uint8 terminal_link;
+       uint8 control_size;
+       struct ma_controls {
+               // For four first bits, a bit set to 1 indicates that the named 
field
+               // is supported by the Video Probe and Commit Control when its
+               // format_index is 1:
+               LBITFIELD8_5 (
+                               key_frame_rate: 1,
+                               p_frame_rate: 1,
+                               comp_quality: 1,
+                               comp_window_size: 1,
+                               reserved: 4 // (control_size*8-1) Set to zero.
+                            );
+       } * _ma_controls;
+} _PACKED usb_video_class_specific_vs_interface_output_header_descriptor;
+
+
 // Processing unit descriptor
 // 1.5: Table 3-8, page 54
 typedef struct {
@@ -165,13 +514,164 @@ typedef struct {
        uint8   source_id;
        uint16  max_multiplier;
        uint8   control_size;
-       uint8   controls[3];
-       uint8   processing;
-       uint8   video_standards;
+#if B_HOST_IS_LENDIAN
+       struct controls {
+               struct control_a {
+                       LBITFIELD16 (
+                                       brightness: 1,
+                                       contrast: 1,
+                                       hue: 1,
+                                       saturation: 1,
+                                       sharpness: 1,
+                                       gamma: 1,
+                                       white_balance_temperature: 1,
+                                       white_balance_component: 1,
+                                       backlight_compensation: 1,
+                                       gain: 1,
+                                       power_line_frequency: 1,
+                                       hue_auto: 1,
+                                       white_balance_temperature_auto: 1,
+                                       white_balance_component_auto: 1,
+                                       digital_multiplier: 1,
+                                       digital_multiplier_limit: 1
+                                   );
+               } _control_a;
+               struct control_b {
+                       LBITFIELD3 (
+                                       analog_video_standard: 1,
+                                       analog_video_lock_status: 1,
+                                       reserved: 14 // Reserved. Se to zero.
+                                  );
+               } _control_b;
+       } _controls;
+#else
+       struct controls {
+               struct control_b {
+                       LBITFIELD3 (
+                                       analog_video_standard: 1,
+                                       analog_video_lock_status: 1,
+                                       reserved: 14 // Reserved. Se to zero.
+                                  );
+               } _control_b;
+               struct control_a {
+                       LBITFIELD16 (
+                                       brightness: 1,
+                                       contrast: 1,
+                                       hue: 1,
+                                       saturation: 1,
+                                       sharpness: 1,
+                                       gamma: 1,
+                                       white_balance_temperature: 1,
+                                       white_balance_component: 1,
+                                       backlight_compensation: 1,
+                                       gain: 1,
+                                       power_line_frequency: 1,
+                                       hue_auto: 1,
+                                       white_balance_temperature_auto: 1,
+                                       white_balance_component_auto: 1,
+                                       digital_multiplier: 1,
+                                       digital_multiplier_limit: 1
+                                   );
+               } _control_a;
+       } _controls;
+#endif
+       uint8 processing;
+       struct video_standards {
+               LBITFIELD8_8 (
+                               none: 1,
+                               ntsc_525_60: 1,
+                               pal_625_50: 1,
+                               secam_625_50: 1,
+                               ntsc_625_50: 1,
+                               pal_525_60: 1,
+                               reserved6: 1, // Reserved. Set to zero.
+                               reserved7: 1  // Reserved. Set to zero.
+                            );
+       } _video_standards;
 } _PACKED usb_video_processing_unit_descriptor;
 
 
-struct usb_video_frame_descriptor {
+typedef struct {
+       uint8 length; // 15 + control_size bytes
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 terminal_id;
+       uint16 terminal_type;
+       uint8 assoc_terminal;
+       uint8 terminal;
+       uint16 objective_focal_length_min;
+       uint16 objective_focal_length_max;
+       uint16 ocular_focal_length;
+       uint8 control_size;
+#if B_HOST_IS_LENDIAN
+       struct controls {
+               struct control_a {
+                       LBITFIELD16 (
+                                       scanning_mode: 1,
+                                       auto_exposure_mode: 1,
+                                       auto_exposure_priority: 1,
+                                       exposure_time_absolute: 1,
+                                       exposure_time_relative: 1,
+                                       focus_absolute: 1,
+                                       focus_relative: 1,
+                                       iris_absolute: 1,
+                                       iris_relative: 1,
+                                       zoom_absolute: 1,
+                                       zoom_relative: 1,
+                                       pan_tilt_absolute: 1,
+                                       pan_tilt_relative: 1,
+                                       roll_absolute: 1,
+                                       roll_relative: 1,
+                                       reserved15: 1
+                                   );
+               } _control_a;
+               struct control_b {
+                       LBITFIELD4 (
+                                       reserved16: 1,
+                                       focus_auto: 1,
+                                       privacy: 1,
+                                       // D19...(control_size*8-1): Reserved, 
set to zero.
+                                       reserved: 13
+                                  );
+               } _contorl_b;
+       } _controls;
+#else
+       struct controls {
+               struct control_b {
+                       LBITFIELD4 (
+                                       reserved16: 1,
+                                       focus_auto: 1,
+                                       privacy: 1,
+                                       // D19...(control_size*8-1): Reserved, 
set to zero.
+                                       reserved: 13
+                                  );
+               } _contorl_b;
+               struct control_a {
+                       LBITFIELD16 (
+                                       scanning_mode: 1,
+                                       auto_exposure_mode: 1,
+                                       auto_exposure_priority: 1,
+                                       exposure_time_absolute: 1,
+                                       exposure_time_relative: 1,
+                                       focus_absolute: 1,
+                                       focus_relative: 1,
+                                       iris_absolute: 1,
+                                       iris_relative: 1,
+                                       zoom_absolute: 1,
+                                       zoom_relative: 1,
+                                       pan_tilt_absolute: 1,
+                                       pan_tilt_relative: 1,
+                                       roll_absolute: 1,
+                                       roll_relative: 1,
+                                       reserved15: 1
+                                   );
+               } _control_a;
+       } _controls;
+#endif
+} _PACKED usb_video_camera_terminal_descriptor;
+
+
+typedef struct {
        uint8   length;
        uint8   descriptor_type;
        uint8   descriptor_subtype;
@@ -195,4 +695,137 @@ struct usb_video_frame_descriptor {
 } _PACKED;
 
 
+typedef struct {
+       uint8 length; // 34 bytes
+       struct hint {
+               LBITFIELD5 (
+                               frame_interval: 1,
+                               key_frame_rate: 1,
+                               p_frame_rate: 1,
+                               comp_quality: 1,
+                               reserved: 12
+                          );
+       } _hint;
+       uint8 format_index;
+       uint8 frame_index;
+       uint32 frame_interval;
+       uint16 key_frame_rate;
+       uint16 p_frame_rate;
+       uint16 comp_quality;
+       uint16 comp_window_size;
+       uint16 delay;
+       uint32 max_video_frame_size;
+       uint32 max_payload_transfer_size;
+       uint32 clock_frequency;
+       struct framing_info {
+               LBITFIELD8_3 (
+                               is_frame_id_required: 1,
+                               is_end_of_frame_present: 1,
+                               reserved: 6
+                            );
+       } _framing_info;
+       uint8 prefered_version;
+       uint8 min_version;
+       uint8 max_version;
+} _PACKED usb_video_video_probe_and_commit_controls;
+
+
+typedef struct {
+       uint8 length; // 11 bytes
+       uint8 frame_index;
+       uint8 compression_index;
+       uint32 max_video_frame_size;
+       uint32 max_payload_transfer_size;
+} _PACKED usb_video_video_still_probe_control_and_still_commit_control;
+
+
+typedef struct {
+       // 10 bytes + (4 * num_image_size_patterns) - 4 + 
num_compression_pattern
+       uint8 length;
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 endpoint_address;
+       uint8 num_image_size_patterns;
+       struct pattern_size {
+               uint16 width;
+               uint16 height;
+       } * _pattern_size;
+       uint8 num_compression_pattern;
+       uint8* compression;
+} _PACKED usb_video_still_image_frame_descriptor;
+
+
+typedef struct {
+       uint8 length; // 7 bytes
+       struct endpoint_address {
+               LBITFIELD8_3 (
+                               endpoint_number: 4, // Determined by the 
designer
+                               reserved: 3,
+                               direction: 1 // Set to 1 = IN endpoint)
+                       );
+       } _endpoint_address;
+       struct attributes {
+               LBITFIELD8_2 (
+                               transfer_type: 2, // Set to 10 = Bulk
+                               reserved: 6
+                            );
+       } _attributes;
+       uint16 max_packet_size;
+       uint8 interval;
+} _PACKED usb_video_standard_vs_bulk_still_image_data_endpoint_descriptor;
+
+
+typedef struct {
+       uint8 length; // 6 bytes
+       uint8 descriptor_type;
+       uint8 descriptor_sub_type;
+       uint8 color_primaries;
+       uint8 transfer_characteristics;
+       uint8 matrix_coefficients;
+} _PACKED usb_video_color_matching_descriptor;
+
+
+typedef struct {
+       uint8 length; // 7 bytes
+       uint8 descriptor_type;
+       struct endpoint_address {
+               LBITFIELD8_3 (
+                               endpoint_number: 4, // Determined by the 
designer
+                               reserved: 3, // Reset to zero.
+                               direction: 1 // 0 = OUT endpoint, 1 = IN 
endpoint
+                            );
+       } _endpoint_address;
+       struct attributes {
+               LBITFIELD8_3 (
+                               transfer_type: 2, // 01 = isochronous
+                               synchronization_type: 2, // 01 = asynchronous
+                               reserved: 4
+                            );
+       } _attributes;
+       uint16 max_packet_size;
+       uint8 interval;
+} _PACKED usb_video_std_vs_isochronous_video_data_endpoint_descriptor;
+
+
+typedef struct {
+       uint8 length; // 7 bytes
+       uint8 descriptor_type;
+       struct endpoint_address {
+               LBITFIELD8_3 (
+                               endpoint_number: 4, // Determined by the 
designer
+                               reserved: 3, // Reset to zero.
+                               direction: 1 // 0 = OUT endpoint
+                            );
+       } _endpoint_address;
+       struct attributes {
+               LBITFIELD8_2 (
+                               transfer_type: 2, // Set to 10 = Bulk
+                               reserved: 6
+                            );
+       } _attributes;
+       uint16 max_packet_size;
+       uint8 interval;
+} _PACKED usb_video_standard_vs_bulk_video_data_endpoint_descriptor;
+
+
 #endif /* !USB_VIDEO_H */


Other related posts:

  • » [haiku-commits] haiku: hrev53615 - headers/os/drivers/usb - Adrien Destugues