From fd47d58e8c3ed19be4309b3a1d3da5b9ce4733ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Wed, 17 Nov 2021 11:51:50 +0100 Subject: [PATCH] winebus.sys: Add a PID device gain output report. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- dlls/winebus.sys/bus_sdl.c | 8 +++++++ dlls/winebus.sys/bus_udev.c | 8 +++++++ dlls/winebus.sys/hid.c | 38 +++++++++++++++++++++++++++++++++ dlls/winebus.sys/unix_private.h | 2 ++ dlls/winebus.sys/unixlib.c | 12 +++++++++++ 5 files changed, 68 insertions(+) diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c index 49afcbaf67c..48d5ad85a2b 100644 --- a/dlls/winebus.sys/bus_sdl.c +++ b/dlls/winebus.sys/bus_sdl.c @@ -480,6 +480,13 @@ static NTSTATUS sdl_device_physical_device_control(struct unix_device *iface, US return STATUS_NOT_SUPPORTED; } +static NTSTATUS sdl_device_physical_device_set_gain(struct unix_device *iface, BYTE value) +{ + FIXME("iface %p, value %#x stub!\n", iface, value); + + return STATUS_NOT_IMPLEMENTED; +} + static NTSTATUS sdl_device_physical_effect_control(struct unix_device *iface, BYTE index, USAGE control, BYTE iterations) { @@ -664,6 +671,7 @@ static const struct hid_device_vtbl sdl_device_vtbl = sdl_device_stop, sdl_device_haptics_start, sdl_device_physical_device_control, + sdl_device_physical_device_set_gain, sdl_device_physical_effect_control, sdl_device_physical_effect_update, }; diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c index 5ff1719848d..74cfe486a03 100644 --- a/dlls/winebus.sys/bus_udev.c +++ b/dlls/winebus.sys/bus_udev.c @@ -924,6 +924,13 @@ static NTSTATUS lnxev_device_physical_device_control(struct unix_device *iface, return STATUS_NOT_SUPPORTED; } +static NTSTATUS lnxev_device_physical_device_set_gain(struct unix_device *iface, BYTE value) +{ + FIXME("iface %p, value %#x stub!\n", iface, value); + + return STATUS_NOT_IMPLEMENTED; +} + static NTSTATUS lnxev_device_physical_effect_control(struct unix_device *iface, BYTE index, USAGE control, BYTE iterations) { @@ -1095,6 +1102,7 @@ static const struct hid_device_vtbl lnxev_device_vtbl = lnxev_device_start, lnxev_device_stop, lnxev_device_haptics_start, + lnxev_device_physical_device_set_gain, lnxev_device_physical_device_control, lnxev_device_physical_effect_control, lnxev_device_physical_effect_update, diff --git a/dlls/winebus.sys/hid.c b/dlls/winebus.sys/hid.c index 893bf1cd7f6..6f22e0e81d8 100644 --- a/dlls/winebus.sys/hid.c +++ b/dlls/winebus.sys/hid.c @@ -412,6 +412,11 @@ static const USAGE pid_device_control_usages[] = PID_USAGE_DC_DEVICE_CONTINUE, }; +struct pid_device_gain +{ + BYTE value; +}; + struct pid_effect_control { BYTE index; @@ -741,6 +746,25 @@ BOOL hid_device_add_physical(struct unix_device *iface, USAGE *usages, USHORT co END_COLLECTION, }; + const BYTE device_gain_report = ++desc->next_report_id[HidP_Output]; + const BYTE device_gain[] = + { + USAGE_PAGE(1, HID_USAGE_PAGE_PID), + USAGE(1, PID_USAGE_DEVICE_GAIN_REPORT), + COLLECTION(1, Logical), + REPORT_ID(1, device_gain_report), + + USAGE(1, PID_USAGE_DEVICE_GAIN), + LOGICAL_MINIMUM(1, 0), + LOGICAL_MAXIMUM(2, 0x00ff), + PHYSICAL_MINIMUM(1, 0), + PHYSICAL_MAXIMUM(2, 0x2710), + REPORT_SIZE(1, 8), + REPORT_COUNT(1, 1), + OUTPUT(1, Data|Var|Abs), + END_COLLECTION, + }; + const BYTE effect_control_report = ++desc->next_report_id[HidP_Output]; const BYTE effect_control_header[] = { @@ -882,6 +906,9 @@ BOOL hid_device_add_physical(struct unix_device *iface, USAGE *usages, USHORT co if (!hid_report_descriptor_append(desc, device_control_footer, sizeof(device_control_footer))) return FALSE; + if (!hid_report_descriptor_append(desc, device_gain, sizeof(device_gain))) + return FALSE; + if (!hid_report_descriptor_append(desc, effect_control_header, sizeof(effect_control_header))) return FALSE; for (i = 1; i < ARRAY_SIZE(pid_effect_control_usages); ++i) @@ -936,6 +963,7 @@ BOOL hid_device_add_physical(struct unix_device *iface, USAGE *usages, USHORT co memcpy(iface->hid_physical.effect_types + 1, usages, count * sizeof(*usages)); iface->hid_physical.device_control_report = device_control_report; + iface->hid_physical.device_gain_report = device_gain_report; iface->hid_physical.effect_control_report = effect_control_report; iface->hid_physical.effect_update_report = effect_update_report; return TRUE; @@ -1013,6 +1041,16 @@ static void hid_device_set_output_report(struct unix_device *iface, HID_XFER_PAC else io->Status = iface->hid_vtbl->physical_device_control(iface, control); } + else if (packet->reportId == physical->device_gain_report) + { + struct pid_device_gain *report = (struct pid_device_gain *)(packet->reportBuffer + 1); + + io->Information = sizeof(*report) + 1; + if (packet->reportBufferLen < io->Information) + io->Status = STATUS_BUFFER_TOO_SMALL; + else + io->Status = iface->hid_vtbl->physical_device_set_gain(iface, report->value); + } else if (packet->reportId == physical->effect_control_report) { struct pid_effect_control *report = (struct pid_effect_control *)(packet->reportBuffer + 1); diff --git a/dlls/winebus.sys/unix_private.h b/dlls/winebus.sys/unix_private.h index 89a0c9abad9..ef574e48cee 100644 --- a/dlls/winebus.sys/unix_private.h +++ b/dlls/winebus.sys/unix_private.h @@ -109,6 +109,7 @@ struct hid_device_vtbl NTSTATUS (*haptics_start)(struct unix_device *iface, DWORD duration_ms, USHORT rumble_intensity, USHORT buzz_intensity); NTSTATUS (*physical_device_control)(struct unix_device *iface, USAGE control); + NTSTATUS (*physical_device_set_gain)(struct unix_device *iface, BYTE value); NTSTATUS (*physical_effect_control)(struct unix_device *iface, BYTE index, USAGE control, BYTE iterations); NTSTATUS (*physical_effect_update)(struct unix_device *iface, BYTE index, struct effect_params *params); }; @@ -157,6 +158,7 @@ struct hid_physical struct effect_params effect_params[256]; BYTE device_control_report; + BYTE device_gain_report; BYTE effect_control_report; BYTE effect_update_report; BYTE set_periodic_report; diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index 6cf58570c76..9d819bab7e3 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -106,6 +106,11 @@ static NTSTATUS mouse_physical_device_control(struct unix_device *iface, USAGE c return STATUS_NOT_SUPPORTED; } +static NTSTATUS mouse_physical_device_set_gain(struct unix_device *iface, BYTE value) +{ + return STATUS_NOT_SUPPORTED; +} + static NTSTATUS mouse_physical_effect_control(struct unix_device *iface, BYTE index, USAGE control, BYTE iterations) { @@ -125,6 +130,7 @@ static const struct hid_device_vtbl mouse_vtbl = mouse_stop, mouse_haptics_start, mouse_physical_device_control, + mouse_physical_device_set_gain, mouse_physical_effect_control, mouse_physical_effect_update, }; @@ -183,6 +189,11 @@ static NTSTATUS keyboard_physical_device_control(struct unix_device *iface, USAG return STATUS_NOT_SUPPORTED; } +static NTSTATUS keyboard_physical_device_set_gain(struct unix_device *iface, BYTE value) +{ + return STATUS_NOT_SUPPORTED; +} + static NTSTATUS keyboard_physical_effect_control(struct unix_device *iface, BYTE index, USAGE control, BYTE iterations) { @@ -202,6 +213,7 @@ static const struct hid_device_vtbl keyboard_vtbl = keyboard_stop, keyboard_haptics_start, keyboard_physical_device_control, + keyboard_physical_device_set_gain, keyboard_physical_effect_control, keyboard_physical_effect_update, };