[PATCH 2/4] winebus.sys: Process quirky DualSense bluetooth reports.
Rémi Bernon
rbernon at codeweavers.com
Fri Jan 21 16:52:59 CST 2022
Hi Arek,
On 1/21/22 17:10, Arkadiusz Hiler wrote:
> Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
> ---
> dlls/winebus.sys/bus_udev.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
> index 2269f5b904e..c290cea6f4f 100644
> --- a/dlls/winebus.sys/bus_udev.c
> +++ b/dlls/winebus.sys/bus_udev.c
> @@ -117,6 +117,7 @@ static inline struct base_device *impl_from_unix_device(struct unix_device *ifac
> }
>
> #define QUIRK_DS4_BT 0x1
> +#define QUIRK_DUALSENSE_BT 0x2
>
> struct hidraw_device
> {
> @@ -356,6 +357,34 @@ static void hidraw_device_read_report(struct unix_device *iface)
> buff[0] = 1;
> }
>
> + /* The behavior of DualSense is very similar to DS4 described above with few exceptions.
> + *
> + * The report number #41 is used for the extended bluetooth input report. The report comes
> + * with only one extra byte in front and the format is not exactly the same and we need to
> + * shuffle a few bytes around.
> + *
> + * Small report:
> + * X Y Z RZ Buttons[3] TriggerLeft TriggerRight
> + *
> + * Extended report:
> + * Prefix X Y Z Rz TriggerLeft TriggerRight Counter Buttons[3] ...
> + */
> + if ((impl->quirks & QUIRK_DUALSENSE_BT) && report_buffer[0] == 0x31 && size >= 11)
> + {
> + BYTE tmp;
> + size = 10;
> + buff += 1;
> +
> + buff[0] = 1; /* fake report #1 */
> +
> + tmp = buff[6]; /* Trigger Right */
> + buff[5] = buff[8]; /* Buttons[0] */
> + buff[6] = buff[9]; /* Buttons[1] */
> + buff[7] = buff[10]; /* Buttons[2] */
> + buff[8] = buff[5]; /* TriggerLeft */
> + buff[9] = tmp; /* TirggerRight */
> + }
You're writing to buff[5] and then reading it, probably you need to save
both triggers first.
--
Rémi Bernon <rbernon at codeweavers.com>
More information about the wine-devel
mailing list