Skip to content

Commit 250680d

Browse files
committed
Avoid 64bit arithmetic calculating constant force
Fixes #96. 32bits compatibility regression.
1 parent 6100a34 commit 250680d

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

hid-lg4ff.c

+9-5
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,8 @@ static __always_inline int lg4ff_timer(struct lg4ff_device_entry *entry)
810810

811811
memset(parameters, 0, sizeof(parameters));
812812

813-
gain = (unsigned)entry->wdata.master_gain * entry->wdata.gain / 0xffff;
813+
// Use a 8bit gain value to avoid 64bit arithmetic later
814+
gain = ((entry->wdata.master_gain / 0xff) * (entry->wdata.gain / 0xff) + entry->wdata.master_gain / 0xff + entry->wdata.gain / 0xff) / 0x100;
814815

815816
spin_lock_irqsave(&entry->timer_lock, flags);
816817

@@ -872,16 +873,19 @@ static __always_inline int lg4ff_timer(struct lg4ff_device_entry *entry)
872873

873874
spin_unlock_irqrestore(&entry->timer_lock, flags);
874875

875-
parameters[0].level = (long)parameters[0].level * gain / 0xffff;
876+
// Level might be the sum of several forces and add up to more than a
877+
// 16bit value but less than 24bit.
878+
// Here we avoid 64bit arithmetic by using an 8bit gain value.
879+
parameters[0].level = parameters[0].level * gain / 0xff;
876880
parameters[1].clip = parameters[1].clip * spring_level / 100;
877881
parameters[2].clip = parameters[2].clip * damper_level / 100;
878882
parameters[3].clip = parameters[3].clip * friction_level / 100;
879883

880884
ffb_level = abs(parameters[0].level);
881885
for (i = 1; i < 4; i++) {
882-
parameters[i].k1 = (long)parameters[i].k1 * gain / 0xffff;
883-
parameters[i].k2 = (long)parameters[i].k2 * gain / 0xffff;
884-
parameters[i].clip = parameters[i].clip * gain / 0xffff;
886+
parameters[i].k1 = parameters[i].k1 * gain / 0xff;
887+
parameters[i].k2 = parameters[i].k2 * gain / 0xff;
888+
parameters[i].clip = parameters[i].clip * gain / 0xff;
885889
ffb_level += parameters[i].clip * 0x7fff / 0xffff;
886890
}
887891
if (ffb_level > entry->peak_ffb_level) {

0 commit comments

Comments
 (0)