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

Bad mapping of Xbox 360 Wired controller #61

Open
heldernovais opened this issue Jul 11, 2021 · 9 comments
Open

Bad mapping of Xbox 360 Wired controller #61

heldernovais opened this issue Jul 11, 2021 · 9 comments

Comments

@heldernovais
Copy link

heldernovais commented Jul 11, 2021

  • I plug the controller into the computer, running FreeBSD 13.0 STABLE. dmesg properly detects a Microsoft controller. I manually load up all the modules, just in case (xb360gp, hgame, iichid, usbus, ...).
  • The XBOX button lights flash and then turn themselves off after about 5 turns. Reconnecting it (USB 1.1? black port) will repeat this. The player1 light is meant to stay on, as it does on Windows (same port, as far as I remember), Linux (same port) and the 360 console.
  • The input is tested using emulators (mednafen uses evdev, afaik).
  • Face buttons, bumpers and right axis appear to work. Left axis -X doesn't seem to be registered. The d-pad doesn't work at all. Triggers aren't detected either. Tested using mednafen and nestopia. jstest-gtk won't even find the device.

I wanted to try experimenting with the code to fix it but I am currently unable to. Could anyone here take a look into this?

@wulf7
Copy link
Owner

wulf7 commented Jul 11, 2021

What evemu-record from devel/evemu port shows when you use dysfunctional controls?

@heldernovais
Copy link
Author

Thank you for your reply.

First of all:
I experimented using a PSX rom with mednafen first and I mapped all the virtual buttons to button B.
'psx.input.port1.gamepad.circle joystick 0xdcae89a8555bb8b10006000b00000000 button_8'
This is from the cfg file. I imagine that's the code for the joystick followed with button 8, supposedly B, being mapped to PSX circle.
I look at your code and it seems like button 8 is actually mapped to the start button and not B?

Strangely, I did 'kldunload xb360gp' and tried remapping. Mednafen is still reading the inputs.
I did 'kldunload iichid' and ... same result. It still reads the inputs. The cfg line even looks the same.
What could be reading my joystick instead? This is a nearly fresh install of FreeBSD 13 STABLE.

Secondly:
I ran evemu-record and the xbox controller wasn't even listed. All /dev/input/eventX map to other inputs.
I tested all of them, just in case, and input from the controller was never detected.

Thirdly:
This is the dmesg output:
ugen1.4: at usbus1
uhid1 on uhub3
uhid1: <Microsoft Corporation Controller, rev 2.00/1.14, addr 4> on usbus1

Is it being handled by another module instead? I did reload the modules.
'usbhidctl -a -f /dev/uhid1' does print the the action in the controllers, but this time, button B is mapped to button 1:
'Generic_Desktop:Game_Pad.Button:Button_2=1'

@heldernovais
Copy link
Author

Update:
doing usbhidctl with '-l' for looping shows all of the buttons being recognised and mapped correctly. But these aren't read properly by the programs I tried it on.

I forgot that I needed to press F3 before testing the axis on mednafen. It reads the triggers and analogue sticks but it still can't read the d-pad at all. I believe mednafen would rather read the d-pad as an axis as that's the way it works on Linux, at least when using <Linux/joystick.h> api instead of evdev.

Is there a way to remap the d-pad buttons to 2 xy axis?

@wulf7
Copy link
Owner

wulf7 commented Jul 12, 2021

This is the dmesg output:
ugen1.4: at usbus1
uhid1 on uhub3
uhid1: <Microsoft Corporation Controller, rev 2.00/1.14, addr 4> on usbus1

You did not enable usbhid. Add following lines to /boot/loader.conf

hw.usb.usbhid.enable=1
usbhid_load="YES"

@heldernovais
Copy link
Author

heldernovais commented Jul 12, 2021

ugen1.4: at usbus1
usbhid0 on uhub4
usbhid0: <Microsoft Corporation Controller, rev 2.00/1.14, addr 4> on usbus1
hidbus1: on usbhid0
xb360gp0: <XBox 360 Gamepad> on hidbus1

Now evemu-record recognises the controller properly, but neither mednafen nor nestopia will detect any input from it.

@heldernovais
Copy link
Author

I also added "xb360gp_enable=YES" and did a reboot -> same result.
I deleted the lines and now the controller is read again (by uhid, with bad mapping).

@wulf7
Copy link
Owner

wulf7 commented Jul 13, 2021

Now evemu-record recognises the controller properly, but neither mednafen nor nestopia will detect any input from it.

There may be two causes:

  1. You do not have enough permissions to open /dev/input/event* . See e.g. Won't attach to Xbox 360 controller #43
  2. libsdl2 is built without evdev support

@heldernovais
Copy link
Author

  • I tried running them as root, same effect.
  • Nestopia doesn't use SDL, so that can't be it.

Please be more cooperative.

@wulf7
Copy link
Owner

wulf7 commented Jul 15, 2021

They both use SDL2.

I just checked ports tree and found out that devel/sdl20 does not support evdev yet, so you need to apply one of following patches and rebuild it:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=249874
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=252371

You can test joysticks with sdl2-jstest utility from https://gitlab.com/sdl-jstest/sdl-jstest repo after than.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants