winebus.sys: Add a PID device gain output report.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2021-11-17 11:51:50 +01:00 committed by Alexandre Julliard
parent e7217a3287
commit fd47d58e8c
5 changed files with 68 additions and 0 deletions

View File

@ -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,
};

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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,
};