[Patch] hid: enhance hid-saitek for use with R.A.T.5 and similar

STALE3852d

4 messages, 2 authors, 2016-01-28 · open the first message on its own page

[Patch] hid: enhance hid-saitek for use with R.A.T.5 and similar

From: Piotr Sawuk <hidden>
Date: 2016-01-09 12:44:14

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 one which merely added rat5-support.

Signed-off-by: Piotr Sawuk <redacted>
---
add support for mad catz r.a.t.5
add a file in sysfs called "mode" exposing the integer of that name.

diff -rup linux-4.2.6-gentoo/drivers/hid/hid-core.c
linux-4.2.6-gentoo-rat5/drivers/hid/hid-core.c
--- linux-4.2.6-gentoo/drivers/hid/hid-core.c	2015-08-30
20:34:09.000000000 +0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/hid-core.c	2015-12-30
12:09:14.340841552 +0100
@@ -1959,6 +1959,7 @@ static const struct hid_device_id hid_ha
 	{ 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_RAT9) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT5) },
 #endif
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG,
USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG,
USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
diff -rup linux-4.2.6-gentoo/drivers/hid/hid-ids.h
linux-4.2.6-gentoo-rat5/drivers/hid/hid-ids.h
--- linux-4.2.6-gentoo/drivers/hid/hid-ids.h	2015-08-30
20:34:09.000000000 +0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/hid-ids.h	2015-12-29
18:47:36.756225217 +0100
@@ -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
diff -rup linux-4.2.6-gentoo/drivers/hid/hid-saitek.c
linux-4.2.6-gentoo-rat5/drivers/hid/hid-saitek.c
--- linux-4.2.6-gentoo/drivers/hid/hid-saitek.c	2015-08-30
20:34:09.000000000 +0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/hid-saitek.c	2016-01-09
12:19:19.574905612 +0100
@@ -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 = container_of(dev, struct 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);
diff -rup linux-4.2.6-gentoo/drivers/hid/Kconfig
linux-4.2.6-gentoo-rat5/drivers/hid/Kconfig
--- linux-4.2.6-gentoo/drivers/hid/Kconfig	2015-08-30 20:34:09.000000000
+0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/Kconfig	2015-12-30
12:14:49.228404039 +0100
@@ -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
--
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

Re: [Patch] hid: enhance hid-saitek for use with R.A.T.5 and similar

From: Jiri Kosina <jikos@kernel.org>
Date: 2016-01-26 14:29:43

On Sat, 9 Jan 2016, Piotr Sawuk wrote:
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 one which merely added rat5-support.

Signed-off-by: Piotr Sawuk <redacted>
The patch has been damaged by your mail client, and as such can't be 
applied. Could you please fix that up and resend?
quoted hunk
---
add support for mad catz r.a.t.5
add a file in sysfs called "mode" exposing the integer of that name.

diff -rup linux-4.2.6-gentoo/drivers/hid/hid-core.c
linux-4.2.6-gentoo-rat5/drivers/hid/hid-core.c
--- linux-4.2.6-gentoo/drivers/hid/hid-core.c	2015-08-30
20:34:09.000000000 +0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/hid-core.c	2015-12-30
12:09:14.340841552 +0100
@@ -1959,6 +1959,7 @@ static const struct hid_device_id hid_ha
 	{ 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_RAT9) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT5) },
Could you please keep the list sorted (at least by parts)?
quoted hunk
 #endif
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG,
USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG,
USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
diff -rup linux-4.2.6-gentoo/drivers/hid/hid-ids.h
linux-4.2.6-gentoo-rat5/drivers/hid/hid-ids.h
--- linux-4.2.6-gentoo/drivers/hid/hid-ids.h	2015-08-30
20:34:09.000000000 +0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/hid-ids.h	2015-12-29
18:47:36.756225217 +0100
@@ -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
diff -rup linux-4.2.6-gentoo/drivers/hid/hid-saitek.c
linux-4.2.6-gentoo-rat5/drivers/hid/hid-saitek.c
--- linux-4.2.6-gentoo/drivers/hid/hid-saitek.c	2015-08-30
20:34:09.000000000 +0200
+++ linux-4.2.6-gentoo-rat5/drivers/hid/hid-saitek.c	2016-01-09
12:19:19.574905612 +0100
@@ -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 = container_of(dev, struct hid_device, dev);
You can use to_hid_device() here.

Thanks,

-- 
Jiri Kosina
SUSE Labs

--
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

Re: [Patch] hid: enhance hid-saitek for use with R.A.T.5 and similar

From: Piotr Sawuk <hidden>
Date: 2016-01-27 23:17:01

On Di, 26.01.2016, 15:29, Jiri Kosina wrote:
On Sat, 9 Jan 2016, Piotr Sawuk wrote:
quoted
Signed-off-by: Piotr Sawuk <redacted>
The patch has been damaged by your mail client, and as such can't be
applied. Could you please fix that up and resend?
thanks, I fixed that by an addon to thunderbird.
Could you please keep the list sorted (at least by parts)?
done.
quoted
+	hdev = container_of(dev, struct hid_device, dev);
You can use to_hid_device() here.
sorry, didn't notice that recent addition.
my new patch wont work against older kernel versions though...

P

Re: [Patch] hid: enhance hid-saitek for use with R.A.T.5 and similar

From: Jiri Kosina <jikos@kernel.org>
Date: 2016-01-28 08:53:43

On Thu, 28 Jan 2016, Piotr Sawuk wrote:
quoted
quoted
+	hdev = container_of(dev, struct hid_device, dev);
You can use to_hid_device() here.
sorry, didn't notice that recent addition.
my new patch wont work against older kernel versions though...
The only thing that really matters is that it works with the kernel it's 
being applied to and pushed upstream.

If anyone wants to backport it later to some older kernel, as part of a 
backport he'd have to open-code to_hide_device() ... no big deal.

Thanks,

-- 
Jiri Kosina
SUSE Labs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help