Mayflash / Dragonrise GameCube controller adapter recognized as tablet, not joystick

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

I recently bought a "Mayflash GameCube Controller Adapter for Wii U &
PC USB". It has 4 GameCube controller ports, and a switch to tell it
whether you're plugging it into a Wii or a PC. The docs say that in PC
mode it works out of the box on Windows & Mac, with their driver being
required for force-feedback, so it's a semi-standard HID device.

With the switch set to "WII U", it's recognized as a hid-generic
device, but the descriptors are nonsense and it doesn't generate any
events. Fair enough.

With the switch set to "PC" it's recognized, the descriptors make a
lot more sense, and it sends events -- in fact it moves the cursor on
my X display! For some reason it's getting recognized as a
mouse/tablet instead of a joystick, so joydev refuses to take
ownership of it, and X's evdev driver does. I suspect it's due to some
mistake in the report descriptors, but I'm not quite expert enough to
say.

I'd like to get this working so I've attached as much useful
information as I can muster. Let me know if there's anything I can do
to help further; I'm not allergic to compiling a kernel.

Thanks

Andrew

=== dmesg notification ===

[108762.808904] hid-generic 0003:0079:1843.000D: input,hidraw6: USB
HID v1.10 Joystick [mayflash limited MAYFLASH GameCube Controller
Adapter] on usb-0000:00:13.0-4/input0

=== udevadm info --attribute-walk ===

  looking at device
'/devices/pci0000:00/0000:00:13.0/usb5/5-4/5-4:1.0/input/input16/mouse3':
    KERNEL=="mouse3"
    SUBSYSTEM=="input"
    DRIVER==""

  looking at parent device
'/devices/pci0000:00/0000:00:13.0/usb5/5-4/5-4:1.0/input/input16':
    KERNELS=="input16"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{name}=="mayflash limited MAYFLASH GameCube Controller Adapter"
    ATTRS{phys}=="usb-0000:00:13.0-4/input0"
    ATTRS{uniq}==""
    ATTRS{properties}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:13.0/usb5/5-4/5-4:1.0':
    KERNELS=="5-4:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:13.0/usb5/5-4':
    KERNELS=="5-4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="4"
    ATTRS{idVendor}=="0079"
    ATTRS{speed}=="12"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="5"
    ATTRS{devnum}=="9"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="500mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="c0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0100"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="129809"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="mayflash limited"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="1843"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="MAYFLASH GameCube Controller Adapter"

(snipped the bus and pci parts)

=== cat /debug/hid/0003:0079:1843.000D/rdesc ===

