Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request]: List of missing USB/PAD devices #4763

Open
9 of 39 tasks
RedDevilus opened this issue Sep 12, 2021 · 45 comments
Open
9 of 39 tasks

[Feature Request]: List of missing USB/PAD devices #4763

RedDevilus opened this issue Sep 12, 2021 · 45 comments

Comments

@RedDevilus
Copy link
Contributor

RedDevilus commented Sep 12, 2021

Description

It would be handier if people know which devices are missing from PCSX2 and people that have or can buy those devices can dump the USB descriptors to then enable the functionality in these games.

Reason

Easier for tracking and letting people know how to help PCSX2 even without much coding knowledge.

Quote by jackun on how to dump these USB descriptors:

https://www.thesycon.de/eng/usb_descriptordumper.shtml
run tdd.exe and also select Options > Show Hex Dump

Example of outputs:
jackun/USBqemu-wheel#44
jackun/USBqemu-wheel#47
#4167

Examples

Currently missing devices (needs verification and expansion):

USB;

  • GunCon2 (nuvee functionality)
  • Beatmania
  • Realplay Golf
  • Realplay Racing
  • Realplay Puzzlesphere
  • Realplay Pool
  • Popegg Printer (Handled on a PR)
  • Onimusha 3 Katana
  • DJ Hero Turntable
  • Rez's Trance Vibrator (Cultured)
  • Sammy Pachinko Controller
  • Gametrak Real World Golf Game & Central Unit
  • SNIPER RIFLE & ARCADE SHOTGUN (VGA Lightgun)
  • Dance Dance Revolution Mat
  • Thrustmaster Fighting Arena
  • Rock Band / Guitar Hero Konami USB Microphone
  • ...ETC

