1 // SPDX-License-Identifier: GPL-2.0-only
3 * HIDPP protocol for Logitech receivers
5 * Copyright (c) 2011 Logitech (c)
6 * Copyright (c) 2012-2013 Google (c)
7 * Copyright (c) 2013-2014 Red Hat Inc.
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13 #include <linux/device.h>
14 #include <linux/input.h>
15 #include <linux/usb.h>
16 #include <linux/hid.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <linux/sched.h>
20 #include <linux/sched/clock.h>
21 #include <linux/kfifo.h>
22 #include <linux/input/mt.h>
23 #include <linux/workqueue.h>
24 #include <linux/atomic.h>
25 #include <linux/fixp-arith.h>
26 #include <asm/unaligned.h>
27 #include "usbhid/usbhid.h"
30 MODULE_LICENSE("GPL");
31 MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
32 MODULE_AUTHOR("Nestor Lopez Casado <nlopezcasad@logitech.com>");
34 static bool disable_raw_mode;
35 module_param(disable_raw_mode, bool, 0644);
36 MODULE_PARM_DESC(disable_raw_mode,
37 "Disable Raw mode reporting for touchpads and keep firmware gestures.");
39 static bool disable_tap_to_click;
40 module_param(disable_tap_to_click, bool, 0644);
41 MODULE_PARM_DESC(disable_tap_to_click,
42 "Disable Tap-To-Click mode reporting for touchpads (only on the K400 currently).");
44 /* Define a non-zero software ID to identify our own requests */
45 #define LINUX_KERNEL_SW_ID 0x01
47 #define REPORT_ID_HIDPP_SHORT 0x10
48 #define REPORT_ID_HIDPP_LONG 0x11
49 #define REPORT_ID_HIDPP_VERY_LONG 0x12
51 #define HIDPP_REPORT_SHORT_LENGTH 7
52 #define HIDPP_REPORT_LONG_LENGTH 20
53 #define HIDPP_REPORT_VERY_LONG_MAX_LENGTH 64
55 #define HIDPP_REPORT_SHORT_SUPPORTED BIT(0)
56 #define HIDPP_REPORT_LONG_SUPPORTED BIT(1)
57 #define HIDPP_REPORT_VERY_LONG_SUPPORTED BIT(2)
59 #define HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS 0x03
60 #define HIDPP_SUB_ID_ROLLER 0x05
61 #define HIDPP_SUB_ID_MOUSE_EXTRA_BTNS 0x06
62 #define HIDPP_SUB_ID_USER_IFACE_EVENT 0x08
63 #define HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST BIT(5)
65 #define HIDPP_QUIRK_CLASS_WTP BIT(0)
66 #define HIDPP_QUIRK_CLASS_M560 BIT(1)
67 #define HIDPP_QUIRK_CLASS_K400 BIT(2)
68 #define HIDPP_QUIRK_CLASS_G920 BIT(3)
69 #define HIDPP_QUIRK_CLASS_K750 BIT(4)
71 /* bits 2..20 are reserved for classes */
72 /* #define HIDPP_QUIRK_CONNECT_EVENTS BIT(21) disabled */
73 #define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
74 #define HIDPP_QUIRK_NO_HIDINPUT BIT(23)
75 #define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS BIT(24)
76 #define HIDPP_QUIRK_UNIFYING BIT(25)
77 #define HIDPP_QUIRK_HIDPP_WHEELS BIT(26)
78 #define HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS BIT(27)
79 #define HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS BIT(28)
80 #define HIDPP_QUIRK_HI_RES_SCROLL_1P0 BIT(29)
82 /* These are just aliases for now */
83 #define HIDPP_QUIRK_KBD_SCROLL_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
84 #define HIDPP_QUIRK_KBD_ZOOM_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
86 /* Convenience constant to check for any high-res support. */
87 #define HIDPP_CAPABILITY_HI_RES_SCROLL (HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL | \
88 HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL | \
89 HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL)
91 #define HIDPP_QUIRK_DELAYED_INIT HIDPP_QUIRK_NO_HIDINPUT
93 #define HIDPP_CAPABILITY_HIDPP10_BATTERY BIT(0)
94 #define HIDPP_CAPABILITY_HIDPP20_BATTERY BIT(1)
95 #define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2)
96 #define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS BIT(3)
97 #define HIDPP_CAPABILITY_BATTERY_VOLTAGE BIT(4)
98 #define HIDPP_CAPABILITY_BATTERY_PERCENTAGE BIT(5)
99 #define HIDPP_CAPABILITY_UNIFIED_BATTERY BIT(6)
100 #define HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL BIT(7)
101 #define HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL BIT(8)
102 #define HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL BIT(9)
104 #define lg_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
107 * There are two hidpp protocols in use, the first version hidpp10 is known
108 * as register access protocol or RAP, the second version hidpp20 is known as
109 * feature access protocol or FAP
111 * Most older devices (including the Unifying usb receiver) use the RAP protocol
112 * where as most newer devices use the FAP protocol. Both protocols are
113 * compatible with the underlying transport, which could be usb, Unifiying, or
114 * bluetooth. The message lengths are defined by the hid vendor specific report
115 * descriptor for the HIDPP_SHORT report type (total message lenth 7 bytes) and
116 * the HIDPP_LONG report type (total message length 20 bytes)
118 * The RAP protocol uses both report types, whereas the FAP only uses HIDPP_LONG
119 * messages. The Unifying receiver itself responds to RAP messages (device index
120 * is 0xFF for the receiver), and all messages (short or long) with a device
121 * index between 1 and 6 are passed untouched to the corresponding paired
124 * The paired device can be RAP or FAP, it will receive the message untouched
125 * from the Unifiying receiver.
130 u8 funcindex_clientid;
131 u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
137 u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
140 struct hidpp_report {
146 u8 rawbytes[sizeof(struct fap)];
150 struct hidpp_battery {
152 u8 solar_feature_index;
153 u8 voltage_feature_index;
154 struct power_supply_desc desc;
155 struct power_supply *ps;
163 u8 supported_levels_1004;
167 * struct hidpp_scroll_counter - Utility class for processing high-resolution
169 * @dev: the input device for which events should be reported.
170 * @wheel_multiplier: the scalar multiplier to be applied to each wheel event
171 * @remainder: counts the number of high-resolution units moved since the last
172 * low-resolution event (REL_WHEEL or REL_HWHEEL) was sent. Should
173 * only be used by class methods.
174 * @direction: direction of last movement (1 or -1)
175 * @last_time: last event time, used to reset remainder after inactivity
177 struct hidpp_scroll_counter {
178 int wheel_multiplier;
181 unsigned long long last_time;
184 struct hidpp_device {
185 struct hid_device *hid_dev;
186 struct input_dev *input;
187 struct mutex send_mutex;
188 void *send_receive_buf;
189 char *name; /* will never be NULL and should not be freed */
190 wait_queue_head_t wait;
191 int very_long_report_length;
192 bool answer_available;
198 struct work_struct work;
199 struct kfifo delayed_work_fifo;
201 struct input_dev *delayed_input;
203 unsigned long quirks;
204 unsigned long capabilities;
205 u8 supported_reports;
207 struct hidpp_battery battery;
208 struct hidpp_scroll_counter vertical_wheel_counter;
210 u8 wireless_feature_index;
213 /* HID++ 1.0 error codes */
214 #define HIDPP_ERROR 0x8f
215 #define HIDPP_ERROR_SUCCESS 0x00
216 #define HIDPP_ERROR_INVALID_SUBID 0x01
217 #define HIDPP_ERROR_INVALID_ADRESS 0x02
218 #define HIDPP_ERROR_INVALID_VALUE 0x03
219 #define HIDPP_ERROR_CONNECT_FAIL 0x04
220 #define HIDPP_ERROR_TOO_MANY_DEVICES 0x05
221 #define HIDPP_ERROR_ALREADY_EXISTS 0x06
222 #define HIDPP_ERROR_BUSY 0x07
223 #define HIDPP_ERROR_UNKNOWN_DEVICE 0x08
224 #define HIDPP_ERROR_RESOURCE_ERROR 0x09
225 #define HIDPP_ERROR_REQUEST_UNAVAILABLE 0x0a
226 #define HIDPP_ERROR_INVALID_PARAM_VALUE 0x0b
227 #define HIDPP_ERROR_WRONG_PIN_CODE 0x0c
228 /* HID++ 2.0 error codes */
229 #define HIDPP20_ERROR 0xff
231 static void hidpp_connect_event(struct hidpp_device *hidpp_dev);
233 static int __hidpp_send_report(struct hid_device *hdev,
234 struct hidpp_report *hidpp_report)
236 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
237 int fields_count, ret;
239 switch (hidpp_report->report_id) {
240 case REPORT_ID_HIDPP_SHORT:
241 fields_count = HIDPP_REPORT_SHORT_LENGTH;
243 case REPORT_ID_HIDPP_LONG:
244 fields_count = HIDPP_REPORT_LONG_LENGTH;
246 case REPORT_ID_HIDPP_VERY_LONG:
247 fields_count = hidpp->very_long_report_length;
254 * set the device_index as the receiver, it will be overwritten by
255 * hid_hw_request if needed
257 hidpp_report->device_index = 0xff;
259 if (hidpp->quirks & HIDPP_QUIRK_FORCE_OUTPUT_REPORTS) {
260 ret = hid_hw_output_report(hdev, (u8 *)hidpp_report, fields_count);
262 ret = hid_hw_raw_request(hdev, hidpp_report->report_id,
263 (u8 *)hidpp_report, fields_count, HID_OUTPUT_REPORT,
267 return ret == fields_count ? 0 : -1;
271 * hidpp_send_message_sync() returns 0 in case of success, and something else
272 * in case of a failure.
273 * - If ' something else' is positive, that means that an error has been raised
274 * by the protocol itself.
275 * - If ' something else' is negative, that means that we had a classic error
276 * (-ENOMEM, -EPIPE, etc...)
278 static int hidpp_send_message_sync(struct hidpp_device *hidpp,
279 struct hidpp_report *message,
280 struct hidpp_report *response)
284 mutex_lock(&hidpp->send_mutex);
286 hidpp->send_receive_buf = response;
287 hidpp->answer_available = false;
290 * So that we can later validate the answer when it arrives
293 *response = *message;
295 ret = __hidpp_send_report(hidpp->hid_dev, message);
298 dbg_hid("__hidpp_send_report returned err: %d\n", ret);
299 memset(response, 0, sizeof(struct hidpp_report));
303 if (!wait_event_timeout(hidpp->wait, hidpp->answer_available,
305 dbg_hid("%s:timeout waiting for response\n", __func__);
306 memset(response, 0, sizeof(struct hidpp_report));
310 if (response->report_id == REPORT_ID_HIDPP_SHORT &&
311 response->rap.sub_id == HIDPP_ERROR) {
312 ret = response->rap.params[1];
313 dbg_hid("%s:got hidpp error %02X\n", __func__, ret);
317 if ((response->report_id == REPORT_ID_HIDPP_LONG ||
318 response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
319 response->fap.feature_index == HIDPP20_ERROR) {
320 ret = response->fap.params[1];
321 dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
326 mutex_unlock(&hidpp->send_mutex);
331 static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
332 u8 feat_index, u8 funcindex_clientid, u8 *params, int param_count,
333 struct hidpp_report *response)
335 struct hidpp_report *message;
338 if (param_count > sizeof(message->fap.params))
341 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
345 if (param_count > (HIDPP_REPORT_LONG_LENGTH - 4))
346 message->report_id = REPORT_ID_HIDPP_VERY_LONG;
348 message->report_id = REPORT_ID_HIDPP_LONG;
349 message->fap.feature_index = feat_index;
350 message->fap.funcindex_clientid = funcindex_clientid | LINUX_KERNEL_SW_ID;
351 memcpy(&message->fap.params, params, param_count);
353 ret = hidpp_send_message_sync(hidpp, message, response);
358 static int hidpp_send_rap_command_sync(struct hidpp_device *hidpp_dev,
359 u8 report_id, u8 sub_id, u8 reg_address, u8 *params, int param_count,
360 struct hidpp_report *response)
362 struct hidpp_report *message;
365 /* Send as long report if short reports are not supported. */
366 if (report_id == REPORT_ID_HIDPP_SHORT &&
367 !(hidpp_dev->supported_reports & HIDPP_REPORT_SHORT_SUPPORTED))
368 report_id = REPORT_ID_HIDPP_LONG;
371 case REPORT_ID_HIDPP_SHORT:
372 max_count = HIDPP_REPORT_SHORT_LENGTH - 4;
374 case REPORT_ID_HIDPP_LONG:
375 max_count = HIDPP_REPORT_LONG_LENGTH - 4;
377 case REPORT_ID_HIDPP_VERY_LONG:
378 max_count = hidpp_dev->very_long_report_length - 4;
384 if (param_count > max_count)
387 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
390 message->report_id = report_id;
391 message->rap.sub_id = sub_id;
392 message->rap.reg_address = reg_address;
393 memcpy(&message->rap.params, params, param_count);
395 ret = hidpp_send_message_sync(hidpp_dev, message, response);
400 static void delayed_work_cb(struct work_struct *work)
402 struct hidpp_device *hidpp = container_of(work, struct hidpp_device,
404 hidpp_connect_event(hidpp);
407 static inline bool hidpp_match_answer(struct hidpp_report *question,
408 struct hidpp_report *answer)
410 return (answer->fap.feature_index == question->fap.feature_index) &&
411 (answer->fap.funcindex_clientid == question->fap.funcindex_clientid);
414 static inline bool hidpp_match_error(struct hidpp_report *question,
415 struct hidpp_report *answer)
417 return ((answer->rap.sub_id == HIDPP_ERROR) ||
418 (answer->fap.feature_index == HIDPP20_ERROR)) &&
419 (answer->fap.funcindex_clientid == question->fap.feature_index) &&
420 (answer->fap.params[0] == question->fap.funcindex_clientid);
423 static inline bool hidpp_report_is_connect_event(struct hidpp_device *hidpp,
424 struct hidpp_report *report)
426 return (hidpp->wireless_feature_index &&
427 (report->fap.feature_index == hidpp->wireless_feature_index)) ||
428 ((report->report_id == REPORT_ID_HIDPP_SHORT) &&
429 (report->rap.sub_id == 0x41));
433 * hidpp_prefix_name() prefixes the current given name with "Logitech ".
435 static void hidpp_prefix_name(char **name, int name_length)
437 #define PREFIX_LENGTH 9 /* "Logitech " */
442 if (name_length > PREFIX_LENGTH &&
443 strncmp(*name, "Logitech ", PREFIX_LENGTH) == 0)
444 /* The prefix has is already in the name */
447 new_length = PREFIX_LENGTH + name_length;
448 new_name = kzalloc(new_length, GFP_KERNEL);
452 snprintf(new_name, new_length, "Logitech %s", *name);
460 * hidpp_scroll_counter_handle_scroll() - Send high- and low-resolution scroll
461 * events given a high-resolution wheel
463 * @input_dev: Pointer to the input device
464 * @counter: a hid_scroll_counter struct describing the wheel.
465 * @hi_res_value: the movement of the wheel, in the mouse's high-resolution
468 * Given a high-resolution movement, this function converts the movement into
469 * fractions of 120 and emits high-resolution scroll events for the input
470 * device. It also uses the multiplier from &struct hid_scroll_counter to
471 * emit low-resolution scroll events when appropriate for
472 * backwards-compatibility with userspace input libraries.
474 static void hidpp_scroll_counter_handle_scroll(struct input_dev *input_dev,
475 struct hidpp_scroll_counter *counter,
478 int low_res_value, remainder, direction;
479 unsigned long long now, previous;
481 hi_res_value = hi_res_value * 120/counter->wheel_multiplier;
482 input_report_rel(input_dev, REL_WHEEL_HI_RES, hi_res_value);
484 remainder = counter->remainder;
485 direction = hi_res_value > 0 ? 1 : -1;
488 previous = counter->last_time;
489 counter->last_time = now;
491 * Reset the remainder after a period of inactivity or when the
492 * direction changes. This prevents the REL_WHEEL emulation point
493 * from sliding for devices that don't always provide the same
494 * number of movements per detent.
496 if (now - previous > 1000000000 || direction != counter->direction)
499 counter->direction = direction;
500 remainder += hi_res_value;
502 /* Some wheels will rest 7/8ths of a detent from the previous detent
503 * after slow movement, so we want the threshold for low-res events to
504 * be in the middle between two detents (e.g. after 4/8ths) as
505 * opposed to on the detents themselves (8/8ths).
507 if (abs(remainder) >= 60) {
508 /* Add (or subtract) 1 because we want to trigger when the wheel
509 * is half-way to the next detent (i.e. scroll 1 detent after a
510 * 1/2 detent movement, 2 detents after a 1 1/2 detent movement,
513 low_res_value = remainder / 120;
514 if (low_res_value == 0)
515 low_res_value = (hi_res_value > 0 ? 1 : -1);
516 input_report_rel(input_dev, REL_WHEEL, low_res_value);
517 remainder -= low_res_value * 120;
519 counter->remainder = remainder;
522 /* -------------------------------------------------------------------------- */
523 /* HIDP++ 1.0 commands */
524 /* -------------------------------------------------------------------------- */
526 #define HIDPP_SET_REGISTER 0x80
527 #define HIDPP_GET_REGISTER 0x81
528 #define HIDPP_SET_LONG_REGISTER 0x82
529 #define HIDPP_GET_LONG_REGISTER 0x83
532 * hidpp10_set_register - Modify a HID++ 1.0 register.
533 * @hidpp_dev: the device to set the register on.
534 * @register_address: the address of the register to modify.
535 * @byte: the byte of the register to modify. Should be less than 3.
536 * @mask: mask of the bits to modify
537 * @value: new values for the bits in mask
538 * Return: 0 if successful, otherwise a negative error code.
540 static int hidpp10_set_register(struct hidpp_device *hidpp_dev,
541 u8 register_address, u8 byte, u8 mask, u8 value)
543 struct hidpp_report response;
545 u8 params[3] = { 0 };
547 ret = hidpp_send_rap_command_sync(hidpp_dev,
548 REPORT_ID_HIDPP_SHORT,
555 memcpy(params, response.rap.params, 3);
557 params[byte] &= ~mask;
558 params[byte] |= value & mask;
560 return hidpp_send_rap_command_sync(hidpp_dev,
561 REPORT_ID_HIDPP_SHORT,
564 params, 3, &response);
567 #define HIDPP_REG_ENABLE_REPORTS 0x00
568 #define HIDPP_ENABLE_CONSUMER_REPORT BIT(0)
569 #define HIDPP_ENABLE_WHEEL_REPORT BIT(2)
570 #define HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT BIT(3)
571 #define HIDPP_ENABLE_BAT_REPORT BIT(4)
572 #define HIDPP_ENABLE_HWHEEL_REPORT BIT(5)
574 static int hidpp10_enable_battery_reporting(struct hidpp_device *hidpp_dev)
576 return hidpp10_set_register(hidpp_dev, HIDPP_REG_ENABLE_REPORTS, 0,
577 HIDPP_ENABLE_BAT_REPORT, HIDPP_ENABLE_BAT_REPORT);
580 #define HIDPP_REG_FEATURES 0x01
581 #define HIDPP_ENABLE_SPECIAL_BUTTON_FUNC BIT(1)
582 #define HIDPP_ENABLE_FAST_SCROLL BIT(6)
584 /* On HID++ 1.0 devices, high-res scroll was called "scrolling acceleration". */
585 static int hidpp10_enable_scrolling_acceleration(struct hidpp_device *hidpp_dev)
587 return hidpp10_set_register(hidpp_dev, HIDPP_REG_FEATURES, 0,
588 HIDPP_ENABLE_FAST_SCROLL, HIDPP_ENABLE_FAST_SCROLL);
591 #define HIDPP_REG_BATTERY_STATUS 0x07
593 static int hidpp10_battery_status_map_level(u8 param)
599 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
602 level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
605 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
608 level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
611 level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
617 static int hidpp10_battery_status_map_status(u8 param)
623 /* discharging (in use) */
624 status = POWER_SUPPLY_STATUS_DISCHARGING;
626 case 0x21: /* (standard) charging */
627 case 0x24: /* fast charging */
628 case 0x25: /* slow charging */
629 status = POWER_SUPPLY_STATUS_CHARGING;
631 case 0x26: /* topping charge */
632 case 0x22: /* charge complete */
633 status = POWER_SUPPLY_STATUS_FULL;
635 case 0x20: /* unknown */
636 status = POWER_SUPPLY_STATUS_UNKNOWN;
639 * 0x01...0x1F = reserved (not charging)
640 * 0x23 = charging error
641 * 0x27..0xff = reserved
644 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
651 static int hidpp10_query_battery_status(struct hidpp_device *hidpp)
653 struct hidpp_report response;
656 ret = hidpp_send_rap_command_sync(hidpp,
657 REPORT_ID_HIDPP_SHORT,
659 HIDPP_REG_BATTERY_STATUS,
664 hidpp->battery.level =
665 hidpp10_battery_status_map_level(response.rap.params[0]);
666 status = hidpp10_battery_status_map_status(response.rap.params[1]);
667 hidpp->battery.status = status;
668 /* the capacity is only available when discharging or full */
669 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
670 status == POWER_SUPPLY_STATUS_FULL;
675 #define HIDPP_REG_BATTERY_MILEAGE 0x0D
677 static int hidpp10_battery_mileage_map_status(u8 param)
681 switch (param >> 6) {
683 /* discharging (in use) */
684 status = POWER_SUPPLY_STATUS_DISCHARGING;
686 case 0x01: /* charging */
687 status = POWER_SUPPLY_STATUS_CHARGING;
689 case 0x02: /* charge complete */
690 status = POWER_SUPPLY_STATUS_FULL;
693 * 0x03 = charging error
696 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
703 static int hidpp10_query_battery_mileage(struct hidpp_device *hidpp)
705 struct hidpp_report response;
708 ret = hidpp_send_rap_command_sync(hidpp,
709 REPORT_ID_HIDPP_SHORT,
711 HIDPP_REG_BATTERY_MILEAGE,
716 hidpp->battery.capacity = response.rap.params[0];
717 status = hidpp10_battery_mileage_map_status(response.rap.params[2]);
718 hidpp->battery.status = status;
719 /* the capacity is only available when discharging or full */
720 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
721 status == POWER_SUPPLY_STATUS_FULL;
726 static int hidpp10_battery_event(struct hidpp_device *hidpp, u8 *data, int size)
728 struct hidpp_report *report = (struct hidpp_report *)data;
729 int status, capacity, level;
732 if (report->report_id != REPORT_ID_HIDPP_SHORT)
735 switch (report->rap.sub_id) {
736 case HIDPP_REG_BATTERY_STATUS:
737 capacity = hidpp->battery.capacity;
738 level = hidpp10_battery_status_map_level(report->rawbytes[1]);
739 status = hidpp10_battery_status_map_status(report->rawbytes[2]);
741 case HIDPP_REG_BATTERY_MILEAGE:
742 capacity = report->rap.params[0];
743 level = hidpp->battery.level;
744 status = hidpp10_battery_mileage_map_status(report->rawbytes[3]);
750 changed = capacity != hidpp->battery.capacity ||
751 level != hidpp->battery.level ||
752 status != hidpp->battery.status;
754 /* the capacity is only available when discharging or full */
755 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
756 status == POWER_SUPPLY_STATUS_FULL;
759 hidpp->battery.level = level;
760 hidpp->battery.status = status;
761 if (hidpp->battery.ps)
762 power_supply_changed(hidpp->battery.ps);
768 #define HIDPP_REG_PAIRING_INFORMATION 0xB5
769 #define HIDPP_EXTENDED_PAIRING 0x30
770 #define HIDPP_DEVICE_NAME 0x40
772 static char *hidpp_unifying_get_name(struct hidpp_device *hidpp_dev)
774 struct hidpp_report response;
776 u8 params[1] = { HIDPP_DEVICE_NAME };
780 ret = hidpp_send_rap_command_sync(hidpp_dev,
781 REPORT_ID_HIDPP_SHORT,
782 HIDPP_GET_LONG_REGISTER,
783 HIDPP_REG_PAIRING_INFORMATION,
784 params, 1, &response);
788 len = response.rap.params[1];
790 if (2 + len > sizeof(response.rap.params))
793 if (len < 4) /* logitech devices are usually at least Xddd */
796 name = kzalloc(len + 1, GFP_KERNEL);
800 memcpy(name, &response.rap.params[2], len);
802 /* include the terminating '\0' */
803 hidpp_prefix_name(&name, len + 1);
808 static int hidpp_unifying_get_serial(struct hidpp_device *hidpp, u32 *serial)
810 struct hidpp_report response;
812 u8 params[1] = { HIDPP_EXTENDED_PAIRING };
814 ret = hidpp_send_rap_command_sync(hidpp,
815 REPORT_ID_HIDPP_SHORT,
816 HIDPP_GET_LONG_REGISTER,
817 HIDPP_REG_PAIRING_INFORMATION,
818 params, 1, &response);
823 * We don't care about LE or BE, we will output it as a string
824 * with %4phD, so we need to keep the order.
826 *serial = *((u32 *)&response.rap.params[1]);
830 static int hidpp_unifying_init(struct hidpp_device *hidpp)
832 struct hid_device *hdev = hidpp->hid_dev;
837 ret = hidpp_unifying_get_serial(hidpp, &serial);
841 snprintf(hdev->uniq, sizeof(hdev->uniq), "%04x-%4phD",
842 hdev->product, &serial);
843 dbg_hid("HID++ Unifying: Got serial: %s\n", hdev->uniq);
845 name = hidpp_unifying_get_name(hidpp);
849 snprintf(hdev->name, sizeof(hdev->name), "%s", name);
850 dbg_hid("HID++ Unifying: Got name: %s\n", name);
856 /* -------------------------------------------------------------------------- */
858 /* -------------------------------------------------------------------------- */
860 #define HIDPP_PAGE_ROOT 0x0000
861 #define HIDPP_PAGE_ROOT_IDX 0x00
863 #define CMD_ROOT_GET_FEATURE 0x00
864 #define CMD_ROOT_GET_PROTOCOL_VERSION 0x10
866 static int hidpp_root_get_feature(struct hidpp_device *hidpp, u16 feature,
867 u8 *feature_index, u8 *feature_type)
869 struct hidpp_report response;
871 u8 params[2] = { feature >> 8, feature & 0x00FF };
873 ret = hidpp_send_fap_command_sync(hidpp,
875 CMD_ROOT_GET_FEATURE,
876 params, 2, &response);
880 if (response.fap.params[0] == 0)
883 *feature_index = response.fap.params[0];
884 *feature_type = response.fap.params[1];
889 static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)
891 const u8 ping_byte = 0x5a;
892 u8 ping_data[3] = { 0, 0, ping_byte };
893 struct hidpp_report response;
896 ret = hidpp_send_rap_command_sync(hidpp,
897 REPORT_ID_HIDPP_SHORT,
899 CMD_ROOT_GET_PROTOCOL_VERSION,
900 ping_data, sizeof(ping_data), &response);
902 if (ret == HIDPP_ERROR_INVALID_SUBID) {
903 hidpp->protocol_major = 1;
904 hidpp->protocol_minor = 0;
908 /* the device might not be connected */
909 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
913 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
920 if (response.rap.params[2] != ping_byte) {
921 hid_err(hidpp->hid_dev, "%s: ping mismatch 0x%02x != 0x%02x\n",
922 __func__, response.rap.params[2], ping_byte);
926 hidpp->protocol_major = response.rap.params[0];
927 hidpp->protocol_minor = response.rap.params[1];
930 hid_info(hidpp->hid_dev, "HID++ %u.%u device connected.\n",
931 hidpp->protocol_major, hidpp->protocol_minor);
935 /* -------------------------------------------------------------------------- */
936 /* 0x0005: GetDeviceNameType */
937 /* -------------------------------------------------------------------------- */
939 #define HIDPP_PAGE_GET_DEVICE_NAME_TYPE 0x0005
941 #define CMD_GET_DEVICE_NAME_TYPE_GET_COUNT 0x00
942 #define CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME 0x10
943 #define CMD_GET_DEVICE_NAME_TYPE_GET_TYPE 0x20
945 static int hidpp_devicenametype_get_count(struct hidpp_device *hidpp,
946 u8 feature_index, u8 *nameLength)
948 struct hidpp_report response;
951 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
952 CMD_GET_DEVICE_NAME_TYPE_GET_COUNT, NULL, 0, &response);
955 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
962 *nameLength = response.fap.params[0];
967 static int hidpp_devicenametype_get_device_name(struct hidpp_device *hidpp,
968 u8 feature_index, u8 char_index, char *device_name, int len_buf)
970 struct hidpp_report response;
974 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
975 CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME, &char_index, 1,
979 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
986 switch (response.report_id) {
987 case REPORT_ID_HIDPP_VERY_LONG:
988 count = hidpp->very_long_report_length - 4;
990 case REPORT_ID_HIDPP_LONG:
991 count = HIDPP_REPORT_LONG_LENGTH - 4;
993 case REPORT_ID_HIDPP_SHORT:
994 count = HIDPP_REPORT_SHORT_LENGTH - 4;
1000 if (len_buf < count)
1003 for (i = 0; i < count; i++)
1004 device_name[i] = response.fap.params[i];
1009 static char *hidpp_get_device_name(struct hidpp_device *hidpp)
1018 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_GET_DEVICE_NAME_TYPE,
1019 &feature_index, &feature_type);
1023 ret = hidpp_devicenametype_get_count(hidpp, feature_index,
1028 name = kzalloc(__name_length + 1, GFP_KERNEL);
1032 while (index < __name_length) {
1033 ret = hidpp_devicenametype_get_device_name(hidpp,
1034 feature_index, index, name + index,
1035 __name_length - index);
1043 /* include the terminating '\0' */
1044 hidpp_prefix_name(&name, __name_length + 1);
1049 /* -------------------------------------------------------------------------- */
1050 /* 0x1000: Battery level status */
1051 /* -------------------------------------------------------------------------- */
1053 #define HIDPP_PAGE_BATTERY_LEVEL_STATUS 0x1000
1055 #define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS 0x00
1056 #define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY 0x10
1058 #define EVENT_BATTERY_LEVEL_STATUS_BROADCAST 0x00
1060 #define FLAG_BATTERY_LEVEL_DISABLE_OSD BIT(0)
1061 #define FLAG_BATTERY_LEVEL_MILEAGE BIT(1)
1062 #define FLAG_BATTERY_LEVEL_RECHARGEABLE BIT(2)
1064 static int hidpp_map_battery_level(int capacity)
1067 return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1069 * The spec says this should be < 31 but some devices report 30
1070 * with brand new batteries and Windows reports 30 as "Good".
1072 else if (capacity < 30)
1073 return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1074 else if (capacity < 81)
1075 return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1076 return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1079 static int hidpp20_batterylevel_map_status_capacity(u8 data[3], int *capacity,
1085 *capacity = data[0];
1086 *next_capacity = data[1];
1087 *level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1089 /* When discharging, we can rely on the device reported capacity.
1090 * For all other states the device reports 0 (unknown).
1093 case 0: /* discharging (in use) */
1094 status = POWER_SUPPLY_STATUS_DISCHARGING;
1095 *level = hidpp_map_battery_level(*capacity);
1097 case 1: /* recharging */
1098 status = POWER_SUPPLY_STATUS_CHARGING;
1100 case 2: /* charge in final stage */
1101 status = POWER_SUPPLY_STATUS_CHARGING;
1103 case 3: /* charge complete */
1104 status = POWER_SUPPLY_STATUS_FULL;
1105 *level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1108 case 4: /* recharging below optimal speed */
1109 status = POWER_SUPPLY_STATUS_CHARGING;
1111 /* 5 = invalid battery type
1113 7 = other charging error */
1115 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1122 static int hidpp20_batterylevel_get_battery_capacity(struct hidpp_device *hidpp,
1129 struct hidpp_report response;
1131 u8 *params = (u8 *)response.fap.params;
1133 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1134 CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS,
1135 NULL, 0, &response);
1136 /* Ignore these intermittent errors */
1137 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1140 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1147 *status = hidpp20_batterylevel_map_status_capacity(params, capacity,
1154 static int hidpp20_batterylevel_get_battery_info(struct hidpp_device *hidpp,
1157 struct hidpp_report response;
1159 u8 *params = (u8 *)response.fap.params;
1160 unsigned int level_count, flags;
1162 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1163 CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY,
1164 NULL, 0, &response);
1166 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1173 level_count = params[0];
1176 if (level_count < 10 || !(flags & FLAG_BATTERY_LEVEL_MILEAGE))
1177 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
1179 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
1184 static int hidpp20_query_battery_info_1000(struct hidpp_device *hidpp)
1188 int status, capacity, next_capacity, level;
1190 if (hidpp->battery.feature_index == 0xff) {
1191 ret = hidpp_root_get_feature(hidpp,
1192 HIDPP_PAGE_BATTERY_LEVEL_STATUS,
1193 &hidpp->battery.feature_index,
1199 ret = hidpp20_batterylevel_get_battery_capacity(hidpp,
1200 hidpp->battery.feature_index,
1202 &next_capacity, &level);
1206 ret = hidpp20_batterylevel_get_battery_info(hidpp,
1207 hidpp->battery.feature_index);
1211 hidpp->battery.status = status;
1212 hidpp->battery.capacity = capacity;
1213 hidpp->battery.level = level;
1214 /* the capacity is only available when discharging or full */
1215 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
1216 status == POWER_SUPPLY_STATUS_FULL;
1221 static int hidpp20_battery_event_1000(struct hidpp_device *hidpp,
1224 struct hidpp_report *report = (struct hidpp_report *)data;
1225 int status, capacity, next_capacity, level;
1228 if (report->fap.feature_index != hidpp->battery.feature_index ||
1229 report->fap.funcindex_clientid != EVENT_BATTERY_LEVEL_STATUS_BROADCAST)
1232 status = hidpp20_batterylevel_map_status_capacity(report->fap.params,
1237 /* the capacity is only available when discharging or full */
1238 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
1239 status == POWER_SUPPLY_STATUS_FULL;
1241 changed = capacity != hidpp->battery.capacity ||
1242 level != hidpp->battery.level ||
1243 status != hidpp->battery.status;
1246 hidpp->battery.level = level;
1247 hidpp->battery.capacity = capacity;
1248 hidpp->battery.status = status;
1249 if (hidpp->battery.ps)
1250 power_supply_changed(hidpp->battery.ps);
1256 /* -------------------------------------------------------------------------- */
1257 /* 0x1001: Battery voltage */
1258 /* -------------------------------------------------------------------------- */
1260 #define HIDPP_PAGE_BATTERY_VOLTAGE 0x1001
1262 #define CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE 0x00
1264 #define EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST 0x00
1266 static int hidpp20_battery_map_status_voltage(u8 data[3], int *voltage,
1267 int *level, int *charge_type)
1271 long flags = (long) data[2];
1272 *level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1275 switch (flags & 0x07) {
1277 status = POWER_SUPPLY_STATUS_CHARGING;
1280 status = POWER_SUPPLY_STATUS_FULL;
1281 *level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1284 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1287 status = POWER_SUPPLY_STATUS_UNKNOWN;
1291 status = POWER_SUPPLY_STATUS_DISCHARGING;
1293 *charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
1294 if (test_bit(3, &flags)) {
1295 *charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
1297 if (test_bit(4, &flags)) {
1298 *charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1300 if (test_bit(5, &flags)) {
1301 *level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1304 *voltage = get_unaligned_be16(data);
1309 static int hidpp20_battery_get_battery_voltage(struct hidpp_device *hidpp,
1311 int *status, int *voltage,
1312 int *level, int *charge_type)
1314 struct hidpp_report response;
1316 u8 *params = (u8 *)response.fap.params;
1318 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1319 CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE,
1320 NULL, 0, &response);
1323 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1330 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_VOLTAGE;
1332 *status = hidpp20_battery_map_status_voltage(params, voltage,
1333 level, charge_type);
1338 static int hidpp20_map_battery_capacity(struct hid_device *hid_dev, int voltage)
1340 /* NB: This voltage curve doesn't necessarily map perfectly to all
1341 * devices that implement the BATTERY_VOLTAGE feature. This is because
1342 * there are a few devices that use different battery technology.
1345 static const int voltages[] = {
1346 4186, 4156, 4143, 4133, 4122, 4113, 4103, 4094, 4086, 4075,
1347 4067, 4059, 4051, 4043, 4035, 4027, 4019, 4011, 4003, 3997,
1348 3989, 3983, 3976, 3969, 3961, 3955, 3949, 3942, 3935, 3929,
1349 3922, 3916, 3909, 3902, 3896, 3890, 3883, 3877, 3870, 3865,
1350 3859, 3853, 3848, 3842, 3837, 3833, 3828, 3824, 3819, 3815,
1351 3811, 3808, 3804, 3800, 3797, 3793, 3790, 3787, 3784, 3781,
1352 3778, 3775, 3772, 3770, 3767, 3764, 3762, 3759, 3757, 3754,
1353 3751, 3748, 3744, 3741, 3737, 3734, 3730, 3726, 3724, 3720,
1354 3717, 3714, 3710, 3706, 3702, 3697, 3693, 3688, 3683, 3677,
1355 3671, 3666, 3662, 3658, 3654, 3646, 3633, 3612, 3579, 3537
1360 BUILD_BUG_ON(ARRAY_SIZE(voltages) != 100);
1362 if (unlikely(voltage < 3500 || voltage >= 5000))
1363 hid_warn_once(hid_dev,
1364 "%s: possibly using the wrong voltage curve\n",
1367 for (i = 0; i < ARRAY_SIZE(voltages); i++) {
1368 if (voltage >= voltages[i])
1369 return ARRAY_SIZE(voltages) - i;
1375 static int hidpp20_query_battery_voltage_info(struct hidpp_device *hidpp)
1379 int status, voltage, level, charge_type;
1381 if (hidpp->battery.voltage_feature_index == 0xff) {
1382 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_BATTERY_VOLTAGE,
1383 &hidpp->battery.voltage_feature_index,
1389 ret = hidpp20_battery_get_battery_voltage(hidpp,
1390 hidpp->battery.voltage_feature_index,
1391 &status, &voltage, &level, &charge_type);
1396 hidpp->battery.status = status;
1397 hidpp->battery.voltage = voltage;
1398 hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
1400 hidpp->battery.level = level;
1401 hidpp->battery.charge_type = charge_type;
1402 hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
1407 static int hidpp20_battery_voltage_event(struct hidpp_device *hidpp,
1410 struct hidpp_report *report = (struct hidpp_report *)data;
1411 int status, voltage, level, charge_type;
1413 if (report->fap.feature_index != hidpp->battery.voltage_feature_index ||
1414 report->fap.funcindex_clientid != EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST)
1417 status = hidpp20_battery_map_status_voltage(report->fap.params, &voltage,
1418 &level, &charge_type);
1420 hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
1422 if (voltage != hidpp->battery.voltage || status != hidpp->battery.status) {
1423 hidpp->battery.voltage = voltage;
1424 hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
1426 hidpp->battery.status = status;
1427 hidpp->battery.level = level;
1428 hidpp->battery.charge_type = charge_type;
1429 if (hidpp->battery.ps)
1430 power_supply_changed(hidpp->battery.ps);
1435 /* -------------------------------------------------------------------------- */
1436 /* 0x1004: Unified battery */
1437 /* -------------------------------------------------------------------------- */
1439 #define HIDPP_PAGE_UNIFIED_BATTERY 0x1004
1441 #define CMD_UNIFIED_BATTERY_GET_CAPABILITIES 0x00
1442 #define CMD_UNIFIED_BATTERY_GET_STATUS 0x10
1444 #define EVENT_UNIFIED_BATTERY_STATUS_EVENT 0x00
1446 #define FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL BIT(0)
1447 #define FLAG_UNIFIED_BATTERY_LEVEL_LOW BIT(1)
1448 #define FLAG_UNIFIED_BATTERY_LEVEL_GOOD BIT(2)
1449 #define FLAG_UNIFIED_BATTERY_LEVEL_FULL BIT(3)
1451 #define FLAG_UNIFIED_BATTERY_FLAGS_RECHARGEABLE BIT(0)
1452 #define FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE BIT(1)
1454 static int hidpp20_unifiedbattery_get_capabilities(struct hidpp_device *hidpp,
1457 struct hidpp_report response;
1459 u8 *params = (u8 *)response.fap.params;
1461 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS ||
1462 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) {
1463 /* we have already set the device capabilities, so let's skip */
1467 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1468 CMD_UNIFIED_BATTERY_GET_CAPABILITIES,
1469 NULL, 0, &response);
1470 /* Ignore these intermittent errors */
1471 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1474 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1482 * If the device supports state of charge (battery percentage) we won't
1483 * export the battery level information. there are 4 possible battery
1484 * levels and they all are optional, this means that the device might
1485 * not support any of them, we are just better off with the battery
1488 if (params[1] & FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE) {
1489 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_PERCENTAGE;
1490 hidpp->battery.supported_levels_1004 = 0;
1492 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
1493 hidpp->battery.supported_levels_1004 = params[0];
1499 static int hidpp20_unifiedbattery_map_status(struct hidpp_device *hidpp,
1501 u8 external_power_status)
1505 switch (charging_status) {
1506 case 0: /* discharging */
1507 status = POWER_SUPPLY_STATUS_DISCHARGING;
1509 case 1: /* charging */
1510 case 2: /* charging slow */
1511 status = POWER_SUPPLY_STATUS_CHARGING;
1513 case 3: /* complete */
1514 status = POWER_SUPPLY_STATUS_FULL;
1517 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1518 hid_info(hidpp->hid_dev, "%s: charging error",
1522 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1529 static int hidpp20_unifiedbattery_map_level(struct hidpp_device *hidpp,
1532 /* cler unsupported level bits */
1533 battery_level &= hidpp->battery.supported_levels_1004;
1535 if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_FULL)
1536 return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1537 else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_GOOD)
1538 return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1539 else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_LOW)
1540 return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1541 else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL)
1542 return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1544 return POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1547 static int hidpp20_unifiedbattery_get_status(struct hidpp_device *hidpp,
1549 u8 *state_of_charge,
1553 struct hidpp_report response;
1555 u8 *params = (u8 *)response.fap.params;
1557 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1558 CMD_UNIFIED_BATTERY_GET_STATUS,
1559 NULL, 0, &response);
1560 /* Ignore these intermittent errors */
1561 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1564 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1571 *state_of_charge = params[0];
1572 *status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
1573 *level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
1578 static int hidpp20_query_battery_info_1004(struct hidpp_device *hidpp)
1585 if (hidpp->battery.feature_index == 0xff) {
1586 ret = hidpp_root_get_feature(hidpp,
1587 HIDPP_PAGE_UNIFIED_BATTERY,
1588 &hidpp->battery.feature_index,
1594 ret = hidpp20_unifiedbattery_get_capabilities(hidpp,
1595 hidpp->battery.feature_index);
1599 ret = hidpp20_unifiedbattery_get_status(hidpp,
1600 hidpp->battery.feature_index,
1607 hidpp->capabilities |= HIDPP_CAPABILITY_UNIFIED_BATTERY;
1608 hidpp->battery.capacity = state_of_charge;
1609 hidpp->battery.status = status;
1610 hidpp->battery.level = level;
1611 hidpp->battery.online = true;
1616 static int hidpp20_battery_event_1004(struct hidpp_device *hidpp,
1619 struct hidpp_report *report = (struct hidpp_report *)data;
1620 u8 *params = (u8 *)report->fap.params;
1621 int state_of_charge, status, level;
1624 if (report->fap.feature_index != hidpp->battery.feature_index ||
1625 report->fap.funcindex_clientid != EVENT_UNIFIED_BATTERY_STATUS_EVENT)
1628 state_of_charge = params[0];
1629 status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
1630 level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
1632 changed = status != hidpp->battery.status ||
1633 (state_of_charge != hidpp->battery.capacity &&
1634 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) ||
1635 (level != hidpp->battery.level &&
1636 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS);
1639 hidpp->battery.capacity = state_of_charge;
1640 hidpp->battery.status = status;
1641 hidpp->battery.level = level;
1642 if (hidpp->battery.ps)
1643 power_supply_changed(hidpp->battery.ps);
1649 /* -------------------------------------------------------------------------- */
1650 /* Battery feature helpers */
1651 /* -------------------------------------------------------------------------- */
1653 static enum power_supply_property hidpp_battery_props[] = {
1654 POWER_SUPPLY_PROP_ONLINE,
1655 POWER_SUPPLY_PROP_STATUS,
1656 POWER_SUPPLY_PROP_SCOPE,
1657 POWER_SUPPLY_PROP_MODEL_NAME,
1658 POWER_SUPPLY_PROP_MANUFACTURER,
1659 POWER_SUPPLY_PROP_SERIAL_NUMBER,
1660 0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY, */
1661 0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY_LEVEL, */
1662 0, /* placeholder for POWER_SUPPLY_PROP_VOLTAGE_NOW, */
1665 static int hidpp_battery_get_property(struct power_supply *psy,
1666 enum power_supply_property psp,
1667 union power_supply_propval *val)
1669 struct hidpp_device *hidpp = power_supply_get_drvdata(psy);
1673 case POWER_SUPPLY_PROP_STATUS:
1674 val->intval = hidpp->battery.status;
1676 case POWER_SUPPLY_PROP_CAPACITY:
1677 val->intval = hidpp->battery.capacity;
1679 case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
1680 val->intval = hidpp->battery.level;
1682 case POWER_SUPPLY_PROP_SCOPE:
1683 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1685 case POWER_SUPPLY_PROP_ONLINE:
1686 val->intval = hidpp->battery.online;
1688 case POWER_SUPPLY_PROP_MODEL_NAME:
1689 if (!strncmp(hidpp->name, "Logitech ", 9))
1690 val->strval = hidpp->name + 9;
1692 val->strval = hidpp->name;
1694 case POWER_SUPPLY_PROP_MANUFACTURER:
1695 val->strval = "Logitech";
1697 case POWER_SUPPLY_PROP_SERIAL_NUMBER:
1698 val->strval = hidpp->hid_dev->uniq;
1700 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1701 /* hardware reports voltage in mV. sysfs expects uV */
1702 val->intval = hidpp->battery.voltage * 1000;
1704 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1705 val->intval = hidpp->battery.charge_type;
1715 /* -------------------------------------------------------------------------- */
1716 /* 0x1d4b: Wireless device status */
1717 /* -------------------------------------------------------------------------- */
1718 #define HIDPP_PAGE_WIRELESS_DEVICE_STATUS 0x1d4b
1720 static int hidpp_set_wireless_feature_index(struct hidpp_device *hidpp)
1725 ret = hidpp_root_get_feature(hidpp,
1726 HIDPP_PAGE_WIRELESS_DEVICE_STATUS,
1727 &hidpp->wireless_feature_index,
1733 /* -------------------------------------------------------------------------- */
1734 /* 0x2120: Hi-resolution scrolling */
1735 /* -------------------------------------------------------------------------- */
1737 #define HIDPP_PAGE_HI_RESOLUTION_SCROLLING 0x2120
1739 #define CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE 0x10
1741 static int hidpp_hrs_set_highres_scrolling_mode(struct hidpp_device *hidpp,
1742 bool enabled, u8 *multiplier)
1748 struct hidpp_report response;
1750 ret = hidpp_root_get_feature(hidpp,
1751 HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
1757 params[0] = enabled ? BIT(0) : 0;
1758 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1759 CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE,
1760 params, sizeof(params), &response);
1763 *multiplier = response.fap.params[1];
1767 /* -------------------------------------------------------------------------- */
1768 /* 0x2121: HiRes Wheel */
1769 /* -------------------------------------------------------------------------- */
1771 #define HIDPP_PAGE_HIRES_WHEEL 0x2121
1773 #define CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY 0x00
1774 #define CMD_HIRES_WHEEL_SET_WHEEL_MODE 0x20
1776 static int hidpp_hrw_get_wheel_capability(struct hidpp_device *hidpp,
1782 struct hidpp_report response;
1784 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
1785 &feature_index, &feature_type);
1787 goto return_default;
1789 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1790 CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY,
1791 NULL, 0, &response);
1793 goto return_default;
1795 *multiplier = response.fap.params[0];
1798 hid_warn(hidpp->hid_dev,
1799 "Couldn't get wheel multiplier (error %d)\n", ret);
1803 static int hidpp_hrw_set_wheel_mode(struct hidpp_device *hidpp, bool invert,
1804 bool high_resolution, bool use_hidpp)
1810 struct hidpp_report response;
1812 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
1813 &feature_index, &feature_type);
1817 params[0] = (invert ? BIT(2) : 0) |
1818 (high_resolution ? BIT(1) : 0) |
1819 (use_hidpp ? BIT(0) : 0);
1821 return hidpp_send_fap_command_sync(hidpp, feature_index,
1822 CMD_HIRES_WHEEL_SET_WHEEL_MODE,
1823 params, sizeof(params), &response);
1826 /* -------------------------------------------------------------------------- */
1827 /* 0x4301: Solar Keyboard */
1828 /* -------------------------------------------------------------------------- */
1830 #define HIDPP_PAGE_SOLAR_KEYBOARD 0x4301
1832 #define CMD_SOLAR_SET_LIGHT_MEASURE 0x00
1834 #define EVENT_SOLAR_BATTERY_BROADCAST 0x00
1835 #define EVENT_SOLAR_BATTERY_LIGHT_MEASURE 0x10
1836 #define EVENT_SOLAR_CHECK_LIGHT_BUTTON 0x20
1838 static int hidpp_solar_request_battery_event(struct hidpp_device *hidpp)
1840 struct hidpp_report response;
1841 u8 params[2] = { 1, 1 };
1845 if (hidpp->battery.feature_index == 0xff) {
1846 ret = hidpp_root_get_feature(hidpp,
1847 HIDPP_PAGE_SOLAR_KEYBOARD,
1848 &hidpp->battery.solar_feature_index,
1854 ret = hidpp_send_fap_command_sync(hidpp,
1855 hidpp->battery.solar_feature_index,
1856 CMD_SOLAR_SET_LIGHT_MEASURE,
1857 params, 2, &response);
1859 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1866 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
1871 static int hidpp_solar_battery_event(struct hidpp_device *hidpp,
1874 struct hidpp_report *report = (struct hidpp_report *)data;
1875 int capacity, lux, status;
1878 function = report->fap.funcindex_clientid;
1881 if (report->fap.feature_index != hidpp->battery.solar_feature_index ||
1882 !(function == EVENT_SOLAR_BATTERY_BROADCAST ||
1883 function == EVENT_SOLAR_BATTERY_LIGHT_MEASURE ||
1884 function == EVENT_SOLAR_CHECK_LIGHT_BUTTON))
1887 capacity = report->fap.params[0];
1890 case EVENT_SOLAR_BATTERY_LIGHT_MEASURE:
1891 lux = (report->fap.params[1] << 8) | report->fap.params[2];
1893 status = POWER_SUPPLY_STATUS_CHARGING;
1895 status = POWER_SUPPLY_STATUS_DISCHARGING;
1897 case EVENT_SOLAR_CHECK_LIGHT_BUTTON:
1899 if (capacity < hidpp->battery.capacity)
1900 status = POWER_SUPPLY_STATUS_DISCHARGING;
1902 status = POWER_SUPPLY_STATUS_CHARGING;
1906 if (capacity == 100)
1907 status = POWER_SUPPLY_STATUS_FULL;
1909 hidpp->battery.online = true;
1910 if (capacity != hidpp->battery.capacity ||
1911 status != hidpp->battery.status) {
1912 hidpp->battery.capacity = capacity;
1913 hidpp->battery.status = status;
1914 if (hidpp->battery.ps)
1915 power_supply_changed(hidpp->battery.ps);
1921 /* -------------------------------------------------------------------------- */
1922 /* 0x6010: Touchpad FW items */
1923 /* -------------------------------------------------------------------------- */
1925 #define HIDPP_PAGE_TOUCHPAD_FW_ITEMS 0x6010
1927 #define CMD_TOUCHPAD_FW_ITEMS_SET 0x10
1929 struct hidpp_touchpad_fw_items {
1931 uint8_t desired_state;
1937 * send a set state command to the device by reading the current items->state
1938 * field. items is then filled with the current state.
1940 static int hidpp_touchpad_fw_items_set(struct hidpp_device *hidpp,
1942 struct hidpp_touchpad_fw_items *items)
1944 struct hidpp_report response;
1946 u8 *params = (u8 *)response.fap.params;
1948 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1949 CMD_TOUCHPAD_FW_ITEMS_SET, &items->state, 1, &response);
1952 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1959 items->presence = params[0];
1960 items->desired_state = params[1];
1961 items->state = params[2];
1962 items->persistent = params[3];
1967 /* -------------------------------------------------------------------------- */
1968 /* 0x6100: TouchPadRawXY */
1969 /* -------------------------------------------------------------------------- */
1971 #define HIDPP_PAGE_TOUCHPAD_RAW_XY 0x6100
1973 #define CMD_TOUCHPAD_GET_RAW_INFO 0x00
1974 #define CMD_TOUCHPAD_SET_RAW_REPORT_STATE 0x20
1976 #define EVENT_TOUCHPAD_RAW_XY 0x00
1978 #define TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT 0x01
1979 #define TOUCHPAD_RAW_XY_ORIGIN_UPPER_LEFT 0x03
1981 struct hidpp_touchpad_raw_info {
1992 struct hidpp_touchpad_raw_xy_finger {
2002 struct hidpp_touchpad_raw_xy {
2004 struct hidpp_touchpad_raw_xy_finger fingers[2];
2011 static int hidpp_touchpad_get_raw_info(struct hidpp_device *hidpp,
2012 u8 feature_index, struct hidpp_touchpad_raw_info *raw_info)
2014 struct hidpp_report response;
2016 u8 *params = (u8 *)response.fap.params;
2018 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
2019 CMD_TOUCHPAD_GET_RAW_INFO, NULL, 0, &response);
2022 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
2029 raw_info->x_size = get_unaligned_be16(¶ms[0]);
2030 raw_info->y_size = get_unaligned_be16(¶ms[2]);
2031 raw_info->z_range = params[4];
2032 raw_info->area_range = params[5];
2033 raw_info->maxcontacts = params[7];
2034 raw_info->origin = params[8];
2035 /* res is given in unit per inch */
2036 raw_info->res = get_unaligned_be16(¶ms[13]) * 2 / 51;
2041 static int hidpp_touchpad_set_raw_report_state(struct hidpp_device *hidpp_dev,
2042 u8 feature_index, bool send_raw_reports,
2043 bool sensor_enhanced_settings)
2045 struct hidpp_report response;
2049 * bit 0 - enable raw
2050 * bit 1 - 16bit Z, no area
2051 * bit 2 - enhanced sensitivity
2052 * bit 3 - width, height (4 bits each) instead of area
2053 * bit 4 - send raw + gestures (degrades smoothness)
2054 * remaining bits - reserved
2056 u8 params = send_raw_reports | (sensor_enhanced_settings << 2);
2058 return hidpp_send_fap_command_sync(hidpp_dev, feature_index,
2059 CMD_TOUCHPAD_SET_RAW_REPORT_STATE, ¶ms, 1, &response);
2062 static void hidpp_touchpad_touch_event(u8 *data,
2063 struct hidpp_touchpad_raw_xy_finger *finger)
2065 u8 x_m = data[0] << 2;
2066 u8 y_m = data[2] << 2;
2068 finger->x = x_m << 6 | data[1];
2069 finger->y = y_m << 6 | data[3];
2071 finger->contact_type = data[0] >> 6;
2072 finger->contact_status = data[2] >> 6;
2074 finger->z = data[4];
2075 finger->area = data[5];
2076 finger->finger_id = data[6] >> 4;
2079 static void hidpp_touchpad_raw_xy_event(struct hidpp_device *hidpp_dev,
2080 u8 *data, struct hidpp_touchpad_raw_xy *raw_xy)
2082 memset(raw_xy, 0, sizeof(struct hidpp_touchpad_raw_xy));
2083 raw_xy->end_of_frame = data[8] & 0x01;
2084 raw_xy->spurious_flag = (data[8] >> 1) & 0x01;
2085 raw_xy->finger_count = data[15] & 0x0f;
2086 raw_xy->button = (data[8] >> 2) & 0x01;
2088 if (raw_xy->finger_count) {
2089 hidpp_touchpad_touch_event(&data[2], &raw_xy->fingers[0]);
2090 hidpp_touchpad_touch_event(&data[9], &raw_xy->fingers[1]);
2094 /* -------------------------------------------------------------------------- */
2095 /* 0x8123: Force feedback support */
2096 /* -------------------------------------------------------------------------- */
2098 #define HIDPP_FF_GET_INFO 0x01
2099 #define HIDPP_FF_RESET_ALL 0x11
2100 #define HIDPP_FF_DOWNLOAD_EFFECT 0x21
2101 #define HIDPP_FF_SET_EFFECT_STATE 0x31
2102 #define HIDPP_FF_DESTROY_EFFECT 0x41
2103 #define HIDPP_FF_GET_APERTURE 0x51
2104 #define HIDPP_FF_SET_APERTURE 0x61
2105 #define HIDPP_FF_GET_GLOBAL_GAINS 0x71
2106 #define HIDPP_FF_SET_GLOBAL_GAINS 0x81
2108 #define HIDPP_FF_EFFECT_STATE_GET 0x00
2109 #define HIDPP_FF_EFFECT_STATE_STOP 0x01
2110 #define HIDPP_FF_EFFECT_STATE_PLAY 0x02
2111 #define HIDPP_FF_EFFECT_STATE_PAUSE 0x03
2113 #define HIDPP_FF_EFFECT_CONSTANT 0x00
2114 #define HIDPP_FF_EFFECT_PERIODIC_SINE 0x01
2115 #define HIDPP_FF_EFFECT_PERIODIC_SQUARE 0x02
2116 #define HIDPP_FF_EFFECT_PERIODIC_TRIANGLE 0x03
2117 #define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP 0x04
2118 #define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN 0x05
2119 #define HIDPP_FF_EFFECT_SPRING 0x06
2120 #define HIDPP_FF_EFFECT_DAMPER 0x07
2121 #define HIDPP_FF_EFFECT_FRICTION 0x08
2122 #define HIDPP_FF_EFFECT_INERTIA 0x09
2123 #define HIDPP_FF_EFFECT_RAMP 0x0A
2125 #define HIDPP_FF_EFFECT_AUTOSTART 0x80
2127 #define HIDPP_FF_EFFECTID_NONE -1
2128 #define HIDPP_FF_EFFECTID_AUTOCENTER -2
2129 #define HIDPP_AUTOCENTER_PARAMS_LENGTH 18
2131 #define HIDPP_FF_MAX_PARAMS 20
2132 #define HIDPP_FF_RESERVED_SLOTS 1
2134 struct hidpp_ff_private_data {
2135 struct hidpp_device *hidpp;
2143 struct workqueue_struct *wq;
2144 atomic_t workqueue_size;
2147 struct hidpp_ff_work_data {
2148 struct work_struct work;
2149 struct hidpp_ff_private_data *data;
2152 u8 params[HIDPP_FF_MAX_PARAMS];
2156 static const signed short hidpp_ff_effects[] = {
2171 static const signed short hidpp_ff_effects_v2[] = {
2178 static const u8 HIDPP_FF_CONDITION_CMDS[] = {
2179 HIDPP_FF_EFFECT_SPRING,
2180 HIDPP_FF_EFFECT_FRICTION,
2181 HIDPP_FF_EFFECT_DAMPER,
2182 HIDPP_FF_EFFECT_INERTIA
2185 static const char *HIDPP_FF_CONDITION_NAMES[] = {
2193 static u8 hidpp_ff_find_effect(struct hidpp_ff_private_data *data, int effect_id)
2197 for (i = 0; i < data->num_effects; i++)
2198 if (data->effect_ids[i] == effect_id)
2204 static void hidpp_ff_work_handler(struct work_struct *w)
2206 struct hidpp_ff_work_data *wd = container_of(w, struct hidpp_ff_work_data, work);
2207 struct hidpp_ff_private_data *data = wd->data;
2208 struct hidpp_report response;
2212 /* add slot number if needed */
2213 switch (wd->effect_id) {
2214 case HIDPP_FF_EFFECTID_AUTOCENTER:
2215 wd->params[0] = data->slot_autocenter;
2217 case HIDPP_FF_EFFECTID_NONE:
2218 /* leave slot as zero */
2221 /* find current slot for effect */
2222 wd->params[0] = hidpp_ff_find_effect(data, wd->effect_id);
2226 /* send command and wait for reply */
2227 ret = hidpp_send_fap_command_sync(data->hidpp, data->feature_index,
2228 wd->command, wd->params, wd->size, &response);
2231 hid_err(data->hidpp->hid_dev, "Failed to send command to device!\n");
2235 /* parse return data */
2236 switch (wd->command) {
2237 case HIDPP_FF_DOWNLOAD_EFFECT:
2238 slot = response.fap.params[0];
2239 if (slot > 0 && slot <= data->num_effects) {
2240 if (wd->effect_id >= 0)
2241 /* regular effect uploaded */
2242 data->effect_ids[slot-1] = wd->effect_id;
2243 else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
2244 /* autocenter spring uploaded */
2245 data->slot_autocenter = slot;
2248 case HIDPP_FF_DESTROY_EFFECT:
2249 if (wd->effect_id >= 0)
2250 /* regular effect destroyed */
2251 data->effect_ids[wd->params[0]-1] = -1;
2252 else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
2253 /* autocenter spring destoyed */
2254 data->slot_autocenter = 0;
2256 case HIDPP_FF_SET_GLOBAL_GAINS:
2257 data->gain = (wd->params[0] << 8) + wd->params[1];
2259 case HIDPP_FF_SET_APERTURE:
2260 data->range = (wd->params[0] << 8) + wd->params[1];
2263 /* no action needed */
2268 atomic_dec(&data->workqueue_size);
2272 static int hidpp_ff_queue_work(struct hidpp_ff_private_data *data, int effect_id, u8 command, u8 *params, u8 size)
2274 struct hidpp_ff_work_data *wd = kzalloc(sizeof(*wd), GFP_KERNEL);
2280 INIT_WORK(&wd->work, hidpp_ff_work_handler);
2283 wd->effect_id = effect_id;
2284 wd->command = command;
2286 memcpy(wd->params, params, size);
2288 s = atomic_inc_return(&data->workqueue_size);
2289 queue_work(data->wq, &wd->work);
2291 /* warn about excessive queue size */
2292 if (s >= 20 && s % 20 == 0)
2293 hid_warn(data->hidpp->hid_dev, "Force feedback command queue contains %d commands, causing substantial delays!", s);
2298 static int hidpp_ff_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old)
2300 struct hidpp_ff_private_data *data = dev->ff->private;
2305 /* set common parameters */
2306 params[2] = effect->replay.length >> 8;
2307 params[3] = effect->replay.length & 255;
2308 params[4] = effect->replay.delay >> 8;
2309 params[5] = effect->replay.delay & 255;
2311 switch (effect->type) {
2313 force = (effect->u.constant.level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2314 params[1] = HIDPP_FF_EFFECT_CONSTANT;
2315 params[6] = force >> 8;
2316 params[7] = force & 255;
2317 params[8] = effect->u.constant.envelope.attack_level >> 7;
2318 params[9] = effect->u.constant.envelope.attack_length >> 8;
2319 params[10] = effect->u.constant.envelope.attack_length & 255;
2320 params[11] = effect->u.constant.envelope.fade_level >> 7;
2321 params[12] = effect->u.constant.envelope.fade_length >> 8;
2322 params[13] = effect->u.constant.envelope.fade_length & 255;
2324 dbg_hid("Uploading constant force level=%d in dir %d = %d\n",
2325 effect->u.constant.level,
2326 effect->direction, force);
2327 dbg_hid(" envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2328 effect->u.constant.envelope.attack_level,
2329 effect->u.constant.envelope.attack_length,
2330 effect->u.constant.envelope.fade_level,
2331 effect->u.constant.envelope.fade_length);
2335 switch (effect->u.periodic.waveform) {
2337 params[1] = HIDPP_FF_EFFECT_PERIODIC_SINE;
2340 params[1] = HIDPP_FF_EFFECT_PERIODIC_SQUARE;
2343 params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP;
2346 params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN;
2349 params[1] = HIDPP_FF_EFFECT_PERIODIC_TRIANGLE;
2352 hid_err(data->hidpp->hid_dev, "Unexpected periodic waveform type %i!\n", effect->u.periodic.waveform);
2355 force = (effect->u.periodic.magnitude * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2356 params[6] = effect->u.periodic.magnitude >> 8;
2357 params[7] = effect->u.periodic.magnitude & 255;
2358 params[8] = effect->u.periodic.offset >> 8;
2359 params[9] = effect->u.periodic.offset & 255;
2360 params[10] = effect->u.periodic.period >> 8;
2361 params[11] = effect->u.periodic.period & 255;
2362 params[12] = effect->u.periodic.phase >> 8;
2363 params[13] = effect->u.periodic.phase & 255;
2364 params[14] = effect->u.periodic.envelope.attack_level >> 7;
2365 params[15] = effect->u.periodic.envelope.attack_length >> 8;
2366 params[16] = effect->u.periodic.envelope.attack_length & 255;
2367 params[17] = effect->u.periodic.envelope.fade_level >> 7;
2368 params[18] = effect->u.periodic.envelope.fade_length >> 8;
2369 params[19] = effect->u.periodic.envelope.fade_length & 255;
2371 dbg_hid("Uploading periodic force mag=%d/dir=%d, offset=%d, period=%d ms, phase=%d\n",
2372 effect->u.periodic.magnitude, effect->direction,
2373 effect->u.periodic.offset,
2374 effect->u.periodic.period,
2375 effect->u.periodic.phase);
2376 dbg_hid(" envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2377 effect->u.periodic.envelope.attack_level,
2378 effect->u.periodic.envelope.attack_length,
2379 effect->u.periodic.envelope.fade_level,
2380 effect->u.periodic.envelope.fade_length);
2384 params[1] = HIDPP_FF_EFFECT_RAMP;
2385 force = (effect->u.ramp.start_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2386 params[6] = force >> 8;
2387 params[7] = force & 255;
2388 force = (effect->u.ramp.end_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2389 params[8] = force >> 8;
2390 params[9] = force & 255;
2391 params[10] = effect->u.ramp.envelope.attack_level >> 7;
2392 params[11] = effect->u.ramp.envelope.attack_length >> 8;
2393 params[12] = effect->u.ramp.envelope.attack_length & 255;
2394 params[13] = effect->u.ramp.envelope.fade_level >> 7;
2395 params[14] = effect->u.ramp.envelope.fade_length >> 8;
2396 params[15] = effect->u.ramp.envelope.fade_length & 255;
2398 dbg_hid("Uploading ramp force level=%d -> %d in dir %d = %d\n",
2399 effect->u.ramp.start_level,
2400 effect->u.ramp.end_level,
2401 effect->direction, force);
2402 dbg_hid(" envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2403 effect->u.ramp.envelope.attack_level,
2404 effect->u.ramp.envelope.attack_length,
2405 effect->u.ramp.envelope.fade_level,
2406 effect->u.ramp.envelope.fade_length);
2412 params[1] = HIDPP_FF_CONDITION_CMDS[effect->type - FF_SPRING];
2413 params[6] = effect->u.condition[0].left_saturation >> 9;
2414 params[7] = (effect->u.condition[0].left_saturation >> 1) & 255;
2415 params[8] = effect->u.condition[0].left_coeff >> 8;
2416 params[9] = effect->u.condition[0].left_coeff & 255;
2417 params[10] = effect->u.condition[0].deadband >> 9;
2418 params[11] = (effect->u.condition[0].deadband >> 1) & 255;
2419 params[12] = effect->u.condition[0].center >> 8;
2420 params[13] = effect->u.condition[0].center & 255;
2421 params[14] = effect->u.condition[0].right_coeff >> 8;
2422 params[15] = effect->u.condition[0].right_coeff & 255;
2423 params[16] = effect->u.condition[0].right_saturation >> 9;
2424 params[17] = (effect->u.condition[0].right_saturation >> 1) & 255;
2426 dbg_hid("Uploading %s force left coeff=%d, left sat=%d, right coeff=%d, right sat=%d\n",
2427 HIDPP_FF_CONDITION_NAMES[effect->type - FF_SPRING],
2428 effect->u.condition[0].left_coeff,
2429 effect->u.condition[0].left_saturation,
2430 effect->u.condition[0].right_coeff,
2431 effect->u.condition[0].right_saturation);
2432 dbg_hid(" deadband=%d, center=%d\n",
2433 effect->u.condition[0].deadband,
2434 effect->u.condition[0].center);
2437 hid_err(data->hidpp->hid_dev, "Unexpected force type %i!\n", effect->type);
2441 return hidpp_ff_queue_work(data, effect->id, HIDPP_FF_DOWNLOAD_EFFECT, params, size);
2444 static int hidpp_ff_playback(struct input_dev *dev, int effect_id, int value)
2446 struct hidpp_ff_private_data *data = dev->ff->private;
2449 params[1] = value ? HIDPP_FF_EFFECT_STATE_PLAY : HIDPP_FF_EFFECT_STATE_STOP;
2451 dbg_hid("St%sing playback of effect %d.\n", value?"art":"opp", effect_id);
2453 return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_SET_EFFECT_STATE, params, ARRAY_SIZE(params));
2456 static int hidpp_ff_erase_effect(struct input_dev *dev, int effect_id)
2458 struct hidpp_ff_private_data *data = dev->ff->private;
2461 dbg_hid("Erasing effect %d.\n", effect_id);
2463 return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_DESTROY_EFFECT, &slot, 1);
2466 static void hidpp_ff_set_autocenter(struct input_dev *dev, u16 magnitude)
2468 struct hidpp_ff_private_data *data = dev->ff->private;
2469 u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH];
2471 dbg_hid("Setting autocenter to %d.\n", magnitude);
2473 /* start a standard spring effect */
2474 params[1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART;
2475 /* zero delay and duration */
2476 params[2] = params[3] = params[4] = params[5] = 0;
2477 /* set coeff to 25% of saturation */
2478 params[8] = params[14] = magnitude >> 11;
2479 params[9] = params[15] = (magnitude >> 3) & 255;
2480 params[6] = params[16] = magnitude >> 9;
2481 params[7] = params[17] = (magnitude >> 1) & 255;
2482 /* zero deadband and center */
2483 params[10] = params[11] = params[12] = params[13] = 0;
2485 hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_AUTOCENTER, HIDPP_FF_DOWNLOAD_EFFECT, params, ARRAY_SIZE(params));
2488 static void hidpp_ff_set_gain(struct input_dev *dev, u16 gain)
2490 struct hidpp_ff_private_data *data = dev->ff->private;
2493 dbg_hid("Setting gain to %d.\n", gain);
2495 params[0] = gain >> 8;
2496 params[1] = gain & 255;
2497 params[2] = 0; /* no boost */
2500 hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_NONE, HIDPP_FF_SET_GLOBAL_GAINS, params, ARRAY_SIZE(params));
2503 static ssize_t hidpp_ff_range_show(struct device *dev, struct device_attribute *attr, char *buf)
2505 struct hid_device *hid = to_hid_device(dev);
2506 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2507 struct input_dev *idev = hidinput->input;
2508 struct hidpp_ff_private_data *data = idev->ff->private;
2510 return scnprintf(buf, PAGE_SIZE, "%u\n", data->range);
2513 static ssize_t hidpp_ff_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2515 struct hid_device *hid = to_hid_device(dev);
2516 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2517 struct input_dev *idev = hidinput->input;
2518 struct hidpp_ff_private_data *data = idev->ff->private;
2520 int range = simple_strtoul(buf, NULL, 10);
2522 range = clamp(range, 180, 900);
2524 params[0] = range >> 8;
2525 params[1] = range & 0x00FF;
2527 hidpp_ff_queue_work(data, -1, HIDPP_FF_SET_APERTURE, params, ARRAY_SIZE(params));
2532 static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, hidpp_ff_range_show, hidpp_ff_range_store);
2534 static void hidpp_ff_destroy(struct ff_device *ff)
2536 struct hidpp_ff_private_data *data = ff->private;
2537 struct hid_device *hid = data->hidpp->hid_dev;
2539 hid_info(hid, "Unloading HID++ force feedback.\n");
2541 device_remove_file(&hid->dev, &dev_attr_range);
2542 destroy_workqueue(data->wq);
2543 kfree(data->effect_ids);
2546 static int hidpp_ff_init(struct hidpp_device *hidpp,
2547 struct hidpp_ff_private_data *data)
2549 struct hid_device *hid = hidpp->hid_dev;
2550 struct hid_input *hidinput;
2551 struct input_dev *dev;
2552 struct usb_device_descriptor *udesc;
2554 struct ff_device *ff;
2555 int error, j, num_slots = data->num_effects;
2558 if (!hid_is_usb(hid)) {
2559 hid_err(hid, "device is not USB\n");
2563 if (list_empty(&hid->inputs)) {
2564 hid_err(hid, "no inputs found\n");
2567 hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2568 dev = hidinput->input;
2571 hid_err(hid, "Struct input_dev not set!\n");
2575 /* Get firmware release */
2576 udesc = &(hid_to_usb_dev(hid)->descriptor);
2577 bcdDevice = le16_to_cpu(udesc->bcdDevice);
2578 version = bcdDevice & 255;
2580 /* Set supported force feedback capabilities */
2581 for (j = 0; hidpp_ff_effects[j] >= 0; j++)
2582 set_bit(hidpp_ff_effects[j], dev->ffbit);
2584 for (j = 0; hidpp_ff_effects_v2[j] >= 0; j++)
2585 set_bit(hidpp_ff_effects_v2[j], dev->ffbit);
2587 error = input_ff_create(dev, num_slots);
2590 hid_err(dev, "Failed to create FF device!\n");
2594 * Create a copy of passed data, so we can transfer memory
2595 * ownership to FF core
2597 data = kmemdup(data, sizeof(*data), GFP_KERNEL);
2600 data->effect_ids = kcalloc(num_slots, sizeof(int), GFP_KERNEL);
2601 if (!data->effect_ids) {
2605 data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
2607 kfree(data->effect_ids);
2612 data->hidpp = hidpp;
2613 data->version = version;
2614 for (j = 0; j < num_slots; j++)
2615 data->effect_ids[j] = -1;
2620 ff->upload = hidpp_ff_upload_effect;
2621 ff->erase = hidpp_ff_erase_effect;
2622 ff->playback = hidpp_ff_playback;
2623 ff->set_gain = hidpp_ff_set_gain;
2624 ff->set_autocenter = hidpp_ff_set_autocenter;
2625 ff->destroy = hidpp_ff_destroy;
2627 /* Create sysfs interface */
2628 error = device_create_file(&(hidpp->hid_dev->dev), &dev_attr_range);
2630 hid_warn(hidpp->hid_dev, "Unable to create sysfs interface for \"range\", errno %d!\n", error);
2632 /* init the hardware command queue */
2633 atomic_set(&data->workqueue_size, 0);
2635 hid_info(hid, "Force feedback support loaded (firmware release %d).\n",
2641 /* ************************************************************************** */
2643 /* Device Support */
2645 /* ************************************************************************** */
2647 /* -------------------------------------------------------------------------- */
2648 /* Touchpad HID++ devices */
2649 /* -------------------------------------------------------------------------- */
2651 #define WTP_MANUAL_RESOLUTION 39
2656 u8 mt_feature_index;
2657 u8 button_feature_index;
2660 unsigned int resolution;
2663 static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
2664 struct hid_field *field, struct hid_usage *usage,
2665 unsigned long **bit, int *max)
2670 static void wtp_populate_input(struct hidpp_device *hidpp,
2671 struct input_dev *input_dev)
2673 struct wtp_data *wd = hidpp->private_data;
2675 __set_bit(EV_ABS, input_dev->evbit);
2676 __set_bit(EV_KEY, input_dev->evbit);
2677 __clear_bit(EV_REL, input_dev->evbit);
2678 __clear_bit(EV_LED, input_dev->evbit);
2680 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, wd->x_size, 0, 0);
2681 input_abs_set_res(input_dev, ABS_MT_POSITION_X, wd->resolution);
2682 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, wd->y_size, 0, 0);
2683 input_abs_set_res(input_dev, ABS_MT_POSITION_Y, wd->resolution);
2685 /* Max pressure is not given by the devices, pick one */
2686 input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 50, 0, 0);
2688 input_set_capability(input_dev, EV_KEY, BTN_LEFT);
2690 if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS)
2691 input_set_capability(input_dev, EV_KEY, BTN_RIGHT);
2693 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
2695 input_mt_init_slots(input_dev, wd->maxcontacts, INPUT_MT_POINTER |
2696 INPUT_MT_DROP_UNUSED);
2699 static void wtp_touch_event(struct hidpp_device *hidpp,
2700 struct hidpp_touchpad_raw_xy_finger *touch_report)
2702 struct wtp_data *wd = hidpp->private_data;
2705 if (!touch_report->finger_id || touch_report->contact_type)
2706 /* no actual data */
2709 slot = input_mt_get_slot_by_key(hidpp->input, touch_report->finger_id);
2711 input_mt_slot(hidpp->input, slot);
2712 input_mt_report_slot_state(hidpp->input, MT_TOOL_FINGER,
2713 touch_report->contact_status);
2714 if (touch_report->contact_status) {
2715 input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_X,
2717 input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_Y,
2718 wd->flip_y ? wd->y_size - touch_report->y :
2720 input_event(hidpp->input, EV_ABS, ABS_MT_PRESSURE,
2721 touch_report->area);
2725 static void wtp_send_raw_xy_event(struct hidpp_device *hidpp,
2726 struct hidpp_touchpad_raw_xy *raw)
2730 for (i = 0; i < 2; i++)
2731 wtp_touch_event(hidpp, &(raw->fingers[i]));
2733 if (raw->end_of_frame &&
2734 !(hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS))
2735 input_event(hidpp->input, EV_KEY, BTN_LEFT, raw->button);
2737 if (raw->end_of_frame || raw->finger_count <= 2) {
2738 input_mt_sync_frame(hidpp->input);
2739 input_sync(hidpp->input);
2743 static int wtp_mouse_raw_xy_event(struct hidpp_device *hidpp, u8 *data)
2745 struct wtp_data *wd = hidpp->private_data;
2746 u8 c1_area = ((data[7] & 0xf) * (data[7] & 0xf) +
2747 (data[7] >> 4) * (data[7] >> 4)) / 2;
2748 u8 c2_area = ((data[13] & 0xf) * (data[13] & 0xf) +
2749 (data[13] >> 4) * (data[13] >> 4)) / 2;
2750 struct hidpp_touchpad_raw_xy raw = {
2751 .timestamp = data[1],
2755 .contact_status = !!data[7],
2756 .x = get_unaligned_le16(&data[3]),
2757 .y = get_unaligned_le16(&data[5]),
2760 .finger_id = data[2],
2763 .contact_status = !!data[13],
2764 .x = get_unaligned_le16(&data[9]),
2765 .y = get_unaligned_le16(&data[11]),
2768 .finger_id = data[8],
2771 .finger_count = wd->maxcontacts,
2773 .end_of_frame = (data[0] >> 7) == 0,
2774 .button = data[0] & 0x01,
2777 wtp_send_raw_xy_event(hidpp, &raw);
2782 static int wtp_raw_event(struct hid_device *hdev, u8 *data, int size)
2784 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2785 struct wtp_data *wd = hidpp->private_data;
2786 struct hidpp_report *report = (struct hidpp_report *)data;
2787 struct hidpp_touchpad_raw_xy raw;
2789 if (!wd || !hidpp->input)
2795 hid_err(hdev, "Received HID report of bad size (%d)",
2799 if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) {
2800 input_event(hidpp->input, EV_KEY, BTN_LEFT,
2801 !!(data[1] & 0x01));
2802 input_event(hidpp->input, EV_KEY, BTN_RIGHT,
2803 !!(data[1] & 0x02));
2804 input_sync(hidpp->input);
2809 return wtp_mouse_raw_xy_event(hidpp, &data[7]);
2811 case REPORT_ID_HIDPP_LONG:
2812 /* size is already checked in hidpp_raw_event. */
2813 if ((report->fap.feature_index != wd->mt_feature_index) ||
2814 (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY))
2816 hidpp_touchpad_raw_xy_event(hidpp, data + 4, &raw);
2818 wtp_send_raw_xy_event(hidpp, &raw);
2825 static int wtp_get_config(struct hidpp_device *hidpp)
2827 struct wtp_data *wd = hidpp->private_data;
2828 struct hidpp_touchpad_raw_info raw_info = {0};
2832 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_TOUCHPAD_RAW_XY,
2833 &wd->mt_feature_index, &feature_type);
2835 /* means that the device is not powered up */
2838 ret = hidpp_touchpad_get_raw_info(hidpp, wd->mt_feature_index,
2843 wd->x_size = raw_info.x_size;
2844 wd->y_size = raw_info.y_size;
2845 wd->maxcontacts = raw_info.maxcontacts;
2846 wd->flip_y = raw_info.origin == TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT;
2847 wd->resolution = raw_info.res;
2848 if (!wd->resolution)
2849 wd->resolution = WTP_MANUAL_RESOLUTION;
2854 static int wtp_allocate(struct hid_device *hdev, const struct hid_device_id *id)
2856 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2857 struct wtp_data *wd;
2859 wd = devm_kzalloc(&hdev->dev, sizeof(struct wtp_data),
2864 hidpp->private_data = wd;
2869 static int wtp_connect(struct hid_device *hdev, bool connected)
2871 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2872 struct wtp_data *wd = hidpp->private_data;
2876 ret = wtp_get_config(hidpp);
2878 hid_err(hdev, "Can not get wtp config: %d\n", ret);
2883 return hidpp_touchpad_set_raw_report_state(hidpp, wd->mt_feature_index,
2887 /* ------------------------------------------------------------------------- */
2888 /* Logitech M560 devices */
2889 /* ------------------------------------------------------------------------- */
2892 * Logitech M560 protocol overview
2894 * The Logitech M560 mouse, is designed for windows 8. When the middle and/or
2895 * the sides buttons are pressed, it sends some keyboard keys events
2896 * instead of buttons ones.
2897 * To complicate things further, the middle button keys sequence
2898 * is different from the odd press and the even press.
2900 * forward button -> Super_R
2901 * backward button -> Super_L+'d' (press only)
2902 * middle button -> 1st time: Alt_L+SuperL+XF86TouchpadOff (press only)
2903 * 2nd time: left-click (press only)
2904 * NB: press-only means that when the button is pressed, the
2905 * KeyPress/ButtonPress and KeyRelease/ButtonRelease events are generated
2906 * together sequentially; instead when the button is released, no event is
2910 * 10<xx>0a 3500af03 (where <xx> is the mouse id),
2911 * the mouse reacts differently:
2912 * - it never sends a keyboard key event
2913 * - for the three mouse button it sends:
2914 * middle button press 11<xx>0a 3500af00...
2915 * side 1 button (forward) press 11<xx>0a 3500b000...
2916 * side 2 button (backward) press 11<xx>0a 3500ae00...
2917 * middle/side1/side2 button release 11<xx>0a 35000000...
2920 static const u8 m560_config_parameter[] = {0x00, 0xaf, 0x03};
2922 /* how buttons are mapped in the report */
2923 #define M560_MOUSE_BTN_LEFT 0x01
2924 #define M560_MOUSE_BTN_RIGHT 0x02
2925 #define M560_MOUSE_BTN_WHEEL_LEFT 0x08
2926 #define M560_MOUSE_BTN_WHEEL_RIGHT 0x10
2928 #define M560_SUB_ID 0x0a
2929 #define M560_BUTTON_MODE_REGISTER 0x35
2931 static int m560_send_config_command(struct hid_device *hdev, bool connected)
2933 struct hidpp_report response;
2934 struct hidpp_device *hidpp_dev;
2936 hidpp_dev = hid_get_drvdata(hdev);
2938 return hidpp_send_rap_command_sync(
2940 REPORT_ID_HIDPP_SHORT,
2942 M560_BUTTON_MODE_REGISTER,
2943 (u8 *)m560_config_parameter,
2944 sizeof(m560_config_parameter),
2949 static int m560_raw_event(struct hid_device *hdev, u8 *data, int size)
2951 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2954 if (!hidpp->input) {
2955 hid_err(hdev, "error in parameter\n");
2960 hid_err(hdev, "error in report\n");
2964 if (data[0] == REPORT_ID_HIDPP_LONG &&
2965 data[2] == M560_SUB_ID && data[6] == 0x00) {
2967 * m560 mouse report for middle, forward and backward button
2970 * data[1] = device-id
2972 * data[5] = 0xaf -> middle
2975 * 0x00 -> release all
2981 input_report_key(hidpp->input, BTN_MIDDLE, 1);
2984 input_report_key(hidpp->input, BTN_FORWARD, 1);
2987 input_report_key(hidpp->input, BTN_BACK, 1);
2990 input_report_key(hidpp->input, BTN_BACK, 0);
2991 input_report_key(hidpp->input, BTN_FORWARD, 0);
2992 input_report_key(hidpp->input, BTN_MIDDLE, 0);
2995 hid_err(hdev, "error in report\n");
2998 input_sync(hidpp->input);
3000 } else if (data[0] == 0x02) {
3002 * Logitech M560 mouse report
3004 * data[0] = type (0x02)
3005 * data[1..2] = buttons
3012 input_report_key(hidpp->input, BTN_LEFT,
3013 !!(data[1] & M560_MOUSE_BTN_LEFT));
3014 input_report_key(hidpp->input, BTN_RIGHT,
3015 !!(data[1] & M560_MOUSE_BTN_RIGHT));
3017 if (data[1] & M560_MOUSE_BTN_WHEEL_LEFT) {
3018 input_report_rel(hidpp->input, REL_HWHEEL, -1);
3019 input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3021 } else if (data[1] & M560_MOUSE_BTN_WHEEL_RIGHT) {
3022 input_report_rel(hidpp->input, REL_HWHEEL, 1);
3023 input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3027 v = hid_snto32(hid_field_extract(hdev, data+3, 0, 12), 12);
3028 input_report_rel(hidpp->input, REL_X, v);
3030 v = hid_snto32(hid_field_extract(hdev, data+3, 12, 12), 12);
3031 input_report_rel(hidpp->input, REL_Y, v);
3033 v = hid_snto32(data[6], 8);
3035 hidpp_scroll_counter_handle_scroll(hidpp->input,
3036 &hidpp->vertical_wheel_counter, v);
3038 input_sync(hidpp->input);
3044 static void m560_populate_input(struct hidpp_device *hidpp,
3045 struct input_dev *input_dev)
3047 __set_bit(EV_KEY, input_dev->evbit);
3048 __set_bit(BTN_MIDDLE, input_dev->keybit);
3049 __set_bit(BTN_RIGHT, input_dev->keybit);
3050 __set_bit(BTN_LEFT, input_dev->keybit);
3051 __set_bit(BTN_BACK, input_dev->keybit);
3052 __set_bit(BTN_FORWARD, input_dev->keybit);
3054 __set_bit(EV_REL, input_dev->evbit);
3055 __set_bit(REL_X, input_dev->relbit);
3056 __set_bit(REL_Y, input_dev->relbit);
3057 __set_bit(REL_WHEEL, input_dev->relbit);
3058 __set_bit(REL_HWHEEL, input_dev->relbit);
3059 __set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3060 __set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3063 static int m560_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3064 struct hid_field *field, struct hid_usage *usage,
3065 unsigned long **bit, int *max)
3070 /* ------------------------------------------------------------------------- */
3071 /* Logitech K400 devices */
3072 /* ------------------------------------------------------------------------- */
3075 * The Logitech K400 keyboard has an embedded touchpad which is seen
3076 * as a mouse from the OS point of view. There is a hardware shortcut to disable
3077 * tap-to-click but the setting is not remembered accross reset, annoying some
3080 * We can toggle this feature from the host by using the feature 0x6010:
3084 struct k400_private_data {
3088 static int k400_disable_tap_to_click(struct hidpp_device *hidpp)
3090 struct k400_private_data *k400 = hidpp->private_data;
3091 struct hidpp_touchpad_fw_items items = {};
3095 if (!k400->feature_index) {
3096 ret = hidpp_root_get_feature(hidpp,
3097 HIDPP_PAGE_TOUCHPAD_FW_ITEMS,
3098 &k400->feature_index, &feature_type);
3100 /* means that the device is not powered up */
3104 ret = hidpp_touchpad_fw_items_set(hidpp, k400->feature_index, &items);
3111 static int k400_allocate(struct hid_device *hdev)
3113 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3114 struct k400_private_data *k400;
3116 k400 = devm_kzalloc(&hdev->dev, sizeof(struct k400_private_data),
3121 hidpp->private_data = k400;
3126 static int k400_connect(struct hid_device *hdev, bool connected)
3128 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3130 if (!disable_tap_to_click)
3133 return k400_disable_tap_to_click(hidpp);
3136 /* ------------------------------------------------------------------------- */
3137 /* Logitech G920 Driving Force Racing Wheel for Xbox One */
3138 /* ------------------------------------------------------------------------- */
3140 #define HIDPP_PAGE_G920_FORCE_FEEDBACK 0x8123
3142 static int g920_ff_set_autocenter(struct hidpp_device *hidpp,
3143 struct hidpp_ff_private_data *data)
3145 struct hidpp_report response;
3146 u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH] = {
3147 [1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART,
3151 /* initialize with zero autocenter to get wheel in usable state */
3153 dbg_hid("Setting autocenter to 0.\n");
3154 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3155 HIDPP_FF_DOWNLOAD_EFFECT,
3156 params, ARRAY_SIZE(params),
3159 hid_warn(hidpp->hid_dev, "Failed to autocenter device!\n");
3161 data->slot_autocenter = response.fap.params[0];
3166 static int g920_get_config(struct hidpp_device *hidpp,
3167 struct hidpp_ff_private_data *data)
3169 struct hidpp_report response;
3173 memset(data, 0, sizeof(*data));
3175 /* Find feature and store for later use */
3176 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_G920_FORCE_FEEDBACK,
3177 &data->feature_index, &feature_type);
3181 /* Read number of slots available in device */
3182 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3189 hid_err(hidpp->hid_dev,
3190 "%s: received protocol error 0x%02x\n", __func__, ret);
3194 data->num_effects = response.fap.params[0] - HIDPP_FF_RESERVED_SLOTS;
3196 /* reset all forces */
3197 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3202 hid_warn(hidpp->hid_dev, "Failed to reset all forces!\n");
3204 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3205 HIDPP_FF_GET_APERTURE,
3209 hid_warn(hidpp->hid_dev,
3210 "Failed to read range from device!\n");
3213 900 : get_unaligned_be16(&response.fap.params[0]);
3215 /* Read the current gain values */
3216 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3217 HIDPP_FF_GET_GLOBAL_GAINS,
3221 hid_warn(hidpp->hid_dev,
3222 "Failed to read gain values from device!\n");
3224 0xffff : get_unaligned_be16(&response.fap.params[0]);
3226 /* ignore boost value at response.fap.params[2] */
3228 return g920_ff_set_autocenter(hidpp, data);
3231 /* -------------------------------------------------------------------------- */
3232 /* Logitech Dinovo Mini keyboard with builtin touchpad */
3233 /* -------------------------------------------------------------------------- */
3234 #define DINOVO_MINI_PRODUCT_ID 0xb30c
3236 static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3237 struct hid_field *field, struct hid_usage *usage,
3238 unsigned long **bit, int *max)
3240 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
3243 switch (usage->hid & HID_USAGE) {
3244 case 0x00d: lg_map_key_clear(KEY_MEDIA); break;
3251 /* -------------------------------------------------------------------------- */
3252 /* HID++1.0 devices which use HID++ reports for their wheels */
3253 /* -------------------------------------------------------------------------- */
3254 static int hidpp10_wheel_connect(struct hidpp_device *hidpp)
3256 return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3257 HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT,
3258 HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT);
3261 static int hidpp10_wheel_raw_event(struct hidpp_device *hidpp,
3272 if (data[0] != REPORT_ID_HIDPP_SHORT || data[2] != HIDPP_SUB_ID_ROLLER)
3278 input_report_rel(hidpp->input, REL_WHEEL, value);
3279 input_report_rel(hidpp->input, REL_WHEEL_HI_RES, value * 120);
3280 input_report_rel(hidpp->input, REL_HWHEEL, hvalue);
3281 input_report_rel(hidpp->input, REL_HWHEEL_HI_RES, hvalue * 120);
3282 input_sync(hidpp->input);
3287 static void hidpp10_wheel_populate_input(struct hidpp_device *hidpp,
3288 struct input_dev *input_dev)
3290 __set_bit(EV_REL, input_dev->evbit);
3291 __set_bit(REL_WHEEL, input_dev->relbit);
3292 __set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3293 __set_bit(REL_HWHEEL, input_dev->relbit);
3294 __set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3297 /* -------------------------------------------------------------------------- */
3298 /* HID++1.0 mice which use HID++ reports for extra mouse buttons */
3299 /* -------------------------------------------------------------------------- */
3300 static int hidpp10_extra_mouse_buttons_connect(struct hidpp_device *hidpp)
3302 return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3303 HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT,
3304 HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT);
3307 static int hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device *hidpp,
3318 if (data[0] != REPORT_ID_HIDPP_SHORT ||
3319 data[2] != HIDPP_SUB_ID_MOUSE_EXTRA_BTNS)
3323 * Buttons are either delivered through the regular mouse report *or*
3324 * through the extra buttons report. At least for button 6 how it is
3325 * delivered differs per receiver firmware version. Even receivers with
3326 * the same usb-id show different behavior, so we handle both cases.
3328 for (i = 0; i < 8; i++)
3329 input_report_key(hidpp->input, BTN_MOUSE + i,
3330 (data[3] & (1 << i)));
3332 /* Some mice report events on button 9+, use BTN_MISC */
3333 for (i = 0; i < 8; i++)
3334 input_report_key(hidpp->input, BTN_MISC + i,
3335 (data[4] & (1 << i)));
3337 input_sync(hidpp->input);
3341 static void hidpp10_extra_mouse_buttons_populate_input(
3342 struct hidpp_device *hidpp, struct input_dev *input_dev)
3344 /* BTN_MOUSE - BTN_MOUSE+7 are set already by the descriptor */
3345 __set_bit(BTN_0, input_dev->keybit);
3346 __set_bit(BTN_1, input_dev->keybit);
3347 __set_bit(BTN_2, input_dev->keybit);
3348 __set_bit(BTN_3, input_dev->keybit);
3349 __set_bit(BTN_4, input_dev->keybit);
3350 __set_bit(BTN_5, input_dev->keybit);
3351 __set_bit(BTN_6, input_dev->keybit);
3352 __set_bit(BTN_7, input_dev->keybit);
3355 /* -------------------------------------------------------------------------- */
3356 /* HID++1.0 kbds which only report 0x10xx consumer usages through sub-id 0x03 */
3357 /* -------------------------------------------------------------------------- */
3359 /* Find the consumer-page input report desc and change Maximums to 0x107f */
3360 static u8 *hidpp10_consumer_keys_report_fixup(struct hidpp_device *hidpp,
3361 u8 *_rdesc, unsigned int *rsize)
3363 /* Note 0 terminated so we can use strnstr to search for this. */
3364 static const char consumer_rdesc_start[] = {
3365 0x05, 0x0C, /* USAGE_PAGE (Consumer Devices) */
3366 0x09, 0x01, /* USAGE (Consumer Control) */
3367 0xA1, 0x01, /* COLLECTION (Application) */
3368 0x85, 0x03, /* REPORT_ID = 3 */
3369 0x75, 0x10, /* REPORT_SIZE (16) */
3370 0x95, 0x02, /* REPORT_COUNT (2) */
3371 0x15, 0x01, /* LOGICAL_MIN (1) */
3372 0x26, 0x00 /* LOGICAL_MAX (... */
3374 char *consumer_rdesc, *rdesc = (char *)_rdesc;
3377 consumer_rdesc = strnstr(rdesc, consumer_rdesc_start, *rsize);
3378 size = *rsize - (consumer_rdesc - rdesc);
3379 if (consumer_rdesc && size >= 25) {
3380 consumer_rdesc[15] = 0x7f;
3381 consumer_rdesc[16] = 0x10;
3382 consumer_rdesc[20] = 0x7f;
3383 consumer_rdesc[21] = 0x10;
3388 static int hidpp10_consumer_keys_connect(struct hidpp_device *hidpp)
3390 return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3391 HIDPP_ENABLE_CONSUMER_REPORT,
3392 HIDPP_ENABLE_CONSUMER_REPORT);
3395 static int hidpp10_consumer_keys_raw_event(struct hidpp_device *hidpp,
3398 u8 consumer_report[5];
3403 if (data[0] != REPORT_ID_HIDPP_SHORT ||
3404 data[2] != HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS)
3408 * Build a normal consumer report (3) out of the data, this detour
3409 * is necessary to get some keyboards to report their 0x10xx usages.
3411 consumer_report[0] = 0x03;
3412 memcpy(&consumer_report[1], &data[3], 4);
3413 /* We are called from atomic context */
3414 hid_report_raw_event(hidpp->hid_dev, HID_INPUT_REPORT,
3415 consumer_report, 5, 1);
3420 /* -------------------------------------------------------------------------- */
3421 /* High-resolution scroll wheels */
3422 /* -------------------------------------------------------------------------- */
3424 static int hi_res_scroll_enable(struct hidpp_device *hidpp)
3429 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL) {
3430 ret = hidpp_hrw_set_wheel_mode(hidpp, false, true, false);
3432 ret = hidpp_hrw_get_wheel_capability(hidpp, &multiplier);
3433 } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL) {
3434 ret = hidpp_hrs_set_highres_scrolling_mode(hidpp, true,
3436 } else /* if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL) */ {
3437 ret = hidpp10_enable_scrolling_acceleration(hidpp);
3443 if (multiplier == 0)
3446 hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
3447 hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
3451 static int hidpp_initialize_hires_scroll(struct hidpp_device *hidpp)
3454 unsigned long capabilities;
3456 capabilities = hidpp->capabilities;
3458 if (hidpp->protocol_major >= 2) {
3462 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
3463 &feature_index, &feature_type);
3465 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL;
3466 hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scroll wheel\n");
3469 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
3470 &feature_index, &feature_type);
3472 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL;
3473 hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scrolling\n");
3476 /* We cannot detect fast scrolling support on HID++ 1.0 devices */
3477 if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_1P0) {
3478 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL;
3479 hid_dbg(hidpp->hid_dev, "Detected HID++ 1.0 fast scroll\n");
3483 if (hidpp->capabilities == capabilities)
3484 hid_dbg(hidpp->hid_dev, "Did not detect HID++ hi-res scrolling hardware support\n");
3488 /* -------------------------------------------------------------------------- */
3489 /* Generic HID++ devices */
3490 /* -------------------------------------------------------------------------- */
3492 static u8 *hidpp_report_fixup(struct hid_device *hdev, u8 *rdesc,
3493 unsigned int *rsize)
3495 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3500 /* For 27 MHz keyboards the quirk gets set after hid_parse. */
3501 if (hdev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE ||
3502 (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS))
3503 rdesc = hidpp10_consumer_keys_report_fixup(hidpp, rdesc, rsize);
3508 static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3509 struct hid_field *field, struct hid_usage *usage,
3510 unsigned long **bit, int *max)
3512 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3517 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3518 return wtp_input_mapping(hdev, hi, field, usage, bit, max);
3519 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560 &&
3520 field->application != HID_GD_MOUSE)
3521 return m560_input_mapping(hdev, hi, field, usage, bit, max);
3523 if (hdev->product == DINOVO_MINI_PRODUCT_ID)
3524 return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
3529 static int hidpp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
3530 struct hid_field *field, struct hid_usage *usage,
3531 unsigned long **bit, int *max)
3533 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3538 /* Ensure that Logitech G920 is not given a default fuzz/flat value */
3539 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
3540 if (usage->type == EV_ABS && (usage->code == ABS_X ||
3541 usage->code == ABS_Y || usage->code == ABS_Z ||
3542 usage->code == ABS_RZ)) {
3543 field->application = HID_GD_MULTIAXIS;
3551 static void hidpp_populate_input(struct hidpp_device *hidpp,
3552 struct input_dev *input)
3554 hidpp->input = input;
3556 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3557 wtp_populate_input(hidpp, input);
3558 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3559 m560_populate_input(hidpp, input);
3561 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS)
3562 hidpp10_wheel_populate_input(hidpp, input);
3564 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS)
3565 hidpp10_extra_mouse_buttons_populate_input(hidpp, input);
3568 static int hidpp_input_configured(struct hid_device *hdev,
3569 struct hid_input *hidinput)
3571 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3572 struct input_dev *input = hidinput->input;
3577 hidpp_populate_input(hidpp, input);
3582 static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
3585 struct hidpp_report *question = hidpp->send_receive_buf;
3586 struct hidpp_report *answer = hidpp->send_receive_buf;
3587 struct hidpp_report *report = (struct hidpp_report *)data;
3591 * If the mutex is locked then we have a pending answer from a
3592 * previously sent command.
3594 if (unlikely(mutex_is_locked(&hidpp->send_mutex))) {
3596 * Check for a correct hidpp20 answer or the corresponding
3599 if (hidpp_match_answer(question, report) ||
3600 hidpp_match_error(question, report)) {
3602 hidpp->answer_available = true;
3603 wake_up(&hidpp->wait);
3605 * This was an answer to a command that this driver sent
3606 * We return 1 to hid-core to avoid forwarding the
3607 * command upstream as it has been treated by the driver
3614 if (unlikely(hidpp_report_is_connect_event(hidpp, report))) {
3615 atomic_set(&hidpp->connected,
3616 !(report->rap.params[0] & (1 << 6)));
3617 if (schedule_work(&hidpp->work) == 0)
3618 dbg_hid("%s: connect event already queued\n", __func__);
3622 if (hidpp->hid_dev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
3623 data[0] == REPORT_ID_HIDPP_SHORT &&
3624 data[2] == HIDPP_SUB_ID_USER_IFACE_EVENT &&
3625 (data[3] & HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST)) {
3626 dev_err_ratelimited(&hidpp->hid_dev->dev,
3627 "Error the keyboard's wireless encryption key has been lost, your keyboard will not work unless you re-configure encryption.\n");
3628 dev_err_ratelimited(&hidpp->hid_dev->dev,
3629 "See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
3632 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3633 ret = hidpp20_battery_event_1000(hidpp, data, size);
3636 ret = hidpp20_battery_event_1004(hidpp, data, size);
3639 ret = hidpp_solar_battery_event(hidpp, data, size);
3642 ret = hidpp20_battery_voltage_event(hidpp, data, size);
3647 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3648 ret = hidpp10_battery_event(hidpp, data, size);
3653 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3654 ret = hidpp10_wheel_raw_event(hidpp, data, size);
3659 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3660 ret = hidpp10_extra_mouse_buttons_raw_event(hidpp, data, size);
3665 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3666 ret = hidpp10_consumer_keys_raw_event(hidpp, data, size);
3674 static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
3677 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3683 /* Generic HID++ processing. */
3685 case REPORT_ID_HIDPP_VERY_LONG:
3686 if (size != hidpp->very_long_report_length) {
3687 hid_err(hdev, "received hid++ report of bad size (%d)",
3691 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3693 case REPORT_ID_HIDPP_LONG:
3694 if (size != HIDPP_REPORT_LONG_LENGTH) {
3695 hid_err(hdev, "received hid++ report of bad size (%d)",
3699 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3701 case REPORT_ID_HIDPP_SHORT:
3702 if (size != HIDPP_REPORT_SHORT_LENGTH) {
3703 hid_err(hdev, "received hid++ report of bad size (%d)",
3707 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3711 /* If no report is available for further processing, skip calling
3712 * raw_event of subclasses. */
3716 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3717 return wtp_raw_event(hdev, data, size);
3718 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3719 return m560_raw_event(hdev, data, size);
3724 static int hidpp_event(struct hid_device *hdev, struct hid_field *field,
3725 struct hid_usage *usage, __s32 value)
3727 /* This function will only be called for scroll events, due to the
3728 * restriction imposed in hidpp_usages.
3730 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3731 struct hidpp_scroll_counter *counter;
3736 counter = &hidpp->vertical_wheel_counter;
3737 /* A scroll event may occur before the multiplier has been retrieved or
3738 * the input device set, or high-res scroll enabling may fail. In such
3739 * cases we must return early (falling back to default behaviour) to
3740 * avoid a crash in hidpp_scroll_counter_handle_scroll.
3742 if (!(hidpp->capabilities & HIDPP_CAPABILITY_HI_RES_SCROLL)
3743 || value == 0 || hidpp->input == NULL
3744 || counter->wheel_multiplier == 0)
3747 hidpp_scroll_counter_handle_scroll(hidpp->input, counter, value);
3751 static int hidpp_initialize_battery(struct hidpp_device *hidpp)
3753 static atomic_t battery_no = ATOMIC_INIT(0);
3754 struct power_supply_config cfg = { .drv_data = hidpp };
3755 struct power_supply_desc *desc = &hidpp->battery.desc;
3756 enum power_supply_property *battery_props;
3757 struct hidpp_battery *battery;
3758 unsigned int num_battery_props;
3762 if (hidpp->battery.ps)
3765 hidpp->battery.feature_index = 0xff;
3766 hidpp->battery.solar_feature_index = 0xff;
3767 hidpp->battery.voltage_feature_index = 0xff;
3769 if (hidpp->protocol_major >= 2) {
3770 if (hidpp->quirks & HIDPP_QUIRK_CLASS_K750)
3771 ret = hidpp_solar_request_battery_event(hidpp);
3773 /* we only support one battery feature right now, so let's
3774 first check the ones that support battery level first
3775 and leave voltage for last */
3776 ret = hidpp20_query_battery_info_1000(hidpp);
3778 ret = hidpp20_query_battery_info_1004(hidpp);
3780 ret = hidpp20_query_battery_voltage_info(hidpp);
3785 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_BATTERY;
3787 ret = hidpp10_query_battery_status(hidpp);
3789 ret = hidpp10_query_battery_mileage(hidpp);
3792 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
3794 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
3796 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_BATTERY;
3799 battery_props = devm_kmemdup(&hidpp->hid_dev->dev,
3800 hidpp_battery_props,
3801 sizeof(hidpp_battery_props),
3806 num_battery_props = ARRAY_SIZE(hidpp_battery_props) - 3;
3808 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE ||
3809 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE ||
3810 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3811 battery_props[num_battery_props++] =
3812 POWER_SUPPLY_PROP_CAPACITY;
3814 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS)
3815 battery_props[num_battery_props++] =
3816 POWER_SUPPLY_PROP_CAPACITY_LEVEL;
3818 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3819 battery_props[num_battery_props++] =
3820 POWER_SUPPLY_PROP_VOLTAGE_NOW;
3822 battery = &hidpp->battery;
3824 n = atomic_inc_return(&battery_no) - 1;
3825 desc->properties = battery_props;
3826 desc->num_properties = num_battery_props;
3827 desc->get_property = hidpp_battery_get_property;
3828 sprintf(battery->name, "hidpp_battery_%ld", n);
3829 desc->name = battery->name;
3830 desc->type = POWER_SUPPLY_TYPE_BATTERY;
3831 desc->use_for_apm = 0;
3833 battery->ps = devm_power_supply_register(&hidpp->hid_dev->dev,
3836 if (IS_ERR(battery->ps))
3837 return PTR_ERR(battery->ps);
3839 power_supply_powers(battery->ps, &hidpp->hid_dev->dev);
3844 static void hidpp_overwrite_name(struct hid_device *hdev)
3846 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3849 if (hidpp->protocol_major < 2)
3852 name = hidpp_get_device_name(hidpp);
3855 hid_err(hdev, "unable to retrieve the name of the device");
3857 dbg_hid("HID++: Got name: %s\n", name);
3858 snprintf(hdev->name, sizeof(hdev->name), "%s", name);
3864 static int hidpp_input_open(struct input_dev *dev)
3866 struct hid_device *hid = input_get_drvdata(dev);
3868 return hid_hw_open(hid);
3871 static void hidpp_input_close(struct input_dev *dev)
3873 struct hid_device *hid = input_get_drvdata(dev);
3878 static struct input_dev *hidpp_allocate_input(struct hid_device *hdev)
3880 struct input_dev *input_dev = devm_input_allocate_device(&hdev->dev);
3881 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3886 input_set_drvdata(input_dev, hdev);
3887 input_dev->open = hidpp_input_open;
3888 input_dev->close = hidpp_input_close;
3890 input_dev->name = hidpp->name;
3891 input_dev->phys = hdev->phys;
3892 input_dev->uniq = hdev->uniq;
3893 input_dev->id.bustype = hdev->bus;
3894 input_dev->id.vendor = hdev->vendor;
3895 input_dev->id.product = hdev->product;
3896 input_dev->id.version = hdev->version;
3897 input_dev->dev.parent = &hdev->dev;
3902 static void hidpp_connect_event(struct hidpp_device *hidpp)
3904 struct hid_device *hdev = hidpp->hid_dev;
3906 bool connected = atomic_read(&hidpp->connected);
3907 struct input_dev *input;
3908 char *name, *devm_name;
3911 if (hidpp->battery.ps) {
3912 hidpp->battery.online = false;
3913 hidpp->battery.status = POWER_SUPPLY_STATUS_UNKNOWN;
3914 hidpp->battery.level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
3915 power_supply_changed(hidpp->battery.ps);
3920 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
3921 ret = wtp_connect(hdev, connected);
3924 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560) {
3925 ret = m560_send_config_command(hdev, connected);
3928 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
3929 ret = k400_connect(hdev, connected);
3934 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3935 ret = hidpp10_wheel_connect(hidpp);
3940 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3941 ret = hidpp10_extra_mouse_buttons_connect(hidpp);
3946 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3947 ret = hidpp10_consumer_keys_connect(hidpp);
3952 /* the device is already connected, we can ask for its name and
3954 if (!hidpp->protocol_major) {
3955 ret = hidpp_root_get_protocol_version(hidpp);
3957 hid_err(hdev, "Can not get the protocol version.\n");
3962 if (hidpp->name == hdev->name && hidpp->protocol_major >= 2) {
3963 name = hidpp_get_device_name(hidpp);
3965 devm_name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
3971 hidpp->name = devm_name;
3975 hidpp_initialize_battery(hidpp);
3976 if (!hid_is_usb(hidpp->hid_dev))
3977 hidpp_initialize_hires_scroll(hidpp);
3979 /* forward current battery state */
3980 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3981 hidpp10_enable_battery_reporting(hidpp);
3982 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE)
3983 hidpp10_query_battery_mileage(hidpp);
3985 hidpp10_query_battery_status(hidpp);
3986 } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3987 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3988 hidpp20_query_battery_voltage_info(hidpp);
3989 else if (hidpp->capabilities & HIDPP_CAPABILITY_UNIFIED_BATTERY)
3990 hidpp20_query_battery_info_1004(hidpp);
3992 hidpp20_query_battery_info_1000(hidpp);
3994 if (hidpp->battery.ps)
3995 power_supply_changed(hidpp->battery.ps);
3997 if (hidpp->capabilities & HIDPP_CAPABILITY_HI_RES_SCROLL)
3998 hi_res_scroll_enable(hidpp);
4000 if (!(hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT) || hidpp->delayed_input)
4001 /* if the input nodes are already created, we can stop now */
4004 input = hidpp_allocate_input(hdev);
4006 hid_err(hdev, "cannot allocate new input device: %d\n", ret);
4010 hidpp_populate_input(hidpp, input);
4012 ret = input_register_device(input);
4014 input_free_device(input);
4018 hidpp->delayed_input = input;
4021 static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
4023 static struct attribute *sysfs_attrs[] = {
4024 &dev_attr_builtin_power_supply.attr,
4028 static const struct attribute_group ps_attribute_group = {
4029 .attrs = sysfs_attrs
4032 static int hidpp_get_report_length(struct hid_device *hdev, int id)
4034 struct hid_report_enum *re;
4035 struct hid_report *report;
4037 re = &(hdev->report_enum[HID_OUTPUT_REPORT]);
4038 report = re->report_id_hash[id];
4042 return report->field[0]->report_count + 1;
4045 static u8 hidpp_validate_device(struct hid_device *hdev)
4047 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4048 int id, report_length;
4049 u8 supported_reports = 0;
4051 id = REPORT_ID_HIDPP_SHORT;
4052 report_length = hidpp_get_report_length(hdev, id);
4053 if (report_length) {
4054 if (report_length < HIDPP_REPORT_SHORT_LENGTH)
4057 supported_reports |= HIDPP_REPORT_SHORT_SUPPORTED;
4060 id = REPORT_ID_HIDPP_LONG;
4061 report_length = hidpp_get_report_length(hdev, id);
4062 if (report_length) {
4063 if (report_length < HIDPP_REPORT_LONG_LENGTH)
4066 supported_reports |= HIDPP_REPORT_LONG_SUPPORTED;
4069 id = REPORT_ID_HIDPP_VERY_LONG;
4070 report_length = hidpp_get_report_length(hdev, id);
4071 if (report_length) {
4072 if (report_length < HIDPP_REPORT_LONG_LENGTH ||
4073 report_length > HIDPP_REPORT_VERY_LONG_MAX_LENGTH)
4076 supported_reports |= HIDPP_REPORT_VERY_LONG_SUPPORTED;
4077 hidpp->very_long_report_length = report_length;
4080 return supported_reports;
4083 hid_warn(hdev, "not enough values in hidpp report %d\n", id);
4087 static bool hidpp_application_equals(struct hid_device *hdev,
4088 unsigned int application)
4090 struct list_head *report_list;
4091 struct hid_report *report;
4093 report_list = &hdev->report_enum[HID_INPUT_REPORT].report_list;
4094 report = list_first_entry_or_null(report_list, struct hid_report, list);
4095 return report && report->application == application;
4098 static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
4100 struct hidpp_device *hidpp;
4103 unsigned int connect_mask = HID_CONNECT_DEFAULT;
4104 struct hidpp_ff_private_data data;
4105 bool will_restart = false;
4107 /* report_fixup needs drvdata to be set before we call hid_parse */
4108 hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
4112 hidpp->hid_dev = hdev;
4113 hidpp->name = hdev->name;
4114 hidpp->quirks = id->driver_data;
4115 hid_set_drvdata(hdev, hidpp);
4117 ret = hid_parse(hdev);
4119 hid_err(hdev, "%s:parse failed\n", __func__);
4124 * Make sure the device is HID++ capable, otherwise treat as generic HID
4126 hidpp->supported_reports = hidpp_validate_device(hdev);
4128 if (!hidpp->supported_reports) {
4129 hid_set_drvdata(hdev, NULL);
4130 devm_kfree(&hdev->dev, hidpp);
4131 return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
4134 if (id->group == HID_GROUP_LOGITECH_DJ_DEVICE)
4135 hidpp->quirks |= HIDPP_QUIRK_UNIFYING;
4137 if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4138 hidpp_application_equals(hdev, HID_GD_MOUSE))
4139 hidpp->quirks |= HIDPP_QUIRK_HIDPP_WHEELS |
4140 HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS;
4142 if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4143 hidpp_application_equals(hdev, HID_GD_KEYBOARD))
4144 hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS;
4146 if (disable_raw_mode) {
4147 hidpp->quirks &= ~HIDPP_QUIRK_CLASS_WTP;
4148 hidpp->quirks &= ~HIDPP_QUIRK_NO_HIDINPUT;
4151 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
4152 ret = wtp_allocate(hdev, id);
4155 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
4156 ret = k400_allocate(hdev);
4161 if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT ||
4162 hidpp->quirks & HIDPP_QUIRK_UNIFYING)
4163 will_restart = true;
4165 INIT_WORK(&hidpp->work, delayed_work_cb);
4166 mutex_init(&hidpp->send_mutex);
4167 init_waitqueue_head(&hidpp->wait);
4169 /* indicates we are handling the battery properties in the kernel */
4170 ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
4172 hid_warn(hdev, "Cannot allocate sysfs group for %s\n",
4176 * Plain USB connections need to actually call start and open
4177 * on the transport driver to allow incoming data.
4179 ret = hid_hw_start(hdev, will_restart ? 0 : connect_mask);
4181 hid_err(hdev, "hw start failed\n");
4182 goto hid_hw_start_fail;
4185 ret = hid_hw_open(hdev);
4187 dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
4189 goto hid_hw_open_fail;
4192 /* Allow incoming packets */
4193 hid_device_io_start(hdev);
4195 if (hidpp->quirks & HIDPP_QUIRK_UNIFYING)
4196 hidpp_unifying_init(hidpp);
4198 connected = hidpp_root_get_protocol_version(hidpp) == 0;
4199 atomic_set(&hidpp->connected, connected);
4200 if (!(hidpp->quirks & HIDPP_QUIRK_UNIFYING)) {
4203 hid_err(hdev, "Device not connected");
4204 goto hid_hw_init_fail;
4207 hidpp_overwrite_name(hdev);
4210 if (connected && hidpp->protocol_major >= 2) {
4211 ret = hidpp_set_wireless_feature_index(hidpp);
4213 hidpp->wireless_feature_index = 0;
4215 goto hid_hw_init_fail;
4219 if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
4220 ret = wtp_get_config(hidpp);
4222 goto hid_hw_init_fail;
4223 } else if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
4224 ret = g920_get_config(hidpp, &data);
4226 goto hid_hw_init_fail;
4229 hidpp_connect_event(hidpp);
4232 /* Reset the HID node state */
4233 hid_device_io_stop(hdev);
4237 if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
4238 connect_mask &= ~HID_CONNECT_HIDINPUT;
4240 /* Now export the actual inputs and hidraw nodes to the world */
4241 ret = hid_hw_start(hdev, connect_mask);
4243 hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
4244 goto hid_hw_start_fail;
4248 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
4249 ret = hidpp_ff_init(hidpp, &data);
4251 hid_warn(hidpp->hid_dev,
4252 "Unable to initialize force feedback support, errno %d\n",
4263 sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4264 cancel_work_sync(&hidpp->work);
4265 mutex_destroy(&hidpp->send_mutex);
4269 static void hidpp_remove(struct hid_device *hdev)
4271 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4274 return hid_hw_stop(hdev);
4276 sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4279 cancel_work_sync(&hidpp->work);
4280 mutex_destroy(&hidpp->send_mutex);
4283 #define LDJ_DEVICE(product) \
4284 HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, \
4285 USB_VENDOR_ID_LOGITECH, (product))
4287 #define L27MHZ_DEVICE(product) \
4288 HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_27MHZ_DEVICE, \
4289 USB_VENDOR_ID_LOGITECH, (product))
4291 static const struct hid_device_id hidpp_devices[] = {
4292 { /* wireless touchpad */
4294 .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT |
4295 HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS },
4296 { /* wireless touchpad T650 */
4298 .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
4299 { /* wireless touchpad T651 */
4300 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
4301 USB_DEVICE_ID_LOGITECH_T651),
4302 .driver_data = HIDPP_QUIRK_CLASS_WTP },
4303 { /* Mouse Logitech Anywhere MX */
4304 LDJ_DEVICE(0x1017), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4305 { /* Mouse logitech M560 */
4307 .driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_CLASS_M560 },
4308 { /* Mouse Logitech M705 (firmware RQM17) */
4309 LDJ_DEVICE(0x101b), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4310 { /* Mouse Logitech Performance MX */
4311 LDJ_DEVICE(0x101a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4312 { /* Keyboard logitech K400 */
4314 .driver_data = HIDPP_QUIRK_CLASS_K400 },
4315 { /* Solar Keyboard Logitech K750 */
4317 .driver_data = HIDPP_QUIRK_CLASS_K750 },
4318 { /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */
4320 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4321 { /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */
4323 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4324 { /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
4326 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4328 { LDJ_DEVICE(HID_ANY_ID) },
4330 { /* Keyboard LX501 (Y-RR53) */
4331 L27MHZ_DEVICE(0x0049),
4332 .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4333 { /* Keyboard MX3000 (Y-RAM74) */
4334 L27MHZ_DEVICE(0x0057),
4335 .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4336 { /* Keyboard MX3200 (Y-RAV80) */
4337 L27MHZ_DEVICE(0x005c),
4338 .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4339 { /* S510 Media Remote */
4340 L27MHZ_DEVICE(0x00fe),
4341 .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4343 { L27MHZ_DEVICE(HID_ANY_ID) },
4345 { /* Logitech G403 Wireless Gaming Mouse over USB */
4346 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC082) },
4347 { /* Logitech G703 Gaming Mouse over USB */
4348 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC087) },
4349 { /* Logitech G703 Hero Gaming Mouse over USB */
4350 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC090) },
4351 { /* Logitech G900 Gaming Mouse over USB */
4352 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC081) },
4353 { /* Logitech G903 Gaming Mouse over USB */
4354 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) },
4355 { /* Logitech G903 Hero Gaming Mouse over USB */
4356 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) },
4357 { /* Logitech G920 Wheel over USB */
4358 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
4359 .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
4360 { /* Logitech G Pro Gaming Mouse over USB */
4361 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC088) },
4363 { /* MX5000 keyboard over Bluetooth */
4364 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305),
4365 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4366 { /* Dinovo Edge keyboard over Bluetooth */
4367 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309),
4368 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4369 { /* MX5500 keyboard over Bluetooth */
4370 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
4371 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4372 { /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */
4373 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) },
4374 { /* MX Master mouse over Bluetooth */
4375 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb012) },
4376 { /* MX Ergo trackball over Bluetooth */
4377 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01d) },
4378 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01e) },
4379 { /* MX Master 3 mouse over Bluetooth */
4380 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
4381 { /* MX Master 3S mouse over Bluetooth */
4382 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb034) },
4386 MODULE_DEVICE_TABLE(hid, hidpp_devices);
4388 static const struct hid_usage_id hidpp_usages[] = {
4389 { HID_GD_WHEEL, EV_REL, REL_WHEEL_HI_RES },
4390 { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
4393 static struct hid_driver hidpp_driver = {
4394 .name = "logitech-hidpp-device",
4395 .id_table = hidpp_devices,
4396 .report_fixup = hidpp_report_fixup,
4397 .probe = hidpp_probe,
4398 .remove = hidpp_remove,
4399 .raw_event = hidpp_raw_event,
4400 .usage_table = hidpp_usages,
4401 .event = hidpp_event,
4402 .input_configured = hidpp_input_configured,
4403 .input_mapping = hidpp_input_mapping,
4404 .input_mapped = hidpp_input_mapped,
4407 module_hid_driver(hidpp_driver);