Skip to content

Commit 6f7dbbd

Browse files
Roderick ColenbranderJiri Kosina
authored andcommitted
HID: playstation: correct DualSense gyro bias handling.
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 <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 12b18bc commit 6f7dbbd

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

drivers/hid/hid-playstation.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -991,19 +991,22 @@ static int dualsense_get_calibration_data(struct dualsense *ds)
991991
*/
992992
speed_2x = (gyro_speed_plus + gyro_speed_minus);
993993
ds->gyro_calib_data[0].abs_code = ABS_RX;
994-
ds->gyro_calib_data[0].bias = gyro_pitch_bias;
994+
ds->gyro_calib_data[0].bias = 0;
995995
ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
996-
ds->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
996+
ds->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +
997+
abs(gyro_pitch_minus - gyro_pitch_bias);
997998

998999
ds->gyro_calib_data[1].abs_code = ABS_RY;
999-
ds->gyro_calib_data[1].bias = gyro_yaw_bias;
1000+
ds->gyro_calib_data[1].bias = 0;
10001001
ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
1001-
ds->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
1002+
ds->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +
1003+
abs(gyro_yaw_minus - gyro_yaw_bias);
10021004

10031005
ds->gyro_calib_data[2].abs_code = ABS_RZ;
1004-
ds->gyro_calib_data[2].bias = gyro_roll_bias;
1006+
ds->gyro_calib_data[2].bias = 0;
10051007
ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
1006-
ds->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
1008+
ds->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +
1009+
abs(gyro_roll_minus - gyro_roll_bias);
10071010

10081011
/*
10091012
* Set accelerometer calibration and normalization parameters.
@@ -1356,8 +1359,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
13561359
for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) {
13571360
int raw_data = (short)le16_to_cpu(ds_report->gyro[i]);
13581361
int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer,
1359-
raw_data - ds->gyro_calib_data[i].bias,
1360-
ds->gyro_calib_data[i].sens_denom);
1362+
raw_data, ds->gyro_calib_data[i].sens_denom);
13611363

13621364
input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data);
13631365
}

0 commit comments

Comments
 (0)