protonscr

Virpil controller support

protonclosed
ValveSoftware/Proton#6839 · opened 2023-06-10 by cyb3rd4d · updated 2026-02-21 · 65 comments · github
2 matching comments, n / p to jump
Ccyb3rd4d 2023-06-10 github

Hello dear Proton community

I recently bought a Virpil controller (a Constellation Alpha) and it was recognized as a game pad by my Steam games (Elite Dangerous and Star Wars Squadrons). I tried a lot of different versions of Proton with those games, official, experimental and also from GE.

I was pretty sure that was a Proton (or at least a Steam) issue, and not a Wine issue, because my controller works in Star Citizen that I run through Lutris. I only had to open the wine control panel for my game, run the game controllers settings and move my controller from the xinput section to the "connected" one (the first section of the window settings).

But for my Steam games, I tried a lot of things I found on wine forums, Reddit etc... mainly tweeking regedit keys with no luck, until I found this post: https://www.reddit.com/user/xatrekak/comments/12hnz0d/fixing_vkb_and_virpil_hotas_running_on_linux/ which fixed my issue.

Here is the content of the post:

So there is an issue with the VIRPIL and VKB products being detected as xbox controllers when Running them on Linux, particularly with Elite: Dangerous. Here is how I fixed it.

After weeks of trouble shooting this is the workarounds that I came up with. Hopefully this helps.

This is the standard documented fix:

Open regedit in your WINEPREFIX

Navigate to HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\winebus

Create a new DWORD named "Enable SDL" with value 0

Create a new DWORD named "Map Controllers" with value 0

In theory the two values above should prevent wine from mapping your devices to xinput. In my experience this alone does not resolve the problem, so if you still have issues then we need to remove every trace of xinput from the registry without completely nuking the controller (which is what happens when you indiscriminately delete the PID/VID entries from the registry) so also complete the following steps:

Navigate to HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\WINEXINPUT

Delete every folder heading under this

Navigate to HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\WINEBUS

Expand every heading that matches the VID/PID of your HOTAS (execute lsusb from the terminal to find your VID/PID)

you should see a long ass folder with a name similar to 273&03000000443300009043000011010000&0&0

Change these key values

Name "Service": change the data from xinput -> winehid

Name "DeviceDesc": change the data from: Wine XInput compatible device -> Wine HID compatible device

Name "CompatiableIds": The data field is a multi line input field. delete everything except: WINEBUS\WINE_COMP_HID

Here are some other things related to my setup that some people have found to be necessary and some have had luck without needing:

Running from lutris instead of though Steam/proton

wine version >= lutris-GE-Proton7-27-x86_64

I didn't had to run the game through Lutris though. After applying the regedit changes, my controller axes and buttons became available in the Elite Dangerous settings.

I really hope this feedback will be useful to improve the Proton support of Virpil controllers.

Kkisak-valve maintainer 2023-06-10 github

Hello @cyb3rd4d, the workaround you've shared is a pretty strong hint that your issue is with libSDL not knowing about your controller, not Proton.

Bypassing libSDL is not a practical option to improve support for your device. Instead, take a look at how your controller interacts with SDL's test utilities and maybe a native Linux game that uses SDL for controller input, see how it behaves, and file an upstream issue report with libSDL with your findings.

Ccyb3rd4d 2023-06-10 github

Hello @kisak-valve, thank you for your reply!

I just installed the packages sdl-jstest and sdl2-jstest from the AUR and I tested my joystick with those two utilities, the buttons and the axes behaves correctly.

I also forgot to mention that my joystick works out of the box on Windows in Elite Dangerous.

Kkakra 2023-08-29 github

Do you guys have VID/PIDs of the Virpil controller so I could add it to my PR https://github.com/ValveSoftware/wine/pull/197?

Ccyb3rd4d 2023-08-30 github

Thank you @kakra, I found 3344:412f

❯ lsusb
Bus 001 Device 004: ID 3344:412f Leaguer Microelectronics (LME) R-VPC Stick MT-50CM2
Kkakra 2023-08-30 github

To make it work, try the following steps (replace 0x3344/0x412F by your specific USB device ID):

  1. Make sure, the wine-proton prefix isn't running (stop the game)
  2. In the game properties, change your launch options to PROTON_ENABLE_HIDRAW=0x3344/0x412F %command%
  3. Go to the compatdata directory of the affected game and create a backup of pfx/system.reg at some other location
  4. Open pfx/system.reg in a text editor and remove all whole sections which contain values or names with these:
    • lines containing both vid_3344 and pid_412f
    • lines containing both VID_3344 and PID_412F

Ensure that you have deployed udev rules for your controller. You should find a file in /etc/udev/rules.d containing something like these:

# Leaguer Microelectronics (LME) R-VPC Stick MT-50CM2
KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="412f", MODE="0660", TAG+="uaccess"

(if not, create 60-steam-input.rules with those lines and reboot)

Now start the game: Your Virpil should now be properly detected.

If this works, I'll add your controller to my list of patches.

Kkakra 2023-08-30 github

Thank you @kakra, I found 3344:412f

Do you have just one stick and this is the right grip? Or is it a compound device having both throttle and joystick combined into a single USB device?

Ccyb3rd4d 2023-08-31 github

It's not a compound device, just a base (MongoosT-50CM2) and a grip (Constellation ALPHA-R).

To make it work, try the following steps:

Can you wait until Saturday or Sunday? I don't have a lot of free time during the week.

Ccyb3rd4d 2023-09-02 github

OK I followed your procedure, I just uninstall the game and reinstalled it before just to make sure to have a clean environment. The Proton version I used is 8.0-3.

The udev rule did not exist so I created the file and I rebooted before launching the game, my Virpil was detected with all its buttons and axes! THANK YOU SO MUCH!!!

But isn't it too restrictive to target my product ID to determine if it's a Virpil controller? Shouldn't we only target the vendor ID?

Kkakra 2023-09-02 github

But isn't it too restrictive to target my product ID to determine if it's a Virpil controller? Shouldn't we only target the vendor ID?

Yeah it is restrictive but OTOH, what if Virpil made other type of devices, too, which should not be handled in that way? It probably needs a more generic approach, like looking at the HID descriptor itself and identifying some common traits of the controller, i.e., my VKB has 128 buttons in the descriptor. So if it would be the VKB VID with 128 buttons, we could say it's a joystick. This may be oversimplified but I think one gets the idea.

For the moment, it would be useful to also know the PID if the left grip. Any chance you could get that from somewhere, maybe a friend?

Sstoertebecker 2023-09-02 github

I just received my Constellation Alpha-R and a WarBRD-D Base from Virpil and was following the instuctions here. Creating a udev rule and adding the PROTON_ENABLE_HIDRAW environment variable did the trick, my joystick works perfectly fine with proton 8 in DCS World (haven't tried other games yet). Thank you very much for this info :)

Playing around with the virpil software, i noticed something: the device got a new product ID several times.
I'm not 100% sure anymore but i think first time it happened when i created a new profile for it, second time when i did the firmware update and a third time when i tried the "split by 32 buttons" option on the profile page in the software. Again, not 100% sure but on this third time it might have changed to the ID that it had in the beginning.

This 32 button split option says that this could help if a game doesn't understand input devices with more than 32 buttons. I'm not sure what it is supposed to do tho. Sounds like it would split the device into several virtual 32 button devices maybe?

The Vendor ID stays the same tho (3344).

Anyways... since my device did change the PID i doubt that checking the PID is a good option (maybe cyb3rd4d can confirm this change of the product ID if you play around in the virpil software?).

I only have this Virpil device but i doubt that Virpil has any devices that should act like an xbox controller. But i also don't know if it would be a good idea to simply enable HIDRAW on all devices with VID 3344.

Kkakra 2023-09-02 github

This 32 button split option says that this could help if a game doesn't understand input devices with more than 32 buttons. I'm not sure what it is supposed to do tho. Sounds like it would split the device into several virtual 32 button devices maybe?

See here: https://github.com/ValveSoftware/wine/pull/197

What the split does is creating a compound device of four individual input devices. Linux still sees it as a single device because the kernel doesn't implement compound devices for generic HID drivers but because Proton wine handles the raw HID devices, it should properly pass through to the game which see four joysticks then each with 32 buttons.

I only have this Virpil device but i doubt that Virpil has any devices that should act like an xbox controller. But i also don't know if it would be a good idea to simply enable HIDRAW on all devices with VID 3344.

I'm not sure where the problem comes from. I think it's SDL which forces wine into making it an XInput device which in turn makes games see it as an Xbox controller.

How many buttons does Virpil create?

Sstoertebecker 2023-09-02 github

How many buttons does Virpil create?

It comes with 6 axis and 31 buttons and this is also what is setup in the default profile and also what windows sees.

The software allowes to set up 6 more axis and up to 128 buttons in total. If you configure some of those extra buttons, the "Game Controller Settings" of windows shows only one buttons more (then 32, i guess this is just a limitation of that UI tho) but the virpil tester thing sees all extra buttons that are configured.

Kkakra 2023-09-02 github

Do both show devices show 31 buttons? This makes it a bit difficult to make it generic. I've changed VKB detection now to detect 128 buttons and the VID, and fall back to PID if there are not 128 buttons. But for Virpil? Should we go with 31 buttons? Or 128?

Sstoertebecker 2023-09-02 github

Yes, with the default profile it shows 31 buttons in both, the virpil tester and the windows controller settings.
In the input device section of manjaro system settings (KDE) it also shows 31 buttons.

The actual name of the device can also be changed in the software. Funny thing is: even the VID and PID can be customized in the software (still don't understand why it randomly changes the PID even if i don't touch that field). I doubt that anyone would ever change that but theoretically, not even the vendor ID is a constant thing with this device.

I actually do think that checking only for VID 3344 is probably the most "plug and play" way for virpil stuff. I still think that other virpil devices should be tested first. I unfortunately don't know anyone with virpil stuff tho.

Kkakra 2023-09-02 github

I actually do think that checking only for VID 3344 is probably the most "plug and play" way for virpil stuff. I still think that other virpil devices should be tested first. I unfortunately don't know anyone with virpil stuff tho.

I've changed the logic: https://github.com/ValveSoftware/wine/pull/197/commits/d4112edb7130700fb09902537be91490ebedcf14

For the udev rules, it should be fine to just compare the VID.

Ccyb3rd4d 2023-09-03 github

Anyways... since my device did change the PID i doubt that checking the PID is a good option (maybe cyb3rd4d can confirm this change of the product ID if you play around in the virpil software?).

I tried to enable the "split by 32 buttons" option but that did not change the PID. Changing some other things in the customization tool neither. I'm on the latest firmware version so I could not try to update it.

Kkakra 2023-09-27 github

I tried to enable the "split by 32 buttons" option but that did not change the PID. Changing some other things in the customization tool neither. I'm on the latest firmware version so I could not try to update it.

I think for Elite Dangerous to see the virtual devices, they really need to appear as a different PIDs. So that may be why you can change the PID. I think VKB has a similar thing. If VID/PID is identical, Elite Dangerous sees just one device. People who buy two identical joysticks for twin-stick see the same problem: ED sees just one joystick, and you need to get external tools which can create virtual joysticks.

TTwoD 2023-11-09 github

I've got two Alphas (L&R) with Warbird bases, and soon also the throttle. In case you need help testing something just ping me. (I saw some USB PID was requested earlier but not in a position to get that right now, will try later).

Currently I have to follow a guide to do registry hacks (probably similar to those linked earlier) ad purge anything xinput related and change that to sdl, as well as turn off xinput checking in the new launcher on every startup, just to not have it think the jousticks are gamepads. And, it only starts at all using an old GE version. And, ED has a tendency to forget mappings...

Getting ED to launch/run smoother is very interesting to me.

I have not needed to use the "splitting" trick to use all buttons on both sticks so far, but I also didn't set them up any special way in their configuration tool (under Windows as I does not detect the sticks in Linux).

Kkakra 2023-11-09 github

And, ED has a tendency to forget mappings...

Find your Custom.4.0.binds file in the options folder, then copy that file to a new name (keep the same extension, e.g. name it Virpil.4.0.binds), then open the file and adjust the xml tag to the same name ( PresetName="Virpil"). Now, ED will remember your settings, you can always pull them from the drop down in-game. But it won't show the preset, if one device saved in it goes missing. You can, however, adjust/fix the USB IDs in that file to get it back to working - if those change for whatever reason.

Kkakra 2023-11-14 github

Getting ED to launch/run smoother is very interesting to me.

@TwoD Using Proton Experimental should fix it for you, no more registry hacks needed.

TTwoD 2023-11-16 github

@kakra Thanks for your suggestions.

I updated Proton Experimental 15 minutes ago, but no luck. The sticks are still detected as gamepads, even if turning off the Xinput check in the launcher. At least it launches with Experimental, which it didn't do when I wrote my previous comment.

I can not get renaming the bindings to work, "Virpil" does not show up in game and "Custom" is back to defaults (but it doesn't write a new one to disk as I haven't saved the config yet).
Both sticks are connected and with the same USB ids (3344:80CC for left and 3344:40CC for right) as before, and the XML looks correct. I've tried this a couple of times before and never got it to recognize the new files.
Usually when there's an issue with that file it dumps a logfile, but it doesn't even do that.
I'll verify all files and make sure I'm really updated and try again after work.

On a happier note, my throttle just arrived so now I can help test with that. I have not set it up in-game yet or done anything to it other than seeing if it gets picked up in Wine correctly, and it does, including all 40+ buttons. It shows up as Bus 001 Device 090: ID 3344:0000 Leaguer Microelectronics (LME) VPC Throttle MT-50CM3.

Kkakra 2023-11-16 github

I can not get renaming the bindings to work, "Virpil" does not show up in game and "Custom" is back to defaults (but it doesn't write a new one to disk as I haven't saved the config yet).

If you rename custom bindings, two conditions must be met:

  1. The renamed profile must have the filename (excluding extensions) matching the profile name in the XML file. If not, the game mixes and mismatches profile files.
  2. Devices for all bound buttons, key, and axes must be present. If some device is missing, the game won't offer the profile in the dropdown. In your case, this probably happens because the game does not see the USB ID but sees xinput devices instead which it matches to a virtual ID "GAMEPAD" (if I remember right) instead.

Could you run with PROTON_LOG=1 and attach the resulting log file?

TTwoD 2023-11-16 github

I verified my bindings file is named "Virpil.4.0.binds" and the second line is <Root PresetName="Virpil" MajorVersion="4" MinorVersion="0">.

Made sure only the two sticks are connected My bad, the throttle was still connected in case that matters.
I only have buttons bound for the stick and the keyboard and mouse.
Started the game, went straight through the launcher without turning off xinput, waited for it to build the GPU profile (which it does almost every launch), moved my cursor away and back to the game - which I noticed generated a few ui-log lines but nothing important - clicked through the intros and went into flight control settings. Virpil does not show up.
steam-359320.log

I just realized I may still have the registry changes in place, which probably messed up xinput. Any idea how to restore them?
I'll try deleting them entirely and see what happens since it's still broken for me anyway.

Edit: I completely removed the 359320 Wine/Proton prefix and restarted the game with just the sticks plugged in.
Everything still acts like a gamepad.
steam-359320_fresh.log
Turned off xinput check in the launcher, same thing.
steam-359320_no_xinput.log
Just to be clear, I did not do anything else to this prefix like add in old bindings or any changes in regedit.
My launch options are just PROTON_LOG=1 __GL_b5f2b3=0xFFFFFFFF %command%, due to an earlier nbidia bug.

Kkakra 2023-11-17 github

The nvidia bug workaround is no longer needed, it has been fixed in 535 or something.

Sorry, I just realized this log doesn't contain the needed lines. Please try WINEDEBUG=+hid,+plugplay,+dinput,+xinput,+setupapi (PROTON_LOG not needed in that case). A patch by Valve should fix the driver caching so the wine xinput driver would not kick in even if previously the joystick would have registered as xinput. Let's see what the log says.

After we found some hints in the log, you can try removing the broken driver entries from the registry as described in https://github.com/ValveSoftware/Proton/issues/6839#issuecomment-1698869486.

TTwoD 2023-11-17 github

I don't get a log at all with that environment variable, unless it gets placed somewhere else when not using PROTON_LOG.
Btw, when I get there, does PROTON_ENABLE_HIDRAW accept multiple ids? As the left/right sticks are different...
I think I need to call it a night. Thanks again for your help!

TTwoD 2023-11-17 github

Noticed that if you set PROTON_LOG to something other than 1 it appends it to WINEDEBUG so I just used PROTON_LOG=+hid,+plugplay,+dinput,+xinput,+setupapi instead and obtained this log (just from the launcher).
steam-359320_gamepad.log

I then tried the method above, adding this to /etc/udev/rules.d/60-steam.rules

# Leaguer Microelectronics (LME) R-VPC Stick WarBRD (Constellation ALPHA-R [SKU VPC-0009-R]  on a WarBRD base [SKU VPC-106])
KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="40cc", MODE="0660", TAG+="uaccess"

# Leaguer Microelectronics (LME) L-VPC Stick WarBRD (Constellation ALPHA-L [SKU VPC-0009-L]  on a WarBRD base [SKU VPC-106])
KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="80cc", MODE="0660", TAG+="uaccess"

# Leaguer Microelectronics (LME) VPC Throttle MT-50CM3 [SKU VPC-201-003]
KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="0197", MODE="0660", TAG+="uaccess"

Then I purged the registry of old references to the controllers as described in your comment earlier, retriggered udev, and replugged the devices just to be sure.
Lastly, I added PROTON_ENABLE_HIDRAW=0x3344/0x0197,0x3344/0x40cc,0x3344/0x80cc as a launch option.
Before this I had not set up the throttle in Windows using the VPC software, so it was reporting ProductID 0000.
Then it was acting like a joystick/gamepad hybrid, but it was a partial success as both the sticks were once again working correctly!
steam-359320_partial_truncated.log

The sticks are now correctly detected and functional as joysticks, and the "Virpil" bindings can be applied.
After messed around some more with the throttle in Windows and creating profiles for it using the VPC Configuration Tool it was a complete success! (No log of that yet)

Configured as just the MongoosT-50CM3 (No Mode modifier) profile, it gets a ProductID 0198.
If I set it to left handed, it becomes 8198.
If I set it to right-handed it becomes 4198 (Yep, that matches the 8 and 4 on the L/R Alpha).
If I set it to have "5-Way Mode modifier" (allows dynamic remapping of all of the buttons at runtime via a 5-way selector) and don't select right/left handedness, the PID is now 0197. (R/L handedness still changes the first digit the same way.)
This is the profile I want to use, and I have enabled "Split by 32 buttons", which allows using them all in ED.

Btw, I have the same Constellation Alpha R grip that cyb3rd4d uses, but a different base. I noticed the PR which got merged just called it a Constellation Alpha.
Both bases are compatible with all grips, but we have completely different USB product ids, suggesting the id is a combination of the two. There is also a newer WarBRD-D base (SKU VPC-106-001) as the original WarBRD I have is no longer sold. These likely produce PID permutations in a similar way, but I don't know if I can figure them all out without actually having them. Either way, I guess correctly identifying Virpil devices got a bit more complicated.

Ugh, final edit for tonight... I just updated the firmware on the sticks after all this. Both changed to be PID 80cb for a while. Then I recreated the profile on the right stick and it keeps changing between 80cb and 40cb and c0cb even with the same settings. Fun times....

AArsenCross 2024-06-02 github

Replying to https://github.com/ValveSoftware/Proton/issues/6839#issuecomment-1698869486

I have followed these instructions and was able to get my right stick to be recognized (In Elite) so 3344/412f is working as expected now. After following the directions I noticed the left stick still doesn't work so I replicated the steps for the Left stick which is the 3344:812c:

Bus 005 Device 004: ID 3344:812c Leaguer Microelectronics (LME) L-VPC Constellation Alpha-L
Bus 005 Device 014: ID 3344:412f Leaguer Microelectronics (LME) R-VPC Stick MT-50CM2

I also added a second copy of the entry for /etc/udev/rules.d/60-steam-input.rules file for the second stick, 812c (Alpha-L). but the Alpha-L is still being recognized as a gamepad.

I was wondering if you had any advice on how to fix this.

Edit: I have Virpil Alpha L & R sticks, Pedals and the CM2 throttle with the firmware set up as a compound device. I'm willing to assist with testing/data gathering/etc for patches.

Kkakra 2024-06-02 github

@ArsenCross Try running with:

PROTON_ENABLE_HIDRAW=0x3344/0x812C,0x3344/0x412F SDL_JOYSTICK_HIDAPI=0 %command%

It prevents SDL from picking up the joystick, and instead the HID driver in wine will use it. This needs proper udev rules to allow access to the devices (you probably already installed those).

If this works, wine is probably missing the USB ID of your left stick.


@kisak-valve Update: yeah, it's missing:

https://github.com/ValveSoftware/wine/blob/a8514f9606ee3fdc3d912c988f651edc5d7d0d55/dlls/winebus.sys/unixlib.c#L123-L133:

static BOOL is_virpil_controller(WORD vid, WORD pid, INT buttons)
{
    if (vid != 0x3344) return FALSE;


    /* comes with 31 buttons in the default configuration, or 128 max */
    if ((buttons == 31) || (buttons == 128)) return TRUE;


    /* if customized, arbitrary amount of buttons may be shown, decide by PID */
    if (pid == 0x412f) return TRUE; /* Virpil Constellation ALPHA-R */
    return FALSE;
}
AArsenCross 2024-06-03 github

PROTON_ENABLE_HIDRAW=0x3344/0x812C,0x3344/0x412F SDL_JOYSTICK_HIDAPI=0 %command%

@ArsenCross Try running with:

PROTON_ENABLE_HIDRAW=0x3344/0x812C,0x3344/0x412F SDL_JOYSTICK_HIDAPI=0 %command%

It prevents SDL from picking up the joystick, and instead the HID driver in wine will use it. This needs proper udev rules to allow access to the devices (you probably already installed those).

If this works, wine is probably missing the USB ID of your left stick.

Adjusting the launch options worked. All the previous changes following your steps were left in place and I only adjusted to the new launch options you provided above.

Looks like my throttle unit also isn't bindable (hadn't even tried it yet) as it's also being currently seen as two separate xInput controllers. However based on the steps you've given here I'll repeat them again when I have more time to identify the device from lsusb as the name for the throttle with it being set up as a compound device isn't easily identifiable with the amount of devices I have.

I'll comment here when I get around to that one whether the steps work or not. Thank you @kakra, very very much, for your assistance here.

TTwoD 2024-06-03 github

@ArsenCross You can use dmesg -w as root to see what it identifies as when you plug it in. Note that I had weird issues with my throttle id before setting it up as you can probably see earlier in the thread, so just keep that in mind.

AArsenCross 2024-06-05 github

@kakra I'm having issues with the throttle unit. I have it recognized following this method however only half of it is working. I assume it has something to do with the fact that the throttle is set up as a compound device split for the 32-button limits. When I use dmesg -w as suggested by @TwoD (thanks, that was new to me and helpful) I see both inputs listed under the device:

[   10.972274] usb 5-2.3: new full-speed USB device number 14 using xhci_hcd
[   11.096353] usb 5-2.3: New USB device found, idVendor=03eb, idProduct=2055, bcdDevice= 0.01
[   11.096357] usb 5-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   11.096359] usb 5-2.3: Product: VPC Throttle MT-50 CM2
[   11.096361] usb 5-2.3: Manufacturer: ATMEL/VIRPIL/200325
[   11.268488] input: ATMEL/VIRPIL/200325 VPC Throttle MT-50 CM2 as /devices/pci0000:00/0000:00:08.1/0000:0c:00.3/usb5/5-2/5-2.3/5-2.3:1.0/0003:03EB:2055.000C/input/input32
[   11.268568] input: ATMEL/VIRPIL/200325 VPC Throttle MT-50 CM2 as /devices/pci0000:00/0000:00:08.1/0000:0c:00.3/usb5/5-2/5-2.3/5-2.3:1.0/0003:03EB:2055.000C/input/input33

However despite them both being 03EB/2055 only one of the two devices is being detected. The one being detected is being registered as a joystick and is bindable as direct input as expected - the other "device" however isn't even registering as a game pad in the game, button presses during binding attempts simply don't register anything at all.

Edit: The more I fool around with this the more I think I'm going to have to update the throttles configuration to be a single device instead of compound device. This is doable mostly because Elite now supports more than 32 buttons however I'm concerned about doing it for other games I may not be aware of still having that old limitation. I was also kind of hoping to see if I could import my bindings file from windows to restore the hours and hours worth of configuration tweaking without doing it again. However I can't get the device to pass through to the VPC Configuration Tool to reflash the firmware into single device mode and have no windows computer now. lol

Kkakra 2024-06-05 github

@ArsenCross Some games, e.g. Elite Dangerous, cannot handle two separate devices on the same device ID. Using the software to split the device should also allow you to change the device ID of the second device. Change it from 03EB/2055 to 03EB/2056, don't change 03EB (it's the vendor ID). Adjust your rules and environment variables. It should work then.

I'll prepare a patch to recognize VID 03EB with exactly 32 buttons so it will be handled in Proton without env variable - but you'll still need to set the ID in your device using the programming software.

BTW: It should work if you set both your compounds to 128 buttons. Elite doesn't care about how many buttons a device has. The problem was: It could only handle the first 32 buttons. Currently, Proton wine makes Virpil devices with 128 buttons to be a throttle or joystick. But I'll change that to support 32/50/64 buttons as a heuristic, too (e.g. I think Star Citizen supports 50 or 64 buttons max).

Kkakra 2024-06-05 github

I was also kind of hoping to see if I could import my bindings file from windows to restore the hours and hours worth of configuration tweaking without doing it again.

Off-topic, but yes, that is totally possible. Just drop your old binding files into the new installation. It's stored in your Windows profile folder. If you didn't rename it, the file is called "custom.4.0.binds" if I remember correctly. To prevent overwrite on customizations, rename the "custom" part of the file name to, e.g. "virpil" or "myconfig", then open the file and replace the name in the XML, too. That way, you'll get a custom named profile in ED which won't be overwritten.

You can also replace the USB IDs in that file to make ED detect the old mappings.

Kkakra 2024-06-05 github

@ArsenCross I submitted a series of patches to better support your controllers out-of-the-box. See https://github.com/ValveSoftware/wine/pull/240.

AArsenCross 2024-06-05 github

@ArsenCross Some games, e.g. Elite Dangerous, cannot handle two separate devices on the same device ID.
... snipped...
Elite doesn't care about how many buttons a device has.

That's actually a relatively recent change with Elite. Elite is actually the reason my throttle is configured to be a compound device right now so unless they removed functionality when they added support for direct input devices with more than 32 buttons I find it unlikely Elite is the cause.

As I was writing this I went on a ramble that caused me to do some further testing and MWO which I've also used the devices in is not seeing the compound devices second set of buttons either. The same was true for the official VPC Tester software when I was trying it last night after I had made my post.

I think my solution is going to be to reflash the firmware on the throttle into a single device however I'm roadblocked by the inability to pass through the device through to Wine or my Windows VM. That however is not a problem for this thread.

Edit: Didn't see this...

@ArsenCross I submitted a series of patches to better support your controllers out-of-the-box. See ValveSoftware/wine#240.

That's amazing and you're awesome @kakra.

Edit2: A side note, the compound device's second half tested I mentioned - MWO of course was launched and tested through steam (with the same launch options as Elite) but the VPC Tester software was installed to my machine with Wine and tested without the aid of steam compatibility programming. If that tells you anything useful.

Kkakra 2024-06-06 github

@ArsenCross The changes have been merged to bleeding edge Proton, so you can try it out in a few hours by switching your Proton beta choice to bleeding edge.

LLucyDemooon 2024-06-22 github

3344:40d4 VPC Constellation ALPHA Prime [R]

Kkakra 2024-06-22 github

3344:40d4 VPC Constellation ALPHA Prime [R]

How many buttons does it have according to evtest?

LLucyDemooon 2024-06-26 github

32 buttons

> Event type 1 (EV_KEY)
>     Event code 288 (BTN_TRIGGER)
>     Event code 289 (BTN_THUMB)
>     Event code 290 (BTN_THUMB2)
>     Event code 291 (BTN_TOP)
>     Event code 292 (BTN_TOP2)
>     Event code 293 (BTN_PINKIE)
>     Event code 294 (BTN_BASE)
>     Event code 295 (BTN_BASE2)
>     Event code 296 (BTN_BASE3)
>     Event code 297 (BTN_BASE4)
>     Event code 298 (BTN_BASE5)
>     Event code 299 (BTN_BASE6)
>     Event code 300 (?)
>     Event code 301 (?)
>     Event code 302 (?)
>     Event code 303 (BTN_DEAD)
>     Event code 704 (BTN_TRIGGER_HAPPY1)
>     Event code 705 (BTN_TRIGGER_HAPPY2)
>     Event code 706 (BTN_TRIGGER_HAPPY3)
>     Event code 707 (BTN_TRIGGER_HAPPY4)
>     Event code 708 (BTN_TRIGGER_HAPPY5)
>     Event code 709 (BTN_TRIGGER_HAPPY6)
>     Event code 710 (BTN_TRIGGER_HAPPY7)
>     Event code 711 (BTN_TRIGGER_HAPPY8)
>     Event code 712 (BTN_TRIGGER_HAPPY9)
>     Event code 713 (BTN_TRIGGER_HAPPY10)
>     Event code 714 (BTN_TRIGGER_HAPPY11)
>     Event code 715 (BTN_TRIGGER_HAPPY12)
>     Event code 716 (BTN_TRIGGER_HAPPY13)
>     Event code 717 (BTN_TRIGGER_HAPPY14)
>     Event code 718 (BTN_TRIGGER_HAPPY15)
>     Event code 719 (BTN_TRIGGER_HAPPY16)

Kkakra 2024-06-27 github

32 buttons

Then it should be automatically be detected by https://github.com/ValveSoftware/wine/commit/991ad981d7b445ff49a211c1fe1e102456a2ac2e.

RRavenX8 2024-07-19 github

32 buttons

Then it should be automatically be detected by ValveSoftware/wine@991ad98.

When flashing a Virpil device with new firmware, it by default changes the PID to a random value. For example my right CM2 stick is VID:3344 and PID:4138. It wouldn't be caught by the patch because I have it configured as 60 buttons.

Kkakra 2024-07-19 github

When flashing a Virpil device with new firmware, it by default changes the PID to a random value. For example my right CM2 stick is VID:3344 and PID:4138. It wouldn't be caught by the patch because I have it configured as 60 buttons.

That's correct. I wonder if we can hint something via a udev tag @rbernon?

OTOH, @RavenX8 can't you just configure 128 buttons without assigning anything above 60? Or 64 buttons at least...

RRavenX8 2024-07-19 github

@kakra From what I can tell, to set it to 128 buttons, you would actually have to assign all 128 logical buttons to a physical button on the stick before the flashing process would actually report them.

Honestly setting up just an extra 30 buttons was a pita since you have to set them manually, I can't imagine doing 96 extra after updating the FW. (the firmware update tool does have the ability to export your button config but I have had trouble using it in the past so I usually just reconfigure my buttons every time I update the FW)

Kkakra 2024-07-19 github

So this is different from VKB where I set the amount of buttons reported by HID, and then can assign physical buttons to the slots or leave them empty? VKB would report 128 buttons, but would I would only assign part of it.

AArsenCross 2024-07-23 github

@ArsenCross The changes have been merged to bleeding edge Proton, so you can try it out in a few hours by switching your Proton beta choice to bleeding edge.

Sorry I'm so late chiming in. Was awhile before I could touch games again. I'm running the game in Proton Experimental and my Constellation L & R sticks are both detected in the game, bindable and flyable. This was tested with a fresh installation of Elite to ensure the file tampering was reversed.

Thank you for the fix.

I do still have 03EB2055 failing to detect by Elite (The other side of the compound device being 03EB2065) which is one of the two compound devices for the CM2 throttle unit in the compound device configuration. I think this ID being included should take care of the throttle in compound device configuration.

I've had some other issues with bindings being lost by Elite after several restarts of the game but I'm not sure if it was a device disconnect or a problem with the game itself retaining the files. I've done no actual analysis as to why this happened yet but it did result in my initial rebinding process being wiped. I'll chime in if I have any worthwhile input on it.

Kkakra 2024-07-23 github

I've had some other issues with bindings being lost by Elite after several restarts of the game but I'm not sure if it was a device disconnect or a problem with the game itself retaining the files. I've done no actual analysis as to why this happened yet but it did result in my initial rebinding process being wiped. I'll chime in if I have any worthwhile input on it.

Never ever touch the bindings in game if not all devices that are part of the custom bindings are connected. Otherwise it will wipe the missing devices away. You can copy the custom.4.0.binds to a different name (e.g., mysettings.4.0.binds), then open it in the text editor and replace the custom name in the xml element with your file name (that is, mysettings in this example). It will then appear as a fixed item in the drop down of the game settings.

I do still have 03EB2055 failing to detect by Elite (The other side of the compound device being 03EB2065)

Okay, I can suggest another change. Can you lsusb the device so we can give it a name in the code comments? Thank you for confirming that the previous changes do work for you.

AArsenCross 2024-07-23 github

Okay, I can suggest another change. Can you lsusb the device so we can give it a name in the code comments? Thank you for confirming that the previous changes do work for you.

Yes, yes I can:
Bus 005 Device 015: ID 03eb:2055 Atmel Corp. VPC Throttle MT-50 CM2
Bus 005 Device 037: ID 03eb:2065 Atmel Corp. LUFA Test and Measurement Demo Application

Also yeah, I do have several binding files and I copy from backup as needed. I even have a no-stick binding for what I consider to be "standardized" controls for KB/M bringing it more in line with what you'd expect if you came form a background of growing up on space games, shooters and the like.

Part of my last response was the result of testing performed with the bindings profiles and matching the entries on a freshly populated "BindingLoadingErrors.log" which let me confirm in writing that Elite wasn't able to detect that device.

Kkakra 2024-07-23 github

When flashing a Virpil device with new firmware, it by default changes the PID to a random value

Then the easiest solution would be to set a well-known PID if that is possible.

CChaosRifle 2024-08-24 github

When flashing a Virpil device with new firmware, it by default changes the PID to a random value

Then the easiest solution would be to set a well-known PID if that is possible.

unfortunately, PID is user modifiable on these things, and in many cases, must be modified. VID is user-modifiable too. PID is modified because the factory PID for left/right sticks would be identical (the bases are agnostic, where the brains are), causing issues in some games. Same for identical control panels. VID should not change though, and all virpil devices should report as a generic HID.

in theory, if the VID of virpil is seen (which should always be the same (3344) but technically a user could change this, albeit there is no real reason AFAIK to do so other than 'make funny number'.) at 3344, treating it as a 128 button capable device should work the same for all virpil hardware. They do have a mode to split to 32 button block segments for legacy support, but they should still report as VID 3344.

part of the issue is how customizable they are. its all user defined by rewriting the firmware EEPROM. you can change the name, VID(you shouldnt do this), PID, and even number of axis/buttons by creating virtual ones in firmware, so at say, 10% of a throttle axis it presses a keystroke to do fingerlifts in a DCS jet. or inverse, doing virtual axis from a rotary encoder. different revisions of the boards will have different outputs, and different users will have different preferences. the only constant is they are all generic up-to-128 button, up-to-8 axis devices. They SHOULD be on VID 3344, but technically, a user can change that too, though no good reason exists to do so, AFAIK.

Kkhaosdoctor 2025-04-28 github

Hi everyone, I'm currently testing this now but I'm not having any luck making the joysticks being detected in Elite.~~

I have two Virpil controllers, a Throttle and a Joystick (Constellation alpha as well). This is the output of the lsusb command:

Bus 001 Device 008: ID 3344:8198 Leaguer Microelectronics (LME) L-VPC Throttle MT-50CM3
Bus 001 Device 010: ID 3344:c0cb Leaguer Microelectronics (LME) R-VPC Stick WarBRD

So they're both being identified, I also ran jstest on all the /dev/input/js devices (the throttle creates 2 devices and the stick just one) to be sure all the buttons and axis were correct and they're all working and being logged.

So far I've tried the following:

  • Change the command to PROTON_ENABLE_HIDRAW=0x3344/0x8198,0x3344/0xC0CB SDL_JOYSTICK_HIDAPI=0 %command%, both with and without the SDL bypass
  • Remove all the references to vid_3344 and pid_c0cb or pid_8198 from the reg file
  • Changing proton versions, currently I tried with 8, 9, hotfix and experimental
  • Created the udev rules, retriggered, rebooted

These are the rules:

# Hotas Virpil Throttle: ID 3344:8198 Leaguer Microelectronics (LME) L-VPC Throttle MT-50CM3
KERNEL=="hidraw", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="8198", MODE="0660", TAG+="uaccess"
# Hotas Virpil Joystick: ID 3344:c0cb Leaguer Microelectronics (LME) R-VPC Stick WarBRD
KERNEL=="hidraw", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="c0cb", MODE="0660", TAG+="uaccess"

Also tried checking what dmesg -w said about then when re-plugging:

[    4.764594] hid-generic 0003:3344:8198.0009: input,hiddev102,hidraw8: USB HID v1.11 Joystick [VIRPIL Controls 20240124 L-VPC Throttle MT-50CM3] on usb-0000:02:00.0-9.1/input0

[    4.764668] input: VIRPIL Controls 20240124 L-VPC Throttle MT-50CM3 as /devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-9/1-9.1/1-9.1:1.1/0003:3344:8198.000A/input/input8

[    4.764725] hid-generic 0003:3344:8198.000A: input,hidraw9: USB HID v1.11 Joystick [VIRPIL Controls 20240124 L-VPC Throttle MT-50CM3] on usb-0000:02:00.0-9.1/input1

[    4.764824] input: VIRPIL Controls 20240124 R-VPC Stick WarBRD as /devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-9/1-9.3/1-9.3:1.0/0003:3344:C0CB.000B/input/input9

[    4.764911] hid-generic 0003:3344:C0CB.000B: input,hiddev103,hidraw10: USB HID v1.11 Joystick [VIRPIL Controls 20240124 R-VPC Stick WarBRD] on usb-0000:02:00.0-9.3/input0

However Elite cannot understand the HOTAS still. I did have some improvement because, before the changes, it was only recognizing the joysticks as game pads, after the changes I now have a Generic Joystick option, however it will only pick up some of the buttons in the devices (some from the stick, some from the throttle, but not all from both) and it still recognizes the buttons as game pads.

I'm stuck on what I should do. Any good soul could help me on that? 😢


Update: it works!

Apparently I got it working, I think it has to do with Linux permission issues, but I'm not sure if that's the only scenario.

To verify I did a ls -l /dev/hidraw* and ls -l /dev/input/js*. JS devices were working correctly and with the permissions set to 0660, but hidraw devices were set to 0600 and they were owned by root so my user didn't have access to it.

I tried to test giving full permissions, so I created another rule file 99-virpil.rules:

KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="8198", MODE="0666"
KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="c0cb", MODE="0666"

Without the * it didn't apply the permissions so I think @kakra's answer is missing a '*'?

After sudo udevadm control reload-rules && sudo udevadm trigger my ls -l /dev/hidraw* now had the correct permissions, Elite still didn't bring the names of the devices like in Windows, but it's now recognizing all the buttons as proper joystick inputs.

Then I tried to solve the issue without having to go full open permissions on this, instead of opening for a tag uaccess I added myself to the input group and changed the rules file to:

KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="8198", MODE="0660", GROUP="input"
KERNEL=="hidraw*", ATTRS{idVendor}=="3344", ATTRS{idProduct}=="c0cb", MODE="0660", GROUP="input"

Logged off (very important), logged in again, restarted udev with the udevadm commands above and tried to run the game and it worked. So if anyone is going through this in the future, this can be a solution.

Thanks for the whole thread, it's really enlightening

Mmandle420 2025-05-16 github

ok, the easy way I've found
protontricks
wine explorer
my computer
control panel
joystick
enable sdl and disable hidraw both checked
problem solved after these regedit fixes
Name "Service": change the data from xinput -> winehid

Name "DeviceDesc": change the data from: Wine XInput compatible device -> Wine HID compatible device

Name "CompatiableIds": The data field is a multi line input field. delete everything except: WINEBUS\WINE_COMP_HID

my issue was that only the throttle was being detected in wine. not sure if it's applicable to this or not, but seems likely to me.

CChaosRifle 2025-05-16 github

my issue was that only the throttle was being detected in wine. not sure if it's applicable to this or not, but seems likely to me.

correct. Any not explicitly defined PID+VID combo makes it fail to be picked up as a controller. Honnestly, wine/proton really needs to just catchall ever VID of 3344 because we can change our PID's to anything, and the PID must be changed for some games if you run multiple control panels, or dual sticks, so this will always be an issue if we dont just catch all 3344 VID's as different people choose different PID's to deconflict.
the only time this isnt an issue for virpil hardware is when the device is left stock, like the throttle.

we really need all VID 3344 devices to be treated as generic joysticks, as virpil only makes generic joysticks and doesnt make xinput devices at all (and seems never will)

Kkakra 2025-05-16 github

wine/proton really needs to just catchall ever VID of 3344

The current patch already does that, but it takes another argument of looking at the number of buttons that are common with programmed profiles.

What has been observed here is probably an artifact in the registry from the wine prefix booting before the patch has been in place.

Nnschubach 2025-05-19 github

I just wanted to put in some input here because I see the lsusb IDs posted here do not match my Virpils. I configured them in Windows with specific names so they were easy to identify as L and R...

Bus 007 Device 006: ID 3344:4130 Leaguer Microelectronics (LME) R-VPC Stick MT-50CM2 Right
Bus 007 Device 007: ID 3344:8130 Leaguer Microelectronics (LME) L-VPC Stick MT-50CM2 Left

So if the last 4 digits are used then that's why my sticks are not being found in Proton games?

RRavenX8 2025-05-19 github

So if the last 4 digits are used then that's why my sticks are not being found in Proton games?

Their not being found because the patch that is currently in place checks for the amount of buttons the device claims to have. For me, the patch doesn't work at all because I have 72 and 60 "buttons" on my sticks.

Basically, if you did any button config changes (like adding or removing button assignments), you will just have to edit the registry manually for every game.

Nnschubach 2025-05-19 github

Hmm, my sticks are only showing 6 axis and 30 buttons each in jstest... that sucks

Kkakra 2025-05-19 github

@nschubach According to patch https://github.com/ValveSoftware/wine/commit/c5a726e8a3ac20a242c27123abb4970c9a477dc7, we detect Virpil as a joystick if it has 31 or 128 buttons configured (which is the default), or if people went with a specific amount compatible with certain games (32, 50, 64 buttons).

You can also configure one of these PIDs which correspond to the left and right stick:

        if (pid == 0x412f) prefer_hidraw = TRUE; /* Virpil Constellation ALPHA-R */
        if (pid == 0x812c) prefer_hidraw = TRUE; /* Virpil Constellation ALPHA-L */

You could probably also use PROTON_ENABLE_HIDRAW to override the heuristics. But if Proton already registered your sticks as an Xinput gamepad, this won't help and you need to remove all the sections from system.reg that reference your VID/PID combinations.

Nnschubach 2025-05-26 github

I did not see any entry in the system.reg file for the compatdata for the game I'm trying to use (Out Of Ore - 2009350 - Unreal Engine if is matters) that matches the 3344/4130/8130

I tried adding the PROTON_ENABLE_HIDRAW to my .bashrc as well as in the launch options of steam.

jstest-sdl --test {0 and 1} detect the sticks, 6 axis, 31 buttons (jstest detected 31... I apparently forgot about 0 based arrays /facepalm), 0 hats, 0 balls (not a gamepad)

I had not tested the etc/udev addition.

FWIW - Farm Sim 22 (1248130) also doesn't recognize the sticks.

Nnschubach 2025-05-26 github

wait... odd. It now detects my left stick (3344:8130), but not the right (3344:4130).

Nnschubach 2025-05-26 github

If I use Proton 9.0-4 it detects both of them as SDL controllers, 10.0-1 (beta) only detects the left stick (as the proper identifier)

10.0
Image

9.0
Image

Kkakra 2025-05-31 github

wait... odd. It now detects my left stick (3344:8130), but not the right (3344:4130).

Maybe you're seeing this issue? https://github.com/ValveSoftware/Proton/issues/8672

Does it work with Proton 9?

Nnschubach 2025-06-02 github

Does it work with Proton 9?

If I use Proton 9.0-4 it detects both of them as SDL controllers. Proton 10 detect one stick, but not both. It unfortunately doesn't see my right stick which would be a manageable fallback.

But that has some real oddity in games like this with a lot of controls since it also seems to send stray keyclicks.

I will continue commenting in the linked thread.

Tthibaultmol 2026-02-20 github

So how's the 2026 experience with Virpil controllers in proton?

EDIT: I did find this and am wondering if it's still needed https://mattmoore.io/posts/virpil-controls-linux-steam/

CChaosRifle 2026-02-21 github

So how's the 2026 experience with Virpil controllers in proton?

just make a hidraw udev rule. unless a game specifically is broken in some way (elite dangerous), this will work.