Open dominikfehr opened 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 ---
PS4 Console detects "mitm'd" PS4 Controller and lets you use it.
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.
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()
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)
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...
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/
Hi @dominikfehr ! Interesting. Is it capable of outputting a realtime dump of the USB data going across the line?
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
Device info (lsusb)