1 /* 2 * HID driver for Saitek devices, currently only the PS1000 (USB gamepad). 3 * Fixes the HID report descriptor by removing a non-existent axis and 4 * clearing the constant bit on the input reports for buttons and d-pad. 5 * (This module is based on "hid-ortek".) 6 * 7 * Copyright (c) 2012 Andreas Hübner 8 */ 9 10 /* 11 * This program is free software; you can redistribute it and/or modify it 12 * under the terms of the GNU General Public License as published by the Free 13 * Software Foundation; either version 2 of the License, or (at your option) 14 * any later version. 15 */ 16 17 #include <linux/device.h> 18 #include <linux/hid.h> 19 #include <linux/module.h> 20 #include <linux/kernel.h> 21 22 #include "hid-ids.h" 23 24 static __u8 *saitek_report_fixup(struct hid_device *hdev, __u8 *rdesc, 25 unsigned int *rsize) 26 { 27 if (*rsize == 137 && rdesc[20] == 0x09 && rdesc[21] == 0x33 28 && rdesc[94] == 0x81 && rdesc[95] == 0x03 29 && rdesc[110] == 0x81 && rdesc[111] == 0x03) { 30 31 hid_info(hdev, "Fixing up Saitek PS1000 report descriptor\n"); 32 33 /* convert spurious axis to a "noop" Logical Minimum (0) */ 34 rdesc[20] = 0x15; 35 rdesc[21] = 0x00; 36 37 /* clear constant bit on buttons and d-pad */ 38 rdesc[95] = 0x02; 39 rdesc[111] = 0x02; 40 41 } 42 return rdesc; 43 } 44 45 static const struct hid_device_id saitek_devices[] = { 46 { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000)}, 47 { } 48 }; 49 50 MODULE_DEVICE_TABLE(hid, saitek_devices); 51 52 static struct hid_driver saitek_driver = { 53 .name = "saitek", 54 .id_table = saitek_devices, 55 .report_fixup = saitek_report_fixup 56 }; 57 58 static int __init saitek_init(void) 59 { 60 return hid_register_driver(&saitek_driver); 61 } 62 63 static void __exit saitek_exit(void) 64 { 65 hid_unregister_driver(&saitek_driver); 66 } 67 68 module_init(saitek_init); 69 module_exit(saitek_exit); 70 MODULE_LICENSE("GPL"); 71