Skip to content

Commit 12b18bc

Browse files
Roderick ColenbranderJiri Kosina
authored andcommitted
HID: playstation: correct DualShock4 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 5e25a8c commit 12b18bc

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
@@ -1815,19 +1815,22 @@ static int dualshock4_get_calibration_data(struct dualshock4 *ds4)
18151815
*/
18161816
speed_2x = (gyro_speed_plus + gyro_speed_minus);
18171817
ds4->gyro_calib_data[0].abs_code = ABS_RX;
1818-
ds4->gyro_calib_data[0].bias = gyro_pitch_bias;
1818+
ds4->gyro_calib_data[0].bias = 0;
18191819
ds4->gyro_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1820-
ds4->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
1820+
ds4->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +
1821+
abs(gyro_pitch_minus - gyro_pitch_bias);
18211822

18221823
ds4->gyro_calib_data[1].abs_code = ABS_RY;
1823-
ds4->gyro_calib_data[1].bias = gyro_yaw_bias;
1824+
ds4->gyro_calib_data[1].bias = 0;
18241825
ds4->gyro_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1825-
ds4->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
1826+
ds4->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +
1827+
abs(gyro_yaw_minus - gyro_yaw_bias);
18261828

18271829
ds4->gyro_calib_data[2].abs_code = ABS_RZ;
1828-
ds4->gyro_calib_data[2].bias = gyro_roll_bias;
1830+
ds4->gyro_calib_data[2].bias = 0;
18291831
ds4->gyro_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
1830-
ds4->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
1832+
ds4->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +
1833+
abs(gyro_roll_minus - gyro_roll_bias);
18311834

18321835
/*
18331836
* Set accelerometer calibration and normalization parameters.
@@ -2178,8 +2181,7 @@ static int dualshock4_parse_report(struct ps_device *ps_dev, struct hid_report *
21782181
for (i = 0; i < ARRAY_SIZE(ds4_report->gyro); i++) {
21792182
int raw_data = (short)le16_to_cpu(ds4_report->gyro[i]);
21802183
int calib_data = mult_frac(ds4->gyro_calib_data[i].sens_numer,
2181-
raw_data - ds4->gyro_calib_data[i].bias,
2182-
ds4->gyro_calib_data[i].sens_denom);
2184+
raw_data, ds4->gyro_calib_data[i].sens_denom);
21832185

21842186
input_report_abs(ds4->sensors, ds4->gyro_calib_data[i].abs_code, calib_data);
21852187
}

0 commit comments

Comments
 (0)