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:
parent
e7217a3287
commit
fd47d58e8c
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue