Gamepad Configuration 101 (WIP)

You don’t NEED to follow this guide if you are using a gamepad that autoconfigures already. This guide intends to cover complex mapping scenarios for people with multiple gamepads or pads not recognized by default

After reading countless of threads about configuring multiple pads I guess should just come up with a step by step guide instead of repeating myself over and over again.

I’ll write this guide testing the steps in between so it should just work if you follow the instructions. It’s not meant to be a technical document but more like a practical explanation so it’s not written in a formal manner.

##Contents

Concepts

  • Retropad: it’s the abstracted gamepad libretro uses. All physical pads should be mapped with RetroPad layout in mind
  • Gamepad: a physical gamepad or joystick
  • Bindings: physical gamepad to retropad assignment
  • Core Map: every core has a default map which assigns each individual retropad input to the emulated system inputs
  • Remaps: subsystem that allows to change core maps
  • Autoconf: subsystem that allows RetroArch to support gamepad hotplug

As you can see there are three layers on the system. So if you were emulating a NES gamepad with a SNES gamepad you have to think of it like this:

We don’t have an official Retropad icon so far(shame!), opening an issue for that as I write this guide.

So, what I am going to address first is binding physical gamepads to retropad.

Controller Binding

I’ll be using the following pads:

  • XBOX 360 Wired Controller
  • Sony DS4 with official bluetooth dongle
  • 8BitDo NES30 Pro

I am running the latest RetroArch nightly on Windows 10 x64 with stock settings. I only tweaked some menu settings so the screenshots are easier to read. I also removed the autoconf profiles from the RetroArch package to make sure the procedure doesn’t produce any false results.

XBOX360 Controller

  1. Launch RetroArch
  2. Connect controller
  3. Done!

You should see a yellow message indicating that the pad is connected to port #0. XINPUT is a sane standard so we are able to ship a built-in autoconf profile.

You can confirm button binding by navigating to Settings -> Input -> Input User 1 binds

No further configuration is required. If you add a second XBOX 360 controller it will be added automatically to port #1.

You can also check current port status under Information -> System Information

Conversely, if you unplug one it will be removed immediately. If you remove the first pad the second one will be promoted to pad number one and so forth.

Sony Dualshock 4

I'll start this part with no other pads configured to illustrate the process for a new pad without autoconf.

After connecting an unsupported gamepad you should get a message like this one:

So, now you need to configure gamepad bindings and optionally save an autoconf profile. The steps to configure the gamepad are the following:

  1. Navigate to Settings -> Input -> Input User 1 binds
  2. Select User 1 bind all
  3. Follow the prompts
  4. Test! and correct any bindings you may have missed or messed up,

Once that is done you can stop unless you want hotplug functionality. If that’s the case:

  1. Select User 1 save autoconf
  2. Select User 1 bind default all
  3. Restart RetroArch or unplug/plug your controller for autodetection to take place again. Something like this should happen:

If you were to connect a second DS4 (with a second adapter because SONY is dumb) it would be mapped automatically to port #1 (second user)

8BitDo NES30 Pro

I'll start this one with the DS4 and 2 NES30 Pro gamepads connected

As you can see in the following screenshot, all the pads are reported but only the DS4 is mapped.

Sadly, the DS4 is mapped to port #2 (user #3), so I can’t really use it for menu navigation by default. This is a problem with how Windows enumerates the gamepads. I don’t know if it’s the case on Linux or OSX but it’s not a problem on Android. You can’t really change the gamepad enumeration without messing with third party tools.

Since one of the 8bitdo’s is assigned to port #0, I’ll just unplug one to avoid having to screw around finding which one is on which port. The DS4 should fallback to port #1 (user #2) once that is done.

Aha! so I unplugged one and the DS4 is at port #1 (user #2) as expected, that means now I can map the other NES30 Pro by going to User 1 Input binds.

We follow the same instructions as last time:

  1. Select User 1 bind all
  2. Confirm inputs

  1. Select User 1 save autoconf
  2. Select User 1 bind default all
  3. Reconnect controller

Immediately after connecting if you didn’t move from the menu you’ll see that the labels will change and include the Auto keyword. That means the configuration comes from an autoconf profile and not from manual binding.

I’ll now plug the second pad without doing anything else:

Notice the #2 as well as the Auto in the this screenshot, that is a differentiation flag, it’s meant to differentiate identical pads at runtime so you can change device indexes.

You can check that everything is bound correctly at once under Information / System Information:

And now I’ll add the two XBOX 360 pads back into the mix:

Here you can see how Windows messes up pad enumeration. All these screenshots are without a reboot and without careful plugging and unplugging pads to try to get them in a particular order. Windows just assigns pads depending on the USB port it seems.

But hey! it works. As long as you only connect the pads you want to use you get a completely plug and play experience as long as your pads have autoconf profiles ready.

To be continued…

##Links:

7 Likes

Great post, thank you!

Hi

Great post thanks

I have a question please. Whats the best way to achieve 2 arcade joysticks (xin-mo) and 2 Xbox one pads all connected so P1 can use Joystick 1 or pad 1 and P2 can use Joystick 2 and Pad 2 and even switch in game if they wish?

I have this setup using Joy2key profiles with 4 joysticks attached and P1 & 3 identical and P2 and 4 identical but i cant seem to get it to work with retroarch and the emulators i have for it, just for standalone emulators.

do you know a way to achieve this please?

I have a generic usb gamepad snes style in linux mint 18.3 and don’t recognized it. the pad is recognized by the system and atari 800 v 4.0.0 emulator. Can you help me, please.