PAD;

  • GunCon (nuvee functionality)
  • Guitar
  • JogCon
  • NegCon
  • Sega Saturn PS2 Controller
  • Hori Dragon Quest Slime Controller (Japan is weird, don't question it)
  • Gamester FPS Master Controller
  • Gamester Formula Racer steering wheel/controller
  • Gamester Radica Wired Controller
  • Gamester Radica Joystick
  • Gamester Steering Wheel Dual Force 2 with pedals
  • Gamester Sports Board
  • Gamester Radica Pro-Racer
  • Gamester Race Pack
  • Gamester Joypad Dual Force 2
  • Gamester Gamester Clash Pads Controller Set
  • Namco Taiko no Tatsujin Drum Controller
  • VTG PlayStation Thrustmaster Freestyler Board
  • Wired Fishing Rod Controller
  • ...ETC

Combined USB + PAD;

  • Logitech Netplay Controller
  • ...ETC

Related:
#3924
#3931
#4041 (missing some features but the controller functionality is merged)
#4167

@seta-san
Copy link
Contributor

i don't think ddr mats were usb. i think they plugged into the standard pad port

@Florin9doi
Copy link
Contributor

Florin9doi commented Sep 13, 2021

Done:

PAD controllers:

USB controllers:

Printers:

Modems:

@RedDevilus
Copy link
Contributor Author

i don't think ddr mats were usb. i think they plugged into the standard pad port

Yeah there can be mistakes, but it's not a big deal for now. Just to have a list.

@seta-san

This comment has been minimized.

@HeroponRikiBestest
Copy link

Add the Aqua System Compact Flight Controller (Used for PetitCopter)

@seta-san
Copy link
Contributor

@RedDevilus can we get a check on the guncon and dj hero unless you need more information from me. i'd really like to take these back and get my money if i can

@seta-san
Copy link
Contributor

Onimusha 3 Katana is a wireless pad receiver, not usb
s-l1600
s-l1600 (1)

@seta-san
Copy link
Contributor

beatmania is
s-l1600 (2)
also a pad controller, not usb.

@seta-san
Copy link
Contributor

while i can't find any direct images of it a review seems to suggest that the thrustmaster fighting arena works with the PS1 and that would mean it's a pad device, not USB.

http://www.psillustrated.com/psillustrated/hard_rev.php/75/fighting-arena-ps2.html

@RedDevilus
Copy link
Contributor Author

@RedDevilus can we get a check on the guncon and dj hero unless you need more information from me. i'd really like to take these back and get my money if i can

It's probably fine with just the USB descriptors and when someone can add it to PCSX2 USB devices.

@seta-san
Copy link
Contributor

let's add this to the list of USB devices i can't afford.
https://www.ebay.com/itm/384463524794
s-l1600 (7)

@SamRohod
Copy link

I understand that this is for USB/PAD devices but is there a possibility of adding the TwinPad plugin to the list of "awaiting merging plugins" like Nuvee.
https://forums.pcsx2.net/Thread-TwinPad-v0-9-25

@refractionpcsx2
Copy link
Member

I understand that this is for USB/PAD devices but is there a possibility of adding the TwinPad plugin to the list of "awaiting merging plugins" like Nuvee. forums.pcsx2.net/Thread-TwinPad-v0-9-25

What are you hoping to bring over from Twinpad? we're not merging in plugins, we're just expanding our functionality to cover everything the plugins did.

@SamRohod
Copy link

SamRohod commented May 3, 2022

What are you hoping to bring over from Twinpad?

I was thinking of the "Combo" features

@RedDevilus
Copy link
Contributor Author

What are you hoping to bring over from Twinpad?

I was thinking of the "Combo" features

This has nothing to do with functionalities of other plugins. It's for (quirky) hardware that is not DS2 controller basically.

@knight-ryu12
Copy link
Contributor

knight-ryu12 commented Dec 25, 2022

Popegg: MPR-G600
VID=054C
PID=003D

full desc from UsbTreeView
https://gist.github.com/knight-ryu12/38c4bc29dd5b42efb4e00a368b5dc03c

@RedDevilus
Copy link
Contributor Author

RedDevilus commented Jan 22, 2023

Dump from Discord:
Information for device Logitech Buzz(tm) Controller V1 (VID=0x054C PID=0x0002):
Logitech Buzzers V1.txt

Supposedly it's not working on nightly. Device details in text above to be checked and see if fix possible.

@rafho1
Copy link

rafho1 commented Jan 26, 2023

I have one of these.

https://www.konamistyle.jp/products/detail.php?product_id=110744

SDL detects this controller fine and can map all the buttons, however the turntable sends an analog value of the turntable rather than a discreet "up" or "down", which makes playing any Beatmania games impossible. I think it should be somewhat easily fixable in SDL or PCSX2 but not sure where to start.

Somebody wrote a Windows app to work around this problem, but i would like to use the controller with my SteamDeck :-D

Hopefully somebody here can point me in the right direction.

beatmania IIDX controller Entry Model:

Product ID: 0x1018
Vendor ID: 0x1ccf
Version: 4.10
Serial Number: BF004-IIDX
Speed: Up to 12 Mb/s
Manufacturer: Konami Amusement
Location ID: 0x14110000 / 4
Current Available (mA): 500
Current Required (mA): 200
Extra Operating Current (mA): 0

@RedDevilus
Copy link
Contributor Author

RedDevilus commented Feb 8, 2023

Best use the hex dumps, but I thought we already had beatmania IIDX dump, but better be safe than sorry

@sanjay900
Copy link
Contributor

Turntable support is merged into master now

@seta-san
Copy link
Contributor

seta-san commented Jul 1, 2023

Guncon 2 is also done

@seta-san
Copy link
Contributor

i'm getting specific requests that the negcon controller be emulated in pcsx2 by 5chan. they say it's already emulated in duckstation

@stenzek
Copy link
Contributor

stenzek commented Aug 24, 2023

Feel free to implement it and make a pull request then ;)

@danbolt
Copy link

danbolt commented Dec 1, 2023

For PictureParadise, I recently acquired a Sony MSAC-US1 Memory Stick Reader/Writer. When plugged into A PopOS workstation with a Memory Stick inserted, I get the following info from lsusb:

$ lsusb -v -d 054c:002d 

Bus 005 Device 010: ID 054c:002d Sony Corp. MSAC-US1 MemoryStick Reader
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x054c Sony Corp.
  idProduct          0x002d MSAC-US1 MemoryStick Reader
  bcdDevice            1.00
  iManufacturer           1 Sony
  iProduct                2 MSAC-US1
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0027
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      4 Floppy (UFI)
      bInterfaceProtocol      1 Control/Bulk
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        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     0x02  EP 2 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     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0000  1x 0 bytes
        bInterval             255

If no memory stick is plugged in (but the USB reader/writer is), this will also be visible:

$ lsusb -v -d 0451:2046 

Bus 005 Device 006: ID 0451:2046 Texas Instruments, Inc. TUSB2046 Hub
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            9 Hub
  bDeviceSubClass         0 
  bDeviceProtocol         0 Full speed (or root) hub
  bMaxPacketSize0         8
  idVendor           0x0451 Texas Instruments, Inc.
  idProduct          0x2046 TUSB2046 Hub
  bcdDevice            1.25
  iManufacturer           0 
  iProduct                0 
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0019
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0001  1x 1 bytes
        bInterval             255

@sonik-br
Copy link

sonik-br commented Dec 5, 2023

I've just found out this and I do have some devices.

Devices with Usb connector:
Seamic
Rez Trance Vib
Densha de Go's Two handle controller "Type 2" (TCPP-20009)
DFGT and G27 racing wheels
Logitech Flight Force (WingMan Force 3D)
Hori FlighStick 1 (I also have some knowledge on how the FS2 works)

Devices with PS style connector:
Jogcon
Negcon
Volume (it's a paddle. works like a negcon)
Jet de Go controller
Taiko controller
Dual Analog controller (the flightstick)
Fishing controller with motion movement
Some other devices with various modes like the Hori pad with digital/analog/dualanalog/negcon plus rumble on all modes, or the Logic3's RC style controller that can be switched to negcon / negcon with rumble / jogcon

And I have a good knowledge of how all the above device works.
I can dump and document the device descriptors and reports. Can send/receive data if needed. I've made adapters for them.
Please let me know if I can help.

@prafullpcsx2
Copy link
Contributor

prafullpcsx2 commented Jul 24, 2024

@Florin9doi
Do you have any idea whether eyetoy mic is emulated in PCSX2 or not? Eyetoy video works fine but games like harry potter prisoner of azkaban also require input from eyetoy mic for some of it's party games and I couldn't get it to work. So I thought either I am doing something wrong or eyetoy mic emulation isn't working.

@Florin9doi
Copy link
Contributor

@Florin9doi Do you have any idea whether eyetoy mic is emulated in PCSX2 or not?

The microphone is not implemented:

@seta-san
Copy link
Contributor

@Florin9doi do you think this one is doable?
#4167

@JWatersMeet
Copy link

I have the Namco Taiko no Tatsujin Drum Controller for PS2, and a cheap unofficial USB adapter. If anyone with a track record here thinks they can build a working input device from it, let me know, and I'll donate it to the project.

@Florin9doi
Copy link
Contributor

Florin9doi commented Aug 3, 2024

Datel XtremeFM

  • BIOS >=v1.60:
    TimeSplitters_SLUS-20090_20240803102726

  • BIOS <=v1.50:

    • USB radio unplugged:
      TimeSplitters_SLUS-20090_20240803103202

    • USB radio plugged:

      • Turned off:
        TimeSplitters_SLUS-20090_20240803103503

      • Turned on, skin 1:
        TimeSplitters_SLUS-20090_20240803113739

      • Turned on, skin 2:
        TimeSplitters_SLUS-20090_20240803113745

      • Turned on, skin 3:
        TimeSplitters_SLUS-20090_20240803113751

      • Turned on, skin 4:
        TimeSplitters_SLUS-20090_20240803113756

      • Play Game:
        TimeSplitters_SLUS-20090_20240803181926

@RedPanda4552
Copy link
Contributor

I have the Namco Taiko no Tatsujin Drum Controller for PS2, and a cheap unofficial USB adapter. If anyone with a track record here thinks they can build a working input device from it, let me know, and I'll donate it to the project.

Do you have your PS2 setup such that you can run homebrew on it via ps2link and ps2client? I have a homebrew which can snoop on a pad device to figure out its identity commands, but in order to be useful we have to be able to get the stdout contents from it.

@JWatersMeet
Copy link

JWatersMeet commented Aug 4, 2024

I have the Namco Taiko no Tatsujin Drum Controller for PS2, and a cheap unofficial USB adapter. If anyone with a track record here thinks they can build a working input device from it, let me know, and I'll donate it to the project.

Do you have your PS2 setup such that you can run homebrew on it via ps2link and ps2client? I have a homebrew which can snoop on a pad device to figure out its identity commands, but in order to be useful we have to be able to get the stdout contents from it.

I don't, but if you do, and think you have a chance of getting it working, I will ship it to you.

@sonik-br
Copy link

sonik-br commented Aug 4, 2024

Do you guys need the output of the usb adapter? Or the output from the taiko controller using psx style connector?

@RedDevilus
Copy link
Contributor Author

RedDevilus commented Aug 4, 2024

Do you guys need the output of the usb adapter? Or the output from the taiko controller using psx style connector?

Need the USB descriptors for adapters or devices:

https://www.thesycon.de/eng/usb_descriptordumper.shtml
run tdd.exe and also select Options > Show Hex Dump

Which you get a whole list of details about it like this snippet as example:

image

Oh wait a PS2 to USB adapter, won't fit the requirements for what I just said, so ignore everything I just said.

@Florin9doi
Copy link
Contributor

Florin9doi commented Aug 5, 2024

I've just found out this and I do have some devices.

Devices with Usb connector: Seamic Rez Trance Vib Densha de Go's Two handle controller "Type 2" (TCPP-20009) DFGT and G27 racing wheels Logitech Flight Force (WingMan Force 3D) Hori FlighStick 1 (I also have some knowledge on how the FS2 works)

Devices with PS style connector: Jogcon Negcon Volume (it's a paddle. works like a negcon) Jet de Go controller Taiko controller Dual Analog controller (the flightstick) Fishing controller with motion movement Some other devices with various modes like the Hori pad with digital/analog/dualanalog/negcon plus rumble on all modes, or the Logic3's RC style controller that can be switched to negcon / negcon with rumble / jogcon

And I have a good knowledge of how all the above device works. I can dump and document the device descriptors and reports. Can send/receive data if needed. I've made adapters for them. Please let me know if I can help.

@sonik-br, could you please post details for Hori FS1/2 (USB descriptors, vendor request's format, data transfer's format) and Logitech Flight Force (USB descriptors are available but I can't find the HID descriptors).

Regarding the SPI controllers do you know how Jet de Go and Taiko are detected by games and how the buttons are mapped? Sometimes they have an unique ID and sometimes they hold different buttons pressed. There are some details but are incomplete.

@sonik-br
Copy link

sonik-br commented Aug 5, 2024

@Florin9doi Heres some info. For the Hori FS1/2 I will post later.

Logitech WingMan Force 3D (Flight Force)

It's FFB commands are practically the same from logitech wheels.
I believe FFB passthrough/emulation can be added just as on the logitech wheel input module.

Device descriptor

Information for device WingMan Force 3D (VID=0x046D PID=0xC283):

------------------------------
Device Descriptor:
------------------------------
0x12 bLength
0x01 bDescriptorType
0x0100 bcdUSB
0x00 bDeviceClass      
0x00 bDeviceSubClass  
0x00 bDeviceProtocol  
0x08 bMaxPacketSize0   (8 bytes)
0x046D idVendor
0xC283 idProduct
0x0106 bcdDevice
0x04 iManufacturer   "Logitech Inc."
0x20 iProduct        "WingMan Force 3D"
0x00 iSerialNumber
0x01 bNumConfigurations


-------------------------
Configuration Descriptor:
-------------------------
0x09 bLength
0x02 bDescriptorType
0x0029 wTotalLength   (41 bytes)
0x01 bNumInterfaces
0x01 bConfigurationValue
0x00 iConfiguration
0x80 bmAttributes   (Bus-powered Device)
0x28 bMaxPower      (80 mA)

Interface Descriptor:
------------------------------
0x09 bLength
0x04 bDescriptorType
0x00 bInterfaceNumber
0x00 bAlternateSetting
0x02 bNumEndPoints
0x03 bInterfaceClass      (Human Interface Device Class)
0x00 bInterfaceSubClass  
0x00 bInterfaceProtocol  
0x00 iInterface

HID Descriptor:
------------------------------
0x09 bLength
0x21 bDescriptorType
0x0100 bcdHID
0x21 bCountryCode
0x01 bNumDescriptors
0x22 bDescriptorType   (Report descriptor)
0x0082 bDescriptorLength

Endpoint Descriptor:
------------------------------
0x07 bLength
0x05 bDescriptorType
0x81 bEndpointAddress  (IN endpoint 1)
0x03 bmAttributes      (Transfer: Interrupt / Synch: None / Usage: Data)
0x0008 wMaxPacketSize    (1 x 8 bytes)
0x0A bInterval         (10 frames)

Endpoint Descriptor:
------------------------------
0x07 bLength
0x05 bDescriptorType
0x01 bEndpointAddress  (OUT endpoint 1)
0x03 bmAttributes      (Transfer: Interrupt / Synch: None / Usage: Data)
0x0008 wMaxPacketSize    (1 x 8 bytes)
0x0A bInterval         (10 frames)

--------------------------------
String Descriptor Table
--------------------------------
Index  LANGID  String
0x00   0x0000  0x0409
0x04   0x0409  "Logitech Inc."
0x20   0x0409  "WingMan Force 3D"

HID descriptor

0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x04,        // Usage (Joystick)
0xA1, 0x01,        // Collection (Application)
0xA1, 0x02,        //   Collection (Logical)
0x09, 0x01,        //     Usage (Pointer)
0xA1, 0x00,        //     Collection (Physical)
0x75, 0x08,        //       Report Size (8)
0x95, 0x02,        //       Report Count (2)
0x15, 0x00,        //       Logical Minimum (0)
0x26, 0xFF, 0x00,  //       Logical Maximum (255)
0x35, 0x00,        //       Physical Minimum (0)
0x46, 0xFF, 0x00,  //       Physical Maximum (255)
0x09, 0x30,        //       Usage (X)
0x09, 0x31,        //       Usage (Y)
0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
0x09, 0x01,        //       Usage (0x01)
0x75, 0x04,        //       Report Size (4)
0x95, 0x01,        //       Report Count (1)
0x25, 0x0F,        //       Logical Maximum (15)
0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
0x25, 0x07,        //       Logical Maximum (7)
0x46, 0x3B, 0x01,  //       Physical Maximum (315)
0x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
0x09, 0x39,        //       Usage (Hat switch)
0x81, 0x42,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
0x75, 0x08,        //       Report Size (8)
0x26, 0xFF, 0x00,  //       Logical Maximum (255)
0x46, 0xFF, 0x00,  //       Physical Maximum (255)
0x09, 0x35,        //       Usage (Rz)
0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //     End Collection
0x65, 0x00,        //     Unit (None)
0x75, 0x01,        //     Report Size (1)
0x95, 0x07,        //     Report Count (7)
0x25, 0x01,        //     Logical Maximum (1)
0x45, 0x01,        //     Physical Maximum (1)
0x05, 0x09,        //     Usage Page (Button)
0x19, 0x01,        //     Usage Minimum (0x01)
0x29, 0x07,        //     Usage Maximum (0x07)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01,        //     Report Count (1)
0x81, 0x01,        //     Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x75, 0x08,        //     Report Size (8)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0x46, 0xFF, 0x00,  //     Physical Maximum (255)
0x09, 0x36,        //     Usage (Slider)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x06, 0x00, 0xFF,  //     Usage Page (Vendor Defined 0xFF00)
0x09, 0x01,        //     Usage (0x01)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //   End Collection
0xA1, 0x02,        //   Collection (Logical)
0x06, 0x00, 0xFF,  //     Usage Page (Vendor Defined 0xFF00)
0x09, 0x02,        //     Usage (0x02)
0x95, 0x08,        //     Report Count (8)
0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0,              //   End Collection
0xC0,              // End Collection

Also a mapped struct if it helps.
Analog values does not reach min/max, at least on my unity. From what I've seen most games have a way to calibrate.

typedef struct __attribute__((__packed__)) {
  uint8_t x; // left ~0x4b, middle ~0x80, right ~0xb1
  uint8_t y; // top ~0x4e, middle ~0x80, bottom ~0xb9
  uint8_t : 4;  // always 0x00 (vendor data)
  uint8_t hat : 4;
  uint8_t twist; // left ~0x75, middle ~0xcd, right 0xff
  uint8_t btn_1 : 1; // trigger button
  uint8_t btn_2 : 1;
  uint8_t btn_3 : 1;
  uint8_t btn_4 : 1;
  uint8_t btn_5 : 1;
  uint8_t btn_6 : 1;
  uint8_t btn_7 : 1;
  uint8_t : 1; // always 0 (padding?)
  uint8_t throttle; // up ~0x1b, middle ~0x66, down ~0xb5
  uint8_t unknown; // always 0x03 (vendor data)
} f3d_report_t;

Taiko Drum

It's just a ps1 digital pad. Reports as 0x41, does not support escape/config commands.
The game even detects a ps1 digital pad as a Taiko controller.
Buttons: Select, Start.
And sensors from left to right: L1, Left, Circle, R1

Jet de Go

It's mostly a dualshock but the actuators are different and it only have a single mode (analog only). Reports as 0x73.

Dpad Left and Right are always pressed.
RX always 0xFF.
Both low and high speed actuators have a zero byte parameter. They are just on/off.

Buttons: Cross, Circle, Square, Triangle, L1, R1, L2, R2, Select, Start
Main controller maps to LX and LY.
Thruster maps to RY (top=0x0, bottom=0xff)

Request commands and responses

0x45 : 0x1, 0x1, 0x0, 0x2, 0x1,0x0
0x46 (actuator 0) : 0x0, 0x0, 0x1, 0x2, 0x0, 0xA
0x46 (actuator 1) : 0x0, 0x0, 0x1, 0x1, 0x0, 0x14
0x47 : 0x0, 0x0, 0x2, 0x0, 0x1, 0x0
0x4C : 0x0, 0x0, 0x0, 0x7, 0x0, 0x0

@Florin9doi
Copy link
Contributor

Thank you

@sonik-br
Copy link

sonik-br commented Aug 5, 2024

@Florin9doi You're welcome!
The Hori FS stuff will come later when I have some time to organize all the info.

Btw, I see that you added negcon and jogcon recently. I also did those two devices but on DuckStation. Then I got stuck at trying to map the jogcon motor's to a real FFB racing wheel.
Did you get it working by any change?

@Florin9doi
Copy link
Contributor

No, I only added vibrations

@sonik-br
Copy link

sonik-br commented Aug 5, 2024

Ok.

Mine is here, if you want to take a look: https://github.com/sonik-br/duckstation/tree/jogcon

I also added a variation to the negcon that supports rumble. Not sure if it's usable on PS2 games. But a lot of PS1 games does support rumble on negcon protocol.

@sonik-br
Copy link

@Florin9doi I've just realized that my previous post about the Logitech Flight Force was missing the device descriptor. Fixed!

@sonik-br
Copy link

sonik-br commented Aug 22, 2024

HORI FlightStick 1 and 2

Some info:
Device is mostly vendor class.
It does send data on endpoint interrupt. This data consists only of the analog axis.
Host then need to query for more data. That would be the digital buttons.
FS2 contains more digital buttons than FS1, and needs a second query to grab this data. FS2 also supports rumble.
Both devices have the same unknown descriptor. In fact, they share the exact same descriptors with the only difference being bcdUSB and bcdDevice.
Digital buttons are "active low". 1=released, 0=pressed.

A lot of info came from the homebrew windows driver https://www.tamanegi.org/prog/hfsd/
I do have a FS1 device and a friend have a FS2 device. I've grabbed the descriptors from both. Can get more info / run tests on real hardware if needed.
I've used this info to recreate the device using a RP2040 and it does work on a ps2 machine.

Device descriptor

------------------------------
Device Descriptor:
------------------------------
0x12	bLength
0x01	bDescriptorType
0x0100	bcdUSB (FS1=0x0100, FS2=0x0110)
0xFF	bDeviceClass      (Vendor specific)
0x01	bDeviceSubClass   
0xFF	bDeviceProtocol   
0x08	bMaxPacketSize0   (8 bytes)
0x06D3	idVendor
0x0F10	idProduct
0x0001	bcdDevice (FS1=0x0001, FS2=0x0002)
0x00	iManufacturer
0x00	iProduct     
0x00	iSerialNumber
0x01	bNumConfigurations


-------------------------
Configuration Descriptor:
-------------------------
0x09	bLength
0x02	bDescriptorType
0x0022	wTotalLength   (34 bytes)
0x01	bNumInterfaces
0x01	bConfigurationValue
0x00	iConfiguration
0xA0	bmAttributes   (Bus-powered Device, Remote-Wakeup)
0x32	bMaxPower      (100 mA)

Interface Descriptor:
------------------------------
0x09	bLength
0x04	bDescriptorType
0x00	bInterfaceNumber
0x00	bAlternateSetting
0x01	bNumEndPoints
0xFF	bInterfaceClass      (Vendor specific)
0x01	bInterfaceSubClass   
0x02	bInterfaceProtocol   
0x00	iInterface

Unknown Descriptor:
------------------------------
0x09	bLength
0x21	bDescriptorType
Hex dump: 
0x09 0x21 0x00 0x01 0x00 0x01 0x22 0x40 0x00 

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x81	bEndpointAddress  (IN endpoint 1)
0x03	bmAttributes      (Transfer: Interrupt / Synch: None / Usage: Data)
0x0008	wMaxPacketSize    (1 x 8 bytes)
0x0A	bInterval         (10 frames)

Data from interrupt report (FS1/FS2)

struct __attribute((packed, aligned(1)))
{                          /* FlightStick 1  |  FlightStick 2 */
  uint8_t stick_x;         /* stick          |  stick (left - right, 0x00 - 0xff) */
  uint8_t stick_y;         /* stick          |  stick (top - bottom, 0x00 - 0xff)  */
  uint8_t rudder;          /* rudder         |  rudder (left - right, 0x00 - 0xff) */
  uint8_t throttle;        /* throttle       |  throttle (top - bottom, 0xff - 0x00) */
  uint8_t hat_x;           /* hat            |  hat (left - right, 0x00 - 0xff) */
  uint8_t hat_y;           /* hat            |  hat (top - bottom, 0x00 - 0xff) */
  uint8_t button_a;        /* triangle       |  button A (press - press, 0x00 - 0xff) */
  uint8_t button_b;        /* square         |  button B (press - press, 0x00 - 0xff) */
};

Data from vendor query 0x00 (FS1/FS2)

struct __attribute((packed, aligned(1)))
{                         /* FlightStick 1  |  FlightStick 2 */
  uint8_t fire_c    : 1;  /* button select  |  button fire-c */
  uint8_t button_d  : 1;  /* 0x1            |  button D */
  uint8_t hat_btn   : 1;  /* hat press      |  hat press */
  uint8_t button_st : 1;  /* button start   |  button ST */
  uint8_t hat1_U    : 1;  /* d-pad top      |  d-pad 1 top */
  uint8_t hat1_R    : 1;  /* d-pad right    |  d-pad 1 right */
  uint8_t hat1_D    : 1;  /* d-pad bottom   |  d-pad 1 bottom */
  uint8_t hat1_L    : 1;  /* d-pad left     |  d-pad 1 left */

  uint8_t reserved1 : 4;  /* 0xf            |  0xf */
  uint8_t reserved2 : 1;  /* 0x1            |  0x1 */
  uint8_t launch    : 1;  /* button lauch   |  button lauch */
  uint8_t trigger   : 1;  /* trigger        |  trigger */
  uint8_t reserved3 : 1;  /* 0x1            |  0x1 */
};

Data from vendor query 0x01 (FS2 only. FS1 reports all bits set)

struct __attribute((packed, aligned(1)))
{                          /* FlightStick 1  |  FlightStick 2*/
  uint8_t reserved4   : 4; /* 0xf            |        0xf */
  uint8_t hat3_right  : 1; /* 0x1            |        d-pad 3 right */
  uint8_t hat3_middle : 1; /* 0x1            |        d-pad 3 middle */
  uint8_t hat3_left   : 1; /* 0x1            |        d-pad 3 left */
  uint8_t reserved5   : 1; /* 0x1            |        0x0 */

  uint8_t mode_select : 2; /* 0x3            |        mode select (M1 - M2 - M3, 2 - 1 - 3) */
  uint8_t reserved6   : 1; /* 0x1            |        0x1 */
  uint8_t button_sw1  : 1; /* 0x1            |        button sw-1 */
  uint8_t hat2_U      : 1; /* 0x1            |        d-pad 2 top */
  uint8_t hat2_R      : 1; /* 0x1            |        d-pad 2 right */
  uint8_t hat2_D      : 1; /* 0x1            |        d-pad 2 bottom */
  uint8_t hat2_L      : 1; /* 0x1            |        d-pad 2 left */
};

Vendor query in tusb format. Should be easy to understand and convert
Set bRequest to either 0x00 or 0x01 to query the extra reports.
Device returns 2 bytes.

uint8_t txbuf[2] = {0xff, 0xff};

tusb_control_request_t const request = {
    .bmRequestType_bit = {
        .recipient = TUSB_REQ_RCPT_INTERFACE,
        .type      = TUSB_REQ_TYPE_VENDOR,
        .direction = TUSB_DIR_IN
    },
    .bRequest = reportnumber, // 0x00 or 0x01
    .wValue   = 0,
    .wIndex   = 1,
    .wLength  = sizeof(txbuf)
};
tuh_xfer_t xfer = {
    .daddr       = dev_addr,
    .ep_addr     = 0, // control endpoint
    .setup       = &request,
    .buffer      = txbuf,
};

Set rumble (FS2 only).
Single byte with rumble force.
This was not extensively tested as I don't have physical access to a FS2 device.

uint8_t txbuf[1] = {force};

tusb_control_request_t const request = {
    .bmRequestType_bit = {
        .recipient = TUSB_REQ_RCPT_INTERFACE,
        .type      = TUSB_REQ_TYPE_VENDOR,
        .direction = TUSB_DIR_OUT
    },
    .bRequest = 0x0c,
    .wValue   = 0,
    .wIndex   = 1,
    .wLength  = 1
};
tuh_xfer_t xfer = {
    .daddr       = dev_addr,
    .ep_addr     = 0, // control endpoint
    .setup       = &request,
    .buffer      = txbuf,
};

@Florin9doi let me know if you need any other info.

EDIT: Fix typo in bcdUSB field.

@F0bes F0bes added FR: Awaiting Consideration The feature request is awaiting a team members consideration. and removed FR: Awaiting Consideration The feature request is awaiting a team members consideration. labels Sep 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests