summaryrefslogtreecommitdiff
path: root/hw/usb/hid-logitech-hidpp20.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/usb/hid-logitech-hidpp20.c')
-rw-r--r--hw/usb/hid-logitech-hidpp20.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/hw/usb/hid-logitech-hidpp20.c b/hw/usb/hid-logitech-hidpp20.c
index 915a028b47..4e43eb26a1 100644
--- a/hw/usb/hid-logitech-hidpp20.c
+++ b/hw/usb/hid-logitech-hidpp20.c
@@ -232,6 +232,24 @@ static HIDPP20_FEATURE(feat_batterystatus)
}
}
+static HIDPP20_FEATURE(feat_featureinfo)
+{
+ return -HIDPP20_ERR_CODE_UNSUPPORTED; /* TODO: figure out */
+ switch (fn) {
+ default:
+ return -HIDPP20_ERR_CODE_INVALID_FUNCTION_ID;
+ }
+}
+
+static HIDPP20_FEATURE(feat_dfucontrol)
+{
+ return -HIDPP20_ERR_CODE_UNSUPPORTED; /* TODO: figure out */
+ switch (fn) {
+ default:
+ return -HIDPP20_ERR_CODE_INVALID_FUNCTION_ID;
+ }
+}
+
static HIDPP20_FEATURE(feat_unknown)
{
/* Undocumented feature */
@@ -263,6 +281,34 @@ static const HidppFeature features_m525[] = {
{ 0x1B00, 0, feat_reprogcontrols },
{ 0x1DF0, HIDPP20_FEAT_TYPE_HIDDEN, feat_unknown },
{ 0x1F03, HIDPP20_FEAT_TYPE_HIDDEN, feat_unknown },
+// { 0x2100, 0, feat_verticalscrolling },
+// { 0x2120, 0, feat_hiresscrolling },
+// { 0x2200, 0, feat_mousepointer },
+};
+
+static const HidppFeature features_t650[] = {
+ { 0x0001, 0, feat_featureset },
+ { 0x0002, 0, feat_featureinfo },
+ { 0x0003, 0, feat_devicefwversion },
+ { 0x0005, 0, feat_devicename },
+ { 0x1000, 0, feat_batterystatus },
+ { 0x1D4B, 0, NULL }, /* WirelessDeviceStatus events */
+ { 0x1DF3, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+ { 0x1B00, 0, feat_reprogcontrols },
+ { 0x1F03, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+// { 0x2100, 0, feat_verticalscrolling },
+// { 0x2120, 0, feat_hiresscrolling },
+// { 0x2200, 0, feat_mousepointer },
+ { 0x00C0, 0, feat_dfucontrol },
+ { 0x1E80, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+// { 0x6100, 0, feat_touchpadrawxy },
+ { 0x1860, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+ { 0x1E00, HIDPP20_FEAT_TYPE_HIDDEN, feat_unknown },
+// { 0x1B01, 0, feat_reprogcontrolsv2 },
+ { 0x1890, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+ { 0x18E5, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+ { 0x18A0, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
+ { 0x1830, HIDPP20_FEAT_TYPE_HIDDEN | HIDPP20_FEAT_TYPE_INTERNAL, feat_unknown },
};
void hidpp20_init_features(LHidDevice *hd) {
@@ -271,6 +317,10 @@ void hidpp20_init_features(LHidDevice *hd) {
hd->info.features = features_m525;
hd->info.features_count = ARRAY_SIZE(features_m525);
break;
+ case 0x4026:
+ hd->info.features = features_t650;
+ hd->info.features_count = ARRAY_SIZE(features_t650);
+ break;
}
}