linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature
@ 2016-09-09 22:50 Simon Wood
  2016-09-09 22:50 ` [PATCH 2/5] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-09 22:50 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Introduce a dev_attr which can be used to combine the accelerator
and brake pedals into a single axis. This is useful for older games
which can not handle separate accelerator and brake.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 .../ABI/testing/sysfs-driver-hid-logitech-lg4ff    |  9 ++++
 drivers/hid/hid-lg4ff.c                            | 58 ++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
index db197a8..69fb890 100644
--- a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
+++ b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
@@ -50,3 +50,12 @@ Description:	Displays the real model of the wheel regardless of any
 		alternate mode the wheel might be switched to.
 		It is a read-only value.
 		This entry is not created for devices that have only one mode.
+
+What:		/sys/bus/hid/drivers/logitech/<dev>/combine_pedals
+Date:		Sep 2016
+KernelVersion:	4.9
+Contact:	Simon Wood <simon@mungewell.org>
+Description:	Controls whether a combined value of accelerator and brake is
+		reported on the Y axis of the controller. Useful for older games
+		which can do not work with separate accelerator/brake axis.
+		Off ('0') by default, enabled by setting '1'.
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index af3a8ec..ca31ce4 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -75,6 +75,7 @@ static void lg4ff_set_range_g25(struct hid_device *hid, u16 range);
 
 struct lg4ff_wheel_data {
 	const u32 product_id;
+	u16 combine;
 	u16 range;
 	const u16 min_range;
 	const u16 max_range;
@@ -345,6 +346,7 @@ static void lg4ff_init_wheel_data(struct lg4ff_wheel_data * const wdata, const s
 	{
 		struct lg4ff_wheel_data t_wdata =  { .product_id = wheel->product_id,
 						     .real_product_id = real_product_id,
+						     .combine = 0,
 						     .min_range = wheel->min_range,
 						     .max_range = wheel->max_range,
 						     .set_range = wheel->set_range,
@@ -885,6 +887,58 @@ static ssize_t lg4ff_alternate_modes_store(struct device *dev, struct device_att
 }
 static DEVICE_ATTR(alternate_modes, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, lg4ff_alternate_modes_show, lg4ff_alternate_modes_store);
 
+static ssize_t lg4ff_combine_show(struct device *dev, struct device_attribute *attr,
+				char *buf)
+{
+	struct hid_device *hid = to_hid_device(dev);
+	struct lg4ff_device_entry *entry;
+	struct lg_drv_data *drv_data;
+	size_t count;
+
+	drv_data = hid_get_drvdata(hid);
+	if (!drv_data) {
+		hid_err(hid, "Private driver data not found!\n");
+		return 0;
+	}
+
+	entry = drv_data->device_props;
+	if (!entry) {
+		hid_err(hid, "Device properties not found!\n");
+		return 0;
+	}
+
+	count = scnprintf(buf, PAGE_SIZE, "%u\n", entry->wdata.combine);
+	return count;
+}
+
+static ssize_t lg4ff_combine_store(struct device *dev, struct device_attribute *attr,
+				 const char *buf, size_t count)
+{
+	struct hid_device *hid = to_hid_device(dev);
+	struct lg4ff_device_entry *entry;
+	struct lg_drv_data *drv_data;
+	u16 combine = simple_strtoul(buf, NULL, 10);
+
+	drv_data = hid_get_drvdata(hid);
+	if (!drv_data) {
+		hid_err(hid, "Private driver data not found!\n");
+		return -EINVAL;
+	}
+
+	entry = drv_data->device_props;
+	if (!entry) {
+		hid_err(hid, "Device properties not found!\n");
+		return -EINVAL;
+	}
+
+	if (combine > 1)
+		combine = 1;
+
+	entry->wdata.combine = combine;
+	return count;
+}
+static DEVICE_ATTR(combine_pedals, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, lg4ff_combine_show, lg4ff_combine_store);
+
 /* Export the currently set range of the wheel */
 static ssize_t lg4ff_range_show(struct device *dev, struct device_attribute *attr,
 				char *buf)
@@ -1259,6 +1313,9 @@ int lg4ff_init(struct hid_device *hid)
 	}
 
 	/* Create sysfs interface */
+	error = device_create_file(&hid->dev, &dev_attr_combine_pedals);
+	if (error)
+		hid_warn(hid, "Unable to create sysfs interface for \"combine\", errno %d\n", error);
 	error = device_create_file(&hid->dev, &dev_attr_range);
 	if (error)
 		hid_warn(hid, "Unable to create sysfs interface for \"range\", errno %d\n", error);
@@ -1358,6 +1415,7 @@ int lg4ff_deinit(struct hid_device *hid)
 		device_remove_file(&hid->dev, &dev_attr_alternate_modes);
 	}
 
+	device_remove_file(&hid->dev, &dev_attr_combine_pedals);
 	device_remove_file(&hid->dev, &dev_attr_range);
 #ifdef CONFIG_LEDS_CLASS
 	{
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/5] HID:hid-logitech: Add combined pedal support Logitech wheels
  2016-09-09 22:50 [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature Simon Wood
@ 2016-09-09 22:50 ` Simon Wood
  2016-09-09 22:50 ` [PATCH 3/5] HID:hid-logitech: Compute combined pedals if not supplied Simon Wood
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-09 22:50 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Add support for reporting a combined accelerator/brake axis for wheels
which contain combined data in their HID stream.

This includes DF, MOMO, MOMO2 and DFP.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg.c    | 12 ++++++++++++
 drivers/hid/hid-lg4ff.c | 32 ++++++++++++++++++++++++++++++++
 drivers/hid/hid-lg4ff.h |  4 ++++
 3 files changed, 48 insertions(+)

diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index feb2be7..06f8a5e 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -657,6 +657,17 @@ static int lg_event(struct hid_device *hdev, struct hid_field *field,
 	return 0;
 }
 
+static int lg_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size)
+{
+	struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
+
+	if (drv_data->quirks & LG_FF4)
+		return lg4ff_raw_event(hdev, report, rd, size, drv_data);
+
+	return 0;
+}
+
 static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
 	struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
@@ -830,6 +841,7 @@ static struct hid_driver lg_driver = {
 	.input_mapping = lg_input_mapping,
 	.input_mapped = lg_input_mapped,
 	.event = lg_event,
+	.raw_event = lg_raw_event,
 	.probe = lg_probe,
 	.remove = lg_remove,
 };
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index ca31ce4..79d34c2 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -329,6 +329,38 @@ int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 	}
 }
 
+int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size, struct lg_drv_data *drv_data)
+{
+	struct lg4ff_device_entry *entry = drv_data->device_props;
+
+	if (!entry)
+		return 0;
+
+	/* adjust HID report present combined pedals data */
+	if (entry->wdata.combine) {
+		switch (entry->wdata.product_id) {
+		case USB_DEVICE_ID_LOGITECH_WHEEL:
+			rd[5] = rd[3];
+			rd[6] = 0x7F;
+			return 1;
+		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
+			rd[4] = rd[3];
+			rd[5] = 0x7F;
+			return 1;
+		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
+			rd[5] = rd[4];
+			rd[6] = 0x7F;
+			return 1;
+		default:
+			return 0;
+		}
+	}
+
+	return 0;
+}
+
 static void lg4ff_init_wheel_data(struct lg4ff_wheel_data * const wdata, const struct lg4ff_wheel *wheel,
 				  const struct lg4ff_multimode_wheel *mmode_wheel,
 				  const u16 real_product_id)
diff --git a/drivers/hid/hid-lg4ff.h b/drivers/hid/hid-lg4ff.h
index 66201af..de1f350 100644
--- a/drivers/hid/hid-lg4ff.h
+++ b/drivers/hid/hid-lg4ff.h
@@ -6,11 +6,15 @@ extern int lg4ff_no_autoswitch; /* From hid-lg.c */
 
 int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 			     struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data);
+int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size, struct lg_drv_data *drv_data);
 int lg4ff_init(struct hid_device *hdev);
 int lg4ff_deinit(struct hid_device *hdev);
 #else
 static inline int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 					   struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data) { return 0; }
+static inline int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size, struct lg_drv_data *drv_data) { return 0; }
 static inline int lg4ff_init(struct hid_device *hdev) { return -1; }
 static inline int lg4ff_deinit(struct hid_device *hdev) { return -1; }
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/5] HID:hid-logitech: Compute combined pedals if not supplied
  2016-09-09 22:50 [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature Simon Wood
  2016-09-09 22:50 ` [PATCH 2/5] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
