item.type == HID_ITEM_TYPE_MAIN &&
item.tag == HID_MAIN_ITEM_TAG_BEGIN_COLLECTION &&
(item_udata(&item) & 0xff) == HID_COLLECTION_PHYSICAL &&
-- hid->bus == BUS_USB)
++ (hid->bus == BUS_USB || hid->bus == BUS_I2C))
hid->group = HID_GROUP_SENSOR_HUB;
}
{
struct hid_report_enum *report_enum = hid->report_enum + type;
struct hid_report *report;
++ struct hid_driver *hdrv;
unsigned int a;
int rsize, csize = size;
u8 *cdata = data;
if (hid->claimed != HID_CLAIMED_HIDRAW) {
for (a = 0; a < report->maxfield; a++)
hid_input_field(hid, report->field[a], cdata, interrupt);
++ hdrv = hid->driver;
++ if (hdrv && hdrv->report)
++ hdrv->report(hid, report);
}
if (hid->claimed & HID_CLAIMED_INPUT)
{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
- { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) },
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) },
hdev->type != HID_TYPE_USBMOUSE)
return true;
break;
++ case USB_VENDOR_ID_VELLEMAN:
++ /* These are not HID devices. They are handled by comedi. */
++ if ((hdev->product >= USB_DEVICE_ID_VELLEMAN_K8055_FIRST &&
++ hdev->product <= USB_DEVICE_ID_VELLEMAN_K8055_LAST) ||
++ (hdev->product >= USB_DEVICE_ID_VELLEMAN_K8061_FIRST &&
++ hdev->product <= USB_DEVICE_ID_VELLEMAN_K8061_LAST))
++ return true;
++ break;
}
if (hdev->type == HID_TYPE_USBMOUSE &&
#define USB_VENDOR_ID_EZKEY 0x0518
#define USB_DEVICE_ID_BTC_8193 0x0002
++#define USB_VENDOR_ID_FORMOSA 0x147a
++#define USB_DEVICE_ID_FORMOSA_IR_RECEIVER 0xe03e
++
#define USB_VENDOR_ID_FREESCALE 0x15A2
#define USB_DEVICE_ID_FREESCALE_MX28 0x004F
#define USB_VENDOR_ID_JESS 0x0c45
#define USB_DEVICE_ID_JESS_YUREX 0x1010
++#define USB_VENDOR_ID_JESS2 0x0f30
++#define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111
++
#define USB_VENDOR_ID_KBGEAR 0x084e
#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
#define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283
#define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286
#define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287
--#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
#define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG 0xc293
++#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295
#define USB_DEVICE_ID_LOGITECH_DFP_WHEEL 0xc298
#define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299
#define USB_VENDOR_ID_NEC 0x073e
#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301
++#define USB_VENDOR_ID_NEXIO 0x1870
++#define USB_DEVICE_ID_NEXIO_MULTITOUCH_420 0x010d
++
#define USB_VENDOR_ID_NEXTWINDOW 0x1926
#define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003
#define USB_VENDOR_ID_SONY 0x054c
#define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b
+ +#define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374
#define USB_DEVICE_ID_SONY_PS3_BDREMOTE 0x0306
#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
#define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f
#define USB_VENDOR_ID_STANTUM_SITRONIX 0x1403
#define USB_DEVICE_ID_MTP_SITRONIX 0x5001
++ #define USB_VENDOR_ID_STEELSERIES 0x1038
++ #define USB_DEVICE_ID_STEELSERIES_SRWS1 0x1410
++
#define USB_VENDOR_ID_SUN 0x0430
#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
#define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010
#define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013
++#define USB_VENDOR_ID_THINGM 0x27b8
++#define USB_DEVICE_ID_BLINK1 0x01ed
++
#define USB_VENDOR_ID_THRUSTMASTER 0x044f
#define USB_VENDOR_ID_TIVO 0x150a
#define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709
#define USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19 0x0a19
++#define USB_VENDOR_ID_VELLEMAN 0x10cf
++#define USB_DEVICE_ID_VELLEMAN_K8055_FIRST 0x5500
++#define USB_DEVICE_ID_VELLEMAN_K8055_LAST 0x5503
++#define USB_DEVICE_ID_VELLEMAN_K8061_FIRST 0x8061
++#define USB_DEVICE_ID_VELLEMAN_K8061_LAST 0x8068
++
#define USB_VENDOR_ID_VERNIER 0x08f7
#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
};
+ +static const u8 sixaxis_rdesc_fixup2[] = {
+ + 0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
+ + 0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
+ + 0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
+ + 0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
+ + 0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
+ + 0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
+ + 0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
+ + 0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
+ + 0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
+ + 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
+ + 0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
+ + 0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
+ + 0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
+ + 0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
+ + 0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
+ + 0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
+ + 0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
+ + 0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
+ + 0xb1, 0x02, 0xc0, 0xc0,
+ +};
+ +
struct sony_sc {
unsigned long quirks;
};
{
struct sony_sc *sc = hid_get_drvdata(hdev);
- - if ((sc->quirks & VAIO_RDESC_CONSTANT) &&
- - *rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) {
- - hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n");
+ + /*
+ + * Some Sony RF receivers wrongly declare the mouse pointer as a
+ + * a constant non-data variable.
+ + */
+ + if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
+ + /* usage page: generic desktop controls */
+ + /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
+ + /* usage: mouse */
+ + rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
+ + /* input (usage page for x,y axes): constant, variable, relative */
+ + rdesc[54] == 0x81 && rdesc[55] == 0x07) {
+ + hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
+ + /* input: data, variable, relative */
rdesc[55] = 0x06;
}
hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
sizeof(sixaxis_rdesc_fixup));
+ + } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
+ + *rsize > sizeof(sixaxis_rdesc_fixup2)) {
+ + hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
+ + *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
+ + *rsize = sizeof(sixaxis_rdesc_fixup2);
+ + memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
}
return rdesc;
}
.driver_data = SIXAXIS_CONTROLLER_BT },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
.driver_data = VAIO_RDESC_CONSTANT },
+ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
+ + .driver_data = VAIO_RDESC_CONSTANT },
{ }
};
MODULE_DEVICE_TABLE(hid, sony_devices);
.report_fixup = sony_report_fixup,
.raw_event = sony_raw_event
};
++module_hid_driver(sony_driver);
--static int __init sony_init(void)
--{
-- return hid_register_driver(&sony_driver);
--}
--
--static void __exit sony_exit(void)
--{
-- hid_unregister_driver(&sony_driver);
--}
--
--module_init(sony_init);
--module_exit(sony_exit);
MODULE_LICENSE("GPL");