@@ -316,6 +316,17 @@ struct dualsense_output_report {
316
316
/* Battery status within batery_status field. */
317
317
#define DS4_BATTERY_STATUS_FULL 11
318
318
319
+ /* The lower 6 bits of hw_control of the Bluetooth main output report
320
+ * control the interval at which Dualshock 4 reports data:
321
+ * 0x00 - 1ms
322
+ * 0x01 - 1ms
323
+ * 0x02 - 2ms
324
+ * 0x3E - 62ms
325
+ * 0x3F - disabled
326
+ */
327
+ #define DS4_OUTPUT_HWCTL_BT_POLL_MASK 0x3F
328
+ /* Default to 4ms poll interval, which is same as USB (not adjustable). */
329
+ #define DS4_BT_DEFAULT_POLL_INTERVAL_MS 4
319
330
#define DS4_OUTPUT_HWCTL_CRC32 0x40
320
331
#define DS4_OUTPUT_HWCTL_HID 0x80
321
332
@@ -348,6 +359,10 @@ struct dualshock4 {
348
359
uint32_t prev_sensor_timestamp ;
349
360
uint32_t sensor_timestamp_us ;
350
361
362
+ /* Bluetooth poll interval */
363
+ bool update_bt_poll_interval ;
364
+ uint8_t bt_poll_interval ;
365
+
351
366
bool update_rumble ;
352
367
uint8_t motor_left ;
353
368
uint8_t motor_right ;
@@ -2010,6 +2025,11 @@ static void dualshock4_output_worker(struct work_struct *work)
2010
2025
*/
2011
2026
report .bt -> hw_control = DS4_OUTPUT_HWCTL_HID | DS4_OUTPUT_HWCTL_CRC32 ;
2012
2027
2028
+ if (ds4 -> update_bt_poll_interval ) {
2029
+ report .bt -> hw_control |= ds4 -> bt_poll_interval ;
2030
+ ds4 -> update_bt_poll_interval = false;
2031
+ }
2032
+
2013
2033
crc = crc32_le (0xFFFFFFFF , & seed , 1 );
2014
2034
crc = ~crc32_le (crc , report .data , report .len - 4 );
2015
2035
@@ -2241,6 +2261,13 @@ static inline void dualshock4_schedule_work(struct dualshock4 *ds4)
2241
2261
spin_unlock_irqrestore (& ds4 -> base .lock , flags );
2242
2262
}
2243
2263
2264
+ static void dualshock4_set_bt_poll_interval (struct dualshock4 * ds4 , uint8_t interval )
2265
+ {
2266
+ ds4 -> bt_poll_interval = interval ;
2267
+ ds4 -> update_bt_poll_interval = true;
2268
+ dualshock4_schedule_work (ds4 );
2269
+ }
2270
+
2244
2271
/* Set default lightbar color based on player. */
2245
2272
static void dualshock4_set_default_lightbar_colors (struct dualshock4 * ds4 )
2246
2273
{
@@ -2372,6 +2399,8 @@ static struct ps_device *dualshock4_create(struct hid_device *hdev)
2372
2399
goto err ;
2373
2400
}
2374
2401
2402
+ dualshock4_set_bt_poll_interval (ds4 , DS4_BT_DEFAULT_POLL_INTERVAL_MS );
2403
+
2375
2404
ret = ps_device_set_player_id (ps_dev );
2376
2405
if (ret ) {
2377
2406
hid_err (hdev , "Failed to assign player id for DualShock4: %d\n" , ret );
0 commit comments