Re: [PATCH] sixaxis: Fix Bluetooth PS3 clone joypad being named like the original

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux