greatscottgadgets / facedancer

Implement your own USB device in Python, supported by a hardware peripheral such as Cynthion or GreatFET
BSD 3-Clause "New" or "Revised" License
787 stars 119 forks source link

Proxying usb gamecontroller with EP 0x04 / EP 0x84: failed to configure impossible endpoint with address 4 [EINVAL] #61

Open dominikfehr opened 2 years ago

dominikfehr commented 2 years ago

BACKEND: greatfet Facedancer commit: e688fe61dc34087db333432394e1f90e52ac3794 GreatFET firmware: Firmware version: v2021.2.1

Problem

Trying to proxy a XBox One Game-controller via FaceDancer, error received is:

greatdancer.set_up_endpoints: greatdancer: failed to configure impossible endpoint with address 4 [EINVAL]

Also tried older Facedancer repo states (end 2019)...

Any hints?

Error output

$ sudo -E python3 facedancer-usbproxy.py -v 045e -p 0b12
Using GreatDancer backend.
GreatDancer initialized
[20:55:50] <, standard request to device (GET_DESCRIPTOR: value=DEVICE descriptor (index=0x00), index=0, length=64)
[20:55:50] <: b'\x12\x01\x00\x02\xffG\xd0@^\x04\x12\x0b\x07\x05\x01\x02\x03\x01'
-- Patched device descriptor. --
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=DEVICE descriptor (index=0x00), index=0, length=18)
[20:55:51] <: b'\x12\x01\x00\x02\xffG\xd0@^\x04\x12\x0b\x07\x05\x01\x02\x03\x01'
-- Patched device descriptor. --
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=CONFIGURATION descriptor (index=0x00), index=0, length=255)
[20:55:51] <: b'\t\x02w\x00\x03\x01\x00\xa0\xfa\t\x04\x00\x00\x02\xffG\xd0\x00\x07\x05\x02\x03@\x00\x04\x07\x05\x82\x03@\x00\x04\t\x04\x00\x01\x02\xffG\xd0\x00\x07\x05\x02\x03@\x00\x04\x07\x05\x82\x03@\x00\x02\t\x04\x01\x00\x00\xffG\xd0\x00\t\x04\x01\x01\x02\xffG\xd0\x00\x07\x05\x03\x01\xe4\x00\x01\x07\x05\x83\x01@\x00\x01\t\x04\x02\x00\x00\xffG\xd0\x00\t\x04\x02\x01\x02\xffG\xd0\x00\x07\x05\x04\x02@\x00\x00\x07\x05\x84\x02@\x00\x00'
-- Storing configuration <USBConfiguration index=1 num_interfaces=3 attributes=0xA0 max_power=500mA> --
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=STRING descriptor (index=0x03), index=409, length=255)
[20:55:51] <: ̺30393731323236373333423524525
[20:55:51] <, vendor request to device (vendor request 144: value=0, index=4, length=16)
[20:55:51] <: b'(\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00'
[20:55:51] <, vendor request to device (vendor request 144: value=0, index=4, length=40)
[20:55:51] <: b'(\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01XGIP10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=STRING descriptor (index=0x00), index=0, length=255)
[20:55:51] <: ̄Љ
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=STRING descriptor (index=0x02), index=409, length=255)
[20:55:51] <: ̖Controller
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=DEVICE_QUALIFIER descriptor (index=0x00), index=0, length=10)
[20:55:51] < --STALLED-- 
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=DEVICE descriptor (index=0x00), index=0, length=18)
[20:55:51] <: b'\x12\x01\x00\x02\xffG\xd0@^\x04\x12\x0b\x07\x05\x01\x02\x03\x01'
-- Patched device descriptor. --
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=CONFIGURATION descriptor (index=0x00), index=0, length=9)
[20:55:51] <: b'\t\x02w\x00\x03\x01\x00\xa0\xfa'
[20:55:51] <, standard request to device (GET_DESCRIPTOR: value=CONFIGURATION descriptor (index=0x00), index=0, length=119)
[20:55:51] <: b'\t\x02w\x00\x03\x01\x00\xa0\xfa\t\x04\x00\x00\x02\xffG\xd0\x00\x07\x05\x02\x03@\x00\x04\x07\x05\x82\x03@\x00\x04\t\x04\x00\x01\x02\xffG\xd0\x00\x07\x05\x02\x03@\x00\x04\x07\x05\x82\x03@\x00\x02\t\x04\x01\x00\x00\xffG\xd0\x00\t\x04\x01\x01\x02\xffG\xd0\x00\x07\x05\x03\x01\xe4\x00\x01\x07\x05\x83\x01@\x00\x01\t\x04\x02\x00\x00\xffG\xd0\x00\t\x04\x02\x01\x02\xffG\xd0\x00\x07\x05\x04\x02@\x00\x00\x07\x05\x84\x02@\x00\x00'
-- Storing configuration <USBConfiguration index=1 num_interfaces=3 attributes=0xA0 max_power=500mA> --
[20:55:51] <, standard request to device (GET_STATUS: value=0, index=0, length=2)
[20:55:51] <: b'\x02\x00'
[20:55:51] >, standard request to device (SET_CONFIGURATION: value=1, index=0, length=0)
-- Applying configuration <USBConfiguration index=1 num_interfaces=3 attributes=0xA0 max_power=500mA> --
Traceback (most recent call last):
  File "/home/userA/Desktop/Facedancer/facedancer-usbproxy.py", line 50, in <module>
    main()
  File "/home/userA/Desktop/Facedancer/facedancer-usbproxy.py", line 44, in main
    d.run()
  File "/home/userA/Desktop/Facedancer/facedancer/USBDevice.py", line 165, in run
    self.scheduler.run()
  File "/home/userA/Desktop/Facedancer/facedancer/core.py", line 509, in run
    task()
  File "/home/userA/Desktop/Facedancer/facedancer/USBDevice.py", line 83, in <lambda>
    self.scheduler.add_task(lambda : self.maxusb_app.service_irqs())
  File "/home/userA/Desktop/Facedancer/facedancer/backends/greatdancer.py", line 765, in service_irqs
    self._handle_setup_events()
  File "/home/userA/Desktop/Facedancer/facedancer/backends/greatdancer.py", line 368, in _handle_setup_events
    self._handle_setup_event_on_endpoint(i)
  File "/home/userA/Desktop/Facedancer/facedancer/backends/greatdancer.py", line 402, in _handle_setup_event_on_endpoint
    self.connected_device.handle_request(request)
  File "/home/userA/Desktop/Facedancer/facedancer/USBProxy.py", line 241, in handle_request
    self._proxy_out_request(req)
  File "/home/userA/Desktop/Facedancer/facedancer/USBProxy.py", line 296, in _proxy_out_request
    req, data = f.filter_control_out(req, data)
  File "/home/userA/Desktop/Facedancer/facedancer/filters/standard.py", line 95, in filter_control_out
    self.device.configured(configuration)
  File "/home/userA/Desktop/Facedancer/facedancer/USBProxy.py", line 220, in configured
    self.maxusb_app.configured(configuration)
  File "/home/userA/Desktop/Facedancer/facedancer/backends/greatdancer.py", line 740, in configured
    self._configure_endpoints(configuration)
  File "/home/userA/Desktop/Facedancer/facedancer/backends/greatdancer.py", line 730, in _configure_endpoints
    self.api.set_up_endpoints(*endpoint_triplets)
  File "/home/userA/.local/lib/python3.9/site-packages/pygreat/comms.py", line 1108, in method
    return self.execute_command(verb_number, in_format, out_format, name=name, class_name=class_name,
  File "/home/userA/.local/lib/python3.9/site-packages/pygreat/comms.py", line 1263, in execute_command
    return self.comms_backend.execute_command(self.CLASS_NUMBER, verb, in_format,
  File "/home/userA/.local/lib/python3.9/site-packages/pygreat/comms.py", line 770, in execute_command
    raw_result = self.execute_raw_command(class_number, verb, payload, timeout,
  File "/home/userA/.local/lib/python3.9/site-packages/pygreat/comms_backends/usb.py", line 391, in execute_raw_command
    future_utils.raise_from(self._exception_for_command_failure(error_number, pretty_name), None)
  File "/home/userA/.local/lib/python3.9/site-packages/future/utils/__init__.py", line 403, in raise_from
    exec(execstr, myglobals, mylocals)
  File "<string>", line 1, in <module>
pygreat.comms.CommandFailureError: greatdancer.set_up_endpoints: greatdancer: failed to configure impossible endpoint with address 4 [EINVAL]

Device info (lsusb)

$ sudo lsusb -vvv -d 045e:0b12

Bus 007 Device 003: ID 045e:0b12 Microsoft Corp. Controller
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass        71 
  bDeviceProtocol       208 
  bMaxPacketSize0        64
  idVendor           0x045e Microsoft Corp.
  idProduct          0x0b12 
  bcdDevice            5.07
  iManufacturer           1 Microsoft
  iProduct                2 Controller
  iSerial                 3 30393731323236373333423524525
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0077
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     71 
      bInterfaceProtocol    208 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               4
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     71 
      bInterfaceProtocol    208 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               4
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               2
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     71 
      bInterfaceProtocol    208 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     71 
      bInterfaceProtocol    208 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x00e4  1x 228 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     71 
      bInterfaceProtocol    208 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     71 
      bInterfaceProtocol    208 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x0002
  (Bus Powered)
  Remote Wakeup Enabled
tuxuser commented 2 years ago

In a similar situation, while trying to sniff/analyze a very similar target device.

Target is an original 054c:09cc Sony Corp. DualShock 4 [CUH-ZCT2x].

It does, just like the device mentioned above, feature an "impossible endpoint" on interface 5:

---snip---
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               5
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               5
--- snip ---

Desired outcome

PS4 Console detects "mitm'd" PS4 Controller and lets you use it.

Problem situation

Both approaches mentioned below do not yield usable results.

Approach 1) endpoint rerouting, ends in a loop of "request descriptor". Approach 2) modifying firmware, just stalls the standard facedancer-usbproxy.py script.

Ideas tried so far

Rewriting the endpoint 0x84 to 0x83 when the target device requests it.

Code used (based on the Nintendo Switch Pro controller rewrite)

#!/usr/bin/env python3
#
# facedancer-switch-flip-endpoint.py

from facedancer import FacedancerUSBApp
from facedancer.USBConfiguration import USBConfiguration
from facedancer.USBInterface import USBInterface
from facedancer.USBEndpoint import USBEndpoint
from facedancer.USBProxy import USBProxyDevice, USBProxyFilter
from facedancer.filters.standard import USBProxySetupFilters
from facedancer.filters.logging import USBProxyPrettyPrintFilter

from enum import Enum

GET_DESCRIPTOR_REQUEST = 6
DESCRIPTOR_CONFIGURATION = 0x02

TARGET_INTERFACE = 5

EP4_IN_ORIG = 0x04 # 0x84
EP4_IN_MOD  = 0x03 # 0x83

USB_VID, USB_PID = 0x054c, 0x09cc

class Direction(Enum):
    OUT = 0
    IN = 1

class PS4ControllerEPRewriteFilter(USBProxyFilter):
    def filter_control_in(self, req, data, stalled):

        if stalled:
            return req, data, stalled

        # If this is a read of a descriptor, see if we'll have to interpose.
        if req.request == GET_DESCRIPTOR_REQUEST:

            # Get the descriptor type and index.
            descriptor_type  = req.value >> 8
            descriptor_index = req.value & 0xFF

            if descriptor_type == DESCRIPTOR_CONFIGURATION and req.length >= 32:
                configuration = USBConfiguration.from_binary_descriptor(data)

                ep4_in, ep3_out = configuration.interfaces[TARGET_INTERFACE].endpoints
                ep4_in.number = EP4_IN_MOD
                configuration.interfaces[TARGET_INTERFACE].endpoints = [ep4_in, ep3_out]

                # And replace our data with the modified descriptor.
                data = configuration.get_descriptor()

        return req, data, stalled

    def filter_in_token(self, ep_num):
        """
        Redirect IN requests on modded EP (0x83) to orignal EP (0x84)
        """
        return EP4_IN_ORIG if ep_num == EP4_IN_MOD else ep_num

    def filter_out(self, ep_num, data):
        """
        Do not redirect EP OUT data
        """
        return ep_num, data

def main():
    u = FacedancerUSBApp(verbose=1)
    d = USBProxyDevice(u, idVendor=USB_VID, idProduct=USB_PID, verbose=2)

    # Apply our filter before the standard filters so we impact configuration
    # of the target device.
    d.add_filter(PS4ControllerEPRewriteFilter())

    d.add_filter(USBProxySetupFilters(d, verbose=2))

    # d.add_filter(PS4ControllerInvertXFilter())
    d.add_filter(USBProxyPrettyPrintFilter(verbose=5))

    d.connect()
    print(d.name)

    try:
        d.run()
    # SIGINT raises KeyboardInterrupt
    except KeyboardInterrupt:
        d.disconnect()

if __name__ == "__main__":
    main()

Modifying unused EP in GreatFET fw

The other approach that was tried: Modifying the GreatFET firmware.

Following changes were done:

diff --git a/firmware/greatfet_usb/classes/greatdancer.c b/firmware/greatfet_usb/classes/greatdancer.c
index d8e31e1..04212b3 100644
--- a/firmware/greatfet_usb/classes/greatdancer.c
+++ b/firmware/greatfet_usb/classes/greatdancer.c
@@ -113,7 +113,7 @@ static usb_endpoint_t *usb_preinit_endpoint_from_address(uint8_t address)
                case 0x82: return &usb1_endpoint2_in;
                case 0x02: return &usb1_endpoint2_out;

-               case 0x83: return &usb1_endpoint3_in;
+               case 0x84: return &usb1_endpoint3_in;
                case 0x03: return &usb1_endpoint3_out;
        }

diff --git a/firmware/greatfet_usb/usb_endpoint.c b/firmware/greatfet_usb/usb_endpoint.c
index 0b45ef8..5c042f8 100644
--- a/firmware/greatfet_usb/usb_endpoint.c
+++ b/firmware/greatfet_usb/usb_endpoint.c
@@ -123,7 +123,7 @@ static USB_DEFINE_QUEUE(usb1_endpoint2_out, 1);

 usb_endpoint_t usb1_endpoint3_in = {
-       .address = 0x83,
+       .address = 0x84,
        .device = &usb_peripherals[1],
        .in = &usb1_endpoint3_in,
        .out = 0,

Full lsusb output:

Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x054c Sony Corp.
  idProduct          0x09cc DualShock 4 [CUH-ZCT2x]
  bcdDevice            1.00
  iManufacturer           1 Sony Interactive Entertainment
  iProduct                2 Wireless Controller
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x00e1
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xc0
      Self Powered
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength       0x0047
        bInCollection           2
        baInterfaceNr(0)        1
        baInterfaceNr(1)        2
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             1
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          6
        bNrChannels             2
        wChannelConfig     0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 2
        bSourceID               1
        bControlSize            1
        bmaControls(0)       0x03
          Mute Control
          Volume Control
        bmaControls(1)       0x00
        bmaControls(2)       0x00
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             3
        wTerminalType      0x0402 Headset
        bAssocTerminal          4
        bSourceID               2
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             4
        wTerminalType      0x0402 Headset
        bAssocTerminal          3
        bNrChannels             1
        wChannelConfig     0x0000
        iChannelNames           0 
        iTerminal               0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 5
        bSourceID               4
        bControlSize            1
        bmaControls(0)       0x03
          Mute Control
          Volume Control
        bmaControls(1)       0x00
        iFeature                0 
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          1
        bSourceID               5
        iTerminal               0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           1
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                11
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             2
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            1 Discrete
        tSamFreq[ 0]        32000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            9
          Transfer Type            Isochronous
          Synch Type               Adaptive
          Usage Type               Data
        wMaxPacketSize     0x0084  1x 132 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           6
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                11
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             1
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            1 Discrete
        tSamFreq[ 0]        16000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0022  1x 34 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     507
          Report Descriptor: (length is 507)
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x05 ] 5
                            Gamepad
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x01 ] 1
            Item(Local ): Usage, data= [ 0x30 ] 48
                            Direction-X
            Item(Local ): Usage, data= [ 0x31 ] 49
                            Direction-Y
            Item(Local ): Usage, data= [ 0x32 ] 50
                            Direction-Z
            Item(Local ): Usage, data= [ 0x35 ] 53
                            Rotate-Z
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x04 ] 4
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage, data= [ 0x39 ] 57
                            Hat Switch
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x07 ] 7
            Item(Global): Physical Minimum, data= [ 0x00 ] 0
            Item(Global): Physical Maximum, data= [ 0x3b 0x01 ] 315
            Item(Global): Unit, data= [ 0x14 ] 20
                            System: English Rotation, Unit: Degrees
            Item(Global): Report Size, data= [ 0x04 ] 4
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x42 ] 66
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State Null_State Non_Volatile Bitfield
            Item(Global): Unit, data= [ 0x00 ] 0
                            System: None, Unit: (None)
            Item(Global): Usage Page, data= [ 0x09 ] 9
                            Buttons
            Item(Local ): Usage Minimum, data= [ 0x01 ] 1
                            Button 1 (Primary)
            Item(Local ): Usage Maximum, data= [ 0x0e ] 14
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x0e ] 14
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
                            (null)
            Item(Local ): Usage, data= [ 0x20 ] 32
                            (null)
            Item(Global): Report Size, data= [ 0x06 ] 6
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x7f ] 127
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x33 ] 51
                            Rotate-X
            Item(Local ): Usage, data= [ 0x34 ] 52
                            Rotate-Y
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
                            (null)
            Item(Local ): Usage, data= [ 0x21 ] 33
                            (null)
            Item(Global): Report Count, data= [ 0x36 ] 54
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x05 ] 5
            Item(Local ): Usage, data= [ 0x22 ] 34
                            (null)
            Item(Global): Report Count, data= [ 0x1f ] 31
            Item(Main  ): Output, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x04 ] 4
            Item(Local ): Usage, data= [ 0x23 ] 35
                            (null)
            Item(Global): Report Count, data= [ 0x24 ] 36
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x02 ] 2
            Item(Local ): Usage, data= [ 0x24 ] 36
                            (null)
            Item(Global): Report Count, data= [ 0x24 ] 36
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x08 ] 8
            Item(Local ): Usage, data= [ 0x25 ] 37
                            (null)
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x10 ] 16
            Item(Local ): Usage, data= [ 0x26 ] 38
                            (null)
            Item(Global): Report Count, data= [ 0x04 ] 4
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x11 ] 17
            Item(Local ): Usage, data= [ 0x27 ] 39
                            (null)
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x12 ] 18
            Item(Global): Usage Page, data= [ 0x02 0xff ] 65282
                            (null)
            Item(Local ): Usage, data= [ 0x21 ] 33
                            (null)
            Item(Global): Report Count, data= [ 0x0f ] 15
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x13 ] 19
            Item(Local ): Usage, data= [ 0x22 ] 34
                            (null)
            Item(Global): Report Count, data= [ 0x16 ] 22
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x14 ] 20
            Item(Global): Usage Page, data= [ 0x05 0xff ] 65285
                            (null)
            Item(Local ): Usage, data= [ 0x20 ] 32
                            (null)
            Item(Global): Report Count, data= [ 0x10 ] 16
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x15 ] 21
            Item(Local ): Usage, data= [ 0x21 ] 33
                            (null)
            Item(Global): Report Count, data= [ 0x2c ] 44
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x80 0xff ] 65408
                            (null)
            Item(Global): Report ID, data= [ 0x80 ] 128
            Item(Local ): Usage, data= [ 0x20 ] 32
                            (null)
            Item(Global): Report Count, data= [ 0x06 ] 6
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x81 ] 129
            Item(Local ): Usage, data= [ 0x21 ] 33
                            (null)
            Item(Global): Report Count, data= [ 0x06 ] 6
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x82 ] 130
            Item(Local ): Usage, data= [ 0x22 ] 34
                            (null)
            Item(Global): Report Count, data= [ 0x05 ] 5
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x83 ] 131
            Item(Local ): Usage, data= [ 0x23 ] 35
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x84 ] 132
            Item(Local ): Usage, data= [ 0x24 ] 36
                            (null)
            Item(Global): Report Count, data= [ 0x04 ] 4
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x85 ] 133
            Item(Local ): Usage, data= [ 0x25 ] 37
                            (null)
            Item(Global): Report Count, data= [ 0x06 ] 6
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x86 ] 134
            Item(Local ): Usage, data= [ 0x26 ] 38
                            (null)
            Item(Global): Report Count, data= [ 0x06 ] 6
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x87 ] 135
            Item(Local ): Usage, data= [ 0x27 ] 39
                            (null)
            Item(Global): Report Count, data= [ 0x23 ] 35
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x88 ] 136
            Item(Local ): Usage, data= [ 0x28 ] 40
                            (null)
            Item(Global): Report Count, data= [ 0x22 ] 34
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x89 ] 137
            Item(Local ): Usage, data= [ 0x29 ] 41
                            (null)
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x90 ] 144
            Item(Local ): Usage, data= [ 0x30 ] 48
                            (null)
            Item(Global): Report Count, data= [ 0x05 ] 5
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x91 ] 145
            Item(Local ): Usage, data= [ 0x31 ] 49
                            (null)
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x92 ] 146
            Item(Local ): Usage, data= [ 0x32 ] 50
                            (null)
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0x93 ] 147
            Item(Local ): Usage, data= [ 0x33 ] 51
                            (null)
            Item(Global): Report Count, data= [ 0x0c ] 12
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa0 ] 160
            Item(Local ): Usage, data= [ 0x40 ] 64
                            (null)
            Item(Global): Report Count, data= [ 0x06 ] 6
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa1 ] 161
            Item(Local ): Usage, data= [ 0x41 ] 65
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa2 ] 162
            Item(Local ): Usage, data= [ 0x42 ] 66
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa3 ] 163
            Item(Local ): Usage, data= [ 0x43 ] 67
                            (null)
            Item(Global): Report Count, data= [ 0x30 ] 48
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa4 ] 164
            Item(Local ): Usage, data= [ 0x44 ] 68
                            (null)
            Item(Global): Report Count, data= [ 0x0d ] 13
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa5 ] 165
            Item(Local ): Usage, data= [ 0x45 ] 69
                            (null)
            Item(Global): Report Count, data= [ 0x15 ] 21
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa6 ] 166
            Item(Local ): Usage, data= [ 0x46 ] 70
                            (null)
            Item(Global): Report Count, data= [ 0x15 ] 21
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xf0 ] 240
            Item(Local ): Usage, data= [ 0x47 ] 71
                            (null)
            Item(Global): Report Count, data= [ 0x3f ] 63
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xf1 ] 241
            Item(Local ): Usage, data= [ 0x48 ] 72
                            (null)
            Item(Global): Report Count, data= [ 0x3f ] 63
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xf2 ] 242
            Item(Local ): Usage, data= [ 0x49 ] 73
                            (null)
            Item(Global): Report Count, data= [ 0x0f ] 15
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa7 ] 167
            Item(Local ): Usage, data= [ 0x4a ] 74
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa8 ] 168
            Item(Local ): Usage, data= [ 0x4b ] 75
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xa9 ] 169
            Item(Local ): Usage, data= [ 0x4c ] 76
                            (null)
            Item(Global): Report Count, data= [ 0x08 ] 8
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xaa ] 170
            Item(Local ): Usage, data= [ 0x4e ] 78
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xab ] 171
            Item(Local ): Usage, data= [ 0x4f ] 79
                            (null)
            Item(Global): Report Count, data= [ 0x39 ] 57
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xac ] 172
            Item(Local ): Usage, data= [ 0x50 ] 80
                            (null)
            Item(Global): Report Count, data= [ 0x39 ] 57
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xad ] 173
            Item(Local ): Usage, data= [ 0x51 ] 81
                            (null)
            Item(Global): Report Count, data= [ 0x0b ] 11
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xae ] 174
            Item(Local ): Usage, data= [ 0x52 ] 82
                            (null)
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xaf ] 175
            Item(Local ): Usage, data= [ 0x53 ] 83
                            (null)
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xb0 ] 176
            Item(Local ): Usage, data= [ 0x54 ] 84
                            (null)
            Item(Global): Report Count, data= [ 0x3f ] 63
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xb1 ] 177
            Item(Local ): Usage, data= [ 0x55 ] 85
                            (null)
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xb2 ] 178
            Item(Local ): Usage, data= [ 0x56 ] 86
                            (null)
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xe0 ] 224
            Item(Local ): Usage, data= [ 0x57 ] 87
                            (null)
            Item(Global): Report Count, data= [ 0x02 ] 2
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xb3 ] 179
            Item(Local ): Usage, data= [ 0x55 ] 85
                            (null)
            Item(Global): Report Count, data= [ 0x3f ] 63
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report ID, data= [ 0xb4 ] 180
            Item(Local ): Usage, data= [ 0x55 ] 85
                            (null)
            Item(Global): Report Count, data= [ 0x3f ] 63
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               5
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               5
Device Status:     0x0000
  (Bus Powered)
jaysonlarose commented 1 year ago

Did you ever find a good workaround for this? Also, what is this "Nintendo Switch Pro controller rewrite"? I'm asking because I'm looking to reliably capture controller data sent between video game controllers and the console... specifically the Nintendo Switch for now, but ideally I'd like a solution that works on any USB controller...

dominikfehr commented 1 year ago

Did you ever find a good workaround for this? Also, what is this "Nintendo Switch Pro controller rewrite"? I'm asking because I'm looking to reliably capture controller data sent between video game controllers and the console... specifically the Nintendo Switch for now, but ideally I'd like a solution that works on any USB controller...

hey @jaysonlarose, at one point we stopped using the greatfet hardware due to too many problems. for pure USB sniffing I can recommend http://openvizsla.org/

there's also another gsg hardware upcoming which might be more sufficent than greatfet: https://greatscottgadgets.com/cynthion/

jaysonlarose commented 1 year ago

Hi @dominikfehr ! Interesting. Is it capable of outputting a realtime dump of the USB data going across the line?