HID: playstation: correct DualSense gyro bias handling.
authorRoderick Colenbrander <roderick@gaikai.com>
Fri, 6 Jan 2023 01:59:10 +0000 (17:59 -0800)
committerJiri Kosina <jkosina@suse.cz>
Wed, 18 Jan 2023 09:12:49 +0000 (10:12 +0100)
The bias for the gyroscope is not used correctly. The sensor bias
needs to be used in calculation of the 'sensivity' instead of being
an offset.

In practice this has little input on the values as the bias values
tends to be small (+/- 20).

Signed-off-by: Roderick Colenbrander <roderick.colenbrander@sony.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-playstation.c

index 5067515..873090f 100644 (file)
@@ -991,19 +991,22 @@ static int dualsense_get_calibration_data(struct dualsense *ds)
         */
        speed_2x = (gyro_speed_plus + gyro_speed_minus);
        ds->gyro_calib_data[0].abs_code = ABS_RX;
-       ds->gyro_calib_data[0].bias = gyro_pitch_bias;
+       ds->gyro_calib_data[0].bias = 0;
        ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
-       ds->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
+       ds->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +
+                       abs(gyro_pitch_minus - gyro_pitch_bias);
 
        ds->gyro_calib_data[1].abs_code = ABS_RY;
-       ds->gyro_calib_data[1].bias = gyro_yaw_bias;
+       ds->gyro_calib_data[1].bias = 0;
        ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
-       ds->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
+       ds->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +
+                       abs(gyro_yaw_minus - gyro_yaw_bias);
 
        ds->gyro_calib_data[2].abs_code = ABS_RZ;
-       ds->gyro_calib_data[2].bias = gyro_roll_bias;
+       ds->gyro_calib_data[2].bias = 0;
        ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
-       ds->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
+       ds->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +
+                       abs(gyro_roll_minus - gyro_roll_bias);
 
        /*
         * Set accelerometer calibration and normalization parameters.
@@ -1356,8 +1359,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
        for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) {
                int raw_data = (short)le16_to_cpu(ds_report->gyro[i]);
                int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer,
-                                          raw_data - ds->gyro_calib_data[i].bias,
-                                          ds->gyro_calib_data[i].sens_denom);
+                                          raw_data, ds->gyro_calib_data[i].sens_denom);
 
                input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data);
        }