Message ID | 20210218190545.109454-1-szymon.janc@codecoup.pl |
---|---|
State | New |
Headers | show |
Series | sixaxis: Fix Bluetooth PS3 clone joypad being named like the original | expand |
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
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]; }