@@ -165,6 +165,16 @@ static void display_buffer_hex(unsigned char *buffer, unsigned size)
165165printf ("\n" );
166166}
167167
168+ static char * uuid_to_string (const uint8_t * uuid )
169+ {
170+ static char uuid_string [40 ];
171+ if (uuid == NULL )return NULL ;
172+ sprintf (uuid_string ,"{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x}" ,
173+ uuid [0 ],uuid [1 ],uuid [2 ],uuid [3 ],uuid [4 ],uuid [5 ],uuid [6 ],uuid [7 ],
174+ uuid [8 ],uuid [9 ],uuid [10 ],uuid [11 ],uuid [12 ],uuid [13 ],uuid [14 ],uuid [15 ]);
175+ return uuid_string ;
176+ }
177+
168178// The PS3 Controller is really a HID device that got its HID Report Descriptors
169179// removed by Sony
170180static int display_ps3_status (libusb_device_handle * handle )
@@ -726,11 +736,51 @@ static void read_ms_winsub_feature_descriptors(libusb_device_handle *handle, uin
726736}
727737}
728738
739+ static void print_device_cap (struct libusb_bos_dev_capability_descriptor * dev_cap )
740+ {
741+ switch (dev_cap -> bDevCapabilityType ) {
742+ case LIBUSB_BT_USB_2_0_EXTENSION : {
743+ struct libusb_usb_2_0_extension_descriptor * usb_2_0_ext = NULL ;
744+ libusb_get_usb_2_0_extension_descriptor (NULL ,dev_cap ,& usb_2_0_ext );
745+ if (usb_2_0_ext ) {
746+ printf (" USB 2.0 extension:\n" );
747+ printf (" attributes : %02X\n" ,usb_2_0_ext -> bmAttributes );
748+ libusb_free_usb_2_0_extension_descriptor (usb_2_0_ext );
749+ }
750+ break ;
751+ }
752+ case LIBUSB_BT_SS_USB_DEVICE_CAPABILITY : {
753+ struct libusb_ss_usb_device_capability_descriptor * ss_usb_device_cap = NULL ;
754+ libusb_get_ss_usb_device_capability_descriptor (NULL ,dev_cap ,& ss_usb_device_cap );
755+ if (ss_usb_device_cap ) {
756+ printf (" USB 3.0 capabilities:\n" );
757+ printf (" attributes : %02X\n" ,ss_usb_device_cap -> bmAttributes );
758+ printf (" supported speeds : %04X\n" ,ss_usb_device_cap -> wSpeedSupported );
759+ printf (" supported functionality: %02X\n" ,ss_usb_device_cap -> bFunctionalitySupport );
760+ libusb_free_ss_usb_device_capability_descriptor (ss_usb_device_cap );
761+ }
762+ break ;
763+ }
764+ case LIBUSB_BT_CONTAINER_ID : {
765+ struct libusb_container_id_descriptor * container_id = NULL ;
766+ libusb_get_container_id_descriptor (NULL ,dev_cap ,& container_id );
767+ if (container_id ) {
768+ printf (" Container ID:\n %s\n" ,uuid_to_string (container_id -> ContainerID ));
769+ libusb_free_container_id_descriptor (container_id );
770+ }
771+ break ;
772+ }
773+ default :
774+ printf (" Unknown BOS device capability %02x:\n" ,dev_cap -> bDevCapabilityType );
775+ }
776+ }
777+
729778static int test_device (uint16_t vid ,uint16_t pid )
730779{
731780libusb_device_handle * handle ;
732781libusb_device * dev ;
733782uint8_t bus ,port_path [8 ];
783+ struct libusb_bos_descriptor * bos_desc ;
734784struct libusb_config_descriptor * conf_desc ;
735785const struct libusb_endpoint_descriptor * endpoint ;
736786int i ,j ,k ,r ;
@@ -784,7 +834,17 @@ static int test_device(uint16_t vid, uint16_t pid)
784834string_index [1 ]= dev_desc .iProduct ;
785835string_index [2 ]= dev_desc .iSerialNumber ;
786836
787- printf ("\nReading configuration descriptors:\n" );
837+ printf ("\nReading BOS descriptor: " );
838+ if (libusb_get_bos_descriptor (handle ,& bos_desc )== LIBUSB_SUCCESS ) {
839+ printf ("%d caps\n" ,bos_desc -> bNumDeviceCaps );
840+ for (i = 0 ;i < bos_desc -> bNumDeviceCaps ;i ++ )
841+ print_device_cap (bos_desc -> dev_capability [i ]);
842+ libusb_free_bos_descriptor (bos_desc );
843+ }else {
844+ printf ("no descriptor\n" );
845+ }
846+
847+ printf ("\nReading first configuration descriptor:\n" );
788848CALL_CHECK (libusb_get_config_descriptor (dev ,0 ,& conf_desc ));
789849nb_ifaces = conf_desc -> bNumInterfaces ;
790850printf (" nb interfaces: %d\n" ,nb_ifaces );