This is taken pretty much straight from FreeBSD ( see http://marc.info/?l=freebsd-commits-all&m=113600388101707&w=2 ). It is tested and working on my amd64 box. Some usbhidctl output:
Generic_Desktop:Game_Pad.Generic_Desktop:Pointer.Generic_Desktop:D-pad_Up=0 Generic_Desktop:Game_Pad.Generic_Desktop:Pointer.Generic_Desktop:D-pad_Down=0 Generic_Desktop:Game_Pad.Generic_Desktop:Pointer.Generic_Desktop:D-pad_Left=0 Generic_Desktop:Game_Pad.Generic_Desktop:Pointer.Generic_Desktop:D-pad_Right=0 Generic_Desktop:Game_Pad.Button:Button_8=0 Generic_Desktop:Game_Pad.Button:Button_7=0 Generic_Desktop:Game_Pad.Button:Button_9=0 Generic_Desktop:Game_Pad.Button:Button_10=0 Generic_Desktop:Game_Pad.Button:Button_5=0 Generic_Desktop:Game_Pad.Button:Button_6=0 Generic_Desktop:Game_Pad.Button:Button_11=0 Generic_Desktop:Game_Pad.Button:Button_1=1 Generic_Desktop:Game_Pad.Button:Button_2=0 Generic_Desktop:Game_Pad.Button:Button_3=0 Generic_Desktop:Game_Pad.Button:Button_4=0 Generic_Desktop:Game_Pad.Generic_Desktop:Z=0 Generic_Desktop:Game_Pad.Generic_Desktop:Rz=0 Generic_Desktop:Game_Pad.Generic_Desktop:X=-4169 Generic_Desktop:Game_Pad.Generic_Desktop:Y=-2390 Generic_Desktop:Game_Pad.Generic_Desktop:Rx=-432 Generic_Desktop:Game_Pad.Generic_Desktop:Ry=1363 Any devs interested in reviewing and hopefully committing this? -- Joe Gidi j...@entropicblur.com "You cannot buy skill." -- Ross Seyfried --- uhidev.c.orig Mon Nov 8 01:57:09 2010 +++ uhidev.c Mon Nov 8 01:08:30 2010 @@ -55,8 +55,9 @@ #include <dev/usb/uhidev.h> -/* Report descriptor for broken Wacom Graphire */ +/* Replacement report descriptors for devices shipped with broken ones */ #include <dev/usb/ugraphire_rdesc.h> +#include <dev/usb/uxb360gp_rdesc.h> #ifdef UHIDEV_DEBUG #define DPRINTF(x) do { if (uhidevdebug) printf x; } while (0) @@ -99,8 +100,15 @@ if (uaa->iface == NULL) return (UMATCH_NONE); id = usbd_get_interface_descriptor(uaa->iface); - if (id == NULL || id->bInterfaceClass != UICLASS_HID) - return (UMATCH_NONE); + if (id == NULL) + return (UMATCH_NONE); + if (id->bInterfaceClass != UICLASS_HID) { + /* The Xbox 360 gamepad doesn't use the HID class. */ + if (id->bInterfaceClass != UICLASS_VENDOR || + id->bInterfaceSubClass != UISUBCLASS_XBOX360_CONTROLLER || + id->bInterfaceProtocol != UIPROTO_XBOX360_GAMEPAD) + return (UMATCH_NONE); + } if (usbd_get_quirks(uaa->device)->uq_flags & UQ_BAD_HID) return (UMATCH_NONE); if (uaa->matchlvl) @@ -203,7 +211,14 @@ /* Keep descriptor */ break; } + } else if (id->bInterfaceClass == UICLASS_VENDOR && + id->bInterfaceSubClass == UISUBCLASS_XBOX360_CONTROLLER && + id->bInterfaceProtocol == UIPROTO_XBOX360_GAMEPAD) { + /* The Xbox 360 gamepad has no report descriptor. */ + size = sizeof uhid_xb360gp_report_descr; + descptr = uhid_xb360gp_report_descr; } + if (descptr) { desc = malloc(size, M_USBDEV, M_NOWAIT); --- usb.h.orig Mon Nov 8 01:58:09 2010 +++ usb.h Mon Nov 8 00:42:01 2010 @@ -486,7 +486,8 @@ #define UIPROTO_IRDA 0 #define UICLASS_VENDOR 0xff - +#define UISUBCLASS_XBOX360_CONTROLLER 0x5d +#define UIPROTO_XBOX360_GAMEPAD 0x01 #define USB_HUB_MAX_DEPTH 5 /*- * Copyright (c) 2005 Ed Schouten <e...@freebsd.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/usb/uxb360gp_rdesc.h,v 1.3 2008/05/24 18:35:55 ed Exp $ */ /* * The descriptor has no output report format, thus preventing you from * controlling the LEDs and the built-in rumblers. */ static const uByte uhid_xb360gp_report_descr[] = { 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */ 0x09, 0x05, /* USAGE (Gamepad) */ 0xa1, 0x01, /* COLLECTION (Application) */ /* Unused */ 0x75, 0x08, /* REPORT SIZE (8) */ 0x95, 0x01, /* REPORT COUNT (1) */ 0x81, 0x01, /* INPUT (Constant) */ /* Byte count */ 0x75, 0x08, /* REPORT SIZE (8) */ 0x95, 0x01, /* REPORT COUNT (1) */ 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */ 0x09, 0x3b, /* USAGE (Byte Count) */ 0x81, 0x01, /* INPUT (Constant) */ /* D-Pad */ 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */ 0x09, 0x01, /* USAGE (Pointer) */ 0xa1, 0x00, /* COLLECTION (Physical) */ 0x75, 0x01, /* REPORT SIZE (1) */ 0x15, 0x00, /* LOGICAL MINIMUM (0) */ 0x25, 0x01, /* LOGICAL MAXIMUM (1) */ 0x35, 0x00, /* PHYSICAL MINIMUM (0) */ 0x45, 0x01, /* PHYSICAL MAXIMUM (1) */ 0x95, 0x04, /* REPORT COUNT (4) */ 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */ 0x09, 0x90, /* USAGE (D-Pad Up) */ 0x09, 0x91, /* USAGE (D-Pad Down) */ 0x09, 0x93, /* USAGE (D-Pad Left) */ 0x09, 0x92, /* USAGE (D-Pad Right) */ 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */ 0xc0, /* END COLLECTION */ /* Buttons 5-11 */ 0x75, 0x01, /* REPORT SIZE (1) */ 0x15, 0x00, /* LOGICAL MINIMUM (0) */ 0x25, 0x01, /* LOGICAL MAXIMUM (1) */ 0x35, 0x00, /* PHYSICAL MINIMUM (0) */ 0x45, 0x01, /* PHYSICAL MAXIMUM (1) */ 0x95, 0x07, /* REPORT COUNT (7) */ 0x05, 0x09, /* USAGE PAGE (Button) */ 0x09, 0x08, /* USAGE (Button 8) */ 0x09, 0x07, /* USAGE (Button 7) */ 0x09, 0x09, /* USAGE (Button 9) */ 0x09, 0x0a, /* USAGE (Button 10) */ 0x09, 0x05, /* USAGE (Button 5) */ 0x09, 0x06, /* USAGE (Button 6) */ 0x09, 0x0b, /* USAGE (Button 11) */ 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */ /* Unused */ 0x75, 0x01, /* REPORT SIZE (1) */ 0x95, 0x01, /* REPORT COUNT (1) */ 0x81, 0x01, /* INPUT (Constant) */ /* Buttons 1-4 */ 0x75, 0x01, /* REPORT SIZE (1) */ 0x15, 0x00, /* LOGICAL MINIMUM (0) */ 0x25, 0x01, /* LOGICAL MAXIMUM (1) */ 0x35, 0x00, /* PHYSICAL MINIMUM (0) */ 0x45, 0x01, /* PHYSICAL MAXIMUM (1) */ 0x95, 0x04, /* REPORT COUNT (4) */ 0x05, 0x09, /* USAGE PAGE (Button) */ 0x19, 0x01, /* USAGE MINIMUM (Button 1) */ 0x29, 0x04, /* USAGE MAXIMUM (Button 4) */ 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */ /* Triggers */ 0x75, 0x08, /* REPORT SIZE (8) */ 0x15, 0x00, /* LOGICAL MINIMUM (0) */ 0x26, 0xff, 0x00, /* LOGICAL MAXIMUM (255) */ 0x35, 0x00, /* PHYSICAL MINIMUM (0) */ 0x46, 0xff, 0x00, /* PHYSICAL MAXIMUM (255) */ 0x95, 0x02, /* REPORT SIZE (2) */ 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */ 0x09, 0x32, /* USAGE (Z) */ 0x09, 0x35, /* USAGE (Rz) */ 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */ /* Sticks */ 0x75, 0x10, /* REPORT SIZE (16) */ 0x16, 0x00, 0x80, /* LOGICAL MINIMUM (-32768) */ 0x26, 0xff, 0x7f, /* LOGICAL MAXIMUM (32767) */ 0x36, 0x00, 0x80, /* PHYSICAL MINIMUM (-32768) */ 0x46, 0xff, 0x7f, /* PHYSICAL MAXIMUM (32767) */ 0x95, 0x04, /* REPORT COUNT (4) */ 0x05, 0x01, /* USAGE PAGE (Generic Desktop) */ 0x09, 0x30, /* USAGE (X) */ 0x09, 0x31, /* USAGE (Y) */ 0x09, 0x33, /* USAGE (Rx) */ 0x09, 0x34, /* USAGE (Ry) */ 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */ /* Unused */ 0x75, 0x30, /* REPORT SIZE (48) */ 0x95, 0x01, /* REPORT COUNT (1) */ 0x81, 0x01, /* INPUT (Constant) */ 0xc0, /* END COLLECTION */ };