@ 2016-09-09 22:50 ` Simon Wood
  2016-09-09 22:50 ` [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-09 22:50 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Add support for computing a combined accelerator/brake axis for wheels
which don't contain combined data in their HID stream.

This includes DFGT, G25, G27, G29 and Wii-Wheel.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg4ff.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index 79d34c2..cc5c9ebd 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -332,6 +332,7 @@ int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
 		u8 *rd, int size, struct lg_drv_data *drv_data)
 {
+	int offset;
 	struct lg4ff_device_entry *entry = drv_data->device_props;
 
 	if (!entry)
@@ -353,9 +354,25 @@ int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
 			rd[5] = rd[4];
 			rd[6] = 0x7F;
 			return 1;
+		case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
+			offset = 5;
+			break;
+		case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
+			offset = 6;
+			break;
+		case USB_DEVICE_ID_LOGITECH_WII_WHEEL:
+			offset = 3;
+			break;
 		default:
 			return 0;
 		}
+
+		/* Compute a combined axis when wheel does not supply it */
+		rd[offset] = (0xFF + rd[offset] - rd[offset+1]) >> 1;
+		rd[offset+1] = 0x7F;
+		return 1;
 	}
 
 	return 0;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels
  2016-09-09 22:50 [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature Simon Wood
  2016-09-09 22:50 ` [PATCH 2/5] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
  2016-09-09 22:50 ` [PATCH 3/5] HID:hid-logitech: Compute combined pedals if not supplied Simon Wood
@ 2016-09-09 22:50 ` Simon Wood
  2016-09-10  1:34   ` kbuild test robot
  2016-09-14 18:55   ` Simon Wood
  2016-09-09 22:50 ` [PATCH 5/5] HID:hid-logitech: Documentation updates/corrections Simon Wood
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
  4 siblings, 2 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-09 22:50 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Rewrite the HID descriptor for _all_ Driving Force wheels (real
or emulated) so that they can report separate Accelerator and
Brake axis.

If the user wants a combined accel/brake axis, they can use the
'combined pedals' feature.

$ echo 1 > /sys/bus/hid/devices/<device-id>/combine_pedals

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg.c | 13 +------------
 1 file changed, 1 insertion(+), 12 deletions(-)

diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index 06f8a5e..53429c6 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -365,18 +365,7 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 
 	/* Several wheels report as this id when operating in emulation mode. */
 	case USB_DEVICE_ID_LOGITECH_WHEEL:
-		udesc = &(hid_to_usb_dev(hdev)->descriptor);
-		if (!udesc) {
-			hid_err(hdev, "NULL USB device descriptor\n");
-			break;
-		}
-		bcdDevice = le16_to_cpu(udesc->bcdDevice);
-		rev_maj = bcdDevice >> 8;
-		rev_min = bcdDevice & 0xff;
-
-		/* Update the report descriptor for only the Driving Force wheel */
-		if (rev_maj == 1 && rev_min == 2 &&
-				*rsize == DF_RDESC_ORIG_SIZE) {
+		if (*rsize == DF_RDESC_ORIG_SIZE) {
 			hid_info(hdev,
 				"fixing up Logitech Driving Force report descriptor\n");
 			rdesc = df_rdesc_fixed;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 5/5] HID:hid-logitech: Documentation updates/corrections
  2016-09-09 22:50 [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature Simon Wood
                   ` (2 preceding siblings ...)
  2016-09-09 22:50 ` [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
@ 2016-09-09 22:50 ` Simon Wood
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
  4 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-09 22:50 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff | 6 ++++++
 drivers/hid/Kconfig                                       | 6 +++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
index 69fb890..36e4d68 100644
--- a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
+++ b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
@@ -35,6 +35,12 @@ Description:	Displays a set of alternate modes supported by a wheel. Each
 		  DF-EX <*--------> G25 <-> G27
 		  DF-EX <*----------------> G27
 
+		G29:
+		  DF-EX <*> DFP <-> G25 <-> G27 <-> G29
+		  DF-EX <*--------> G25 <-> G27 <-> G29
+		  DF-EX <*----------------> G27 <-> G29
+		  DF-EX <*------------------------> G29
+
 		DFGT:
 		  DF-EX <*> DFP <-> DFGT
 		  DF-EX <*--------> DFGT
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 78ac481..bebf89c0 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -457,8 +457,6 @@ config LOGITECH_FF
 	  - Logitech WingMan Cordless RumblePad
 	  - Logitech WingMan Cordless RumblePad 2
 	  - Logitech WingMan Force 3D
-	  - Logitech Formula Force EX
-	  - Logitech WingMan Formula Force GP
 
 	  and if you want to enable force feedback for them.
 	  Note: if you say N here, this device will still be supported, but without
@@ -491,12 +489,14 @@ config LOGIWHEELS_FF
 	  Say Y here if you want to enable force feedback and range setting
 	  support for following Logitech wheels:
 	  - Logitech Driving Force
+	  - Logitech Driving Force EX
 	  - Logitech Driving Force Pro
 	  - Logitech Driving Force GT
 	  - Logitech G25
 	  - Logitech G27
+	  - Logitech G29
 	  - Logitech MOMO/MOMO 2
-	  - Logitech Formula Force EX
+	  - Logitech Formula Force EX/FX/GP
 
 config HID_MAGICMOUSE
 	tristate "Apple Magic Mouse/Trackpad multi-touch support"
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels
  2016-09-09 22:50 ` [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
@ 2016-09-10  1:34   ` kbuild test robot
  2016-09-14 18:55   ` Simon Wood
  1 sibling, 0 replies; 14+ messages in thread
From: kbuild test robot @ 2016-09-10  1:34 UTC (permalink / raw)
  To: Simon Wood
  Cc: kbuild-all, linux-input, linux-kernel, Jiri Kosina, Edwin Velds,
	Elias Vanderstuyft, Michal Maly, Simon Wood

[-- Attachment #1: Type: text/plain, Size: 3390 bytes --]

Hi Simon,

[auto build test WARNING on hid/for-next]
[also build test WARNING on v4.8-rc5 next-20160909]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]

url:    https://github.com/0day-ci/linux/commits/Simon-Wood/HID-hid-logitech-Introduce-dev_attr-for-combined-pedals-feature/20160910-065505
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git for-next
config: sh-titan_defconfig (attached as .config)
compiler: sh4-linux-gnu-gcc (Debian 5.4.0-6) 5.4.0 20160609
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=sh 

All warnings (new ones prefixed by >>):

   drivers/hid/hid-lg.c: In function 'lg_report_fixup':
>> drivers/hid/hid-lg.c:347:28: warning: unused variable 'rev_min' [-Wunused-variable]
     __u16 bcdDevice, rev_maj, rev_min;
                               ^
>> drivers/hid/hid-lg.c:347:19: warning: unused variable 'rev_maj' [-Wunused-variable]
     __u16 bcdDevice, rev_maj, rev_min;
                      ^
>> drivers/hid/hid-lg.c:347:8: warning: unused variable 'bcdDevice' [-Wunused-variable]
     __u16 bcdDevice, rev_maj, rev_min;
           ^
>> drivers/hid/hid-lg.c:346:32: warning: unused variable 'udesc' [-Wunused-variable]
     struct usb_device_descriptor *udesc;
                                   ^

vim +/rev_min +347 drivers/hid/hid-lg.c

5f22a799 drivers/hid/hid-logitech.c Jiri Slaby         2008-05-16  340   * the original value of 0x28c of logical maximum to 0x104d
5f22a799 drivers/hid/hid-logitech.c Jiri Slaby         2008-05-16  341   */
73e4008d drivers/hid/hid-lg.c       Nikolai Kondrashov 2010-08-06  342  static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
73e4008d drivers/hid/hid-lg.c       Nikolai Kondrashov 2010-08-06  343  		unsigned int *rsize)
5f22a799 drivers/hid/hid-logitech.c Jiri Slaby         2008-05-16  344  {
25751553 drivers/hid/hid-lg.c       Axel Lin           2012-09-13  345  	struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
54bfe3f0 drivers/hid/hid-lg.c       Paul Sbarra        2013-02-17 @346  	struct usb_device_descriptor *udesc;
54bfe3f0 drivers/hid/hid-lg.c       Paul Sbarra        2013-02-17 @347  	__u16 bcdDevice, rev_maj, rev_min;
5f22a799 drivers/hid/hid-logitech.c Jiri Slaby         2008-05-16  348  
4ab25786 drivers/hid/hid-lg.c       Jiri Kosina        2014-08-21  349  	if ((drv_data->quirks & LG_RDESC) && *rsize >= 91 && rdesc[83] == 0x26 &&
5f22a799 drivers/hid/hid-logitech.c Jiri Slaby         2008-05-16  350  			rdesc[84] == 0x8c && rdesc[85] == 0x02) {

:::::: The code at line 347 was first introduced by commit
:::::: 54bfe3f0dab2b2f0ac629690f187537d95adeb4f HID: logitech: add report descriptor for Driving Force wheel

:::::: TO: Paul Sbarra <sbarra.paul@gmail.com>
:::::: CC: Jiri Kosina <jkosina@suse.cz>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 15776 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels
  2016-09-09 22:50 ` [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
  2016-09-10  1:34   ` kbuild test robot
@ 2016-09-14 18:55   ` Simon Wood
  1 sibling, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-14 18:55 UTC (permalink / raw)
  To: Simon Wood
  Cc: linux-input, linux-kernel, Jiri Kosina, Edwin Velds,
	Elias Vanderstuyft, Michal Maly, Simon Wood

On Fri, September 9, 2016 7:34 pm, kbuild test robot wrote:
> All warnings (new ones prefixed by >>):
>
>
> drivers/hid/hid-lg.c: In function 'lg_report_fixup':
>
>>> drivers/hid/hid-lg.c:347:28: warning: unused variable 'rev_min'
>>> [-Wunused-variable]
>>>
> __u16 bcdDevice, rev_maj, rev_min;
> ^
>
>>> drivers/hid/hid-lg.c:347:19: warning: unused variable 'rev_maj'
>>> [-Wunused-variable]
>>>
> __u16 bcdDevice, rev_maj, rev_min;
> ^
>
>>> drivers/hid/hid-lg.c:347:8: warning: unused variable 'bcdDevice'
>>> [-Wunused-variable]
>>>
> __u16 bcdDevice, rev_maj, rev_min;
> ^
>
>>> drivers/hid/hid-lg.c:346:32: warning: unused variable 'udesc'
>>> [-Wunused-variable]
>>>
> struct usb_device_descriptor *udesc; ^

Hi all,
No other comments from the rest of the patch set (so far), so I'll send a
V2 patch set to cover these towards the end of the week.

Also have better support for the "Wingman Forumula Force GT" to include,
as I picked one up cheap on Kijiji.
Simon.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature
  2016-09-09 22:50 [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature Simon Wood
                   ` (3 preceding siblings ...)
  2016-09-09 22:50 ` [PATCH 5/5] HID:hid-logitech: Documentation updates/corrections Simon Wood
@ 2016-09-18 16:55 ` Simon Wood
  2016-09-18 16:55   ` [Patch-V2 2/6] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
                     ` (5 more replies)
  4 siblings, 6 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-18 16:55 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Introduce a dev_attr which can be used to combine the accelerator
and brake pedals into a single axis. This is useful for older games
which can not handle seperate accelerator and brake.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 .../ABI/testing/sysfs-driver-hid-logitech-lg4ff    |  9 ++++
 drivers/hid/hid-lg4ff.c                            | 58 ++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
index db197a8..9cd7c5a 100644
--- a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
+++ b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
@@ -50,3 +50,12 @@ Description:	Displays the real model of the wheel regardless of any
 		alternate mode the wheel might be switched to.
 		It is a read-only value.
 		This entry is not created for devices that have only one mode.
+
+What:		/sys/bus/hid/drivers/logitech/<dev>/combine_pedals
+Date:		Sep 2016
+KernelVersion:	4.9
+Contact:	Simon Wood <simon@mungewell.org>
+Description:	Controls whether a combined value of accelerator and brake is
+		reported on the Y axis of the controller. Useful for older games
+		which can do not work with separate accelerator/brake axis.
+		Off ('0') by default, enabled by setting '1'.
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index af3a8ec..ca31ce4 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -75,6 +75,7 @@ static void lg4ff_set_range_g25(struct hid_device *hid, u16 range);
 
 struct lg4ff_wheel_data {
 	const u32 product_id;
+	u16 combine;
 	u16 range;
 	const u16 min_range;
 	const u16 max_range;
@@ -345,6 +346,7 @@ static void lg4ff_init_wheel_data(struct lg4ff_wheel_data * const wdata, const s
 	{
 		struct lg4ff_wheel_data t_wdata =  { .product_id = wheel->product_id,
 						     .real_product_id = real_product_id,
+						     .combine = 0,
 						     .min_range = wheel->min_range,
 						     .max_range = wheel->max_range,
 						     .set_range = wheel->set_range,
@@ -885,6 +887,58 @@ static ssize_t lg4ff_alternate_modes_store(struct device *dev, struct device_att
 }
 static DEVICE_ATTR(alternate_modes, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, lg4ff_alternate_modes_show, lg4ff_alternate_modes_store);
 
+static ssize_t lg4ff_combine_show(struct device *dev, struct device_attribute *attr,
+				char *buf)
+{
+	struct hid_device *hid = to_hid_device(dev);
+	struct lg4ff_device_entry *entry;
+	struct lg_drv_data *drv_data;
+	size_t count;
+
+	drv_data = hid_get_drvdata(hid);
+	if (!drv_data) {
+		hid_err(hid, "Private driver data not found!\n");
+		return 0;
+	}
+
+	entry = drv_data->device_props;
+	if (!entry) {
+		hid_err(hid, "Device properties not found!\n");
+		return 0;
+	}
+
+	count = scnprintf(buf, PAGE_SIZE, "%u\n", entry->wdata.combine);
+	return count;
+}
+
+static ssize_t lg4ff_combine_store(struct device *dev, struct device_attribute *attr,
+				 const char *buf, size_t count)
+{
+	struct hid_device *hid = to_hid_device(dev);
+	struct lg4ff_device_entry *entry;
+	struct lg_drv_data *drv_data;
+	u16 combine = simple_strtoul(buf, NULL, 10);
+
+	drv_data = hid_get_drvdata(hid);
+	if (!drv_data) {
+		hid_err(hid, "Private driver data not found!\n");
+		return -EINVAL;
+	}
+
+	entry = drv_data->device_props;
+	if (!entry) {
+		hid_err(hid, "Device properties not found!\n");
+		return -EINVAL;
+	}
+
+	if (combine > 1)
+		combine = 1;
+
+	entry->wdata.combine = combine;
+	return count;
+}
+static DEVICE_ATTR(combine_pedals, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, lg4ff_combine_show, lg4ff_combine_store);
+
 /* Export the currently set range of the wheel */
 static ssize_t lg4ff_range_show(struct device *dev, struct device_attribute *attr,
 				char *buf)
@@ -1259,6 +1313,9 @@ int lg4ff_init(struct hid_device *hid)
 	}
 
 	/* Create sysfs interface */
+	error = device_create_file(&hid->dev, &dev_attr_combine_pedals);
+	if (error)
+		hid_warn(hid, "Unable to create sysfs interface for \"combine\", errno %d\n", error);
 	error = device_create_file(&hid->dev, &dev_attr_range);
 	if (error)
 		hid_warn(hid, "Unable to create sysfs interface for \"range\", errno %d\n", error);
@@ -1358,6 +1415,7 @@ int lg4ff_deinit(struct hid_device *hid)
 		device_remove_file(&hid->dev, &dev_attr_alternate_modes);
 	}
 
+	device_remove_file(&hid->dev, &dev_attr_combine_pedals);
 	device_remove_file(&hid->dev, &dev_attr_range);
 #ifdef CONFIG_LEDS_CLASS
 	{
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Patch-V2 2/6] HID:hid-logitech: Add combined pedal support Logitech wheels
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
@ 2016-09-18 16:55   ` Simon Wood
  2016-09-18 16:55   ` [Patch-V2 3/6] HID:hid-logitech: Compute combined pedals value Simon Wood
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-18 16:55 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Add support for reporting a combined accelerator/brake axis for wheels
which contain combined data in their HID stream.

This includes DF, MOMO, MOMO2 and DFP.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg.c    | 12 ++++++++++++
 drivers/hid/hid-lg4ff.c | 32 ++++++++++++++++++++++++++++++++
 drivers/hid/hid-lg4ff.h |  4 ++++
 3 files changed, 48 insertions(+)

diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index feb2be7..06f8a5e 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -657,6 +657,17 @@ static int lg_event(struct hid_device *hdev, struct hid_field *field,
 	return 0;
 }
 
+static int lg_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size)
+{
+	struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
+
+	if (drv_data->quirks & LG_FF4)
+		return lg4ff_raw_event(hdev, report, rd, size, drv_data);
+
+	return 0;
+}
+
 static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
 	struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
@@ -830,6 +841,7 @@ static struct hid_driver lg_driver = {
 	.input_mapping = lg_input_mapping,
 	.input_mapped = lg_input_mapped,
 	.event = lg_event,
+	.raw_event = lg_raw_event,
 	.probe = lg_probe,
 	.remove = lg_remove,
 };
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index ca31ce4..79d34c2 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -329,6 +329,38 @@ int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 	}
 }
 
+int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size, struct lg_drv_data *drv_data)
+{
+	struct lg4ff_device_entry *entry = drv_data->device_props;
+
+	if (!entry)
+		return 0;
+
+	/* adjust HID report present combined pedals data */
+	if (entry->wdata.combine) {
+		switch (entry->wdata.product_id) {
+		case USB_DEVICE_ID_LOGITECH_WHEEL:
+			rd[5] = rd[3];
+			rd[6] = 0x7F;
+			return 1;
+		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
+			rd[4] = rd[3];
+			rd[5] = 0x7F;
+			return 1;
+		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
+			rd[5] = rd[4];
+			rd[6] = 0x7F;
+			return 1;
+		default:
+			return 0;
+		}
+	}
+
+	return 0;
+}
+
 static void lg4ff_init_wheel_data(struct lg4ff_wheel_data * const wdata, const struct lg4ff_wheel *wheel,
 				  const struct lg4ff_multimode_wheel *mmode_wheel,
 				  const u16 real_product_id)
diff --git a/drivers/hid/hid-lg4ff.h b/drivers/hid/hid-lg4ff.h
index 66201af..de1f350 100644
--- a/drivers/hid/hid-lg4ff.h
+++ b/drivers/hid/hid-lg4ff.h
@@ -6,11 +6,15 @@ extern int lg4ff_no_autoswitch; /* From hid-lg.c */
 
 int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 			     struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data);
+int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size, struct lg_drv_data *drv_data);
 int lg4ff_init(struct hid_device *hdev);
 int lg4ff_deinit(struct hid_device *hdev);
 #else
 static inline int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 					   struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data) { return 0; }
+static inline int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+		u8 *rd, int size, struct lg_drv_data *drv_data) { return 0; }
 static inline int lg4ff_init(struct hid_device *hdev) { return -1; }
 static inline int lg4ff_deinit(struct hid_device *hdev) { return -1; }
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Patch-V2 3/6] HID:hid-logitech: Compute combined pedals value
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
  2016-09-18 16:55   ` [Patch-V2 2/6] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
@ 2016-09-18 16:55   ` Simon Wood
  2016-09-18 16:55   ` [Patch-V2 4/6] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
                     ` (3 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-18 16:55 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Add support for computing a combined accelerator/brake axis for wheels
which don't contain combined data in their HID stream.

This includes DFGT, G25, G27, G29 and Wii-Wheel.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg4ff.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index 79d34c2..cc5c9ebd 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -332,6 +332,7 @@ int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
 int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
 		u8 *rd, int size, struct lg_drv_data *drv_data)
 {
+	int offset;
 	struct lg4ff_device_entry *entry = drv_data->device_props;
 
 	if (!entry)
@@ -353,9 +354,25 @@ int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
 			rd[5] = rd[4];
 			rd[6] = 0x7F;
 			return 1;
+		case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
+			offset = 5;
+			break;
+		case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
+			offset = 6;
+			break;
+		case USB_DEVICE_ID_LOGITECH_WII_WHEEL:
+			offset = 3;
+			break;
 		default:
 			return 0;
 		}
