diff options
| author | Simon Wood <gitsend@mungewell.org> | 2016-09-18 12:55:41 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2016-09-26 09:39:56 -0400 |
| commit | 560bea30ff9dd4823d8f611aaab88d3c3f9c7d8d (patch) | |
| tree | 7fa65a362c9eebd448169148b7dd82c273aaa468 | |
| parent | 7363b25af33251d036a4bedb7daed1e6bc395142 (diff) | |
HID: hid-logitech: Improve Wingman Formula Force GP support
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>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
| -rw-r--r-- | drivers/hid/hid-lg.c | 59 | ||||
| -rw-r--r-- | drivers/hid/hid-lg4ff.c | 2 |
2 files changed, 60 insertions, 1 deletions
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c index ffcf4f162ea5..76f644deb0a7 100644 --- a/drivers/hid/hid-lg.c +++ b/drivers/hid/hid-lg.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #define FV_RDESC_ORIG_SIZE 130 | 49 | #define FV_RDESC_ORIG_SIZE 130 |
| 50 | #define MOMO_RDESC_ORIG_SIZE 87 | 50 | #define MOMO_RDESC_ORIG_SIZE 87 |
| 51 | #define MOMO2_RDESC_ORIG_SIZE 87 | 51 | #define MOMO2_RDESC_ORIG_SIZE 87 |
| 52 | #define FFG_RDESC_ORIG_SIZE 85 | ||
| 52 | 53 | ||
| 53 | /* Fixed report descriptors for Logitech Driving Force (and Pro) | 54 | /* Fixed report descriptors for Logitech Driving Force (and Pro) |
| 54 | * wheel controllers | 55 | * wheel controllers |
| @@ -334,6 +335,52 @@ static __u8 momo2_rdesc_fixed[] = { | |||
| 334 | 0xC0 /* End Collection */ | 335 | 0xC0 /* End Collection */ |
| 335 | }; | 336 | }; |
| 336 | 337 | ||
| 338 | static __u8 ffg_rdesc_fixed[] = { | ||
| 339 | 0x05, 0x01, /* Usage Page (Desktop), */ | ||
| 340 | 0x09, 0x04, /* Usage (Joystik), */ | ||
| 341 | 0xA1, 0x01, /* Collection (Application), */ | ||
| 342 | 0xA1, 0x02, /* Collection (Logical), */ | ||
| 343 | 0x95, 0x01, /* Report Count (1), */ | ||
| 344 | 0x75, 0x0A, /* Report Size (10), */ | ||
| 345 | 0x15, 0x00, /* Logical Minimum (0), */ | ||
| 346 | 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */ | ||
| 347 | 0x35, 0x00, /* Physical Minimum (0), */ | ||
| 348 | 0x46, 0xFF, 0x03, /* Physical Maximum (1023), */ | ||
| 349 | 0x09, 0x30, /* Usage (X), */ | ||
| 350 | 0x81, 0x02, /* Input (Variable), */ | ||
| 351 | 0x95, 0x06, /* Report Count (6), */ | ||
| 352 | 0x75, 0x01, /* Report Size (1), */ | ||
| 353 | 0x25, 0x01, /* Logical Maximum (1), */ | ||
| 354 | 0x45, 0x01, /* Physical Maximum (1), */ | ||
| 355 | 0x05, 0x09, /* Usage Page (Button), */ | ||
| 356 | 0x19, 0x01, /* Usage Minimum (01h), */ | ||
| 357 | 0x29, 0x06, /* Usage Maximum (06h), */ | ||
| 358 | 0x81, 0x02, /* Input (Variable), */ | ||
| 359 | 0x95, 0x01, /* Report Count (1), */ | ||
| 360 | 0x75, 0x08, /* Report Size (8), */ | ||
| 361 | 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ | ||
| 362 | 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ | ||
| 363 | 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ | ||
| 364 | 0x09, 0x01, /* Usage (01h), */ | ||
| 365 | 0x81, 0x02, /* Input (Variable), */ | ||
| 366 | 0x05, 0x01, /* Usage Page (Desktop), */ | ||
| 367 | 0x81, 0x01, /* Input (Constant), */ | ||
| 368 | 0x09, 0x31, /* Usage (Y), */ | ||
| 369 | 0x81, 0x02, /* Input (Variable), */ | ||
| 370 | 0x09, 0x32, /* Usage (Z), */ | ||
| 371 | 0x81, 0x02, /* Input (Variable), */ | ||
| 372 | 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ | ||
| 373 | 0x09, 0x01, /* Usage (01h), */ | ||
| 374 | 0x81, 0x02, /* Input (Variable), */ | ||
| 375 | 0xC0, /* End Collection, */ | ||
| 376 | 0xA1, 0x02, /* Collection (Logical), */ | ||
| 377 | 0x09, 0x02, /* Usage (02h), */ | ||
| 378 | 0x95, 0x07, /* Report Count (7), */ | ||
| 379 | 0x91, 0x02, /* Output (Variable), */ | ||
| 380 | 0xC0, /* End Collection, */ | ||
| 381 | 0xC0 /* End Collection */ | ||
| 382 | }; | ||
| 383 | |||
| 337 | /* | 384 | /* |
| 338 | * Certain Logitech keyboards send in report #3 keys which are far | 385 | * Certain Logitech keyboards send in report #3 keys which are far |
| 339 | * above the logical maximum described in descriptor. This extends | 386 | * above the logical maximum described in descriptor. This extends |
| @@ -361,6 +408,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
| 361 | 408 | ||
| 362 | switch (hdev->product) { | 409 | switch (hdev->product) { |
| 363 | 410 | ||
| 411 | case USB_DEVICE_ID_LOGITECH_WINGMAN_FFG: | ||
| 412 | if (*rsize == FFG_RDESC_ORIG_SIZE) { | ||
| 413 | hid_info(hdev, | ||
| 414 | "fixing up Logitech Wingman Formula Force GP report descriptor\n"); | ||
| 415 | rdesc = ffg_rdesc_fixed; | ||
| 416 | *rsize = sizeof(ffg_rdesc_fixed); | ||
| 417 | } | ||
| 418 | break; | ||
| 419 | |||
| 364 | /* Several wheels report as this id when operating in emulation mode. */ | 420 | /* Several wheels report as this id when operating in emulation mode. */ |
| 365 | case USB_DEVICE_ID_LOGITECH_WHEEL: | 421 | case USB_DEVICE_ID_LOGITECH_WHEEL: |
| 366 | if (*rsize == DF_RDESC_ORIG_SIZE) { | 422 | if (*rsize == DF_RDESC_ORIG_SIZE) { |
| @@ -608,6 +664,7 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi, | |||
| 608 | usage->code == ABS_RZ)) { | 664 | usage->code == ABS_RZ)) { |
| 609 | switch (hdev->product) { | 665 | switch (hdev->product) { |
| 610 | case USB_DEVICE_ID_LOGITECH_G29_WHEEL: | 666 | case USB_DEVICE_ID_LOGITECH_G29_WHEEL: |
| 667 | case USB_DEVICE_ID_LOGITECH_WINGMAN_FFG: | ||
| 611 | case USB_DEVICE_ID_LOGITECH_WHEEL: | 668 | case USB_DEVICE_ID_LOGITECH_WHEEL: |
| 612 | case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL: | 669 | case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL: |
| 613 | case USB_DEVICE_ID_LOGITECH_DFP_WHEEL: | 670 | case USB_DEVICE_ID_LOGITECH_DFP_WHEEL: |
| @@ -807,7 +864,7 @@ static const struct hid_device_id lg_devices[] = { | |||
| 807 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL), | 864 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL), |
| 808 | .driver_data = LG_FF4 }, | 865 | .driver_data = LG_FF4 }, |
| 809 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG), | 866 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG), |
| 810 | .driver_data = LG_FF }, | 867 | .driver_data = LG_NOGET | LG_FF4 }, |
| 811 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), | 868 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), |
| 812 | .driver_data = LG_FF2 }, | 869 | .driver_data = LG_FF2 }, |
| 813 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940), | 870 | { 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 cc5c9ebd12a1..1fc12e357035 100644 --- a/drivers/hid/hid-lg4ff.c +++ b/drivers/hid/hid-lg4ff.c | |||
| @@ -137,6 +137,7 @@ struct lg4ff_alternate_mode { | |||
| 137 | }; | 137 | }; |
| 138 | 138 | ||
| 139 | static const struct lg4ff_wheel lg4ff_devices[] = { | 139 | static const struct lg4ff_wheel lg4ff_devices[] = { |
| 140 | {USB_DEVICE_ID_LOGITECH_WINGMAN_FFG, lg4ff_wheel_effects, 40, 180, NULL}, | ||
| 140 | {USB_DEVICE_ID_LOGITECH_WHEEL, lg4ff_wheel_effects, 40, 270, NULL}, | 141 | {USB_DEVICE_ID_LOGITECH_WHEEL, lg4ff_wheel_effects, 40, 270, NULL}, |
| 141 | {USB_DEVICE_ID_LOGITECH_MOMO_WHEEL, lg4ff_wheel_effects, 40, 270, NULL}, | 142 | {USB_DEVICE_ID_LOGITECH_MOMO_WHEEL, lg4ff_wheel_effects, 40, 270, NULL}, |
| 142 | {USB_DEVICE_ID_LOGITECH_DFP_WHEEL, lg4ff_wheel_effects, 40, 900, lg4ff_set_range_dfp}, | 143 | {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, | |||
| 345 | rd[5] = rd[3]; | 346 | rd[5] = rd[3]; |
| 346 | rd[6] = 0x7F; | 347 | rd[6] = 0x7F; |
| 347 | return 1; | 348 | return 1; |
| 349 | case USB_DEVICE_ID_LOGITECH_WINGMAN_FFG: | ||
| 348 | case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL: | 350 | case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL: |
| 349 | case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2: | 351 | case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2: |
| 350 | rd[4] = rd[3]; | 352 | rd[4] = rd[3]; |
