Skip to content

Commit

Permalink
[PS5] Add Dual Sense 0x31 report & rumble support
Browse files Browse the repository at this point in the history
  • Loading branch information
darthcloud committed Nov 22, 2020
1 parent 1aca1b4 commit e325276
Show file tree
Hide file tree
Showing 10 changed files with 234 additions and 129 deletions.
4 changes: 2 additions & 2 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ idf_component_register(SRCS "main.c"
"adapter/gc.c"
"adapter/ps3.c"
"adapter/wii.c"
"adapter/ps4.c"
"adapter/ps4_ps5.c"
"adapter/xb1.c"
"adapter/sw.c"
"adapter/parallel_1p.c"
Expand All @@ -27,7 +27,7 @@ idf_component_register(SRCS "main.c"
"bluetooth/hidp_generic.c"
"bluetooth/hidp_ps3.c"
"bluetooth/hidp_wii.c"
"bluetooth/hidp_ps4.c"
"bluetooth/hidp_ps4_ps5.c"
"bluetooth/hidp_xb1.c"
"bluetooth/hidp_sw.c"
"drivers/led.c"
Expand Down
32 changes: 17 additions & 15 deletions main/adapter/adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "hid_generic.h"
#include "ps3.h"
#include "wii.h"
#include "ps4.h"
#include "ps4_ps5.h"
#include "xb1.h"
#include "sw.h"
#include "parallel_1p.h"
Expand Down Expand Up @@ -55,10 +55,25 @@ static to_generic_t to_generic_func[BT_MAX] = {
wiin_to_generic, /* WII_NUNCHUCK */
wiic_to_generic, /* WII_CLASSIC */
wiiu_to_generic, /* WIIU_PRO */
ps4_to_generic, /* PS4_DS4 */
ps4_ps5_to_generic, /* PS4_DS4 */
xb1_to_generic, /* XB1_S */
xb1_to_generic, /* XB1_ADAPTIVE */
sw_to_generic, /* SW */
ps4_ps5_to_generic, /* PS5_DS */
};

static fb_from_generic_t fb_from_generic_func[BT_MAX] = {
NULL, /* HID_GENERIC */
ps3_fb_from_generic, /* PS3_DS3 */
wii_fb_from_generic, /* WII_CORE */
wii_fb_from_generic, /* WII_NUNCHUCK */
wii_fb_from_generic, /* WII_CLASSIC */
wii_fb_from_generic, /* WIIU_PRO */
ps4_fb_from_generic, /* PS4_DS4 */
xb1_fb_from_generic, /* XB1_S */
xb1_fb_from_generic, /* XB1_ADAPTIVE */
sw_fb_from_generic, /* SW */
ps5_fb_from_generic, /* PS5_DS4 */
};

static from_generic_t from_generic_func[WIRED_MAX] = {
Expand Down Expand Up @@ -109,19 +124,6 @@ static fb_to_generic_t fb_to_generic_func[WIRED_MAX] = {
NULL, /* EXP_BOARD */
};

static fb_from_generic_t fb_from_generic_func[BT_MAX] = {
NULL, /* HID_GENERIC */
ps3_fb_from_generic, /* PS3_DS3 */
wii_fb_from_generic, /* WII_CORE */
wii_fb_from_generic, /* WII_NUNCHUCK */
wii_fb_from_generic, /* WII_CLASSIC */
wii_fb_from_generic, /* WIIU_PRO */
ps4_fb_from_generic, /* PS4_DS4 */
xb1_fb_from_generic, /* XB1_S */
xb1_fb_from_generic, /* XB1_ADAPTIVE */
sw_fb_from_generic, /* SW */
};

static meta_init_t meta_init_func[WIRED_MAX] = {
para_auto_meta_init, /* WIRED_AUTO */
para_1p_meta_init, /* PARALLEL_1P */
Expand Down
1 change: 1 addition & 0 deletions main/adapter/adapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ enum {
XB1_S,
XB1_ADAPTIVE,
SW,
PS5_DS,
BT_MAX,
};

Expand Down
13 changes: 0 additions & 13 deletions main/adapter/ps4.h

This file was deleted.

95 changes: 69 additions & 26 deletions main/adapter/ps4.c → main/adapter/ps4_ps5.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
#include <string.h>
#include "../zephyr/types.h"
#include "../util.h"
#include "ps4.h"
#include "../bluetooth/hidp_ps4_ps5.h"
#include "ps4_ps5.h"

enum {
PS4_S = 4,
Expand Down Expand Up @@ -36,18 +37,19 @@ static const uint8_t ps4_led_dev_id_map[][3] = {
{0x01, 0x01, 0x01},
};

const uint8_t ps4_axes_idx[ADAPTER_MAX_AXES] =
static const uint8_t ps4_axes_idx[ADAPTER_MAX_AXES] =
{
/* AXIS_LX, AXIS_LY, AXIS_RX, AXIS_RY, TRIG_L, TRIG_R */
0, 1, 2, 3, 7, 8
};

const struct ctrl_meta ps4_btn_meta =
static const uint8_t ps5_axes_idx[ADAPTER_MAX_AXES] =
{
.polarity = 0,
/* AXIS_LX, AXIS_LY, AXIS_RX, AXIS_RY, TRIG_L, TRIG_R */
0, 1, 2, 3, 5, 6
};

const struct ctrl_meta ps4_axes_meta[ADAPTER_MAX_AXES] =
static const struct ctrl_meta ps4_axes_meta[ADAPTER_MAX_AXES] =
{
{.neutral = 0x80, .abs_max = 0x80},
{.neutral = 0x80, .abs_max = 0x80, .polarity = 1},
Expand Down Expand Up @@ -84,24 +86,20 @@ struct ps4_map {
};
} __packed;

struct ps4_set_conf {
uint8_t conf0;
uint8_t tbd0;
uint8_t conf1;
uint8_t tbd1[2];
uint8_t r_rumble;
uint8_t l_rumble;
uint8_t leds[3];
uint8_t led_on_delay;
uint8_t led_off_delay;
uint8_t tbd2[61];
uint32_t crc;
struct ps5_map {
uint8_t reserved;
uint8_t axes[6];
uint8_t reserved2;
union {
uint8_t hat;
uint32_t buttons;
};
} __packed;

const uint32_t ps4_mask[4] = {0xBBFF0FFF, 0x00000000, 0x00000000, 0x00000000};
const uint32_t ps4_desc[4] = {0x110000FF, 0x00000000, 0x00000000, 0x00000000};
static const uint32_t ps4_mask[4] = {0xBBFF0FFF, 0x00000000, 0x00000000, 0x00000000};
static const uint32_t ps4_desc[4] = {0x110000FF, 0x00000000, 0x00000000, 0x00000000};

const uint32_t ps4_btns_mask[32] = {
static const uint32_t ps4_btns_mask[32] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
Expand All @@ -112,7 +110,7 @@ const uint32_t ps4_btns_mask[32] = {
0, BIT(PS4_R1), 0, BIT(PS4_R3),
};

void ps_ps4_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
static void ps4_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
struct ps4_map *map = (struct ps4_map *)bt_data->input;

memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
Expand Down Expand Up @@ -142,7 +140,37 @@ void ps_ps4_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data)
}
}

void ps_hid_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
static void ps5_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
struct ps5_map *map = (struct ps5_map *)bt_data->input;

memset((void *)ctrl_data, 0, sizeof(*ctrl_data));

ctrl_data->mask = (uint32_t *)ps4_mask;
ctrl_data->desc = (uint32_t *)ps4_desc;

for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
if (map->buttons & ps4_btns_mask[i]) {
ctrl_data->btns[0].value |= generic_btns_mask[i];
}
}

/* Convert hat to regular btns */
ctrl_data->btns[0].value |= hat_to_ld_btns[map->hat & 0xF];

if (!atomic_test_bit(&bt_data->flags, BT_INIT)) {
for (uint32_t i = 0; i < ADAPTER_MAX_AXES; i++) {
bt_data->axes_cal[i] = -(map->axes[ps5_axes_idx[i]] - ps4_axes_meta[i].neutral);
}
atomic_set_bit(&bt_data->flags, BT_INIT);
}

for (uint32_t i = 0; i < ADAPTER_MAX_AXES; i++) {
ctrl_data->axes[i].meta = &ps4_axes_meta[i];
ctrl_data->axes[i].value = map->axes[ps5_axes_idx[i]] - ps4_axes_meta[i].neutral + bt_data->axes_cal[i];
}
}

static void hid_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
struct hid_map *map = (struct hid_map *)bt_data->input;

memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
Expand Down Expand Up @@ -172,13 +200,16 @@ void ps_hid_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data)
}
}

void ps4_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
void ps4_ps5_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
switch (bt_data->report_id) {
case 0x01:
ps_hid_to_generic(bt_data, ctrl_data);
hid_to_generic(bt_data, ctrl_data);
break;
case 0x11:
ps_ps4_to_generic(bt_data, ctrl_data);
ps4_to_generic(bt_data, ctrl_data);
break;
case 0x31:
ps5_to_generic(bt_data, ctrl_data);
break;
default:
printf("# Unknown report type: %02X\n", bt_data->report_type);
Expand All @@ -187,7 +218,7 @@ void ps4_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data) {
}

void ps4_fb_from_generic(struct generic_fb *fb_data, struct bt_data *bt_data) {
struct ps4_set_conf *set_conf = (struct ps4_set_conf *)bt_data->output;
struct bt_hidp_ps4_set_conf *set_conf = (struct bt_hidp_ps4_set_conf *)bt_data->output;
memset((void *)set_conf, 0, sizeof(*set_conf));
set_conf->conf0 = 0xc4;
set_conf->conf1 = 0x07;
Expand All @@ -198,3 +229,15 @@ void ps4_fb_from_generic(struct generic_fb *fb_data, struct bt_data *bt_data) {
set_conf->r_rumble = 0xFF;
}
}

void ps5_fb_from_generic(struct generic_fb *fb_data, struct bt_data *bt_data) {
struct bt_hidp_ps5_set_conf *set_conf = (struct bt_hidp_ps5_set_conf *)bt_data->output;
memset((void *)set_conf, 0, sizeof(*set_conf));

set_conf->conf0 = 0x02;
if (fb_data->state) {
set_conf->cmd = 0x03;
set_conf->r_rumble = 0x3F;
set_conf->l_rumble = 0x3F;
}
}
14 changes: 14 additions & 0 deletions main/adapter/ps4_ps5.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright (c) 2019-2020, Jacques Gagnon
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef _PS4_PS5_H_
#define _PS4_PS5_H_
#include "adapter.h"

void ps4_ps5_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctrl_data);
void ps4_fb_from_generic(struct generic_fb *fb_data, struct bt_data *bt_data);
void ps5_fb_from_generic(struct generic_fb *fb_data, struct bt_data *bt_data);

#endif /* _PS4_PS5_H_ */
9 changes: 6 additions & 3 deletions main/bluetooth/hidp.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include "hidp_generic.h"
#include "hidp_ps3.h"
#include "hidp_wii.h"
#include "hidp_ps4.h"
#include "hidp_ps4_ps5.h"
#include "hidp_xb1.h"
#include "hidp_sw.h"

Expand All @@ -26,10 +26,11 @@ static const bt_hid_init_t bt_hid_init_list[BT_MAX] = {
bt_hid_wii_init, /* WII_NUNCHUCK */
bt_hid_wii_init, /* WII_CLASSIC */
bt_hid_wii_init, /* WIIU_PRO */
bt_hid_ps4_init, /* PS4_DS4 */
bt_hid_ps4_ps5_init, /* PS4_DS4 */
bt_hid_xb1_init, /* XB1_S */
bt_hid_xb1_init, /* XB1_ADAPTIVE */
bt_hid_sw_init, /* SW */
bt_hid_ps4_ps5_init, /* PS5_DS */
};

static const bt_hid_hdlr_t bt_hid_hdlr_list[BT_MAX] = {
Expand All @@ -39,10 +40,11 @@ static const bt_hid_hdlr_t bt_hid_hdlr_list[BT_MAX] = {
bt_hid_wii_hdlr, /* WII_NUNCHUCK */
bt_hid_wii_hdlr, /* WII_CLASSIC */
bt_hid_wii_hdlr, /* WIIU_PRO */
bt_hid_ps4_hdlr, /* PS4_DS4 */
bt_hid_ps4_ps5_hdlr, /* PS4_DS4 */
bt_hid_xb1_hdlr, /* XB1_S */
bt_hid_xb1_hdlr, /* XB1_ADAPTIVE */
bt_hid_sw_hdlr, /* SW */
bt_hid_ps4_ps5_hdlr, /* PS5_DS */
};

static const bt_hid_cmd_t bt_hid_feedback_list[BT_MAX] = {
Expand All @@ -56,6 +58,7 @@ static const bt_hid_cmd_t bt_hid_feedback_list[BT_MAX] = {
bt_hid_cmd_xb1_rumble, /* XB1_S */
bt_hid_cmd_xb1_rumble, /* XB1_ADAPTIVE */
bt_hid_cmd_sw_set_conf, /* SW */
bt_hid_cmd_ps5_set_conf, /* PS5_DS */
};

void bt_hid_init(struct bt_dev *device) {
Expand Down
65 changes: 0 additions & 65 deletions main/bluetooth/hidp_ps4.c

This file was deleted.

Loading

0 comments on commit e325276

Please sign in to comment.