05 01 09 04 a1 01 85 01 09 01 a1 00 05 09 19 01 29 10 15 00 25 01 75
01 95 10 81 02 05 01 09 30 09 31 09 32 09 35 15 00 26 ff 00 75 08 95
04 81 02 05 01 09 33 09 34 95 02 81 02 05 01 09 39 15 00 25 07 35 00
46 3b 01 65 14 75 04 95 01 81 02 75 04 95 01 81 01 06 00 ff 09 01 75
08 95 02 91 02 c0 c0 05 01 09 04 a1 01 85 02 09 01 a1 00 05 09 19 01
29 10 15 00 25 01 75 01 95 10 81 02 05 01 09 30 09 31 09 32 09 35 15
00 26 ff 00 75 08 95 04 81 02 05 01 09 33 09 34 95 02 81 02 05 01 09
39 15 00 25 07 35 00 46 3b 01 65 14 75 04 95 01 81 02 75 04 95 01 81
01 06 00 ff 09 01 75 08 95 02 91 02 c0 c0 05 01 09 04 a1 01 85 03 09
01 a1 00 05 09 19 01 29 10 15 00 25 01 75 01 95 10 81 02 05 01 09 30
09 31 09 32 09 35 15 00 26 ff 00 75 08 95 04 81 02 05 01 09 33 09 34
95 02 81 02 05 01 09 39 15 00 25 07 35 00 46 3b 01 65 14 75 04 95 01
81 02 75 04 95 01 81 01 06 00 ff 09 01 75 08 95 02 91 02 c0 c0 05 01
09 04 a1 01 85 04 09 01 a1 00 05 09 19 01 29 10 15 00 25 01 75 01 95
10 81 02 05 01 09 30 09 31 09 32 09 35 15 00 26 ff 00 75 08 95 04 81
02 05 01 09 33 09 34 95 02 81 02 05 01 09 39 15 00 25 07 35 00 46 3b
01 65 14 75 04 95 01 81 02 75 04 95 01 81 01 06 00 ff 09 01 75 08 95
02 91 02 c0 c0

  INPUT(1)[INPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(16)
        Button.0001
        Button.0002
        Button.0003
        Button.0004
        Button.0005
        Button.0006
        Button.0007
        Button.0008
        Button.0009
        Button.000a
        Button.000b
        Button.000c
        Button.000d
        Button.000e
        Button.000f
        Button.0010
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(16)
      Report Offset(0)
      Flags( Variable Absolute )
    Field(1)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(4)
        GenericDesktop.X
        GenericDesktop.Y
        GenericDesktop.Z
        GenericDesktop.Rz
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(4)
      Report Offset(16)
      Flags( Variable Absolute )
    Field(2)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        GenericDesktop.Rx
        GenericDesktop.Ry
      Logical Minimum(0)
      Logical Maximum(255)
      Report Size(8)
      Report Count(2)
      Report Offset(48)
      Flags( Variable Absolute )
    Field(3)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(1)
        GenericDesktop.HatSwitch
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(4)
      Report Count(1)
      Report Offset(64)
      Flags( Variable Absolute )
  INPUT(2)[INPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(16)
        Button.0001
        Button.0002
        Button.0003
        Button.0004
        Button.0005
        Button.0006
        Button.0007
        Button.0008
        Button.0009
        Button.000a
        Button.000b
        Button.000c
        Button.000d
        Button.000e
        Button.000f
        Button.0010
      Logical Minimum(0)
      Logical Maximum(1)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(1)
      Report Count(16)
      Report Offset(0)
      Flags( Variable Absolute )
    Field(1)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(4)
        GenericDesktop.X
        GenericDesktop.Y
        GenericDesktop.Z
        GenericDesktop.Rz
      Logical Minimum(0)
      Logical Maximum(255)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(4)
      Report Offset(16)
      Flags( Variable Absolute )
    Field(2)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        GenericDesktop.Rx
        GenericDesktop.Ry
      Logical Minimum(0)
      Logical Maximum(255)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(48)
      Flags( Variable Absolute )
    Field(3)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(1)
        GenericDesktop.HatSwitch
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(4)
      Report Count(1)
      Report Offset(64)
      Flags( Variable Absolute )
  INPUT(3)[INPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(16)
        Button.0001
        Button.0002
        Button.0003
        Button.0004
        Button.0005
        Button.0006
        Button.0007
        Button.0008
        Button.0009
        Button.000a
        Button.000b
        Button.000c
        Button.000d
        Button.000e
        Button.000f
        Button.0010
      Logical Minimum(0)
      Logical Maximum(1)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(1)
      Report Count(16)
      Report Offset(0)
      Flags( Variable Absolute )
    Field(1)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(4)
        GenericDesktop.X
        GenericDesktop.Y
        GenericDesktop.Z
        GenericDesktop.Rz
      Logical Minimum(0)
      Logical Maximum(255)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(4)
      Report Offset(16)
      Flags( Variable Absolute )
    Field(2)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        GenericDesktop.Rx
        GenericDesktop.Ry
      Logical Minimum(0)
      Logical Maximum(255)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(48)
      Flags( Variable Absolute )
    Field(3)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(1)
        GenericDesktop.HatSwitch
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(4)
      Report Count(1)
      Report Offset(64)
      Flags( Variable Absolute )
  INPUT(4)[INPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(16)
        Button.0001
        Button.0002
        Button.0003
        Button.0004
        Button.0005
        Button.0006
        Button.0007
        Button.0008
        Button.0009
        Button.000a
        Button.000b
        Button.000c
        Button.000d
        Button.000e
        Button.000f
        Button.0010
      Logical Minimum(0)
      Logical Maximum(1)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(1)
      Report Count(16)
      Report Offset(0)
      Flags( Variable Absolute )
    Field(1)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(4)
        GenericDesktop.X
        GenericDesktop.Y
        GenericDesktop.Z
        GenericDesktop.Rz
      Logical Minimum(0)
      Logical Maximum(255)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(4)
      Report Offset(16)
      Flags( Variable Absolute )
    Field(2)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        GenericDesktop.Rx
        GenericDesktop.Ry
      Logical Minimum(0)
      Logical Maximum(255)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(48)
      Flags( Variable Absolute )
    Field(3)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(1)
        GenericDesktop.HatSwitch
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(4)
      Report Count(1)
      Report Offset(64)
      Flags( Variable Absolute )
  OUTPUT(1)[OUTPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        ff00.0001
        ff00.0001
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(0)
      Flags( Variable Absolute )
  OUTPUT(2)[OUTPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        ff00.0001
        ff00.0001
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(0)
      Flags( Variable Absolute )
  OUTPUT(3)[OUTPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        ff00.0001
        ff00.0001
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(0)
      Flags( Variable Absolute )
  OUTPUT(4)[OUTPUT]
    Field(0)
      Physical(GenericDesktop.Pointer)
      Application(GenericDesktop.Joystick)
      Usage(2)
        ff00.0001
        ff00.0001
      Logical Minimum(0)
      Logical Maximum(7)
      Physical Minimum(0)
      Physical Maximum(315)
      Unit(English Rotation : Degrees)
      Report Size(8)
      Report Count(2)
      Report Offset(0)
      Flags( Variable Absolute )

Button.0001 ---> Key.Trigger
Button.0002 ---> Key.ThumbBtn
Button.0003 ---> Key.ThumbBtn2
Button.0004 ---> Key.TopBtn
Button.0005 ---> Key.TopBtn2
Button.0006 ---> Key.PinkieBtn
Button.0007 ---> Key.BaseBtn
Button.0008 ---> Key.BaseBtn2
Button.0009 ---> Key.BaseBtn3
Button.000a ---> Key.BaseBtn4
Button.000b ---> Key.BaseBtn5
Button.000c ---> Key.BaseBtn6
Button.000d ---> Key.?
Button.000e ---> Key.?
Button.000f ---> Key.?
Button.0010 ---> Key.BtnDead
GenericDesktop.X ---> Absolute.X
GenericDesktop.Y ---> Absolute.Y
GenericDesktop.Z ---> Absolute.Z
GenericDesktop.Rz ---> Absolute.Rz
GenericDesktop.Rx ---> Absolute.Rx
GenericDesktop.Ry ---> Absolute.Ry
GenericDesktop.HatSwitch ---> Absolute.Hat0X
Button.0001 ---> Key.BtnA
Button.0002 ---> Key.BtnB
Button.0003 ---> Key.BtnC
Button.0004 ---> Key.BtnX
Button.0005 ---> Key.BtnY
Button.0006 ---> Key.BtnZ
Button.0007 ---> Key.BtnTL
Button.0008 ---> Key.BtnTR
Button.0009 ---> Key.BtnTL2
Button.000a ---> Key.BtnTR2
Button.000b ---> Key.BtnSelect
Button.000c ---> Key.BtnStart
Button.000d ---> Key.BtnMode
Button.000e ---> Key.BtnThumbL
Button.000f ---> Key.BtnThumbR
Button.0010 ---> Key.?
GenericDesktop.X ---> Absolute.Throttle
GenericDesktop.Y ---> Absolute.Rudder
GenericDesktop.Z ---> Absolute.Wheel
GenericDesktop.Rz ---> Absolute.Gas
GenericDesktop.Rx ---> Absolute.Brake
GenericDesktop.Ry ---> Absolute.?
GenericDesktop.HatSwitch ---> Absolute.Hat1X
Button.0001 ---> Key.ToolPen
Button.0002 ---> Key.ToolRubber
Button.0003 ---> Key.ToolBrush
Button.0004 ---> Key.ToolPencil
Button.0005 ---> Key.ToolAirbrush
Button.0006 ---> Key.ToolFinger
Button.0007 ---> Key.ToolMouse
Button.0008 ---> Key.ToolLens
Button.0009 ---> Key.?
Button.000a ---> Key.?
Button.000b ---> Key.Touch
Button.000c ---> Key.Stylus
Button.000d ---> Key.Stylus2
Button.000e ---> Key.ToolDoubleTap
Button.000f ---> Key.ToolTripleTap
Button.0010 ---> Key.?
GenericDesktop.X ---> Absolute.?
GenericDesktop.Y ---> Absolute.?
GenericDesktop.Z ---> Absolute.?
GenericDesktop.Rz ---> Absolute.?
GenericDesktop.Rx ---> Absolute.Hat2X
GenericDesktop.Ry ---> Absolute.Hat2Y
GenericDesktop.HatSwitch ---> Absolute.Hat3X
Button.0001 ---> Key.WheelBtn
Button.0002 ---> Key.Gear up
Button.0003 ---> Key.?
Button.0004 ---> Key.?
Button.0005 ---> Key.?
Button.0006 ---> Key.?
Button.0007 ---> Key.?
Button.0008 ---> Key.?
Button.0009 ---> Key.?
Button.000a ---> Key.?
Button.000b ---> Key.?
Button.000c ---> Key.?
Button.000d ---> Key.?
Button.000e ---> Key.?
Button.000f ---> Key.?
Button.0010 ---> Key.?
GenericDesktop.X ---> Absolute.Pressure
GenericDesktop.Y ---> Absolute.Distance
GenericDesktop.Z ---> Absolute.XTilt
GenericDesktop.Rz ---> Absolute.YTilt
GenericDesktop.Rx ---> Absolute.ToolWidth
GenericDesktop.Ry ---> Absolute.?
GenericDesktop.HatSwitch ---> Absolute.?
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
ff00.0001 ---> Sync.Report
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux