@@ -1958,6 +1958,7 @@ static const struct hid_device_id hid_ha
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7_OLD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT5) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9) },
#endif
{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
@@ -634,6 +634,7 @@
#define USB_VENDOR_ID_MADCATZ 0x0738
#define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540
+#define USB_DEVICE_ID_MADCATZ_RAT5 0x1705
#define USB_DEVICE_ID_MADCATZ_RAT9 0x1709
#define USB_VENDOR_ID_MCC 0x09db
@@ -7,10 +7,11 @@
* (This module is based on "hid-ortek".)
* Copyright (c) 2012 Andreas Hübner
*
- * R.A.T.7, R.A.T.9, M.M.O.7 (USB gaming mice):
+ * R.A.T.5, R.A.T.7, R.A.T.9, M.M.O.7 (USB gaming mice):
* Fixes the mode button which cycles through three constantly pressed
* buttons. All three press events are mapped to one button and the
* missing release event is generated immediately.
+ * Original press event is available in "mode" file on sysfs.
*
*/
@@ -37,6 +38,40 @@ struct saitek_sc {
int mode;
};
+static ssize_t show_mode(struct device *dev,
+ struct device_attribute *attr,
+ char *mode_buf);
+
+/* world-readable since errors are caught and no usb-interaction needed. */
+DEVICE_ATTR(mode,0444,show_mode,NULL);
+
+static ssize_t show_mode(struct device *dev,
+ struct device_attribute *attr,
+ char *mode_buf)
+{
+ struct saitek_sc *ssc;
+ struct hid_device *hdev;
+
+ /* error-messages in sysfs file since it's non-critical. */
+ if (dev == NULL) {
+ return snprintf(mode_buf, PAGE_SIZE, "No parent.\n");
+ }
+
+ hdev = to_hid_device(dev);
+ ssc = hid_get_drvdata(hdev);
+ if (ssc == NULL) {
+ return snprintf(mode_buf, PAGE_SIZE, "No data.\n");
+ }
+
+ /* actual output is number >=1. 0 or above text for error: */
+ return snprintf(mode_buf, PAGE_SIZE, "%i\n", ssc->mode + 1);
+}
+
+static void saitek_remove(struct hid_device *hdev)
+{
+ device_remove_file(&hdev->dev, &dev_attr_mode);
+}
+
static int saitek_probe(struct hid_device *hdev,
const struct hid_device_id *id)
{
@@ -61,9 +96,15 @@ static int saitek_probe(struct hid_devic
return ret;
}
+ ret = device_create_file(&hdev->dev, &dev_attr_mode);
+ if (ret) {
+ hid_warn(hdev, "Couldn't create mode file in sysfs.\n");
+ }
+
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
if (ret) {
hid_err(hdev, "hw start failed\n");
+ saitek_remove(hdev);
return ret;
}
@@ -181,6 +222,8 @@ static const struct hid_device_id saitek
.driver_data = SAITEK_RELEASE_MODE_RAT7 },
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7),
.driver_data = SAITEK_RELEASE_MODE_RAT7 },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT5),
+ .driver_data = SAITEK_RELEASE_MODE_RAT7 },
{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9),
.driver_data = SAITEK_RELEASE_MODE_RAT7 },
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7),
@@ -197,6 +240,7 @@ static struct hid_driver saitek_driver =
.report_fixup = saitek_report_fixup,
.raw_event = saitek_raw_event,
.event = saitek_event,
+ .remove = saitek_remove,
};
module_hid_driver(saitek_driver);
@@ -665,6 +665,7 @@ config HID_SAITEK
Supported devices:
- PS1000 Dual Analog Pad
+ - R.A.T.5 Gaming Mouse
- R.A.T.9 Gaming Mouse
- R.A.T.7 Gaming Mouse
- M.M.O.7 Gaming Mouse
added support for my pid so I can test the changes: 3 events were mapped to one, this allows discerning which is which. on my mouse there is a button with a 3 colour-led. I can now determine in user-space which colour is visible. this patch replaces my previous ones. if you use an older kernel than Dec 28th 2015, use previous patch! Signed-off-by: Piotr Sawuk <piotr5@users.sf.net> --- add support for mad catz r.a.t.5 add a file in sysfs called "mode" exposing the integer of that name. -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html