7 Commits

Author SHA1 Message Date
Oleg
3d19599175 Bump dkms package_version 2024-08-08 03:02:52 +03:00
Makarenko Oleg
6d0ac791b1 Merge pull request #19 from JacKeTUs/fix-alignment
Fix alignment on hid-ids.h
2024-08-08 03:00:47 +03:00
Oleg
bc87313267 Fix alignment on hid-ids.h 2024-08-08 03:00:27 +03:00
Makarenko Oleg
8f42ca6774 Merge pull request #16 from Lawstorant/rework-checks
Rework envelope check
2024-08-08 02:59:20 +03:00
Makarenko Oleg
2ee89cb9a4 Merge pull request #17 from JacKeTUs/aur-link-fix
Fix AUR package URL
2024-08-02 04:08:24 +03:00
Lawstorant
241a25cee9 Fix AUR package URL 2024-07-27 00:12:07 +02:00
Lawstorant
8220bbbfb0 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
2024-07-27 00:10:39 +02:00
5 changed files with 28 additions and 38 deletions

View File

@@ -1,5 +1,5 @@
PACKAGE_NAME="universal-pidff" PACKAGE_NAME="universal-pidff"
PACKAGE_VERSION="0.0.3" PACKAGE_VERSION="0.0.6"
MAKE[0]="make KVERSION=$kernelver" MAKE[0]="make KVERSION=$kernelver"
CLEAN="make clean" CLEAN="make clean"
BUILT_MODULE_NAME[0]="hid-universal-pidff" BUILT_MODULE_NAME[0]="hid-universal-pidff"

View File

@@ -2,7 +2,7 @@
#ifndef __HID_IDS_H #ifndef __HID_IDS_H
#define __HID_IDS_H #define __HID_IDS_H
#define USB_VENDOR_ID_MOZA 0x346e #define USB_VENDOR_ID_MOZA 0x346e
#define USB_DEVICE_ID_MOZA_R3 0x0005 #define USB_DEVICE_ID_MOZA_R3 0x0005
#define USB_DEVICE_ID_MOZA_R5 0x0004 #define USB_DEVICE_ID_MOZA_R5 0x0004
#define USB_DEVICE_ID_MOZA_R9 0x0002 #define USB_DEVICE_ID_MOZA_R9 0x0002

View File

@@ -14,15 +14,15 @@
static const struct hid_device_id pidff_wheel_devices[] = { static const struct hid_device_id pidff_wheel_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R3), { 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), { 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), { 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), { 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), { 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), { HID_USB_DEVICE(USB_VENDOR_ID_CAMMUS, USB_DEVICE_ID_CAMMUS_C5),
.driver_data = PIDFF_QUIRK_NO_DELAY_EFFECT }, .driver_data = PIDFF_QUIRK_NO_DELAY_EFFECT },
{ } { }

View File

@@ -311,6 +311,14 @@ static void pidff_set_envelope_report(struct pidff_device *pidff,
static int pidff_needs_set_envelope(struct ff_envelope *envelope, static int pidff_needs_set_envelope(struct ff_envelope *envelope,
struct ff_envelope *old) 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 || return envelope->attack_level != old->attack_level ||
envelope->fade_level != old->fade_level || envelope->fade_level != old->fade_level ||
envelope->attack_length != old->attack_length || 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 // Actually we just can use clamp macro
// from include/linux/kernel.h#L59 // from include/linux/kernel.h#L59
// But for the debug purposes we're leaving it as is // But for the debug purposes we're leaving it as is
pidff->set_periodic[PID_PERIOD].value[0] = pidff->set_periodic[PID_PERIOD].value[0] =
pidff_clamp(effect->u.periodic.period, pidff_clamp(effect->u.periodic.period,
pidff->set_periodic[PID_PERIOD].field); pidff->set_periodic[PID_PERIOD].field);
hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC], 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); pidff_set_effect_report(pidff, effect);
if (!old || pidff_needs_set_constant(effect, old)) if (!old || pidff_needs_set_constant(effect, old))
pidff_set_constant_force_report(pidff, effect); pidff_set_constant_force_report(pidff, effect);
if (!old || if (pidff_needs_set_envelope(&effect->u.constant.envelope,
pidff_needs_set_envelope(&effect->u.constant.envelope, old ? &old->u.periodic.envelope : NULL))
&old->u.constant.envelope))
pidff_set_envelope_report(pidff, pidff_set_envelope_report(pidff,
&effect->u.constant.envelope); &effect->u.constant.envelope);
break; 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)) if (!old || pidff_needs_set_periodic(effect, old))
pidff_set_periodic_report(pidff, effect); pidff_set_periodic_report(pidff, effect);
if (pidff->quirks & PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE) if (pidff_needs_set_envelope(&effect->u.periodic.envelope,
{ old ? &old->u.periodic.envelope : NULL))
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))
pidff_set_envelope_report(pidff, pidff_set_envelope_report(pidff,
&effect->u.periodic.envelope); &effect->u.periodic.envelope);
break; break;
@@ -711,9 +707,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
pidff_set_effect_report(pidff, effect); pidff_set_effect_report(pidff, effect);
if (!old || pidff_needs_set_ramp(effect, old)) if (!old || pidff_needs_set_ramp(effect, old))
pidff_set_ramp_force_report(pidff, effect); pidff_set_ramp_force_report(pidff, effect);
if (!old ||
pidff_needs_set_envelope(&effect->u.ramp.envelope, if (pidff_needs_set_envelope(&effect->u.ramp.envelope,
&old->u.ramp.envelope)) old ? &old->u.periodic.envelope : NULL))
pidff_set_envelope_report(pidff, pidff_set_envelope_report(pidff,
&effect->u.ramp.envelope); &effect->u.ramp.envelope);
break; break;

View File

@@ -4,21 +4,15 @@
/* PIDFF Quirks to solve issues with certain devices */ /* 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) * 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) * 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); int hid_pidff_init_quirks(struct hid_device *hid, const struct hid_device_id *id);