u8 wireless_feature_index;
+ int hires_wheel_multiplier;
+ u8 hires_wheel_feature_index;
+
bool connected_once;
};
multiplier = 1;
}
+ hidpp->hires_wheel_multiplier = multiplier;
hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
return 0;
int ret;
unsigned long capabilities;
+ hidpp->hires_wheel_feature_index = 0xff;
capabilities = hidpp->capabilities;
if (hidpp->protocol_major >= 2) {
&feature_index);
if (!ret) {
hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL;
+ hidpp->hires_wheel_feature_index = feature_index;
hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scroll wheel\n");
return 0;
}
return 0;
}
+static int hidpp20_hires_wheel_raw_event(struct hidpp_device *hidpp,
+ u8 *data, int size)
+{
+ if (hidpp->hires_wheel_feature_index == 0xff)
+ return 0;
+
+ if (size < 5)
+ return 0;
+
+ if (data[0] != REPORT_ID_HIDPP_LONG ||
+ data[2] != hidpp->hires_wheel_feature_index)
+ return 0;
+
+ if ((data[3] & 0xf0) == CMD_HIRES_WHEEL_SET_WHEEL_MODE) {
+ u8 mode = data[4];
+ bool hires = (mode & 0x02) != 0;
+ int new_multiplier = (hires && hidpp->hires_wheel_multiplier > 0)
+ ? hidpp->hires_wheel_multiplier : 1;
+ hidpp->vertical_wheel_counter.wheel_multiplier = new_multiplier;
+ return 1;
+ }
+
+ return 0;
+}
+
/* -------------------------------------------------------------------------- */
/* Generic HID++ devices */
/* -------------------------------------------------------------------------- */
return ret;
}
+ if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL) {
+ ret = hidpp20_hires_wheel_raw_event(hidpp, data, size);
+ if (ret != 0)
+ return ret;
+ }
+
return 0;
}