+
+		/* Compute a combined axis when wheel does not supply it */
+		rd[offset] = (0xFF + rd[offset] - rd[offset+1]) >> 1;
+		rd[offset+1] = 0x7F;
+		return 1;
 	}
 
 	return 0;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Patch-V2 4/6] HID:hid-logitech: Rewrite of descriptor for all DF wheels
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
  2016-09-18 16:55   ` [Patch-V2 2/6] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
  2016-09-18 16:55   ` [Patch-V2 3/6] HID:hid-logitech: Compute combined pedals value Simon Wood
@ 2016-09-18 16:55   ` Simon Wood
  2016-09-18 16:55   ` [Patch-V2 5/6] HID:hid-logitech: Improve Wingman Formula Force GP support Simon Wood
                     ` (2 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-18 16:55 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Rewrite the HID descriptor for _all_ Driving Force wheels (real
or emulated) so that they can report separate Accelerator and
Brake axis.

If the user wants a combined accel/brake axis, they can use the
'combined pedals' feature.

$ echo 1 > /sys/bus/hid/devices/<device-id>/combine_pedals

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index 06f8a5e..ffcf4f1 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -343,8 +343,6 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 		unsigned int *rsize)
 {
 	struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
-	struct usb_device_descriptor *udesc;
-	__u16 bcdDevice, rev_maj, rev_min;
 
 	if ((drv_data->quirks & LG_RDESC) && *rsize >= 91 && rdesc[83] == 0x26 &&
 			rdesc[84] == 0x8c && rdesc[85] == 0x02) {
@@ -365,18 +363,7 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 
 	/* Several wheels report as this id when operating in emulation mode. */
 	case USB_DEVICE_ID_LOGITECH_WHEEL:
-		udesc = &(hid_to_usb_dev(hdev)->descriptor);
-		if (!udesc) {
-			hid_err(hdev, "NULL USB device descriptor\n");
-			break;
-		}
-		bcdDevice = le16_to_cpu(udesc->bcdDevice);
-		rev_maj = bcdDevice >> 8;
-		rev_min = bcdDevice & 0xff;
-
-		/* Update the report descriptor for only the Driving Force wheel */
-		if (rev_maj == 1 && rev_min == 2 &&
-				*rsize == DF_RDESC_ORIG_SIZE) {
+		if (*rsize == DF_RDESC_ORIG_SIZE) {
 			hid_info(hdev,
 				"fixing up Logitech Driving Force report descriptor\n");
 			rdesc = df_rdesc_fixed;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Patch-V2 5/6] HID:hid-logitech: Improve Wingman Formula Force GP support
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
                     ` (2 preceding siblings ...)
  2016-09-18 16:55   ` [Patch-V2 4/6] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
@ 2016-09-18 16:55   ` Simon Wood
  2016-09-18 16:55   ` [Patch-V2 6/6] HID:hid-logitech: Documentation updates/corrections Simon Wood
  2016-09-26 13:41   ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Jiri Kosina
  5 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-18 16:55 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Move ForceFeedback support for the Formula Force GP into hid-lgff4
and re-write HID descriptor, thus allowing combined pedals or not
as user desires.

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 drivers/hid/hid-lg.c    | 59 ++++++++++++++++++++++++++++++++++++++++++++++++-
 drivers/hid/hid-lg4ff.c |  2 ++
 2 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index ffcf4f1..76f644d 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -49,6 +49,7 @@
 #define FV_RDESC_ORIG_SIZE	130
 #define MOMO_RDESC_ORIG_SIZE	87
 #define MOMO2_RDESC_ORIG_SIZE	87
+#define FFG_RDESC_ORIG_SIZE	85
 
 /* Fixed report descriptors for Logitech Driving Force (and Pro)
  * wheel controllers
@@ -334,6 +335,52 @@ static __u8 momo2_rdesc_fixed[] = {
 0xC0                /*  End Collection                      */
 };
 
+static __u8 ffg_rdesc_fixed[] = {
+0x05, 0x01,         /*  Usage Page (Desktop),               */
+0x09, 0x04,         /*  Usage (Joystik),                    */
+0xA1, 0x01,         /*  Collection (Application),           */
+0xA1, 0x02,         /*      Collection (Logical),           */
+0x95, 0x01,         /*          Report Count (1),           */
+0x75, 0x0A,         /*          Report Size (10),           */
+0x15, 0x00,         /*          Logical Minimum (0),        */
+0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
+0x35, 0x00,         /*          Physical Minimum (0),       */
+0x46, 0xFF, 0x03,   /*          Physical Maximum (1023),    */
+0x09, 0x30,         /*          Usage (X),                  */
+0x81, 0x02,         /*          Input (Variable),           */
+0x95, 0x06,         /*          Report Count (6),           */
+0x75, 0x01,         /*          Report Size (1),            */
+0x25, 0x01,         /*          Logical Maximum (1),        */
+0x45, 0x01,         /*          Physical Maximum (1),       */
+0x05, 0x09,         /*          Usage Page (Button),        */
+0x19, 0x01,         /*          Usage Minimum (01h),        */
+0x29, 0x06,         /*          Usage Maximum (06h),        */
+0x81, 0x02,         /*          Input (Variable),           */
+0x95, 0x01,         /*          Report Count (1),           */
+0x75, 0x08,         /*          Report Size (8),            */
+0x26, 0xFF, 0x00,   /*          Logical Maximum (255),      */
+0x46, 0xFF, 0x00,   /*          Physical Maximum (255),     */
+0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
+0x09, 0x01,         /*          Usage (01h),                */
+0x81, 0x02,         /*          Input (Variable),           */
+0x05, 0x01,         /*          Usage Page (Desktop),       */
+0x81, 0x01,         /*          Input (Constant),           */
+0x09, 0x31,         /*          Usage (Y),                  */
+0x81, 0x02,         /*          Input (Variable),           */
+0x09, 0x32,         /*          Usage (Z),                  */
+0x81, 0x02,         /*          Input (Variable),           */
+0x06, 0x00, 0xFF,   /*          Usage Page (FF00h),         */
+0x09, 0x01,         /*          Usage (01h),                */
+0x81, 0x02,         /*          Input (Variable),           */
+0xC0,               /*      End Collection,                 */
+0xA1, 0x02,         /*      Collection (Logical),           */
+0x09, 0x02,         /*          Usage (02h),                */
+0x95, 0x07,         /*          Report Count (7),           */
+0x91, 0x02,         /*          Output (Variable),          */
+0xC0,               /*      End Collection,                 */
+0xC0                /*  End Collection                      */
+};
+
 /*
  * Certain Logitech keyboards send in report #3 keys which are far
  * above the logical maximum described in descriptor. This extends
@@ -361,6 +408,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 
 	switch (hdev->product) {
 
+	case USB_DEVICE_ID_LOGITECH_WINGMAN_FFG:
+		if (*rsize == FFG_RDESC_ORIG_SIZE) {
+			hid_info(hdev,
+				"fixing up Logitech Wingman Formula Force GP report descriptor\n");
+			rdesc = ffg_rdesc_fixed;
+			*rsize = sizeof(ffg_rdesc_fixed);
+		}
+		break;
+
 	/* Several wheels report as this id when operating in emulation mode. */
 	case USB_DEVICE_ID_LOGITECH_WHEEL:
 		if (*rsize == DF_RDESC_ORIG_SIZE) {
@@ -608,6 +664,7 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
 			usage->code == ABS_RZ)) {
 		switch (hdev->product) {
 		case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
+		case USB_DEVICE_ID_LOGITECH_WINGMAN_FFG:
 		case USB_DEVICE_ID_LOGITECH_WHEEL:
 		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
 		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
@@ -807,7 +864,7 @@ static const struct hid_device_id lg_devices[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL),
 		.driver_data = LG_FF4 },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG),
-		.driver_data = LG_FF },
+		.driver_data = LG_NOGET | LG_FF4 },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2),
 		.driver_data = LG_FF2 },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940),
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c
index cc5c9ebd..1fc12e3 100644
--- a/drivers/hid/hid-lg4ff.c
+++ b/drivers/hid/hid-lg4ff.c
@@ -137,6 +137,7 @@ struct lg4ff_alternate_mode {
 };
 
 static const struct lg4ff_wheel lg4ff_devices[] = {
+	{USB_DEVICE_ID_LOGITECH_WINGMAN_FFG, lg4ff_wheel_effects, 40, 180, NULL},
 	{USB_DEVICE_ID_LOGITECH_WHEEL,       lg4ff_wheel_effects, 40, 270, NULL},
 	{USB_DEVICE_ID_LOGITECH_MOMO_WHEEL,  lg4ff_wheel_effects, 40, 270, NULL},
 	{USB_DEVICE_ID_LOGITECH_DFP_WHEEL,   lg4ff_wheel_effects, 40, 900, lg4ff_set_range_dfp},
@@ -345,6 +346,7 @@ int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
 			rd[5] = rd[3];
 			rd[6] = 0x7F;
 			return 1;
+		case USB_DEVICE_ID_LOGITECH_WINGMAN_FFG:
 		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
 		case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
 			rd[4] = rd[3];
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Patch-V2 6/6] HID:hid-logitech: Documentation updates/corrections
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
                     ` (3 preceding siblings ...)
  2016-09-18 16:55   ` [Patch-V2 5/6] HID:hid-logitech: Improve Wingman Formula Force GP support Simon Wood
@ 2016-09-18 16:55   ` Simon Wood
  2016-09-26 13:41   ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Jiri Kosina
  5 siblings, 0 replies; 14+ messages in thread
From: Simon Wood @ 2016-09-18 16:55 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Signed-off-by: Simon Wood <simon@mungewell.org>
---
 .../ABI/testing/sysfs-driver-hid-logitech-lg4ff    |  6 ++++++
 drivers/hid/Kconfig                                | 23 +++++++++++++---------
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
index 9cd7c5a..305dffd 100644
--- a/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
+++ b/Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
@@ -35,6 +35,12 @@ Description:	Displays a set of alternate modes supported by a wheel. Each
 		  DF-EX <*--------> G25 <-> G27
 		  DF-EX <*----------------> G27
 
+		G29:
+		  DF-EX <*> DFP <-> G25 <-> G27 <-> G29
+		  DF-EX <*--------> G25 <-> G27 <-> G29
+		  DF-EX <*----------------> G27 <-> G29
+		  DF-EX <*------------------------> G29
+
 		DFGT:
 		  DF-EX <*> DFP <-> DFGT
 		  DF-EX <*--------> DFGT
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 78ac481..5227d8a 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -457,8 +457,6 @@ config LOGITECH_FF
 	  - Logitech WingMan Cordless RumblePad
 	  - Logitech WingMan Cordless RumblePad 2
 	  - Logitech WingMan Force 3D
-	  - Logitech Formula Force EX
-	  - Logitech WingMan Formula Force GP
 
 	  and if you want to enable force feedback for them.
 	  Note: if you say N here, this device will still be supported, but without
@@ -488,15 +486,22 @@ config LOGIWHEELS_FF
 	select INPUT_FF_MEMLESS
 	default LOGITECH_FF
 	help
-	  Say Y here if you want to enable force feedback and range setting
+	  Say Y here if you want to enable force feedback and range setting(*)
 	  support for following Logitech wheels:
+	  - Logitech G25 (*)
+	  - Logitech G27 (*)
+	  - Logitech G29 (*)
 	  - Logitech Driving Force
-	  - Logitech Driving Force Pro
-	  - Logitech Driving Force GT
-	  - Logitech G25
-	  - Logitech G27
-	  - Logitech MOMO/MOMO 2
-	  - Logitech Formula Force EX
+	  - Logitech Driving Force Pro (*)
+	  - Logitech Driving Force GT (*)
+	  - Logitech Driving Force EX/RX
+	  - Logitech Driving Force Wireless
+	  - Logitech Speed Force Wireless
+	  - Logitech MOMO Force
+	  - Logitech MOMO Racing Force
+	  - Logitech Formula Force GP
+	  - Logitech Formula Force EX/RX
+	  - Logitech Wingman Formula Force GP
 
 config HID_MAGICMOUSE
 	tristate "Apple Magic Mouse/Trackpad multi-touch support"
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature
  2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
                     ` (4 preceding siblings ...)
  2016-09-18 16:55   ` [Patch-V2 6/6] HID:hid-logitech: Documentation updates/corrections Simon Wood
@ 2016-09-26 13:41   ` Jiri Kosina
  5 siblings, 0 replies; 14+ messages in thread
From: Jiri Kosina @ 2016-09-26 13:41 UTC (permalink / raw)
  To: Simon Wood
  Cc: linux-input, linux-kernel, Edwin Velds, Elias Vanderstuyft,
	Michal Maly, Simon Wood

Hi,

the series is now in hid.git#for-4.9/logitech. Thanks,

-- 
Jiri Kosina
SUSE Labs

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2016-09-26 13:41 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-09 22:50 [PATCH 1/5] HID:hid-logitech: Introduce dev_attr for combined pedals feature Simon Wood
2016-09-09 22:50 ` [PATCH 2/5] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
2016-09-09 22:50 ` [PATCH 3/5] HID:hid-logitech: Compute combined pedals if not supplied Simon Wood
2016-09-09 22:50 ` [PATCH 4/5] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
2016-09-10  1:34   ` kbuild test robot
2016-09-14 18:55   ` Simon Wood
2016-09-09 22:50 ` [PATCH 5/5] HID:hid-logitech: Documentation updates/corrections Simon Wood
2016-09-18 16:55 ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Simon Wood
2016-09-18 16:55   ` [Patch-V2 2/6] HID:hid-logitech: Add combined pedal support Logitech wheels Simon Wood
2016-09-18 16:55   ` [Patch-V2 3/6] HID:hid-logitech: Compute combined pedals value Simon Wood
2016-09-18 16:55   ` [Patch-V2 4/6] HID:hid-logitech: Rewrite of descriptor for all DF wheels Simon Wood
2016-09-18 16:55   ` [Patch-V2 5/6] HID:hid-logitech: Improve Wingman Formula Force GP support Simon Wood
2016-09-18 16:55   ` [Patch-V2 6/6] HID:hid-logitech: Documentation updates/corrections Simon Wood
2016-09-26 13:41   ` [Patch-V2 1/6] HID:hid-logitech: Introduce control for combined pedals feature Jiri Kosina

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).