From 8220bbbfb086f26aab8ac9bb3fa1e4c602583c0c Mon Sep 17 00:00:00 2001 From: Lawstorant Date: Fri, 26 Jul 2024 23:28:57 +0200 Subject: [PATCH 1/2] Rework envelope checks to fix FFB for Moza Only set envelopes when they are needed (any value is != 0). This fixes Moza FFB in games that use Sine effect to emulate constant force. Remove FIX_PERIODIC_ENVELOPE quirk as it's no longer needed --- hid-pidff-wrapper.c | 10 +++++----- hid-pidff.c | 38 +++++++++++++++++--------------------- hid-pidff.h | 14 ++++---------- 3 files changed, 26 insertions(+), 36 deletions(-) diff --git a/hid-pidff-wrapper.c b/hid-pidff-wrapper.c index 5ebdbda..bc019a9 100644 --- a/hid-pidff-wrapper.c +++ b/hid-pidff-wrapper.c @@ -14,15 +14,15 @@ static const struct hid_device_id pidff_wheel_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R3), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R5), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R9), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R12), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R16_R21), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_CAMMUS, USB_DEVICE_ID_CAMMUS_C5), .driver_data = PIDFF_QUIRK_NO_DELAY_EFFECT }, { } diff --git a/hid-pidff.c b/hid-pidff.c index 5bb858f..22e4b9b 100644 --- a/hid-pidff.c +++ b/hid-pidff.c @@ -311,6 +311,14 @@ static void pidff_set_envelope_report(struct pidff_device *pidff, static int pidff_needs_set_envelope(struct ff_envelope *envelope, struct ff_envelope *old) { + if (!old) { + return envelope->attack_level != 0 || + envelope->fade_level != 0 || + envelope->attack_length != 0 || + envelope->fade_length != 0; + + } + return envelope->attack_level != old->attack_level || envelope->fade_level != old->fade_level || envelope->attack_length != old->attack_length || @@ -406,8 +414,8 @@ static void pidff_set_periodic_report(struct pidff_device *pidff, // Actually we just can use clamp macro // from include/linux/kernel.h#L59 // But for the debug purposes we're leaving it as is - pidff->set_periodic[PID_PERIOD].value[0] = - pidff_clamp(effect->u.periodic.period, + pidff->set_periodic[PID_PERIOD].value[0] = + pidff_clamp(effect->u.periodic.period, pidff->set_periodic[PID_PERIOD].field); hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC], @@ -643,9 +651,8 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_constant(effect, old)) pidff_set_constant_force_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.constant.envelope, - &old->u.constant.envelope)) + if (pidff_needs_set_envelope(&effect->u.constant.envelope, + old ? &old->u.periodic.envelope : NULL)) pidff_set_envelope_report(pidff, &effect->u.constant.envelope); break; @@ -683,19 +690,8 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, if (!old || pidff_needs_set_periodic(effect, old)) pidff_set_periodic_report(pidff, effect); - if (pidff->quirks & PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE) - { - effect->u.periodic.envelope.attack_level = - effect->u.periodic.envelope.attack_level == 0 - ? 0x7fff : effect->u.periodic.envelope.attack_level; - - effect->u.periodic.envelope.fade_level = - effect->u.periodic.envelope.fade_level == 0 - ? 0x7fff : effect->u.periodic.envelope.fade_level; - } - if (!old || - pidff_needs_set_envelope(&effect->u.periodic.envelope, - &old->u.periodic.envelope)) + if (pidff_needs_set_envelope(&effect->u.periodic.envelope, + old ? &old->u.periodic.envelope : NULL)) pidff_set_envelope_report(pidff, &effect->u.periodic.envelope); break; @@ -711,9 +707,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_ramp(effect, old)) pidff_set_ramp_force_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.ramp.envelope, - &old->u.ramp.envelope)) + + if (pidff_needs_set_envelope(&effect->u.ramp.envelope, + old ? &old->u.periodic.envelope : NULL)) pidff_set_envelope_report(pidff, &effect->u.ramp.envelope); break; diff --git a/hid-pidff.h b/hid-pidff.h index 5009cc9..e9b504e 100644 --- a/hid-pidff.h +++ b/hid-pidff.h @@ -4,21 +4,15 @@ /* PIDFF Quirks to solve issues with certain devices */ -/* - * Always set a value > 0 for PERIODIC envelope attack and fade level -*/ -#define PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE BIT(0) - /* * Ignore direction and always set 16384 (0x4000) -*/ -#define PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(1) + */ +#define PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(0) /* * Skip initialization of 0xA7 descriptor (Delay effect) -*/ -#define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(2) - + */ +#define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(1) int hid_pidff_init_quirks(struct hid_device *hid, const struct hid_device_id *id); From 241a25cee9cd56ad83b73495060e6311f603fb84 Mon Sep 17 00:00:00 2001 From: Lawstorant Date: Sat, 27 Jul 2024 00:12:07 +0200 Subject: [PATCH 2/2] Fix AUR package URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 645efa8..1d1f5d4 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ You can install it through AUR package, through DKMS or manually. On SecureBoot enabled systems you will need additional steps for load this driver into the system. See [Signing](docs/SIGNING.md#signing) section. ### AUR package -There's an [AUR package](https://aur.archlinux.org/packages/universal-ff-dkms-git) for Arch Linux maintained by [@Lawstorant](https://github.com/Lawstorant). +There's an [AUR package](https://aur.archlinux.org/packages/universal-pidff-dkms-git) for Arch Linux maintained by [@Lawstorant](https://github.com/Lawstorant). ### DKMS DKMS will install module into system, and will update it every time you update your kernel. Module will persist after reboots. It's the preferrable way to install it on the most distros.