On Thursday, 18 February 2021 20:05:45 CET Szymon Janc wrote: > When cable pairing a PS3 clone device, we should try and keep the USB device > name to create a new btd_device so that the joypad is named after its USB > name when connecting through Bluetooth. > > If that isn't done, "Shanwan" clone joypads are named like the genuine > joypads, and kernel Bluetooth quirks aren't applied. > > gh-issue: https://github.com/bluez/bluez/issues/46 > --- > plugins/sixaxis.c | 5 ++++- > profiles/input/server.c | 2 +- > profiles/input/sixaxis.h | 13 ++++++++++++- > 3 files changed, 17 insertions(+), 3 deletions(-) > > diff --git a/plugins/sixaxis.c b/plugins/sixaxis.c > index d693a86c0..517cecc47 100644 > --- a/plugins/sixaxis.c > +++ b/plugins/sixaxis.c > @@ -387,6 +387,7 @@ get_pairing_type_for_device(struct udev_device *udevice, > uint16_t *bus, char **sysfs_path) > { > struct udev_device *hid_parent; > + const char *hid_name; > const char *hid_id; > const struct cable_pairing *cp; > uint16_t vid, pid; > @@ -401,7 +402,9 @@ get_pairing_type_for_device(struct udev_device *udevice, > uint16_t *bus, if (!hid_id || sscanf(hid_id, "%hx:%hx:%hx", bus, &vid, > &pid) != 3) return NULL; > > - cp = get_pairing(vid, pid); > + hid_name = udev_device_get_property_value(hid_parent, "HID_NAME"); > + > + cp = get_pairing(vid, pid, hid_name); > *sysfs_path = g_strdup(udev_device_get_syspath(udevice)); > > return cp; > diff --git a/profiles/input/server.c b/profiles/input/server.c > index d8b413744..79cf08a66 100644 > --- a/profiles/input/server.c > +++ b/profiles/input/server.c > @@ -120,7 +120,7 @@ static bool dev_is_sixaxis(const bdaddr_t *src, const > bdaddr_t *dst) vid = btd_device_get_vendor(device); > pid = btd_device_get_product(device); > > - cp = get_pairing(vid, pid); > + cp = get_pairing(vid, pid, NULL); > if (cp && (cp->type == CABLE_PAIRING_SIXAXIS || > cp->type == CABLE_PAIRING_DS4)) > return true; > diff --git a/profiles/input/sixaxis.h b/profiles/input/sixaxis.h > index a3cda70e4..ab8831995 100644 > --- a/profiles/input/sixaxis.h > +++ b/profiles/input/sixaxis.h > @@ -29,7 +29,7 @@ struct cable_pairing { > }; > > static inline const struct cable_pairing * > -get_pairing(uint16_t vid, uint16_t pid) > +get_pairing(uint16_t vid, uint16_t pid, const char *name) > { > static const struct cable_pairing devices[] = { > { > @@ -40,6 +40,14 @@ get_pairing(uint16_t vid, uint16_t pid) > .version = 0x0000, > .type = CABLE_PAIRING_SIXAXIS, > }, > + { > + .name = "SHANWAN PS3 GamePad", > + .source = 0x0002, > + .vid = 0x054c, > + .pid = 0x0268, > + .version = 0x0000, > + .type = CABLE_PAIRING_SIXAXIS, > + }, > { > .name = "Navigation Controller", > .source = 0x0002, > @@ -73,6 +81,9 @@ get_pairing(uint16_t vid, uint16_t pid) > if (devices[i].pid != pid) > continue; > > + if (name && strcmp(name, devices[i].name)) > + continue; > + > return &devices[i]; > } Applied. -- pozdrawiam Szymon Janc