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>");
33 MODULE_AUTHOR("Bastien Nocera <hadess@hadess.net>");
35 static bool disable_tap_to_click;
36 module_param(disable_tap_to_click, bool, 0644);
37 MODULE_PARM_DESC(disable_tap_to_click,
38 "Disable Tap-To-Click mode reporting for touchpads (only on the K400 currently).");
40 /* Define a non-zero software ID to identify our own requests */
41 #define LINUX_KERNEL_SW_ID 0x01
43 #define REPORT_ID_HIDPP_SHORT 0x10
44 #define REPORT_ID_HIDPP_LONG 0x11
45 #define REPORT_ID_HIDPP_VERY_LONG 0x12
47 #define HIDPP_REPORT_SHORT_LENGTH 7
48 #define HIDPP_REPORT_LONG_LENGTH 20
49 #define HIDPP_REPORT_VERY_LONG_MAX_LENGTH 64
51 #define HIDPP_REPORT_SHORT_SUPPORTED BIT(0)
52 #define HIDPP_REPORT_LONG_SUPPORTED BIT(1)
53 #define HIDPP_REPORT_VERY_LONG_SUPPORTED BIT(2)
55 #define HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS 0x03
56 #define HIDPP_SUB_ID_ROLLER 0x05
57 #define HIDPP_SUB_ID_MOUSE_EXTRA_BTNS 0x06
58 #define HIDPP_SUB_ID_USER_IFACE_EVENT 0x08
59 #define HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST BIT(5)
61 #define HIDPP_QUIRK_CLASS_WTP BIT(0)
62 #define HIDPP_QUIRK_CLASS_M560 BIT(1)
63 #define HIDPP_QUIRK_CLASS_K400 BIT(2)
64 #define HIDPP_QUIRK_CLASS_G920 BIT(3)
65 #define HIDPP_QUIRK_CLASS_K750 BIT(4)
67 /* bits 2..20 are reserved for classes */
68 /* #define HIDPP_QUIRK_CONNECT_EVENTS BIT(21) disabled */
69 #define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
70 #define HIDPP_QUIRK_DELAYED_INIT BIT(23)
71 #define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS BIT(24)
72 #define HIDPP_QUIRK_UNIFYING BIT(25)
73 #define HIDPP_QUIRK_HIDPP_WHEELS BIT(26)
74 #define HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS BIT(27)
75 #define HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS BIT(28)
76 #define HIDPP_QUIRK_HI_RES_SCROLL_1P0 BIT(29)
77 #define HIDPP_QUIRK_WIRELESS_STATUS BIT(30)
79 /* These are just aliases for now */
80 #define HIDPP_QUIRK_KBD_SCROLL_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
81 #define HIDPP_QUIRK_KBD_ZOOM_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
83 /* Convenience constant to check for any high-res support. */
84 #define HIDPP_CAPABILITY_HI_RES_SCROLL (HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL | \
85 HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL | \
86 HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL)
88 #define HIDPP_CAPABILITY_HIDPP10_BATTERY BIT(0)
89 #define HIDPP_CAPABILITY_HIDPP20_BATTERY BIT(1)
90 #define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2)
91 #define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS BIT(3)
92 #define HIDPP_CAPABILITY_BATTERY_VOLTAGE BIT(4)
93 #define HIDPP_CAPABILITY_BATTERY_PERCENTAGE BIT(5)
94 #define HIDPP_CAPABILITY_UNIFIED_BATTERY BIT(6)
95 #define HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL BIT(7)
96 #define HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL BIT(8)
97 #define HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL BIT(9)
98 #define HIDPP_CAPABILITY_ADC_MEASUREMENT BIT(10)
100 #define lg_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
103 * There are two hidpp protocols in use, the first version hidpp10 is known
104 * as register access protocol or RAP, the second version hidpp20 is known as
105 * feature access protocol or FAP
107 * Most older devices (including the Unifying usb receiver) use the RAP protocol
108 * where as most newer devices use the FAP protocol. Both protocols are
109 * compatible with the underlying transport, which could be usb, Unifiying, or
110 * bluetooth. The message lengths are defined by the hid vendor specific report
111 * descriptor for the HIDPP_SHORT report type (total message lenth 7 bytes) and
112 * the HIDPP_LONG report type (total message length 20 bytes)
114 * The RAP protocol uses both report types, whereas the FAP only uses HIDPP_LONG
115 * messages. The Unifying receiver itself responds to RAP messages (device index
116 * is 0xFF for the receiver), and all messages (short or long) with a device
117 * index between 1 and 6 are passed untouched to the corresponding paired
120 * The paired device can be RAP or FAP, it will receive the message untouched
121 * from the Unifiying receiver.
126 u8 funcindex_clientid;
127 u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
133 u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
136 struct hidpp_report {
142 u8 rawbytes[sizeof(struct fap)];
146 struct hidpp_battery {
148 u8 solar_feature_index;
149 u8 voltage_feature_index;
150 u8 adc_measurement_feature_index;
151 struct power_supply_desc desc;
152 struct power_supply *ps;
160 u8 supported_levels_1004;
164 * struct hidpp_scroll_counter - Utility class for processing high-resolution
166 * @dev: the input device for which events should be reported.
167 * @wheel_multiplier: the scalar multiplier to be applied to each wheel event
168 * @remainder: counts the number of high-resolution units moved since the last
169 * low-resolution event (REL_WHEEL or REL_HWHEEL) was sent. Should
170 * only be used by class methods.
171 * @direction: direction of last movement (1 or -1)
172 * @last_time: last event time, used to reset remainder after inactivity
174 struct hidpp_scroll_counter {
175 int wheel_multiplier;
178 unsigned long long last_time;
181 struct hidpp_device {
182 struct hid_device *hid_dev;
183 struct input_dev *input;
184 struct mutex send_mutex;
185 void *send_receive_buf;
186 char *name; /* will never be NULL and should not be freed */
187 wait_queue_head_t wait;
188 int very_long_report_length;
189 bool answer_available;
195 struct work_struct work;
196 struct kfifo delayed_work_fifo;
198 struct input_dev *delayed_input;
200 unsigned long quirks;
201 unsigned long capabilities;
202 u8 supported_reports;
204 struct hidpp_battery battery;
205 struct hidpp_scroll_counter vertical_wheel_counter;
207 u8 wireless_feature_index;
210 /* HID++ 1.0 error codes */
211 #define HIDPP_ERROR 0x8f
212 #define HIDPP_ERROR_SUCCESS 0x00
213 #define HIDPP_ERROR_INVALID_SUBID 0x01
214 #define HIDPP_ERROR_INVALID_ADRESS 0x02
215 #define HIDPP_ERROR_INVALID_VALUE 0x03
216 #define HIDPP_ERROR_CONNECT_FAIL 0x04
217 #define HIDPP_ERROR_TOO_MANY_DEVICES 0x05
218 #define HIDPP_ERROR_ALREADY_EXISTS 0x06
219 #define HIDPP_ERROR_BUSY 0x07
220 #define HIDPP_ERROR_UNKNOWN_DEVICE 0x08
221 #define HIDPP_ERROR_RESOURCE_ERROR 0x09
222 #define HIDPP_ERROR_REQUEST_UNAVAILABLE 0x0a
223 #define HIDPP_ERROR_INVALID_PARAM_VALUE 0x0b
224 #define HIDPP_ERROR_WRONG_PIN_CODE 0x0c
225 /* HID++ 2.0 error codes */
226 #define HIDPP20_ERROR_NO_ERROR 0x00
227 #define HIDPP20_ERROR_UNKNOWN 0x01
228 #define HIDPP20_ERROR_INVALID_ARGS 0x02
229 #define HIDPP20_ERROR_OUT_OF_RANGE 0x03
230 #define HIDPP20_ERROR_HW_ERROR 0x04
231 #define HIDPP20_ERROR_NOT_ALLOWED 0x05
232 #define HIDPP20_ERROR_INVALID_FEATURE_INDEX 0x06
233 #define HIDPP20_ERROR_INVALID_FUNCTION_ID 0x07
234 #define HIDPP20_ERROR_BUSY 0x08
235 #define HIDPP20_ERROR_UNSUPPORTED 0x09
236 #define HIDPP20_ERROR 0xff
238 static void hidpp_connect_event(struct hidpp_device *hidpp_dev);
240 static int __hidpp_send_report(struct hid_device *hdev,
241 struct hidpp_report *hidpp_report)
243 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
244 int fields_count, ret;
246 switch (hidpp_report->report_id) {
247 case REPORT_ID_HIDPP_SHORT:
248 fields_count = HIDPP_REPORT_SHORT_LENGTH;
250 case REPORT_ID_HIDPP_LONG:
251 fields_count = HIDPP_REPORT_LONG_LENGTH;
253 case REPORT_ID_HIDPP_VERY_LONG:
254 fields_count = hidpp->very_long_report_length;
261 * set the device_index as the receiver, it will be overwritten by
262 * hid_hw_request if needed
264 hidpp_report->device_index = 0xff;
266 if (hidpp->quirks & HIDPP_QUIRK_FORCE_OUTPUT_REPORTS) {
267 ret = hid_hw_output_report(hdev, (u8 *)hidpp_report, fields_count);
269 ret = hid_hw_raw_request(hdev, hidpp_report->report_id,
270 (u8 *)hidpp_report, fields_count, HID_OUTPUT_REPORT,
274 return ret == fields_count ? 0 : -1;
278 * Effectively send the message to the device, waiting for its answer.
280 * Must be called with hidpp->send_mutex locked
282 * Same return protocol than hidpp_send_message_sync():
284 * - negative error means transport error
285 * - positive value means protocol error
287 static int __do_hidpp_send_message_sync(struct hidpp_device *hidpp,
288 struct hidpp_report *message,
289 struct hidpp_report *response)
293 __must_hold(&hidpp->send_mutex);
295 hidpp->send_receive_buf = response;
296 hidpp->answer_available = false;
299 * So that we can later validate the answer when it arrives
302 *response = *message;
304 ret = __hidpp_send_report(hidpp->hid_dev, message);
306 dbg_hid("__hidpp_send_report returned err: %d\n", ret);
307 memset(response, 0, sizeof(struct hidpp_report));
311 if (!wait_event_timeout(hidpp->wait, hidpp->answer_available,
313 dbg_hid("%s:timeout waiting for response\n", __func__);
314 memset(response, 0, sizeof(struct hidpp_report));
318 if (response->report_id == REPORT_ID_HIDPP_SHORT &&
319 response->rap.sub_id == HIDPP_ERROR) {
320 ret = response->rap.params[1];
321 dbg_hid("%s:got hidpp error %02X\n", __func__, ret);
325 if ((response->report_id == REPORT_ID_HIDPP_LONG ||
326 response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
327 response->fap.feature_index == HIDPP20_ERROR) {
328 ret = response->fap.params[1];
329 dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
337 * hidpp_send_message_sync() returns 0 in case of success, and something else
338 * in case of a failure.
340 * See __do_hidpp_send_message_sync() for a detailed explanation of the returned
343 static int hidpp_send_message_sync(struct hidpp_device *hidpp,
344 struct hidpp_report *message,
345 struct hidpp_report *response)
350 mutex_lock(&hidpp->send_mutex);
353 ret = __do_hidpp_send_message_sync(hidpp, message, response);
354 if (ret != HIDPP20_ERROR_BUSY)
357 dbg_hid("%s:got busy hidpp 2.0 error %02X, retrying\n", __func__, ret);
358 } while (--max_retries);
360 mutex_unlock(&hidpp->send_mutex);
366 * hidpp_send_fap_command_sync() returns 0 in case of success, and something else
367 * in case of a failure.
369 * See __do_hidpp_send_message_sync() for a detailed explanation of the returned
372 static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
373 u8 feat_index, u8 funcindex_clientid, u8 *params, int param_count,
374 struct hidpp_report *response)
376 struct hidpp_report *message;
379 if (param_count > sizeof(message->fap.params)) {
380 hid_dbg(hidpp->hid_dev,
381 "Invalid number of parameters passed to command (%d != %llu)\n",
383 (unsigned long long) sizeof(message->fap.params));
387 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
391 if (param_count > (HIDPP_REPORT_LONG_LENGTH - 4))
392 message->report_id = REPORT_ID_HIDPP_VERY_LONG;
394 message->report_id = REPORT_ID_HIDPP_LONG;
395 message->fap.feature_index = feat_index;
396 message->fap.funcindex_clientid = funcindex_clientid | LINUX_KERNEL_SW_ID;
397 memcpy(&message->fap.params, params, param_count);
399 ret = hidpp_send_message_sync(hidpp, message, response);
405 * hidpp_send_rap_command_sync() returns 0 in case of success, and something else
406 * in case of a failure.
408 * See __do_hidpp_send_message_sync() for a detailed explanation of the returned
411 static int hidpp_send_rap_command_sync(struct hidpp_device *hidpp_dev,
412 u8 report_id, u8 sub_id, u8 reg_address, u8 *params, int param_count,
413 struct hidpp_report *response)
415 struct hidpp_report *message;
418 /* Send as long report if short reports are not supported. */
419 if (report_id == REPORT_ID_HIDPP_SHORT &&
420 !(hidpp_dev->supported_reports & HIDPP_REPORT_SHORT_SUPPORTED))
421 report_id = REPORT_ID_HIDPP_LONG;
424 case REPORT_ID_HIDPP_SHORT:
425 max_count = HIDPP_REPORT_SHORT_LENGTH - 4;
427 case REPORT_ID_HIDPP_LONG:
428 max_count = HIDPP_REPORT_LONG_LENGTH - 4;
430 case REPORT_ID_HIDPP_VERY_LONG:
431 max_count = hidpp_dev->very_long_report_length - 4;
437 if (param_count > max_count)
440 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
443 message->report_id = report_id;
444 message->rap.sub_id = sub_id;
445 message->rap.reg_address = reg_address;
446 memcpy(&message->rap.params, params, param_count);
448 ret = hidpp_send_message_sync(hidpp_dev, message, response);
453 static void delayed_work_cb(struct work_struct *work)
455 struct hidpp_device *hidpp = container_of(work, struct hidpp_device,
457 hidpp_connect_event(hidpp);
460 static inline bool hidpp_match_answer(struct hidpp_report *question,
461 struct hidpp_report *answer)
463 return (answer->fap.feature_index == question->fap.feature_index) &&
464 (answer->fap.funcindex_clientid == question->fap.funcindex_clientid);
467 static inline bool hidpp_match_error(struct hidpp_report *question,
468 struct hidpp_report *answer)
470 return ((answer->rap.sub_id == HIDPP_ERROR) ||
471 (answer->fap.feature_index == HIDPP20_ERROR)) &&
472 (answer->fap.funcindex_clientid == question->fap.feature_index) &&
473 (answer->fap.params[0] == question->fap.funcindex_clientid);
476 static inline bool hidpp_report_is_connect_event(struct hidpp_device *hidpp,
477 struct hidpp_report *report)
479 return (hidpp->wireless_feature_index &&
480 (report->fap.feature_index == hidpp->wireless_feature_index)) ||
481 ((report->report_id == REPORT_ID_HIDPP_SHORT) &&
482 (report->rap.sub_id == 0x41));
486 * hidpp_prefix_name() prefixes the current given name with "Logitech ".
488 static void hidpp_prefix_name(char **name, int name_length)
490 #define PREFIX_LENGTH 9 /* "Logitech " */
495 if (name_length > PREFIX_LENGTH &&
496 strncmp(*name, "Logitech ", PREFIX_LENGTH) == 0)
497 /* The prefix has is already in the name */
500 new_length = PREFIX_LENGTH + name_length;
501 new_name = kzalloc(new_length, GFP_KERNEL);
505 snprintf(new_name, new_length, "Logitech %s", *name);
513 * Updates the USB wireless_status based on whether the headset
514 * is turned on and reachable.
516 static void hidpp_update_usb_wireless_status(struct hidpp_device *hidpp)
518 struct hid_device *hdev = hidpp->hid_dev;
519 struct usb_interface *intf;
521 if (!(hidpp->quirks & HIDPP_QUIRK_WIRELESS_STATUS))
523 if (!hid_is_usb(hdev))
526 intf = to_usb_interface(hdev->dev.parent);
527 usb_set_wireless_status(intf, hidpp->battery.online ?
528 USB_WIRELESS_STATUS_CONNECTED :
529 USB_WIRELESS_STATUS_DISCONNECTED);
533 * hidpp_scroll_counter_handle_scroll() - Send high- and low-resolution scroll
534 * events given a high-resolution wheel
536 * @input_dev: Pointer to the input device
537 * @counter: a hid_scroll_counter struct describing the wheel.
538 * @hi_res_value: the movement of the wheel, in the mouse's high-resolution
541 * Given a high-resolution movement, this function converts the movement into
542 * fractions of 120 and emits high-resolution scroll events for the input
543 * device. It also uses the multiplier from &struct hid_scroll_counter to
544 * emit low-resolution scroll events when appropriate for
545 * backwards-compatibility with userspace input libraries.
547 static void hidpp_scroll_counter_handle_scroll(struct input_dev *input_dev,
548 struct hidpp_scroll_counter *counter,
551 int low_res_value, remainder, direction;
552 unsigned long long now, previous;
554 hi_res_value = hi_res_value * 120/counter->wheel_multiplier;
555 input_report_rel(input_dev, REL_WHEEL_HI_RES, hi_res_value);
557 remainder = counter->remainder;
558 direction = hi_res_value > 0 ? 1 : -1;
561 previous = counter->last_time;
562 counter->last_time = now;
564 * Reset the remainder after a period of inactivity or when the
565 * direction changes. This prevents the REL_WHEEL emulation point
566 * from sliding for devices that don't always provide the same
567 * number of movements per detent.
569 if (now - previous > 1000000000 || direction != counter->direction)
572 counter->direction = direction;
573 remainder += hi_res_value;
575 /* Some wheels will rest 7/8ths of a detent from the previous detent
576 * after slow movement, so we want the threshold for low-res events to
577 * be in the middle between two detents (e.g. after 4/8ths) as
578 * opposed to on the detents themselves (8/8ths).
580 if (abs(remainder) >= 60) {
581 /* Add (or subtract) 1 because we want to trigger when the wheel
582 * is half-way to the next detent (i.e. scroll 1 detent after a
583 * 1/2 detent movement, 2 detents after a 1 1/2 detent movement,
586 low_res_value = remainder / 120;
587 if (low_res_value == 0)
588 low_res_value = (hi_res_value > 0 ? 1 : -1);
589 input_report_rel(input_dev, REL_WHEEL, low_res_value);
590 remainder -= low_res_value * 120;
592 counter->remainder = remainder;
595 /* -------------------------------------------------------------------------- */
596 /* HIDP++ 1.0 commands */
597 /* -------------------------------------------------------------------------- */
599 #define HIDPP_SET_REGISTER 0x80
600 #define HIDPP_GET_REGISTER 0x81
601 #define HIDPP_SET_LONG_REGISTER 0x82
602 #define HIDPP_GET_LONG_REGISTER 0x83
605 * hidpp10_set_register - Modify a HID++ 1.0 register.
606 * @hidpp_dev: the device to set the register on.
607 * @register_address: the address of the register to modify.
608 * @byte: the byte of the register to modify. Should be less than 3.
609 * @mask: mask of the bits to modify
610 * @value: new values for the bits in mask
611 * Return: 0 if successful, otherwise a negative error code.
613 static int hidpp10_set_register(struct hidpp_device *hidpp_dev,
614 u8 register_address, u8 byte, u8 mask, u8 value)
616 struct hidpp_report response;
618 u8 params[3] = { 0 };
620 ret = hidpp_send_rap_command_sync(hidpp_dev,
621 REPORT_ID_HIDPP_SHORT,
628 memcpy(params, response.rap.params, 3);
630 params[byte] &= ~mask;
631 params[byte] |= value & mask;
633 return hidpp_send_rap_command_sync(hidpp_dev,
634 REPORT_ID_HIDPP_SHORT,
637 params, 3, &response);
640 #define HIDPP_REG_ENABLE_REPORTS 0x00
641 #define HIDPP_ENABLE_CONSUMER_REPORT BIT(0)
642 #define HIDPP_ENABLE_WHEEL_REPORT BIT(2)
643 #define HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT BIT(3)
644 #define HIDPP_ENABLE_BAT_REPORT BIT(4)
645 #define HIDPP_ENABLE_HWHEEL_REPORT BIT(5)
647 static int hidpp10_enable_battery_reporting(struct hidpp_device *hidpp_dev)
649 return hidpp10_set_register(hidpp_dev, HIDPP_REG_ENABLE_REPORTS, 0,
650 HIDPP_ENABLE_BAT_REPORT, HIDPP_ENABLE_BAT_REPORT);
653 #define HIDPP_REG_FEATURES 0x01
654 #define HIDPP_ENABLE_SPECIAL_BUTTON_FUNC BIT(1)
655 #define HIDPP_ENABLE_FAST_SCROLL BIT(6)
657 /* On HID++ 1.0 devices, high-res scroll was called "scrolling acceleration". */
658 static int hidpp10_enable_scrolling_acceleration(struct hidpp_device *hidpp_dev)
660 return hidpp10_set_register(hidpp_dev, HIDPP_REG_FEATURES, 0,
661 HIDPP_ENABLE_FAST_SCROLL, HIDPP_ENABLE_FAST_SCROLL);
664 #define HIDPP_REG_BATTERY_STATUS 0x07
666 static int hidpp10_battery_status_map_level(u8 param)
672 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
675 level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
678 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
681 level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
684 level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
690 static int hidpp10_battery_status_map_status(u8 param)
696 /* discharging (in use) */
697 status = POWER_SUPPLY_STATUS_DISCHARGING;
699 case 0x21: /* (standard) charging */
700 case 0x24: /* fast charging */
701 case 0x25: /* slow charging */
702 status = POWER_SUPPLY_STATUS_CHARGING;
704 case 0x26: /* topping charge */
705 case 0x22: /* charge complete */
706 status = POWER_SUPPLY_STATUS_FULL;
708 case 0x20: /* unknown */
709 status = POWER_SUPPLY_STATUS_UNKNOWN;
712 * 0x01...0x1F = reserved (not charging)
713 * 0x23 = charging error
714 * 0x27..0xff = reserved
717 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
724 static int hidpp10_query_battery_status(struct hidpp_device *hidpp)
726 struct hidpp_report response;
729 ret = hidpp_send_rap_command_sync(hidpp,
730 REPORT_ID_HIDPP_SHORT,
732 HIDPP_REG_BATTERY_STATUS,
737 hidpp->battery.level =
738 hidpp10_battery_status_map_level(response.rap.params[0]);
739 status = hidpp10_battery_status_map_status(response.rap.params[1]);
740 hidpp->battery.status = status;
741 /* the capacity is only available when discharging or full */
742 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
743 status == POWER_SUPPLY_STATUS_FULL;
748 #define HIDPP_REG_BATTERY_MILEAGE 0x0D
750 static int hidpp10_battery_mileage_map_status(u8 param)
754 switch (param >> 6) {
756 /* discharging (in use) */
757 status = POWER_SUPPLY_STATUS_DISCHARGING;
759 case 0x01: /* charging */
760 status = POWER_SUPPLY_STATUS_CHARGING;
762 case 0x02: /* charge complete */
763 status = POWER_SUPPLY_STATUS_FULL;
766 * 0x03 = charging error
769 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
776 static int hidpp10_query_battery_mileage(struct hidpp_device *hidpp)
778 struct hidpp_report response;
781 ret = hidpp_send_rap_command_sync(hidpp,
782 REPORT_ID_HIDPP_SHORT,
784 HIDPP_REG_BATTERY_MILEAGE,
789 hidpp->battery.capacity = response.rap.params[0];
790 status = hidpp10_battery_mileage_map_status(response.rap.params[2]);
791 hidpp->battery.status = status;
792 /* the capacity is only available when discharging or full */
793 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
794 status == POWER_SUPPLY_STATUS_FULL;
799 static int hidpp10_battery_event(struct hidpp_device *hidpp, u8 *data, int size)
801 struct hidpp_report *report = (struct hidpp_report *)data;
802 int status, capacity, level;
805 if (report->report_id != REPORT_ID_HIDPP_SHORT)
808 switch (report->rap.sub_id) {
809 case HIDPP_REG_BATTERY_STATUS:
810 capacity = hidpp->battery.capacity;
811 level = hidpp10_battery_status_map_level(report->rawbytes[1]);
812 status = hidpp10_battery_status_map_status(report->rawbytes[2]);
814 case HIDPP_REG_BATTERY_MILEAGE:
815 capacity = report->rap.params[0];
816 level = hidpp->battery.level;
817 status = hidpp10_battery_mileage_map_status(report->rawbytes[3]);
823 changed = capacity != hidpp->battery.capacity ||
824 level != hidpp->battery.level ||
825 status != hidpp->battery.status;
827 /* the capacity is only available when discharging or full */
828 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
829 status == POWER_SUPPLY_STATUS_FULL;
832 hidpp->battery.level = level;
833 hidpp->battery.status = status;
834 if (hidpp->battery.ps)
835 power_supply_changed(hidpp->battery.ps);
841 #define HIDPP_REG_PAIRING_INFORMATION 0xB5
842 #define HIDPP_EXTENDED_PAIRING 0x30
843 #define HIDPP_DEVICE_NAME 0x40
845 static char *hidpp_unifying_get_name(struct hidpp_device *hidpp_dev)
847 struct hidpp_report response;
849 u8 params[1] = { HIDPP_DEVICE_NAME };
853 ret = hidpp_send_rap_command_sync(hidpp_dev,
854 REPORT_ID_HIDPP_SHORT,
855 HIDPP_GET_LONG_REGISTER,
856 HIDPP_REG_PAIRING_INFORMATION,
857 params, 1, &response);
861 len = response.rap.params[1];
863 if (2 + len > sizeof(response.rap.params))
866 if (len < 4) /* logitech devices are usually at least Xddd */
869 name = kzalloc(len + 1, GFP_KERNEL);
873 memcpy(name, &response.rap.params[2], len);
875 /* include the terminating '\0' */
876 hidpp_prefix_name(&name, len + 1);
881 static int hidpp_unifying_get_serial(struct hidpp_device *hidpp, u32 *serial)
883 struct hidpp_report response;
885 u8 params[1] = { HIDPP_EXTENDED_PAIRING };
887 ret = hidpp_send_rap_command_sync(hidpp,
888 REPORT_ID_HIDPP_SHORT,
889 HIDPP_GET_LONG_REGISTER,
890 HIDPP_REG_PAIRING_INFORMATION,
891 params, 1, &response);
896 * We don't care about LE or BE, we will output it as a string
897 * with %4phD, so we need to keep the order.
899 *serial = *((u32 *)&response.rap.params[1]);
903 static int hidpp_unifying_init(struct hidpp_device *hidpp)
905 struct hid_device *hdev = hidpp->hid_dev;
910 ret = hidpp_unifying_get_serial(hidpp, &serial);
914 snprintf(hdev->uniq, sizeof(hdev->uniq), "%4phD", &serial);
915 dbg_hid("HID++ Unifying: Got serial: %s\n", hdev->uniq);
917 name = hidpp_unifying_get_name(hidpp);
921 snprintf(hdev->name, sizeof(hdev->name), "%s", name);
922 dbg_hid("HID++ Unifying: Got name: %s\n", name);
928 /* -------------------------------------------------------------------------- */
930 /* -------------------------------------------------------------------------- */
932 #define HIDPP_PAGE_ROOT 0x0000
933 #define HIDPP_PAGE_ROOT_IDX 0x00
935 #define CMD_ROOT_GET_FEATURE 0x00
936 #define CMD_ROOT_GET_PROTOCOL_VERSION 0x10
938 static int hidpp_root_get_feature(struct hidpp_device *hidpp, u16 feature,
939 u8 *feature_index, u8 *feature_type)
941 struct hidpp_report response;
943 u8 params[2] = { feature >> 8, feature & 0x00FF };
945 ret = hidpp_send_fap_command_sync(hidpp,
947 CMD_ROOT_GET_FEATURE,
948 params, 2, &response);
952 if (response.fap.params[0] == 0)
955 *feature_index = response.fap.params[0];
956 *feature_type = response.fap.params[1];
961 static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)
963 const u8 ping_byte = 0x5a;
964 u8 ping_data[3] = { 0, 0, ping_byte };
965 struct hidpp_report response;
968 ret = hidpp_send_rap_command_sync(hidpp,
969 REPORT_ID_HIDPP_SHORT,
971 CMD_ROOT_GET_PROTOCOL_VERSION | LINUX_KERNEL_SW_ID,
972 ping_data, sizeof(ping_data), &response);
974 if (ret == HIDPP_ERROR_INVALID_SUBID) {
975 hidpp->protocol_major = 1;
976 hidpp->protocol_minor = 0;
980 /* the device might not be connected */
981 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
985 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
992 if (response.rap.params[2] != ping_byte) {
993 hid_err(hidpp->hid_dev, "%s: ping mismatch 0x%02x != 0x%02x\n",
994 __func__, response.rap.params[2], ping_byte);
998 hidpp->protocol_major = response.rap.params[0];
999 hidpp->protocol_minor = response.rap.params[1];
1002 hid_info(hidpp->hid_dev, "HID++ %u.%u device connected.\n",
1003 hidpp->protocol_major, hidpp->protocol_minor);
1007 /* -------------------------------------------------------------------------- */
1008 /* 0x0003: Device Information */
1009 /* -------------------------------------------------------------------------- */
1011 #define HIDPP_PAGE_DEVICE_INFORMATION 0x0003
1013 #define CMD_GET_DEVICE_INFO 0x00
1015 static int hidpp_get_serial(struct hidpp_device *hidpp, u32 *serial)
1017 struct hidpp_report response;
1022 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_DEVICE_INFORMATION,
1028 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1029 CMD_GET_DEVICE_INFO,
1030 NULL, 0, &response);
1034 /* See hidpp_unifying_get_serial() */
1035 *serial = *((u32 *)&response.rap.params[1]);
1039 static int hidpp_serial_init(struct hidpp_device *hidpp)
1041 struct hid_device *hdev = hidpp->hid_dev;
1045 ret = hidpp_get_serial(hidpp, &serial);
1049 snprintf(hdev->uniq, sizeof(hdev->uniq), "%4phD", &serial);
1050 dbg_hid("HID++ DeviceInformation: Got serial: %s\n", hdev->uniq);
1055 /* -------------------------------------------------------------------------- */
1056 /* 0x0005: GetDeviceNameType */
1057 /* -------------------------------------------------------------------------- */
1059 #define HIDPP_PAGE_GET_DEVICE_NAME_TYPE 0x0005
1061 #define CMD_GET_DEVICE_NAME_TYPE_GET_COUNT 0x00
1062 #define CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME 0x10
1063 #define CMD_GET_DEVICE_NAME_TYPE_GET_TYPE 0x20
1065 static int hidpp_devicenametype_get_count(struct hidpp_device *hidpp,
1066 u8 feature_index, u8 *nameLength)
1068 struct hidpp_report response;
1071 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1072 CMD_GET_DEVICE_NAME_TYPE_GET_COUNT, NULL, 0, &response);
1075 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1082 *nameLength = response.fap.params[0];
1087 static int hidpp_devicenametype_get_device_name(struct hidpp_device *hidpp,
1088 u8 feature_index, u8 char_index, char *device_name, int len_buf)
1090 struct hidpp_report response;
1094 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1095 CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME, &char_index, 1,
1099 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1106 switch (response.report_id) {
1107 case REPORT_ID_HIDPP_VERY_LONG:
1108 count = hidpp->very_long_report_length - 4;
1110 case REPORT_ID_HIDPP_LONG:
1111 count = HIDPP_REPORT_LONG_LENGTH - 4;
1113 case REPORT_ID_HIDPP_SHORT:
1114 count = HIDPP_REPORT_SHORT_LENGTH - 4;
1120 if (len_buf < count)
1123 for (i = 0; i < count; i++)
1124 device_name[i] = response.fap.params[i];
1129 static char *hidpp_get_device_name(struct hidpp_device *hidpp)
1138 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_GET_DEVICE_NAME_TYPE,
1139 &feature_index, &feature_type);
1143 ret = hidpp_devicenametype_get_count(hidpp, feature_index,
1148 name = kzalloc(__name_length + 1, GFP_KERNEL);
1152 while (index < __name_length) {
1153 ret = hidpp_devicenametype_get_device_name(hidpp,
1154 feature_index, index, name + index,
1155 __name_length - index);
1163 /* include the terminating '\0' */
1164 hidpp_prefix_name(&name, __name_length + 1);
1169 /* -------------------------------------------------------------------------- */
1170 /* 0x1000: Battery level status */
1171 /* -------------------------------------------------------------------------- */
1173 #define HIDPP_PAGE_BATTERY_LEVEL_STATUS 0x1000
1175 #define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS 0x00
1176 #define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY 0x10
1178 #define EVENT_BATTERY_LEVEL_STATUS_BROADCAST 0x00
1180 #define FLAG_BATTERY_LEVEL_DISABLE_OSD BIT(0)
1181 #define FLAG_BATTERY_LEVEL_MILEAGE BIT(1)
1182 #define FLAG_BATTERY_LEVEL_RECHARGEABLE BIT(2)
1184 static int hidpp_map_battery_level(int capacity)
1187 return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1189 * The spec says this should be < 31 but some devices report 30
1190 * with brand new batteries and Windows reports 30 as "Good".
1192 else if (capacity < 30)
1193 return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1194 else if (capacity < 81)
1195 return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1196 return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1199 static int hidpp20_batterylevel_map_status_capacity(u8 data[3], int *capacity,
1205 *capacity = data[0];
1206 *next_capacity = data[1];
1207 *level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1209 /* When discharging, we can rely on the device reported capacity.
1210 * For all other states the device reports 0 (unknown).
1213 case 0: /* discharging (in use) */
1214 status = POWER_SUPPLY_STATUS_DISCHARGING;
1215 *level = hidpp_map_battery_level(*capacity);
1217 case 1: /* recharging */
1218 status = POWER_SUPPLY_STATUS_CHARGING;
1220 case 2: /* charge in final stage */
1221 status = POWER_SUPPLY_STATUS_CHARGING;
1223 case 3: /* charge complete */
1224 status = POWER_SUPPLY_STATUS_FULL;
1225 *level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1228 case 4: /* recharging below optimal speed */
1229 status = POWER_SUPPLY_STATUS_CHARGING;
1231 /* 5 = invalid battery type
1233 7 = other charging error */
1235 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1242 static int hidpp20_batterylevel_get_battery_capacity(struct hidpp_device *hidpp,
1249 struct hidpp_report response;
1251 u8 *params = (u8 *)response.fap.params;
1253 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1254 CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS,
1255 NULL, 0, &response);
1256 /* Ignore these intermittent errors */
1257 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1260 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1267 *status = hidpp20_batterylevel_map_status_capacity(params, capacity,
1274 static int hidpp20_batterylevel_get_battery_info(struct hidpp_device *hidpp,
1277 struct hidpp_report response;
1279 u8 *params = (u8 *)response.fap.params;
1280 unsigned int level_count, flags;
1282 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1283 CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY,
1284 NULL, 0, &response);
1286 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1293 level_count = params[0];
1296 if (level_count < 10 || !(flags & FLAG_BATTERY_LEVEL_MILEAGE))
1297 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
1299 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
1304 static int hidpp20_query_battery_info_1000(struct hidpp_device *hidpp)
1308 int status, capacity, next_capacity, level;
1310 if (hidpp->battery.feature_index == 0xff) {
1311 ret = hidpp_root_get_feature(hidpp,
1312 HIDPP_PAGE_BATTERY_LEVEL_STATUS,
1313 &hidpp->battery.feature_index,
1319 ret = hidpp20_batterylevel_get_battery_capacity(hidpp,
1320 hidpp->battery.feature_index,
1322 &next_capacity, &level);
1326 ret = hidpp20_batterylevel_get_battery_info(hidpp,
1327 hidpp->battery.feature_index);
1331 hidpp->battery.status = status;
1332 hidpp->battery.capacity = capacity;
1333 hidpp->battery.level = level;
1334 /* the capacity is only available when discharging or full */
1335 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
1336 status == POWER_SUPPLY_STATUS_FULL;
1341 static int hidpp20_battery_event_1000(struct hidpp_device *hidpp,
1344 struct hidpp_report *report = (struct hidpp_report *)data;
1345 int status, capacity, next_capacity, level;
1348 if (report->fap.feature_index != hidpp->battery.feature_index ||
1349 report->fap.funcindex_clientid != EVENT_BATTERY_LEVEL_STATUS_BROADCAST)
1352 status = hidpp20_batterylevel_map_status_capacity(report->fap.params,
1357 /* the capacity is only available when discharging or full */
1358 hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
1359 status == POWER_SUPPLY_STATUS_FULL;
1361 changed = capacity != hidpp->battery.capacity ||
1362 level != hidpp->battery.level ||
1363 status != hidpp->battery.status;
1366 hidpp->battery.level = level;
1367 hidpp->battery.capacity = capacity;
1368 hidpp->battery.status = status;
1369 if (hidpp->battery.ps)
1370 power_supply_changed(hidpp->battery.ps);
1376 /* -------------------------------------------------------------------------- */
1377 /* 0x1001: Battery voltage */
1378 /* -------------------------------------------------------------------------- */
1380 #define HIDPP_PAGE_BATTERY_VOLTAGE 0x1001
1382 #define CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE 0x00
1384 #define EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST 0x00
1386 static int hidpp20_battery_map_status_voltage(u8 data[3], int *voltage,
1387 int *level, int *charge_type)
1391 long flags = (long) data[2];
1392 *level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1395 switch (flags & 0x07) {
1397 status = POWER_SUPPLY_STATUS_CHARGING;
1400 status = POWER_SUPPLY_STATUS_FULL;
1401 *level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1404 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1407 status = POWER_SUPPLY_STATUS_UNKNOWN;
1411 status = POWER_SUPPLY_STATUS_DISCHARGING;
1413 *charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
1414 if (test_bit(3, &flags)) {
1415 *charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
1417 if (test_bit(4, &flags)) {
1418 *charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1420 if (test_bit(5, &flags)) {
1421 *level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1424 *voltage = get_unaligned_be16(data);
1429 static int hidpp20_battery_get_battery_voltage(struct hidpp_device *hidpp,
1431 int *status, int *voltage,
1432 int *level, int *charge_type)
1434 struct hidpp_report response;
1436 u8 *params = (u8 *)response.fap.params;
1438 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1439 CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE,
1440 NULL, 0, &response);
1443 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1450 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_VOLTAGE;
1452 *status = hidpp20_battery_map_status_voltage(params, voltage,
1453 level, charge_type);
1458 static int hidpp20_map_battery_capacity(struct hid_device *hid_dev, int voltage)
1460 /* NB: This voltage curve doesn't necessarily map perfectly to all
1461 * devices that implement the BATTERY_VOLTAGE feature. This is because
1462 * there are a few devices that use different battery technology.
1465 static const int voltages[100] = {
1466 4186, 4156, 4143, 4133, 4122, 4113, 4103, 4094, 4086, 4075,
1467 4067, 4059, 4051, 4043, 4035, 4027, 4019, 4011, 4003, 3997,
1468 3989, 3983, 3976, 3969, 3961, 3955, 3949, 3942, 3935, 3929,
1469 3922, 3916, 3909, 3902, 3896, 3890, 3883, 3877, 3870, 3865,
1470 3859, 3853, 3848, 3842, 3837, 3833, 3828, 3824, 3819, 3815,
1471 3811, 3808, 3804, 3800, 3797, 3793, 3790, 3787, 3784, 3781,
1472 3778, 3775, 3772, 3770, 3767, 3764, 3762, 3759, 3757, 3754,
1473 3751, 3748, 3744, 3741, 3737, 3734, 3730, 3726, 3724, 3720,
1474 3717, 3714, 3710, 3706, 3702, 3697, 3693, 3688, 3683, 3677,
1475 3671, 3666, 3662, 3658, 3654, 3646, 3633, 3612, 3579, 3537
1480 if (unlikely(voltage < 3500 || voltage >= 5000))
1481 hid_warn_once(hid_dev,
1482 "%s: possibly using the wrong voltage curve\n",
1485 for (i = 0; i < ARRAY_SIZE(voltages); i++) {
1486 if (voltage >= voltages[i])
1487 return ARRAY_SIZE(voltages) - i;
1493 static int hidpp20_query_battery_voltage_info(struct hidpp_device *hidpp)
1497 int status, voltage, level, charge_type;
1499 if (hidpp->battery.voltage_feature_index == 0xff) {
1500 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_BATTERY_VOLTAGE,
1501 &hidpp->battery.voltage_feature_index,
1507 ret = hidpp20_battery_get_battery_voltage(hidpp,
1508 hidpp->battery.voltage_feature_index,
1509 &status, &voltage, &level, &charge_type);
1514 hidpp->battery.status = status;
1515 hidpp->battery.voltage = voltage;
1516 hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
1518 hidpp->battery.level = level;
1519 hidpp->battery.charge_type = charge_type;
1520 hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
1525 static int hidpp20_battery_voltage_event(struct hidpp_device *hidpp,
1528 struct hidpp_report *report = (struct hidpp_report *)data;
1529 int status, voltage, level, charge_type;
1531 if (report->fap.feature_index != hidpp->battery.voltage_feature_index ||
1532 report->fap.funcindex_clientid != EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST)
1535 status = hidpp20_battery_map_status_voltage(report->fap.params, &voltage,
1536 &level, &charge_type);
1538 hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
1540 if (voltage != hidpp->battery.voltage || status != hidpp->battery.status) {
1541 hidpp->battery.voltage = voltage;
1542 hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
1544 hidpp->battery.status = status;
1545 hidpp->battery.level = level;
1546 hidpp->battery.charge_type = charge_type;
1547 if (hidpp->battery.ps)
1548 power_supply_changed(hidpp->battery.ps);
1553 /* -------------------------------------------------------------------------- */
1554 /* 0x1004: Unified battery */
1555 /* -------------------------------------------------------------------------- */
1557 #define HIDPP_PAGE_UNIFIED_BATTERY 0x1004
1559 #define CMD_UNIFIED_BATTERY_GET_CAPABILITIES 0x00
1560 #define CMD_UNIFIED_BATTERY_GET_STATUS 0x10
1562 #define EVENT_UNIFIED_BATTERY_STATUS_EVENT 0x00
1564 #define FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL BIT(0)
1565 #define FLAG_UNIFIED_BATTERY_LEVEL_LOW BIT(1)
1566 #define FLAG_UNIFIED_BATTERY_LEVEL_GOOD BIT(2)
1567 #define FLAG_UNIFIED_BATTERY_LEVEL_FULL BIT(3)
1569 #define FLAG_UNIFIED_BATTERY_FLAGS_RECHARGEABLE BIT(0)
1570 #define FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE BIT(1)
1572 static int hidpp20_unifiedbattery_get_capabilities(struct hidpp_device *hidpp,
1575 struct hidpp_report response;
1577 u8 *params = (u8 *)response.fap.params;
1579 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS ||
1580 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) {
1581 /* we have already set the device capabilities, so let's skip */
1585 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1586 CMD_UNIFIED_BATTERY_GET_CAPABILITIES,
1587 NULL, 0, &response);
1588 /* Ignore these intermittent errors */
1589 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1592 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1600 * If the device supports state of charge (battery percentage) we won't
1601 * export the battery level information. there are 4 possible battery
1602 * levels and they all are optional, this means that the device might
1603 * not support any of them, we are just better off with the battery
1606 if (params[1] & FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE) {
1607 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_PERCENTAGE;
1608 hidpp->battery.supported_levels_1004 = 0;
1610 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
1611 hidpp->battery.supported_levels_1004 = params[0];
1617 static int hidpp20_unifiedbattery_map_status(struct hidpp_device *hidpp,
1619 u8 external_power_status)
1623 switch (charging_status) {
1624 case 0: /* discharging */
1625 status = POWER_SUPPLY_STATUS_DISCHARGING;
1627 case 1: /* charging */
1628 case 2: /* charging slow */
1629 status = POWER_SUPPLY_STATUS_CHARGING;
1631 case 3: /* complete */
1632 status = POWER_SUPPLY_STATUS_FULL;
1635 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1636 hid_info(hidpp->hid_dev, "%s: charging error",
1640 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1647 static int hidpp20_unifiedbattery_map_level(struct hidpp_device *hidpp,
1650 /* cler unsupported level bits */
1651 battery_level &= hidpp->battery.supported_levels_1004;
1653 if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_FULL)
1654 return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1655 else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_GOOD)
1656 return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1657 else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_LOW)
1658 return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1659 else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL)
1660 return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1662 return POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1665 static int hidpp20_unifiedbattery_get_status(struct hidpp_device *hidpp,
1667 u8 *state_of_charge,
1671 struct hidpp_report response;
1673 u8 *params = (u8 *)response.fap.params;
1675 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1676 CMD_UNIFIED_BATTERY_GET_STATUS,
1677 NULL, 0, &response);
1678 /* Ignore these intermittent errors */
1679 if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1682 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1689 *state_of_charge = params[0];
1690 *status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
1691 *level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
1696 static int hidpp20_query_battery_info_1004(struct hidpp_device *hidpp)
1703 if (hidpp->battery.feature_index == 0xff) {
1704 ret = hidpp_root_get_feature(hidpp,
1705 HIDPP_PAGE_UNIFIED_BATTERY,
1706 &hidpp->battery.feature_index,
1712 ret = hidpp20_unifiedbattery_get_capabilities(hidpp,
1713 hidpp->battery.feature_index);
1717 ret = hidpp20_unifiedbattery_get_status(hidpp,
1718 hidpp->battery.feature_index,
1725 hidpp->capabilities |= HIDPP_CAPABILITY_UNIFIED_BATTERY;
1726 hidpp->battery.capacity = state_of_charge;
1727 hidpp->battery.status = status;
1728 hidpp->battery.level = level;
1729 hidpp->battery.online = true;
1734 static int hidpp20_battery_event_1004(struct hidpp_device *hidpp,
1737 struct hidpp_report *report = (struct hidpp_report *)data;
1738 u8 *params = (u8 *)report->fap.params;
1739 int state_of_charge, status, level;
1742 if (report->fap.feature_index != hidpp->battery.feature_index ||
1743 report->fap.funcindex_clientid != EVENT_UNIFIED_BATTERY_STATUS_EVENT)
1746 state_of_charge = params[0];
1747 status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
1748 level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
1750 changed = status != hidpp->battery.status ||
1751 (state_of_charge != hidpp->battery.capacity &&
1752 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) ||
1753 (level != hidpp->battery.level &&
1754 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS);
1757 hidpp->battery.capacity = state_of_charge;
1758 hidpp->battery.status = status;
1759 hidpp->battery.level = level;
1760 if (hidpp->battery.ps)
1761 power_supply_changed(hidpp->battery.ps);
1767 /* -------------------------------------------------------------------------- */
1768 /* Battery feature helpers */
1769 /* -------------------------------------------------------------------------- */
1771 static enum power_supply_property hidpp_battery_props[] = {
1772 POWER_SUPPLY_PROP_ONLINE,
1773 POWER_SUPPLY_PROP_STATUS,
1774 POWER_SUPPLY_PROP_SCOPE,
1775 POWER_SUPPLY_PROP_MODEL_NAME,
1776 POWER_SUPPLY_PROP_MANUFACTURER,
1777 POWER_SUPPLY_PROP_SERIAL_NUMBER,
1778 0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY, */
1779 0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY_LEVEL, */
1780 0, /* placeholder for POWER_SUPPLY_PROP_VOLTAGE_NOW, */
1783 static int hidpp_battery_get_property(struct power_supply *psy,
1784 enum power_supply_property psp,
1785 union power_supply_propval *val)
1787 struct hidpp_device *hidpp = power_supply_get_drvdata(psy);
1791 case POWER_SUPPLY_PROP_STATUS:
1792 val->intval = hidpp->battery.status;
1794 case POWER_SUPPLY_PROP_CAPACITY:
1795 val->intval = hidpp->battery.capacity;
1797 case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
1798 val->intval = hidpp->battery.level;
1800 case POWER_SUPPLY_PROP_SCOPE:
1801 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1803 case POWER_SUPPLY_PROP_ONLINE:
1804 val->intval = hidpp->battery.online;
1806 case POWER_SUPPLY_PROP_MODEL_NAME:
1807 if (!strncmp(hidpp->name, "Logitech ", 9))
1808 val->strval = hidpp->name + 9;
1810 val->strval = hidpp->name;
1812 case POWER_SUPPLY_PROP_MANUFACTURER:
1813 val->strval = "Logitech";
1815 case POWER_SUPPLY_PROP_SERIAL_NUMBER:
1816 val->strval = hidpp->hid_dev->uniq;
1818 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1819 /* hardware reports voltage in mV. sysfs expects uV */
1820 val->intval = hidpp->battery.voltage * 1000;
1822 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1823 val->intval = hidpp->battery.charge_type;
1833 /* -------------------------------------------------------------------------- */
1834 /* 0x1d4b: Wireless device status */
1835 /* -------------------------------------------------------------------------- */
1836 #define HIDPP_PAGE_WIRELESS_DEVICE_STATUS 0x1d4b
1838 static int hidpp_set_wireless_feature_index(struct hidpp_device *hidpp)
1843 ret = hidpp_root_get_feature(hidpp,
1844 HIDPP_PAGE_WIRELESS_DEVICE_STATUS,
1845 &hidpp->wireless_feature_index,
1851 /* -------------------------------------------------------------------------- */
1852 /* 0x1f20: ADC measurement */
1853 /* -------------------------------------------------------------------------- */
1855 #define HIDPP_PAGE_ADC_MEASUREMENT 0x1f20
1857 #define CMD_ADC_MEASUREMENT_GET_ADC_MEASUREMENT 0x00
1859 #define EVENT_ADC_MEASUREMENT_STATUS_BROADCAST 0x00
1861 static int hidpp20_map_adc_measurement_1f20_capacity(struct hid_device *hid_dev, int voltage)
1863 /* NB: This voltage curve doesn't necessarily map perfectly to all
1864 * devices that implement the ADC_MEASUREMENT feature. This is because
1865 * there are a few devices that use different battery technology.
1868 * https://github.com/Sapd/HeadsetControl/blob/acd972be0468e039b93aae81221f20a54d2d60f7/src/devices/logitech_g633_g933_935.c#L44-L52
1870 static const int voltages[100] = {
1871 4030, 4024, 4018, 4011, 4003, 3994, 3985, 3975, 3963, 3951,
1872 3937, 3922, 3907, 3893, 3880, 3868, 3857, 3846, 3837, 3828,
1873 3820, 3812, 3805, 3798, 3791, 3785, 3779, 3773, 3768, 3762,
1874 3757, 3752, 3747, 3742, 3738, 3733, 3729, 3724, 3720, 3716,
1875 3712, 3708, 3704, 3700, 3696, 3692, 3688, 3685, 3681, 3677,
1876 3674, 3670, 3667, 3663, 3660, 3657, 3653, 3650, 3646, 3643,
1877 3640, 3637, 3633, 3630, 3627, 3624, 3620, 3617, 3614, 3611,
1878 3608, 3604, 3601, 3598, 3595, 3592, 3589, 3585, 3582, 3579,
1879 3576, 3573, 3569, 3566, 3563, 3560, 3556, 3553, 3550, 3546,
1880 3543, 3539, 3536, 3532, 3529, 3525, 3499, 3466, 3433, 3399,
1888 if (unlikely(voltage < 3400 || voltage >= 5000))
1889 hid_warn_once(hid_dev,
1890 "%s: possibly using the wrong voltage curve\n",
1893 for (i = 0; i < ARRAY_SIZE(voltages); i++) {
1894 if (voltage >= voltages[i])
1895 return ARRAY_SIZE(voltages) - i;
1901 static int hidpp20_map_adc_measurement_1f20(u8 data[3], int *voltage)
1910 status = POWER_SUPPLY_STATUS_DISCHARGING;
1913 status = POWER_SUPPLY_STATUS_CHARGING;
1916 status = POWER_SUPPLY_STATUS_FULL;
1920 status = POWER_SUPPLY_STATUS_UNKNOWN;
1924 *voltage = get_unaligned_be16(data);
1926 dbg_hid("Parsed 1f20 data as flag 0x%02x voltage %dmV\n",
1932 /* Return value is whether the device is online */
1933 static bool hidpp20_get_adc_measurement_1f20(struct hidpp_device *hidpp,
1935 int *status, int *voltage)
1937 struct hidpp_report response;
1939 u8 *params = (u8 *)response.fap.params;
1941 *status = POWER_SUPPLY_STATUS_UNKNOWN;
1943 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1944 CMD_ADC_MEASUREMENT_GET_ADC_MEASUREMENT,
1945 NULL, 0, &response);
1948 hid_dbg(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1953 *status = hidpp20_map_adc_measurement_1f20(params, voltage);
1957 static int hidpp20_query_adc_measurement_info_1f20(struct hidpp_device *hidpp)
1961 if (hidpp->battery.adc_measurement_feature_index == 0xff) {
1964 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_ADC_MEASUREMENT,
1965 &hidpp->battery.adc_measurement_feature_index,
1970 hidpp->capabilities |= HIDPP_CAPABILITY_ADC_MEASUREMENT;
1973 hidpp->battery.online = hidpp20_get_adc_measurement_1f20(hidpp,
1974 hidpp->battery.adc_measurement_feature_index,
1975 &hidpp->battery.status,
1976 &hidpp->battery.voltage);
1977 hidpp->battery.capacity = hidpp20_map_adc_measurement_1f20_capacity(hidpp->hid_dev,
1978 hidpp->battery.voltage);
1979 hidpp_update_usb_wireless_status(hidpp);
1984 static int hidpp20_adc_measurement_event_1f20(struct hidpp_device *hidpp,
1987 struct hidpp_report *report = (struct hidpp_report *)data;
1988 int status, voltage;
1990 if (report->fap.feature_index != hidpp->battery.adc_measurement_feature_index ||
1991 report->fap.funcindex_clientid != EVENT_ADC_MEASUREMENT_STATUS_BROADCAST)
1994 status = hidpp20_map_adc_measurement_1f20(report->fap.params, &voltage);
1996 hidpp->battery.online = status != POWER_SUPPLY_STATUS_UNKNOWN;
1998 if (voltage != hidpp->battery.voltage || status != hidpp->battery.status) {
1999 hidpp->battery.status = status;
2000 hidpp->battery.voltage = voltage;
2001 hidpp->battery.capacity = hidpp20_map_adc_measurement_1f20_capacity(hidpp->hid_dev, voltage);
2002 if (hidpp->battery.ps)
2003 power_supply_changed(hidpp->battery.ps);
2004 hidpp_update_usb_wireless_status(hidpp);
2009 /* -------------------------------------------------------------------------- */
2010 /* 0x2120: Hi-resolution scrolling */
2011 /* -------------------------------------------------------------------------- */
2013 #define HIDPP_PAGE_HI_RESOLUTION_SCROLLING 0x2120
2015 #define CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE 0x10
2017 static int hidpp_hrs_set_highres_scrolling_mode(struct hidpp_device *hidpp,
2018 bool enabled, u8 *multiplier)
2024 struct hidpp_report response;
2026 ret = hidpp_root_get_feature(hidpp,
2027 HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
2033 params[0] = enabled ? BIT(0) : 0;
2034 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
2035 CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE,
2036 params, sizeof(params), &response);
2039 *multiplier = response.fap.params[1];
2043 /* -------------------------------------------------------------------------- */
2044 /* 0x2121: HiRes Wheel */
2045 /* -------------------------------------------------------------------------- */
2047 #define HIDPP_PAGE_HIRES_WHEEL 0x2121
2049 #define CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY 0x00
2050 #define CMD_HIRES_WHEEL_SET_WHEEL_MODE 0x20
2052 static int hidpp_hrw_get_wheel_capability(struct hidpp_device *hidpp,
2058 struct hidpp_report response;
2060 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
2061 &feature_index, &feature_type);
2063 goto return_default;
2065 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
2066 CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY,
2067 NULL, 0, &response);
2069 goto return_default;
2071 *multiplier = response.fap.params[0];
2074 hid_warn(hidpp->hid_dev,
2075 "Couldn't get wheel multiplier (error %d)\n", ret);
2079 static int hidpp_hrw_set_wheel_mode(struct hidpp_device *hidpp, bool invert,
2080 bool high_resolution, bool use_hidpp)
2086 struct hidpp_report response;
2088 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
2089 &feature_index, &feature_type);
2093 params[0] = (invert ? BIT(2) : 0) |
2094 (high_resolution ? BIT(1) : 0) |
2095 (use_hidpp ? BIT(0) : 0);
2097 return hidpp_send_fap_command_sync(hidpp, feature_index,
2098 CMD_HIRES_WHEEL_SET_WHEEL_MODE,
2099 params, sizeof(params), &response);
2102 /* -------------------------------------------------------------------------- */
2103 /* 0x4301: Solar Keyboard */
2104 /* -------------------------------------------------------------------------- */
2106 #define HIDPP_PAGE_SOLAR_KEYBOARD 0x4301
2108 #define CMD_SOLAR_SET_LIGHT_MEASURE 0x00
2110 #define EVENT_SOLAR_BATTERY_BROADCAST 0x00
2111 #define EVENT_SOLAR_BATTERY_LIGHT_MEASURE 0x10
2112 #define EVENT_SOLAR_CHECK_LIGHT_BUTTON 0x20
2114 static int hidpp_solar_request_battery_event(struct hidpp_device *hidpp)
2116 struct hidpp_report response;
2117 u8 params[2] = { 1, 1 };
2121 if (hidpp->battery.feature_index == 0xff) {
2122 ret = hidpp_root_get_feature(hidpp,
2123 HIDPP_PAGE_SOLAR_KEYBOARD,
2124 &hidpp->battery.solar_feature_index,
2130 ret = hidpp_send_fap_command_sync(hidpp,
2131 hidpp->battery.solar_feature_index,
2132 CMD_SOLAR_SET_LIGHT_MEASURE,
2133 params, 2, &response);
2135 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
2142 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
2147 static int hidpp_solar_battery_event(struct hidpp_device *hidpp,
2150 struct hidpp_report *report = (struct hidpp_report *)data;
2151 int capacity, lux, status;
2154 function = report->fap.funcindex_clientid;
2157 if (report->fap.feature_index != hidpp->battery.solar_feature_index ||
2158 !(function == EVENT_SOLAR_BATTERY_BROADCAST ||
2159 function == EVENT_SOLAR_BATTERY_LIGHT_MEASURE ||
2160 function == EVENT_SOLAR_CHECK_LIGHT_BUTTON))
2163 capacity = report->fap.params[0];
2166 case EVENT_SOLAR_BATTERY_LIGHT_MEASURE:
2167 lux = (report->fap.params[1] << 8) | report->fap.params[2];
2169 status = POWER_SUPPLY_STATUS_CHARGING;
2171 status = POWER_SUPPLY_STATUS_DISCHARGING;
2173 case EVENT_SOLAR_CHECK_LIGHT_BUTTON:
2175 if (capacity < hidpp->battery.capacity)
2176 status = POWER_SUPPLY_STATUS_DISCHARGING;
2178 status = POWER_SUPPLY_STATUS_CHARGING;
2182 if (capacity == 100)
2183 status = POWER_SUPPLY_STATUS_FULL;
2185 hidpp->battery.online = true;
2186 if (capacity != hidpp->battery.capacity ||
2187 status != hidpp->battery.status) {
2188 hidpp->battery.capacity = capacity;
2189 hidpp->battery.status = status;
2190 if (hidpp->battery.ps)
2191 power_supply_changed(hidpp->battery.ps);
2197 /* -------------------------------------------------------------------------- */
2198 /* 0x6010: Touchpad FW items */
2199 /* -------------------------------------------------------------------------- */
2201 #define HIDPP_PAGE_TOUCHPAD_FW_ITEMS 0x6010
2203 #define CMD_TOUCHPAD_FW_ITEMS_SET 0x10
2205 struct hidpp_touchpad_fw_items {
2207 uint8_t desired_state;
2213 * send a set state command to the device by reading the current items->state
2214 * field. items is then filled with the current state.
2216 static int hidpp_touchpad_fw_items_set(struct hidpp_device *hidpp,
2218 struct hidpp_touchpad_fw_items *items)
2220 struct hidpp_report response;
2222 u8 *params = (u8 *)response.fap.params;
2224 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
2225 CMD_TOUCHPAD_FW_ITEMS_SET, &items->state, 1, &response);
2228 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
2235 items->presence = params[0];
2236 items->desired_state = params[1];
2237 items->state = params[2];
2238 items->persistent = params[3];
2243 /* -------------------------------------------------------------------------- */
2244 /* 0x6100: TouchPadRawXY */
2245 /* -------------------------------------------------------------------------- */
2247 #define HIDPP_PAGE_TOUCHPAD_RAW_XY 0x6100
2249 #define CMD_TOUCHPAD_GET_RAW_INFO 0x00
2250 #define CMD_TOUCHPAD_SET_RAW_REPORT_STATE 0x20
2252 #define EVENT_TOUCHPAD_RAW_XY 0x00
2254 #define TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT 0x01
2255 #define TOUCHPAD_RAW_XY_ORIGIN_UPPER_LEFT 0x03
2257 struct hidpp_touchpad_raw_info {
2268 struct hidpp_touchpad_raw_xy_finger {
2278 struct hidpp_touchpad_raw_xy {
2280 struct hidpp_touchpad_raw_xy_finger fingers[2];
2287 static int hidpp_touchpad_get_raw_info(struct hidpp_device *hidpp,
2288 u8 feature_index, struct hidpp_touchpad_raw_info *raw_info)
2290 struct hidpp_report response;
2292 u8 *params = (u8 *)response.fap.params;
2294 ret = hidpp_send_fap_command_sync(hidpp, feature_index,
2295 CMD_TOUCHPAD_GET_RAW_INFO, NULL, 0, &response);
2298 hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
2305 raw_info->x_size = get_unaligned_be16(¶ms[0]);
2306 raw_info->y_size = get_unaligned_be16(¶ms[2]);
2307 raw_info->z_range = params[4];
2308 raw_info->area_range = params[5];
2309 raw_info->maxcontacts = params[7];
2310 raw_info->origin = params[8];
2311 /* res is given in unit per inch */
2312 raw_info->res = get_unaligned_be16(¶ms[13]) * 2 / 51;
2317 static int hidpp_touchpad_set_raw_report_state(struct hidpp_device *hidpp_dev,
2318 u8 feature_index, bool send_raw_reports,
2319 bool sensor_enhanced_settings)
2321 struct hidpp_report response;
2325 * bit 0 - enable raw
2326 * bit 1 - 16bit Z, no area
2327 * bit 2 - enhanced sensitivity
2328 * bit 3 - width, height (4 bits each) instead of area
2329 * bit 4 - send raw + gestures (degrades smoothness)
2330 * remaining bits - reserved
2332 u8 params = send_raw_reports | (sensor_enhanced_settings << 2);
2334 return hidpp_send_fap_command_sync(hidpp_dev, feature_index,
2335 CMD_TOUCHPAD_SET_RAW_REPORT_STATE, ¶ms, 1, &response);
2338 static void hidpp_touchpad_touch_event(u8 *data,
2339 struct hidpp_touchpad_raw_xy_finger *finger)
2341 u8 x_m = data[0] << 2;
2342 u8 y_m = data[2] << 2;
2344 finger->x = x_m << 6 | data[1];
2345 finger->y = y_m << 6 | data[3];
2347 finger->contact_type = data[0] >> 6;
2348 finger->contact_status = data[2] >> 6;
2350 finger->z = data[4];
2351 finger->area = data[5];
2352 finger->finger_id = data[6] >> 4;
2355 static void hidpp_touchpad_raw_xy_event(struct hidpp_device *hidpp_dev,
2356 u8 *data, struct hidpp_touchpad_raw_xy *raw_xy)
2358 memset(raw_xy, 0, sizeof(struct hidpp_touchpad_raw_xy));
2359 raw_xy->end_of_frame = data[8] & 0x01;
2360 raw_xy->spurious_flag = (data[8] >> 1) & 0x01;
2361 raw_xy->finger_count = data[15] & 0x0f;
2362 raw_xy->button = (data[8] >> 2) & 0x01;
2364 if (raw_xy->finger_count) {
2365 hidpp_touchpad_touch_event(&data[2], &raw_xy->fingers[0]);
2366 hidpp_touchpad_touch_event(&data[9], &raw_xy->fingers[1]);
2370 /* -------------------------------------------------------------------------- */
2371 /* 0x8123: Force feedback support */
2372 /* -------------------------------------------------------------------------- */
2374 #define HIDPP_FF_GET_INFO 0x01
2375 #define HIDPP_FF_RESET_ALL 0x11
2376 #define HIDPP_FF_DOWNLOAD_EFFECT 0x21
2377 #define HIDPP_FF_SET_EFFECT_STATE 0x31
2378 #define HIDPP_FF_DESTROY_EFFECT 0x41
2379 #define HIDPP_FF_GET_APERTURE 0x51
2380 #define HIDPP_FF_SET_APERTURE 0x61
2381 #define HIDPP_FF_GET_GLOBAL_GAINS 0x71
2382 #define HIDPP_FF_SET_GLOBAL_GAINS 0x81
2384 #define HIDPP_FF_EFFECT_STATE_GET 0x00
2385 #define HIDPP_FF_EFFECT_STATE_STOP 0x01
2386 #define HIDPP_FF_EFFECT_STATE_PLAY 0x02
2387 #define HIDPP_FF_EFFECT_STATE_PAUSE 0x03
2389 #define HIDPP_FF_EFFECT_CONSTANT 0x00
2390 #define HIDPP_FF_EFFECT_PERIODIC_SINE 0x01
2391 #define HIDPP_FF_EFFECT_PERIODIC_SQUARE 0x02
2392 #define HIDPP_FF_EFFECT_PERIODIC_TRIANGLE 0x03
2393 #define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP 0x04
2394 #define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN 0x05
2395 #define HIDPP_FF_EFFECT_SPRING 0x06
2396 #define HIDPP_FF_EFFECT_DAMPER 0x07
2397 #define HIDPP_FF_EFFECT_FRICTION 0x08
2398 #define HIDPP_FF_EFFECT_INERTIA 0x09
2399 #define HIDPP_FF_EFFECT_RAMP 0x0A
2401 #define HIDPP_FF_EFFECT_AUTOSTART 0x80
2403 #define HIDPP_FF_EFFECTID_NONE -1
2404 #define HIDPP_FF_EFFECTID_AUTOCENTER -2
2405 #define HIDPP_AUTOCENTER_PARAMS_LENGTH 18
2407 #define HIDPP_FF_MAX_PARAMS 20
2408 #define HIDPP_FF_RESERVED_SLOTS 1
2410 struct hidpp_ff_private_data {
2411 struct hidpp_device *hidpp;
2419 struct workqueue_struct *wq;
2420 atomic_t workqueue_size;
2423 struct hidpp_ff_work_data {
2424 struct work_struct work;
2425 struct hidpp_ff_private_data *data;
2428 u8 params[HIDPP_FF_MAX_PARAMS];
2432 static const signed short hidpp_ff_effects[] = {
2447 static const signed short hidpp_ff_effects_v2[] = {
2454 static const u8 HIDPP_FF_CONDITION_CMDS[] = {
2455 HIDPP_FF_EFFECT_SPRING,
2456 HIDPP_FF_EFFECT_FRICTION,
2457 HIDPP_FF_EFFECT_DAMPER,
2458 HIDPP_FF_EFFECT_INERTIA
2461 static const char *HIDPP_FF_CONDITION_NAMES[] = {
2469 static u8 hidpp_ff_find_effect(struct hidpp_ff_private_data *data, int effect_id)
2473 for (i = 0; i < data->num_effects; i++)
2474 if (data->effect_ids[i] == effect_id)
2480 static void hidpp_ff_work_handler(struct work_struct *w)
2482 struct hidpp_ff_work_data *wd = container_of(w, struct hidpp_ff_work_data, work);
2483 struct hidpp_ff_private_data *data = wd->data;
2484 struct hidpp_report response;
2488 /* add slot number if needed */
2489 switch (wd->effect_id) {
2490 case HIDPP_FF_EFFECTID_AUTOCENTER:
2491 wd->params[0] = data->slot_autocenter;
2493 case HIDPP_FF_EFFECTID_NONE:
2494 /* leave slot as zero */
2497 /* find current slot for effect */
2498 wd->params[0] = hidpp_ff_find_effect(data, wd->effect_id);
2502 /* send command and wait for reply */
2503 ret = hidpp_send_fap_command_sync(data->hidpp, data->feature_index,
2504 wd->command, wd->params, wd->size, &response);
2507 hid_err(data->hidpp->hid_dev, "Failed to send command to device!\n");
2511 /* parse return data */
2512 switch (wd->command) {
2513 case HIDPP_FF_DOWNLOAD_EFFECT:
2514 slot = response.fap.params[0];
2515 if (slot > 0 && slot <= data->num_effects) {
2516 if (wd->effect_id >= 0)
2517 /* regular effect uploaded */
2518 data->effect_ids[slot-1] = wd->effect_id;
2519 else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
2520 /* autocenter spring uploaded */
2521 data->slot_autocenter = slot;
2524 case HIDPP_FF_DESTROY_EFFECT:
2525 if (wd->effect_id >= 0)
2526 /* regular effect destroyed */
2527 data->effect_ids[wd->params[0]-1] = -1;
2528 else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
2529 /* autocenter spring destoyed */
2530 data->slot_autocenter = 0;
2532 case HIDPP_FF_SET_GLOBAL_GAINS:
2533 data->gain = (wd->params[0] << 8) + wd->params[1];
2535 case HIDPP_FF_SET_APERTURE:
2536 data->range = (wd->params[0] << 8) + wd->params[1];
2539 /* no action needed */
2544 atomic_dec(&data->workqueue_size);
2548 static int hidpp_ff_queue_work(struct hidpp_ff_private_data *data, int effect_id, u8 command, u8 *params, u8 size)
2550 struct hidpp_ff_work_data *wd = kzalloc(sizeof(*wd), GFP_KERNEL);
2556 INIT_WORK(&wd->work, hidpp_ff_work_handler);
2559 wd->effect_id = effect_id;
2560 wd->command = command;
2562 memcpy(wd->params, params, size);
2564 s = atomic_inc_return(&data->workqueue_size);
2565 queue_work(data->wq, &wd->work);
2567 /* warn about excessive queue size */
2568 if (s >= 20 && s % 20 == 0)
2569 hid_warn(data->hidpp->hid_dev, "Force feedback command queue contains %d commands, causing substantial delays!", s);
2574 static int hidpp_ff_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old)
2576 struct hidpp_ff_private_data *data = dev->ff->private;
2581 /* set common parameters */
2582 params[2] = effect->replay.length >> 8;
2583 params[3] = effect->replay.length & 255;
2584 params[4] = effect->replay.delay >> 8;
2585 params[5] = effect->replay.delay & 255;
2587 switch (effect->type) {
2589 force = (effect->u.constant.level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2590 params[1] = HIDPP_FF_EFFECT_CONSTANT;
2591 params[6] = force >> 8;
2592 params[7] = force & 255;
2593 params[8] = effect->u.constant.envelope.attack_level >> 7;
2594 params[9] = effect->u.constant.envelope.attack_length >> 8;
2595 params[10] = effect->u.constant.envelope.attack_length & 255;
2596 params[11] = effect->u.constant.envelope.fade_level >> 7;
2597 params[12] = effect->u.constant.envelope.fade_length >> 8;
2598 params[13] = effect->u.constant.envelope.fade_length & 255;
2600 dbg_hid("Uploading constant force level=%d in dir %d = %d\n",
2601 effect->u.constant.level,
2602 effect->direction, force);
2603 dbg_hid(" envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2604 effect->u.constant.envelope.attack_level,
2605 effect->u.constant.envelope.attack_length,
2606 effect->u.constant.envelope.fade_level,
2607 effect->u.constant.envelope.fade_length);
2611 switch (effect->u.periodic.waveform) {
2613 params[1] = HIDPP_FF_EFFECT_PERIODIC_SINE;
2616 params[1] = HIDPP_FF_EFFECT_PERIODIC_SQUARE;
2619 params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP;
2622 params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN;
2625 params[1] = HIDPP_FF_EFFECT_PERIODIC_TRIANGLE;
2628 hid_err(data->hidpp->hid_dev, "Unexpected periodic waveform type %i!\n", effect->u.periodic.waveform);
2631 force = (effect->u.periodic.magnitude * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2632 params[6] = effect->u.periodic.magnitude >> 8;
2633 params[7] = effect->u.periodic.magnitude & 255;
2634 params[8] = effect->u.periodic.offset >> 8;
2635 params[9] = effect->u.periodic.offset & 255;
2636 params[10] = effect->u.periodic.period >> 8;
2637 params[11] = effect->u.periodic.period & 255;
2638 params[12] = effect->u.periodic.phase >> 8;
2639 params[13] = effect->u.periodic.phase & 255;
2640 params[14] = effect->u.periodic.envelope.attack_level >> 7;
2641 params[15] = effect->u.periodic.envelope.attack_length >> 8;
2642 params[16] = effect->u.periodic.envelope.attack_length & 255;
2643 params[17] = effect->u.periodic.envelope.fade_level >> 7;
2644 params[18] = effect->u.periodic.envelope.fade_length >> 8;
2645 params[19] = effect->u.periodic.envelope.fade_length & 255;
2647 dbg_hid("Uploading periodic force mag=%d/dir=%d, offset=%d, period=%d ms, phase=%d\n",
2648 effect->u.periodic.magnitude, effect->direction,
2649 effect->u.periodic.offset,
2650 effect->u.periodic.period,
2651 effect->u.periodic.phase);
2652 dbg_hid(" envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2653 effect->u.periodic.envelope.attack_level,
2654 effect->u.periodic.envelope.attack_length,
2655 effect->u.periodic.envelope.fade_level,
2656 effect->u.periodic.envelope.fade_length);
2660 params[1] = HIDPP_FF_EFFECT_RAMP;
2661 force = (effect->u.ramp.start_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2662 params[6] = force >> 8;
2663 params[7] = force & 255;
2664 force = (effect->u.ramp.end_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2665 params[8] = force >> 8;
2666 params[9] = force & 255;
2667 params[10] = effect->u.ramp.envelope.attack_level >> 7;
2668 params[11] = effect->u.ramp.envelope.attack_length >> 8;
2669 params[12] = effect->u.ramp.envelope.attack_length & 255;
2670 params[13] = effect->u.ramp.envelope.fade_level >> 7;
2671 params[14] = effect->u.ramp.envelope.fade_length >> 8;
2672 params[15] = effect->u.ramp.envelope.fade_length & 255;
2674 dbg_hid("Uploading ramp force level=%d -> %d in dir %d = %d\n",
2675 effect->u.ramp.start_level,
2676 effect->u.ramp.end_level,
2677 effect->direction, force);
2678 dbg_hid(" envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2679 effect->u.ramp.envelope.attack_level,
2680 effect->u.ramp.envelope.attack_length,
2681 effect->u.ramp.envelope.fade_level,
2682 effect->u.ramp.envelope.fade_length);
2688 params[1] = HIDPP_FF_CONDITION_CMDS[effect->type - FF_SPRING];
2689 params[6] = effect->u.condition[0].left_saturation >> 9;
2690 params[7] = (effect->u.condition[0].left_saturation >> 1) & 255;
2691 params[8] = effect->u.condition[0].left_coeff >> 8;
2692 params[9] = effect->u.condition[0].left_coeff & 255;
2693 params[10] = effect->u.condition[0].deadband >> 9;
2694 params[11] = (effect->u.condition[0].deadband >> 1) & 255;
2695 params[12] = effect->u.condition[0].center >> 8;
2696 params[13] = effect->u.condition[0].center & 255;
2697 params[14] = effect->u.condition[0].right_coeff >> 8;
2698 params[15] = effect->u.condition[0].right_coeff & 255;
2699 params[16] = effect->u.condition[0].right_saturation >> 9;
2700 params[17] = (effect->u.condition[0].right_saturation >> 1) & 255;
2702 dbg_hid("Uploading %s force left coeff=%d, left sat=%d, right coeff=%d, right sat=%d\n",
2703 HIDPP_FF_CONDITION_NAMES[effect->type - FF_SPRING],
2704 effect->u.condition[0].left_coeff,
2705 effect->u.condition[0].left_saturation,
2706 effect->u.condition[0].right_coeff,
2707 effect->u.condition[0].right_saturation);
2708 dbg_hid(" deadband=%d, center=%d\n",
2709 effect->u.condition[0].deadband,
2710 effect->u.condition[0].center);
2713 hid_err(data->hidpp->hid_dev, "Unexpected force type %i!\n", effect->type);
2717 return hidpp_ff_queue_work(data, effect->id, HIDPP_FF_DOWNLOAD_EFFECT, params, size);
2720 static int hidpp_ff_playback(struct input_dev *dev, int effect_id, int value)
2722 struct hidpp_ff_private_data *data = dev->ff->private;
2725 params[1] = value ? HIDPP_FF_EFFECT_STATE_PLAY : HIDPP_FF_EFFECT_STATE_STOP;
2727 dbg_hid("St%sing playback of effect %d.\n", value?"art":"opp", effect_id);
2729 return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_SET_EFFECT_STATE, params, ARRAY_SIZE(params));
2732 static int hidpp_ff_erase_effect(struct input_dev *dev, int effect_id)
2734 struct hidpp_ff_private_data *data = dev->ff->private;
2737 dbg_hid("Erasing effect %d.\n", effect_id);
2739 return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_DESTROY_EFFECT, &slot, 1);
2742 static void hidpp_ff_set_autocenter(struct input_dev *dev, u16 magnitude)
2744 struct hidpp_ff_private_data *data = dev->ff->private;
2745 u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH];
2747 dbg_hid("Setting autocenter to %d.\n", magnitude);
2749 /* start a standard spring effect */
2750 params[1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART;
2751 /* zero delay and duration */
2752 params[2] = params[3] = params[4] = params[5] = 0;
2753 /* set coeff to 25% of saturation */
2754 params[8] = params[14] = magnitude >> 11;
2755 params[9] = params[15] = (magnitude >> 3) & 255;
2756 params[6] = params[16] = magnitude >> 9;
2757 params[7] = params[17] = (magnitude >> 1) & 255;
2758 /* zero deadband and center */
2759 params[10] = params[11] = params[12] = params[13] = 0;
2761 hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_AUTOCENTER, HIDPP_FF_DOWNLOAD_EFFECT, params, ARRAY_SIZE(params));
2764 static void hidpp_ff_set_gain(struct input_dev *dev, u16 gain)
2766 struct hidpp_ff_private_data *data = dev->ff->private;
2769 dbg_hid("Setting gain to %d.\n", gain);
2771 params[0] = gain >> 8;
2772 params[1] = gain & 255;
2773 params[2] = 0; /* no boost */
2776 hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_NONE, HIDPP_FF_SET_GLOBAL_GAINS, params, ARRAY_SIZE(params));
2779 static ssize_t hidpp_ff_range_show(struct device *dev, struct device_attribute *attr, char *buf)
2781 struct hid_device *hid = to_hid_device(dev);
2782 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2783 struct input_dev *idev = hidinput->input;
2784 struct hidpp_ff_private_data *data = idev->ff->private;
2786 return scnprintf(buf, PAGE_SIZE, "%u\n", data->range);
2789 static ssize_t hidpp_ff_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2791 struct hid_device *hid = to_hid_device(dev);
2792 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2793 struct input_dev *idev = hidinput->input;
2794 struct hidpp_ff_private_data *data = idev->ff->private;
2796 int range = simple_strtoul(buf, NULL, 10);
2798 range = clamp(range, 180, 900);
2800 params[0] = range >> 8;
2801 params[1] = range & 0x00FF;
2803 hidpp_ff_queue_work(data, -1, HIDPP_FF_SET_APERTURE, params, ARRAY_SIZE(params));
2808 static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, hidpp_ff_range_show, hidpp_ff_range_store);
2810 static void hidpp_ff_destroy(struct ff_device *ff)
2812 struct hidpp_ff_private_data *data = ff->private;
2813 struct hid_device *hid = data->hidpp->hid_dev;
2815 hid_info(hid, "Unloading HID++ force feedback.\n");
2817 device_remove_file(&hid->dev, &dev_attr_range);
2818 destroy_workqueue(data->wq);
2819 kfree(data->effect_ids);
2822 static int hidpp_ff_init(struct hidpp_device *hidpp,
2823 struct hidpp_ff_private_data *data)
2825 struct hid_device *hid = hidpp->hid_dev;
2826 struct hid_input *hidinput;
2827 struct input_dev *dev;
2828 struct usb_device_descriptor *udesc;
2830 struct ff_device *ff;
2831 int error, j, num_slots = data->num_effects;
2834 if (!hid_is_usb(hid)) {
2835 hid_err(hid, "device is not USB\n");
2839 if (list_empty(&hid->inputs)) {
2840 hid_err(hid, "no inputs found\n");
2843 hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2844 dev = hidinput->input;
2847 hid_err(hid, "Struct input_dev not set!\n");
2851 /* Get firmware release */
2852 udesc = &(hid_to_usb_dev(hid)->descriptor);
2853 bcdDevice = le16_to_cpu(udesc->bcdDevice);
2854 version = bcdDevice & 255;
2856 /* Set supported force feedback capabilities */
2857 for (j = 0; hidpp_ff_effects[j] >= 0; j++)
2858 set_bit(hidpp_ff_effects[j], dev->ffbit);
2860 for (j = 0; hidpp_ff_effects_v2[j] >= 0; j++)
2861 set_bit(hidpp_ff_effects_v2[j], dev->ffbit);
2863 error = input_ff_create(dev, num_slots);
2866 hid_err(dev, "Failed to create FF device!\n");
2870 * Create a copy of passed data, so we can transfer memory
2871 * ownership to FF core
2873 data = kmemdup(data, sizeof(*data), GFP_KERNEL);
2876 data->effect_ids = kcalloc(num_slots, sizeof(int), GFP_KERNEL);
2877 if (!data->effect_ids) {
2881 data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
2883 kfree(data->effect_ids);
2888 data->hidpp = hidpp;
2889 data->version = version;
2890 for (j = 0; j < num_slots; j++)
2891 data->effect_ids[j] = -1;
2896 ff->upload = hidpp_ff_upload_effect;
2897 ff->erase = hidpp_ff_erase_effect;
2898 ff->playback = hidpp_ff_playback;
2899 ff->set_gain = hidpp_ff_set_gain;
2900 ff->set_autocenter = hidpp_ff_set_autocenter;
2901 ff->destroy = hidpp_ff_destroy;
2903 /* Create sysfs interface */
2904 error = device_create_file(&(hidpp->hid_dev->dev), &dev_attr_range);
2906 hid_warn(hidpp->hid_dev, "Unable to create sysfs interface for \"range\", errno %d!\n", error);
2908 /* init the hardware command queue */
2909 atomic_set(&data->workqueue_size, 0);
2911 hid_info(hid, "Force feedback support loaded (firmware release %d).\n",
2917 /* ************************************************************************** */
2919 /* Device Support */
2921 /* ************************************************************************** */
2923 /* -------------------------------------------------------------------------- */
2924 /* Touchpad HID++ devices */
2925 /* -------------------------------------------------------------------------- */
2927 #define WTP_MANUAL_RESOLUTION 39
2932 u8 mt_feature_index;
2933 u8 button_feature_index;
2936 unsigned int resolution;
2939 static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
2940 struct hid_field *field, struct hid_usage *usage,
2941 unsigned long **bit, int *max)
2946 static void wtp_populate_input(struct hidpp_device *hidpp,
2947 struct input_dev *input_dev)
2949 struct wtp_data *wd = hidpp->private_data;
2951 __set_bit(EV_ABS, input_dev->evbit);
2952 __set_bit(EV_KEY, input_dev->evbit);
2953 __clear_bit(EV_REL, input_dev->evbit);
2954 __clear_bit(EV_LED, input_dev->evbit);
2956 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, wd->x_size, 0, 0);
2957 input_abs_set_res(input_dev, ABS_MT_POSITION_X, wd->resolution);
2958 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, wd->y_size, 0, 0);
2959 input_abs_set_res(input_dev, ABS_MT_POSITION_Y, wd->resolution);
2961 /* Max pressure is not given by the devices, pick one */
2962 input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 50, 0, 0);
2964 input_set_capability(input_dev, EV_KEY, BTN_LEFT);
2966 if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS)
2967 input_set_capability(input_dev, EV_KEY, BTN_RIGHT);
2969 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
2971 input_mt_init_slots(input_dev, wd->maxcontacts, INPUT_MT_POINTER |
2972 INPUT_MT_DROP_UNUSED);
2975 static void wtp_touch_event(struct hidpp_device *hidpp,
2976 struct hidpp_touchpad_raw_xy_finger *touch_report)
2978 struct wtp_data *wd = hidpp->private_data;
2981 if (!touch_report->finger_id || touch_report->contact_type)
2982 /* no actual data */
2985 slot = input_mt_get_slot_by_key(hidpp->input, touch_report->finger_id);
2987 input_mt_slot(hidpp->input, slot);
2988 input_mt_report_slot_state(hidpp->input, MT_TOOL_FINGER,
2989 touch_report->contact_status);
2990 if (touch_report->contact_status) {
2991 input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_X,
2993 input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_Y,
2994 wd->flip_y ? wd->y_size - touch_report->y :
2996 input_event(hidpp->input, EV_ABS, ABS_MT_PRESSURE,
2997 touch_report->area);
3001 static void wtp_send_raw_xy_event(struct hidpp_device *hidpp,
3002 struct hidpp_touchpad_raw_xy *raw)
3006 for (i = 0; i < 2; i++)
3007 wtp_touch_event(hidpp, &(raw->fingers[i]));
3009 if (raw->end_of_frame &&
3010 !(hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS))
3011 input_event(hidpp->input, EV_KEY, BTN_LEFT, raw->button);
3013 if (raw->end_of_frame || raw->finger_count <= 2) {
3014 input_mt_sync_frame(hidpp->input);
3015 input_sync(hidpp->input);
3019 static int wtp_mouse_raw_xy_event(struct hidpp_device *hidpp, u8 *data)
3021 struct wtp_data *wd = hidpp->private_data;
3022 u8 c1_area = ((data[7] & 0xf) * (data[7] & 0xf) +
3023 (data[7] >> 4) * (data[7] >> 4)) / 2;
3024 u8 c2_area = ((data[13] & 0xf) * (data[13] & 0xf) +
3025 (data[13] >> 4) * (data[13] >> 4)) / 2;
3026 struct hidpp_touchpad_raw_xy raw = {
3027 .timestamp = data[1],
3031 .contact_status = !!data[7],
3032 .x = get_unaligned_le16(&data[3]),
3033 .y = get_unaligned_le16(&data[5]),
3036 .finger_id = data[2],
3039 .contact_status = !!data[13],
3040 .x = get_unaligned_le16(&data[9]),
3041 .y = get_unaligned_le16(&data[11]),
3044 .finger_id = data[8],
3047 .finger_count = wd->maxcontacts,
3049 .end_of_frame = (data[0] >> 7) == 0,
3050 .button = data[0] & 0x01,
3053 wtp_send_raw_xy_event(hidpp, &raw);
3058 static int wtp_raw_event(struct hid_device *hdev, u8 *data, int size)
3060 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3061 struct wtp_data *wd = hidpp->private_data;
3062 struct hidpp_report *report = (struct hidpp_report *)data;
3063 struct hidpp_touchpad_raw_xy raw;
3065 if (!wd || !hidpp->input)
3071 hid_err(hdev, "Received HID report of bad size (%d)",
3075 if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) {
3076 input_event(hidpp->input, EV_KEY, BTN_LEFT,
3077 !!(data[1] & 0x01));
3078 input_event(hidpp->input, EV_KEY, BTN_RIGHT,
3079 !!(data[1] & 0x02));
3080 input_sync(hidpp->input);
3085 return wtp_mouse_raw_xy_event(hidpp, &data[7]);
3087 case REPORT_ID_HIDPP_LONG:
3088 /* size is already checked in hidpp_raw_event. */
3089 if ((report->fap.feature_index != wd->mt_feature_index) ||
3090 (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY))
3092 hidpp_touchpad_raw_xy_event(hidpp, data + 4, &raw);
3094 wtp_send_raw_xy_event(hidpp, &raw);
3101 static int wtp_get_config(struct hidpp_device *hidpp)
3103 struct wtp_data *wd = hidpp->private_data;
3104 struct hidpp_touchpad_raw_info raw_info = {0};
3108 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_TOUCHPAD_RAW_XY,
3109 &wd->mt_feature_index, &feature_type);
3111 /* means that the device is not powered up */
3114 ret = hidpp_touchpad_get_raw_info(hidpp, wd->mt_feature_index,
3119 wd->x_size = raw_info.x_size;
3120 wd->y_size = raw_info.y_size;
3121 wd->maxcontacts = raw_info.maxcontacts;
3122 wd->flip_y = raw_info.origin == TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT;
3123 wd->resolution = raw_info.res;
3124 if (!wd->resolution)
3125 wd->resolution = WTP_MANUAL_RESOLUTION;
3130 static int wtp_allocate(struct hid_device *hdev, const struct hid_device_id *id)
3132 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3133 struct wtp_data *wd;
3135 wd = devm_kzalloc(&hdev->dev, sizeof(struct wtp_data),
3140 hidpp->private_data = wd;
3145 static int wtp_connect(struct hid_device *hdev, bool connected)
3147 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3148 struct wtp_data *wd = hidpp->private_data;
3152 ret = wtp_get_config(hidpp);
3154 hid_err(hdev, "Can not get wtp config: %d\n", ret);
3159 return hidpp_touchpad_set_raw_report_state(hidpp, wd->mt_feature_index,
3163 /* ------------------------------------------------------------------------- */
3164 /* Logitech M560 devices */
3165 /* ------------------------------------------------------------------------- */
3168 * Logitech M560 protocol overview
3170 * The Logitech M560 mouse, is designed for windows 8. When the middle and/or
3171 * the sides buttons are pressed, it sends some keyboard keys events
3172 * instead of buttons ones.
3173 * To complicate things further, the middle button keys sequence
3174 * is different from the odd press and the even press.
3176 * forward button -> Super_R
3177 * backward button -> Super_L+'d' (press only)
3178 * middle button -> 1st time: Alt_L+SuperL+XF86TouchpadOff (press only)
3179 * 2nd time: left-click (press only)
3180 * NB: press-only means that when the button is pressed, the
3181 * KeyPress/ButtonPress and KeyRelease/ButtonRelease events are generated
3182 * together sequentially; instead when the button is released, no event is
3186 * 10<xx>0a 3500af03 (where <xx> is the mouse id),
3187 * the mouse reacts differently:
3188 * - it never sends a keyboard key event
3189 * - for the three mouse button it sends:
3190 * middle button press 11<xx>0a 3500af00...
3191 * side 1 button (forward) press 11<xx>0a 3500b000...
3192 * side 2 button (backward) press 11<xx>0a 3500ae00...
3193 * middle/side1/side2 button release 11<xx>0a 35000000...
3196 static const u8 m560_config_parameter[] = {0x00, 0xaf, 0x03};
3198 /* how buttons are mapped in the report */
3199 #define M560_MOUSE_BTN_LEFT 0x01
3200 #define M560_MOUSE_BTN_RIGHT 0x02
3201 #define M560_MOUSE_BTN_WHEEL_LEFT 0x08
3202 #define M560_MOUSE_BTN_WHEEL_RIGHT 0x10
3204 #define M560_SUB_ID 0x0a
3205 #define M560_BUTTON_MODE_REGISTER 0x35
3207 static int m560_send_config_command(struct hid_device *hdev, bool connected)
3209 struct hidpp_report response;
3210 struct hidpp_device *hidpp_dev;
3212 hidpp_dev = hid_get_drvdata(hdev);
3214 return hidpp_send_rap_command_sync(
3216 REPORT_ID_HIDPP_SHORT,
3218 M560_BUTTON_MODE_REGISTER,
3219 (u8 *)m560_config_parameter,
3220 sizeof(m560_config_parameter),
3225 static int m560_raw_event(struct hid_device *hdev, u8 *data, int size)
3227 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3230 if (!hidpp->input) {
3231 hid_err(hdev, "error in parameter\n");
3236 hid_err(hdev, "error in report\n");
3240 if (data[0] == REPORT_ID_HIDPP_LONG &&
3241 data[2] == M560_SUB_ID && data[6] == 0x00) {
3243 * m560 mouse report for middle, forward and backward button
3246 * data[1] = device-id
3248 * data[5] = 0xaf -> middle
3251 * 0x00 -> release all
3257 input_report_key(hidpp->input, BTN_MIDDLE, 1);
3260 input_report_key(hidpp->input, BTN_FORWARD, 1);
3263 input_report_key(hidpp->input, BTN_BACK, 1);
3266 input_report_key(hidpp->input, BTN_BACK, 0);
3267 input_report_key(hidpp->input, BTN_FORWARD, 0);
3268 input_report_key(hidpp->input, BTN_MIDDLE, 0);
3271 hid_err(hdev, "error in report\n");
3274 input_sync(hidpp->input);
3276 } else if (data[0] == 0x02) {
3278 * Logitech M560 mouse report
3280 * data[0] = type (0x02)
3281 * data[1..2] = buttons
3288 input_report_key(hidpp->input, BTN_LEFT,
3289 !!(data[1] & M560_MOUSE_BTN_LEFT));
3290 input_report_key(hidpp->input, BTN_RIGHT,
3291 !!(data[1] & M560_MOUSE_BTN_RIGHT));
3293 if (data[1] & M560_MOUSE_BTN_WHEEL_LEFT) {
3294 input_report_rel(hidpp->input, REL_HWHEEL, -1);
3295 input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3297 } else if (data[1] & M560_MOUSE_BTN_WHEEL_RIGHT) {
3298 input_report_rel(hidpp->input, REL_HWHEEL, 1);
3299 input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3303 v = hid_snto32(hid_field_extract(hdev, data+3, 0, 12), 12);
3304 input_report_rel(hidpp->input, REL_X, v);
3306 v = hid_snto32(hid_field_extract(hdev, data+3, 12, 12), 12);
3307 input_report_rel(hidpp->input, REL_Y, v);
3309 v = hid_snto32(data[6], 8);
3311 hidpp_scroll_counter_handle_scroll(hidpp->input,
3312 &hidpp->vertical_wheel_counter, v);
3314 input_sync(hidpp->input);
3320 static void m560_populate_input(struct hidpp_device *hidpp,
3321 struct input_dev *input_dev)
3323 __set_bit(EV_KEY, input_dev->evbit);
3324 __set_bit(BTN_MIDDLE, input_dev->keybit);
3325 __set_bit(BTN_RIGHT, input_dev->keybit);
3326 __set_bit(BTN_LEFT, input_dev->keybit);
3327 __set_bit(BTN_BACK, input_dev->keybit);
3328 __set_bit(BTN_FORWARD, input_dev->keybit);
3330 __set_bit(EV_REL, input_dev->evbit);
3331 __set_bit(REL_X, input_dev->relbit);
3332 __set_bit(REL_Y, input_dev->relbit);
3333 __set_bit(REL_WHEEL, input_dev->relbit);
3334 __set_bit(REL_HWHEEL, input_dev->relbit);
3335 __set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3336 __set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3339 static int m560_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3340 struct hid_field *field, struct hid_usage *usage,
3341 unsigned long **bit, int *max)
3346 /* ------------------------------------------------------------------------- */
3347 /* Logitech K400 devices */
3348 /* ------------------------------------------------------------------------- */
3351 * The Logitech K400 keyboard has an embedded touchpad which is seen
3352 * as a mouse from the OS point of view. There is a hardware shortcut to disable
3353 * tap-to-click but the setting is not remembered accross reset, annoying some
3356 * We can toggle this feature from the host by using the feature 0x6010:
3360 struct k400_private_data {
3364 static int k400_disable_tap_to_click(struct hidpp_device *hidpp)
3366 struct k400_private_data *k400 = hidpp->private_data;
3367 struct hidpp_touchpad_fw_items items = {};
3371 if (!k400->feature_index) {
3372 ret = hidpp_root_get_feature(hidpp,
3373 HIDPP_PAGE_TOUCHPAD_FW_ITEMS,
3374 &k400->feature_index, &feature_type);
3376 /* means that the device is not powered up */
3380 ret = hidpp_touchpad_fw_items_set(hidpp, k400->feature_index, &items);
3387 static int k400_allocate(struct hid_device *hdev)
3389 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3390 struct k400_private_data *k400;
3392 k400 = devm_kzalloc(&hdev->dev, sizeof(struct k400_private_data),
3397 hidpp->private_data = k400;
3402 static int k400_connect(struct hid_device *hdev, bool connected)
3404 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3406 if (!disable_tap_to_click)
3409 return k400_disable_tap_to_click(hidpp);
3412 /* ------------------------------------------------------------------------- */
3413 /* Logitech G920 Driving Force Racing Wheel for Xbox One */
3414 /* ------------------------------------------------------------------------- */
3416 #define HIDPP_PAGE_G920_FORCE_FEEDBACK 0x8123
3418 static int g920_ff_set_autocenter(struct hidpp_device *hidpp,
3419 struct hidpp_ff_private_data *data)
3421 struct hidpp_report response;
3422 u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH] = {
3423 [1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART,
3427 /* initialize with zero autocenter to get wheel in usable state */
3429 dbg_hid("Setting autocenter to 0.\n");
3430 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3431 HIDPP_FF_DOWNLOAD_EFFECT,
3432 params, ARRAY_SIZE(params),
3435 hid_warn(hidpp->hid_dev, "Failed to autocenter device!\n");
3437 data->slot_autocenter = response.fap.params[0];
3442 static int g920_get_config(struct hidpp_device *hidpp,
3443 struct hidpp_ff_private_data *data)
3445 struct hidpp_report response;
3449 memset(data, 0, sizeof(*data));
3451 /* Find feature and store for later use */
3452 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_G920_FORCE_FEEDBACK,
3453 &data->feature_index, &feature_type);
3457 /* Read number of slots available in device */
3458 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3465 hid_err(hidpp->hid_dev,
3466 "%s: received protocol error 0x%02x\n", __func__, ret);
3470 data->num_effects = response.fap.params[0] - HIDPP_FF_RESERVED_SLOTS;
3472 /* reset all forces */
3473 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3478 hid_warn(hidpp->hid_dev, "Failed to reset all forces!\n");
3480 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3481 HIDPP_FF_GET_APERTURE,
3485 hid_warn(hidpp->hid_dev,
3486 "Failed to read range from device!\n");
3489 900 : get_unaligned_be16(&response.fap.params[0]);
3491 /* Read the current gain values */
3492 ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3493 HIDPP_FF_GET_GLOBAL_GAINS,
3497 hid_warn(hidpp->hid_dev,
3498 "Failed to read gain values from device!\n");
3500 0xffff : get_unaligned_be16(&response.fap.params[0]);
3502 /* ignore boost value at response.fap.params[2] */
3504 return g920_ff_set_autocenter(hidpp, data);
3507 /* -------------------------------------------------------------------------- */
3508 /* Logitech Dinovo Mini keyboard with builtin touchpad */
3509 /* -------------------------------------------------------------------------- */
3510 #define DINOVO_MINI_PRODUCT_ID 0xb30c
3512 static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3513 struct hid_field *field, struct hid_usage *usage,
3514 unsigned long **bit, int *max)
3516 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
3519 switch (usage->hid & HID_USAGE) {
3520 case 0x00d: lg_map_key_clear(KEY_MEDIA); break;
3527 /* -------------------------------------------------------------------------- */
3528 /* HID++1.0 devices which use HID++ reports for their wheels */
3529 /* -------------------------------------------------------------------------- */
3530 static int hidpp10_wheel_connect(struct hidpp_device *hidpp)
3532 return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3533 HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT,
3534 HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT);
3537 static int hidpp10_wheel_raw_event(struct hidpp_device *hidpp,
3548 if (data[0] != REPORT_ID_HIDPP_SHORT || data[2] != HIDPP_SUB_ID_ROLLER)
3554 input_report_rel(hidpp->input, REL_WHEEL, value);
3555 input_report_rel(hidpp->input, REL_WHEEL_HI_RES, value * 120);
3556 input_report_rel(hidpp->input, REL_HWHEEL, hvalue);
3557 input_report_rel(hidpp->input, REL_HWHEEL_HI_RES, hvalue * 120);
3558 input_sync(hidpp->input);
3563 static void hidpp10_wheel_populate_input(struct hidpp_device *hidpp,
3564 struct input_dev *input_dev)
3566 __set_bit(EV_REL, input_dev->evbit);
3567 __set_bit(REL_WHEEL, input_dev->relbit);
3568 __set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3569 __set_bit(REL_HWHEEL, input_dev->relbit);
3570 __set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3573 /* -------------------------------------------------------------------------- */
3574 /* HID++1.0 mice which use HID++ reports for extra mouse buttons */
3575 /* -------------------------------------------------------------------------- */
3576 static int hidpp10_extra_mouse_buttons_connect(struct hidpp_device *hidpp)
3578 return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3579 HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT,
3580 HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT);
3583 static int hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device *hidpp,
3594 if (data[0] != REPORT_ID_HIDPP_SHORT ||
3595 data[2] != HIDPP_SUB_ID_MOUSE_EXTRA_BTNS)
3599 * Buttons are either delivered through the regular mouse report *or*
3600 * through the extra buttons report. At least for button 6 how it is
3601 * delivered differs per receiver firmware version. Even receivers with
3602 * the same usb-id show different behavior, so we handle both cases.
3604 for (i = 0; i < 8; i++)
3605 input_report_key(hidpp->input, BTN_MOUSE + i,
3606 (data[3] & (1 << i)));
3608 /* Some mice report events on button 9+, use BTN_MISC */
3609 for (i = 0; i < 8; i++)
3610 input_report_key(hidpp->input, BTN_MISC + i,
3611 (data[4] & (1 << i)));
3613 input_sync(hidpp->input);
3617 static void hidpp10_extra_mouse_buttons_populate_input(
3618 struct hidpp_device *hidpp, struct input_dev *input_dev)
3620 /* BTN_MOUSE - BTN_MOUSE+7 are set already by the descriptor */
3621 __set_bit(BTN_0, input_dev->keybit);
3622 __set_bit(BTN_1, input_dev->keybit);
3623 __set_bit(BTN_2, input_dev->keybit);
3624 __set_bit(BTN_3, input_dev->keybit);
3625 __set_bit(BTN_4, input_dev->keybit);
3626 __set_bit(BTN_5, input_dev->keybit);
3627 __set_bit(BTN_6, input_dev->keybit);
3628 __set_bit(BTN_7, input_dev->keybit);
3631 /* -------------------------------------------------------------------------- */
3632 /* HID++1.0 kbds which only report 0x10xx consumer usages through sub-id 0x03 */
3633 /* -------------------------------------------------------------------------- */
3635 /* Find the consumer-page input report desc and change Maximums to 0x107f */
3636 static u8 *hidpp10_consumer_keys_report_fixup(struct hidpp_device *hidpp,
3637 u8 *_rdesc, unsigned int *rsize)
3639 /* Note 0 terminated so we can use strnstr to search for this. */
3640 static const char consumer_rdesc_start[] = {
3641 0x05, 0x0C, /* USAGE_PAGE (Consumer Devices) */
3642 0x09, 0x01, /* USAGE (Consumer Control) */
3643 0xA1, 0x01, /* COLLECTION (Application) */
3644 0x85, 0x03, /* REPORT_ID = 3 */
3645 0x75, 0x10, /* REPORT_SIZE (16) */
3646 0x95, 0x02, /* REPORT_COUNT (2) */
3647 0x15, 0x01, /* LOGICAL_MIN (1) */
3648 0x26, 0x00 /* LOGICAL_MAX (... */
3650 char *consumer_rdesc, *rdesc = (char *)_rdesc;
3653 consumer_rdesc = strnstr(rdesc, consumer_rdesc_start, *rsize);
3654 size = *rsize - (consumer_rdesc - rdesc);
3655 if (consumer_rdesc && size >= 25) {
3656 consumer_rdesc[15] = 0x7f;
3657 consumer_rdesc[16] = 0x10;
3658 consumer_rdesc[20] = 0x7f;
3659 consumer_rdesc[21] = 0x10;
3664 static int hidpp10_consumer_keys_connect(struct hidpp_device *hidpp)
3666 return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3667 HIDPP_ENABLE_CONSUMER_REPORT,
3668 HIDPP_ENABLE_CONSUMER_REPORT);
3671 static int hidpp10_consumer_keys_raw_event(struct hidpp_device *hidpp,
3674 u8 consumer_report[5];
3679 if (data[0] != REPORT_ID_HIDPP_SHORT ||
3680 data[2] != HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS)
3684 * Build a normal consumer report (3) out of the data, this detour
3685 * is necessary to get some keyboards to report their 0x10xx usages.
3687 consumer_report[0] = 0x03;
3688 memcpy(&consumer_report[1], &data[3], 4);
3689 /* We are called from atomic context */
3690 hid_report_raw_event(hidpp->hid_dev, HID_INPUT_REPORT,
3691 consumer_report, 5, 1);
3696 /* -------------------------------------------------------------------------- */
3697 /* High-resolution scroll wheels */
3698 /* -------------------------------------------------------------------------- */
3700 static int hi_res_scroll_enable(struct hidpp_device *hidpp)
3705 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL) {
3706 ret = hidpp_hrw_set_wheel_mode(hidpp, false, true, false);
3708 ret = hidpp_hrw_get_wheel_capability(hidpp, &multiplier);
3709 } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL) {
3710 ret = hidpp_hrs_set_highres_scrolling_mode(hidpp, true,
3712 } else /* if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL) */ {
3713 ret = hidpp10_enable_scrolling_acceleration(hidpp);
3717 hid_dbg(hidpp->hid_dev,
3718 "Could not enable hi-res scrolling: %d\n", ret);
3722 if (multiplier == 0) {
3723 hid_dbg(hidpp->hid_dev,
3724 "Invalid multiplier 0 from device, setting it to 1\n");
3728 hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
3729 hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
3733 static int hidpp_initialize_hires_scroll(struct hidpp_device *hidpp)
3736 unsigned long capabilities;
3738 capabilities = hidpp->capabilities;
3740 if (hidpp->protocol_major >= 2) {
3744 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
3745 &feature_index, &feature_type);
3747 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL;
3748 hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scroll wheel\n");
3751 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
3752 &feature_index, &feature_type);
3754 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL;
3755 hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scrolling\n");
3758 /* We cannot detect fast scrolling support on HID++ 1.0 devices */
3759 if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_1P0) {
3760 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL;
3761 hid_dbg(hidpp->hid_dev, "Detected HID++ 1.0 fast scroll\n");
3765 if (hidpp->capabilities == capabilities)
3766 hid_dbg(hidpp->hid_dev, "Did not detect HID++ hi-res scrolling hardware support\n");
3770 /* -------------------------------------------------------------------------- */
3771 /* Generic HID++ devices */
3772 /* -------------------------------------------------------------------------- */
3774 static u8 *hidpp_report_fixup(struct hid_device *hdev, u8 *rdesc,
3775 unsigned int *rsize)
3777 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3782 /* For 27 MHz keyboards the quirk gets set after hid_parse. */
3783 if (hdev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE ||
3784 (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS))
3785 rdesc = hidpp10_consumer_keys_report_fixup(hidpp, rdesc, rsize);
3790 static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3791 struct hid_field *field, struct hid_usage *usage,
3792 unsigned long **bit, int *max)
3794 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3799 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3800 return wtp_input_mapping(hdev, hi, field, usage, bit, max);
3801 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560 &&
3802 field->application != HID_GD_MOUSE)
3803 return m560_input_mapping(hdev, hi, field, usage, bit, max);
3805 if (hdev->product == DINOVO_MINI_PRODUCT_ID)
3806 return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
3811 static int hidpp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
3812 struct hid_field *field, struct hid_usage *usage,
3813 unsigned long **bit, int *max)
3815 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3820 /* Ensure that Logitech G920 is not given a default fuzz/flat value */
3821 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
3822 if (usage->type == EV_ABS && (usage->code == ABS_X ||
3823 usage->code == ABS_Y || usage->code == ABS_Z ||
3824 usage->code == ABS_RZ)) {
3825 field->application = HID_GD_MULTIAXIS;
3833 static void hidpp_populate_input(struct hidpp_device *hidpp,
3834 struct input_dev *input)
3836 hidpp->input = input;
3838 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3839 wtp_populate_input(hidpp, input);
3840 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3841 m560_populate_input(hidpp, input);
3843 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS)
3844 hidpp10_wheel_populate_input(hidpp, input);
3846 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS)
3847 hidpp10_extra_mouse_buttons_populate_input(hidpp, input);
3850 static int hidpp_input_configured(struct hid_device *hdev,
3851 struct hid_input *hidinput)
3853 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3854 struct input_dev *input = hidinput->input;
3859 hidpp_populate_input(hidpp, input);
3864 static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
3867 struct hidpp_report *question = hidpp->send_receive_buf;
3868 struct hidpp_report *answer = hidpp->send_receive_buf;
3869 struct hidpp_report *report = (struct hidpp_report *)data;
3873 * If the mutex is locked then we have a pending answer from a
3874 * previously sent command.
3876 if (unlikely(mutex_is_locked(&hidpp->send_mutex))) {
3878 * Check for a correct hidpp20 answer or the corresponding
3881 if (hidpp_match_answer(question, report) ||
3882 hidpp_match_error(question, report)) {
3884 hidpp->answer_available = true;
3885 wake_up(&hidpp->wait);
3887 * This was an answer to a command that this driver sent
3888 * We return 1 to hid-core to avoid forwarding the
3889 * command upstream as it has been treated by the driver
3896 if (unlikely(hidpp_report_is_connect_event(hidpp, report))) {
3897 atomic_set(&hidpp->connected,
3898 !(report->rap.params[0] & (1 << 6)));
3899 if (schedule_work(&hidpp->work) == 0)
3900 dbg_hid("%s: connect event already queued\n", __func__);
3904 if (hidpp->hid_dev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
3905 data[0] == REPORT_ID_HIDPP_SHORT &&
3906 data[2] == HIDPP_SUB_ID_USER_IFACE_EVENT &&
3907 (data[3] & HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST)) {
3908 dev_err_ratelimited(&hidpp->hid_dev->dev,
3909 "Error the keyboard's wireless encryption key has been lost, your keyboard will not work unless you re-configure encryption.\n");
3910 dev_err_ratelimited(&hidpp->hid_dev->dev,
3911 "See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
3914 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3915 ret = hidpp20_battery_event_1000(hidpp, data, size);
3918 ret = hidpp20_battery_event_1004(hidpp, data, size);
3921 ret = hidpp_solar_battery_event(hidpp, data, size);
3924 ret = hidpp20_battery_voltage_event(hidpp, data, size);
3927 ret = hidpp20_adc_measurement_event_1f20(hidpp, data, size);
3932 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3933 ret = hidpp10_battery_event(hidpp, data, size);
3938 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3939 ret = hidpp10_wheel_raw_event(hidpp, data, size);
3944 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3945 ret = hidpp10_extra_mouse_buttons_raw_event(hidpp, data, size);
3950 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3951 ret = hidpp10_consumer_keys_raw_event(hidpp, data, size);
3959 static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
3962 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3968 /* Generic HID++ processing. */
3970 case REPORT_ID_HIDPP_VERY_LONG:
3971 if (size != hidpp->very_long_report_length) {
3972 hid_err(hdev, "received hid++ report of bad size (%d)",
3976 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3978 case REPORT_ID_HIDPP_LONG:
3979 if (size != HIDPP_REPORT_LONG_LENGTH) {
3980 hid_err(hdev, "received hid++ report of bad size (%d)",
3984 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3986 case REPORT_ID_HIDPP_SHORT:
3987 if (size != HIDPP_REPORT_SHORT_LENGTH) {
3988 hid_err(hdev, "received hid++ report of bad size (%d)",
3992 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3996 /* If no report is available for further processing, skip calling
3997 * raw_event of subclasses. */
4001 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
4002 return wtp_raw_event(hdev, data, size);
4003 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
4004 return m560_raw_event(hdev, data, size);
4009 static int hidpp_event(struct hid_device *hdev, struct hid_field *field,
4010 struct hid_usage *usage, __s32 value)
4012 /* This function will only be called for scroll events, due to the
4013 * restriction imposed in hidpp_usages.
4015 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4016 struct hidpp_scroll_counter *counter;
4021 counter = &hidpp->vertical_wheel_counter;
4022 /* A scroll event may occur before the multiplier has been retrieved or
4023 * the input device set, or high-res scroll enabling may fail. In such
4024 * cases we must return early (falling back to default behaviour) to
4025 * avoid a crash in hidpp_scroll_counter_handle_scroll.
4027 if (!(hidpp->capabilities & HIDPP_CAPABILITY_HI_RES_SCROLL)
4028 || value == 0 || hidpp->input == NULL
4029 || counter->wheel_multiplier == 0)
4032 hidpp_scroll_counter_handle_scroll(hidpp->input, counter, value);
4036 static int hidpp_initialize_battery(struct hidpp_device *hidpp)
4038 static atomic_t battery_no = ATOMIC_INIT(0);
4039 struct power_supply_config cfg = { .drv_data = hidpp };
4040 struct power_supply_desc *desc = &hidpp->battery.desc;
4041 enum power_supply_property *battery_props;
4042 struct hidpp_battery *battery;
4043 unsigned int num_battery_props;
4047 if (hidpp->battery.ps)
4050 hidpp->battery.feature_index = 0xff;
4051 hidpp->battery.solar_feature_index = 0xff;
4052 hidpp->battery.voltage_feature_index = 0xff;
4053 hidpp->battery.adc_measurement_feature_index = 0xff;
4055 if (hidpp->protocol_major >= 2) {
4056 if (hidpp->quirks & HIDPP_QUIRK_CLASS_K750)
4057 ret = hidpp_solar_request_battery_event(hidpp);
4059 /* we only support one battery feature right now, so let's
4060 first check the ones that support battery level first
4061 and leave voltage for last */
4062 ret = hidpp20_query_battery_info_1000(hidpp);
4064 ret = hidpp20_query_battery_info_1004(hidpp);
4066 ret = hidpp20_query_battery_voltage_info(hidpp);
4068 ret = hidpp20_query_adc_measurement_info_1f20(hidpp);
4073 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_BATTERY;
4075 ret = hidpp10_query_battery_status(hidpp);
4077 ret = hidpp10_query_battery_mileage(hidpp);
4080 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
4082 hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
4084 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_BATTERY;
4087 battery_props = devm_kmemdup(&hidpp->hid_dev->dev,
4088 hidpp_battery_props,
4089 sizeof(hidpp_battery_props),
4094 num_battery_props = ARRAY_SIZE(hidpp_battery_props) - 3;
4096 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE ||
4097 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE ||
4098 hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE ||
4099 hidpp->capabilities & HIDPP_CAPABILITY_ADC_MEASUREMENT)
4100 battery_props[num_battery_props++] =
4101 POWER_SUPPLY_PROP_CAPACITY;
4103 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS)
4104 battery_props[num_battery_props++] =
4105 POWER_SUPPLY_PROP_CAPACITY_LEVEL;
4107 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE ||
4108 hidpp->capabilities & HIDPP_CAPABILITY_ADC_MEASUREMENT)
4109 battery_props[num_battery_props++] =
4110 POWER_SUPPLY_PROP_VOLTAGE_NOW;
4112 battery = &hidpp->battery;
4114 n = atomic_inc_return(&battery_no) - 1;
4115 desc->properties = battery_props;
4116 desc->num_properties = num_battery_props;
4117 desc->get_property = hidpp_battery_get_property;
4118 sprintf(battery->name, "hidpp_battery_%ld", n);
4119 desc->name = battery->name;
4120 desc->type = POWER_SUPPLY_TYPE_BATTERY;
4121 desc->use_for_apm = 0;
4123 battery->ps = devm_power_supply_register(&hidpp->hid_dev->dev,
4126 if (IS_ERR(battery->ps))
4127 return PTR_ERR(battery->ps);
4129 power_supply_powers(battery->ps, &hidpp->hid_dev->dev);
4134 static void hidpp_overwrite_name(struct hid_device *hdev)
4136 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4139 if (hidpp->protocol_major < 2)
4142 name = hidpp_get_device_name(hidpp);
4145 hid_err(hdev, "unable to retrieve the name of the device");
4147 dbg_hid("HID++: Got name: %s\n", name);
4148 snprintf(hdev->name, sizeof(hdev->name), "%s", name);
4154 static int hidpp_input_open(struct input_dev *dev)
4156 struct hid_device *hid = input_get_drvdata(dev);
4158 return hid_hw_open(hid);
4161 static void hidpp_input_close(struct input_dev *dev)
4163 struct hid_device *hid = input_get_drvdata(dev);
4168 static struct input_dev *hidpp_allocate_input(struct hid_device *hdev)
4170 struct input_dev *input_dev = devm_input_allocate_device(&hdev->dev);
4171 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4176 input_set_drvdata(input_dev, hdev);
4177 input_dev->open = hidpp_input_open;
4178 input_dev->close = hidpp_input_close;
4180 input_dev->name = hidpp->name;
4181 input_dev->phys = hdev->phys;
4182 input_dev->uniq = hdev->uniq;
4183 input_dev->id.bustype = hdev->bus;
4184 input_dev->id.vendor = hdev->vendor;
4185 input_dev->id.product = hdev->product;
4186 input_dev->id.version = hdev->version;
4187 input_dev->dev.parent = &hdev->dev;
4192 static void hidpp_connect_event(struct hidpp_device *hidpp)
4194 struct hid_device *hdev = hidpp->hid_dev;
4196 bool connected = atomic_read(&hidpp->connected);
4197 struct input_dev *input;
4198 char *name, *devm_name;
4201 if (hidpp->battery.ps) {
4202 hidpp->battery.online = false;
4203 hidpp->battery.status = POWER_SUPPLY_STATUS_UNKNOWN;
4204 hidpp->battery.level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
4205 power_supply_changed(hidpp->battery.ps);
4210 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
4211 ret = wtp_connect(hdev, connected);
4214 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560) {
4215 ret = m560_send_config_command(hdev, connected);
4218 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
4219 ret = k400_connect(hdev, connected);
4224 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
4225 ret = hidpp10_wheel_connect(hidpp);
4230 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
4231 ret = hidpp10_extra_mouse_buttons_connect(hidpp);
4236 if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
4237 ret = hidpp10_consumer_keys_connect(hidpp);
4242 /* the device is already connected, we can ask for its name and
4244 if (!hidpp->protocol_major) {
4245 ret = hidpp_root_get_protocol_version(hidpp);
4247 hid_err(hdev, "Can not get the protocol version.\n");
4252 if (hidpp->name == hdev->name && hidpp->protocol_major >= 2) {
4253 name = hidpp_get_device_name(hidpp);
4255 devm_name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
4261 hidpp->name = devm_name;
4265 hidpp_initialize_battery(hidpp);
4266 if (!hid_is_usb(hidpp->hid_dev))
4267 hidpp_initialize_hires_scroll(hidpp);
4269 /* forward current battery state */
4270 if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
4271 hidpp10_enable_battery_reporting(hidpp);
4272 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE)
4273 hidpp10_query_battery_mileage(hidpp);
4275 hidpp10_query_battery_status(hidpp);
4276 } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
4277 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
4278 hidpp20_query_battery_voltage_info(hidpp);
4279 else if (hidpp->capabilities & HIDPP_CAPABILITY_UNIFIED_BATTERY)
4280 hidpp20_query_battery_info_1004(hidpp);
4281 else if (hidpp->capabilities & HIDPP_CAPABILITY_ADC_MEASUREMENT)
4282 hidpp20_query_adc_measurement_info_1f20(hidpp);
4284 hidpp20_query_battery_info_1000(hidpp);
4286 if (hidpp->battery.ps)
4287 power_supply_changed(hidpp->battery.ps);
4289 if (hidpp->capabilities & HIDPP_CAPABILITY_HI_RES_SCROLL)
4290 hi_res_scroll_enable(hidpp);
4292 if (!(hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT) || hidpp->delayed_input)
4293 /* if the input nodes are already created, we can stop now */
4296 input = hidpp_allocate_input(hdev);
4298 hid_err(hdev, "cannot allocate new input device: %d\n", ret);
4302 hidpp_populate_input(hidpp, input);
4304 ret = input_register_device(input);
4306 input_free_device(input);
4310 hidpp->delayed_input = input;
4313 static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
4315 static struct attribute *sysfs_attrs[] = {
4316 &dev_attr_builtin_power_supply.attr,
4320 static const struct attribute_group ps_attribute_group = {
4321 .attrs = sysfs_attrs
4324 static int hidpp_get_report_length(struct hid_device *hdev, int id)
4326 struct hid_report_enum *re;
4327 struct hid_report *report;
4329 re = &(hdev->report_enum[HID_OUTPUT_REPORT]);
4330 report = re->report_id_hash[id];
4334 return report->field[0]->report_count + 1;
4337 static u8 hidpp_validate_device(struct hid_device *hdev)
4339 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4340 int id, report_length;
4341 u8 supported_reports = 0;
4343 id = REPORT_ID_HIDPP_SHORT;
4344 report_length = hidpp_get_report_length(hdev, id);
4345 if (report_length) {
4346 if (report_length < HIDPP_REPORT_SHORT_LENGTH)
4349 supported_reports |= HIDPP_REPORT_SHORT_SUPPORTED;
4352 id = REPORT_ID_HIDPP_LONG;
4353 report_length = hidpp_get_report_length(hdev, id);
4354 if (report_length) {
4355 if (report_length < HIDPP_REPORT_LONG_LENGTH)
4358 supported_reports |= HIDPP_REPORT_LONG_SUPPORTED;
4361 id = REPORT_ID_HIDPP_VERY_LONG;
4362 report_length = hidpp_get_report_length(hdev, id);
4363 if (report_length) {
4364 if (report_length < HIDPP_REPORT_LONG_LENGTH ||
4365 report_length > HIDPP_REPORT_VERY_LONG_MAX_LENGTH)
4368 supported_reports |= HIDPP_REPORT_VERY_LONG_SUPPORTED;
4369 hidpp->very_long_report_length = report_length;
4372 return supported_reports;
4375 hid_warn(hdev, "not enough values in hidpp report %d\n", id);
4379 static bool hidpp_application_equals(struct hid_device *hdev,
4380 unsigned int application)
4382 struct list_head *report_list;
4383 struct hid_report *report;
4385 report_list = &hdev->report_enum[HID_INPUT_REPORT].report_list;
4386 report = list_first_entry_or_null(report_list, struct hid_report, list);
4387 return report && report->application == application;
4390 static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
4392 struct hidpp_device *hidpp;
4395 unsigned int connect_mask = HID_CONNECT_DEFAULT;
4396 struct hidpp_ff_private_data data;
4397 bool will_restart = false;
4399 /* report_fixup needs drvdata to be set before we call hid_parse */
4400 hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
4404 hidpp->hid_dev = hdev;
4405 hidpp->name = hdev->name;
4406 hidpp->quirks = id->driver_data;
4407 hid_set_drvdata(hdev, hidpp);
4409 ret = hid_parse(hdev);
4411 hid_err(hdev, "%s:parse failed\n", __func__);
4416 * Make sure the device is HID++ capable, otherwise treat as generic HID
4418 hidpp->supported_reports = hidpp_validate_device(hdev);
4420 if (!hidpp->supported_reports) {
4421 hid_set_drvdata(hdev, NULL);
4422 devm_kfree(&hdev->dev, hidpp);
4423 return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
4426 if (id->group == HID_GROUP_LOGITECH_DJ_DEVICE)
4427 hidpp->quirks |= HIDPP_QUIRK_UNIFYING;
4429 if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4430 hidpp_application_equals(hdev, HID_GD_MOUSE))
4431 hidpp->quirks |= HIDPP_QUIRK_HIDPP_WHEELS |
4432 HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS;
4434 if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4435 hidpp_application_equals(hdev, HID_GD_KEYBOARD))
4436 hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS;
4438 if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
4439 ret = wtp_allocate(hdev, id);
4442 } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
4443 ret = k400_allocate(hdev);
4448 if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT ||
4449 hidpp->quirks & HIDPP_QUIRK_UNIFYING)
4450 will_restart = true;
4452 INIT_WORK(&hidpp->work, delayed_work_cb);
4453 mutex_init(&hidpp->send_mutex);
4454 init_waitqueue_head(&hidpp->wait);
4456 /* indicates we are handling the battery properties in the kernel */
4457 ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
4459 hid_warn(hdev, "Cannot allocate sysfs group for %s\n",
4463 * First call hid_hw_start(hdev, 0) to allow IO without connecting any
4464 * hid subdrivers (hid-input, hidraw). This allows retrieving the dev's
4465 * name and serial number and store these in hdev->name and hdev->uniq,
4466 * before the hid-input and hidraw drivers expose these to userspace.
4468 ret = hid_hw_start(hdev, will_restart ? 0 : connect_mask);
4470 hid_err(hdev, "hw start failed\n");
4471 goto hid_hw_start_fail;
4474 ret = hid_hw_open(hdev);
4476 dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
4478 goto hid_hw_open_fail;
4481 /* Allow incoming packets */
4482 hid_device_io_start(hdev);
4484 if (hidpp->quirks & HIDPP_QUIRK_UNIFYING)
4485 hidpp_unifying_init(hidpp);
4486 else if (hid_is_usb(hidpp->hid_dev))
4487 hidpp_serial_init(hidpp);
4489 connected = hidpp_root_get_protocol_version(hidpp) == 0;
4490 atomic_set(&hidpp->connected, connected);
4491 if (!(hidpp->quirks & HIDPP_QUIRK_UNIFYING)) {
4494 hid_err(hdev, "Device not connected");
4495 goto hid_hw_init_fail;
4498 hidpp_overwrite_name(hdev);
4501 if (connected && hidpp->protocol_major >= 2) {
4502 ret = hidpp_set_wireless_feature_index(hidpp);
4504 hidpp->wireless_feature_index = 0;
4506 goto hid_hw_init_fail;
4510 if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
4511 ret = wtp_get_config(hidpp);
4513 goto hid_hw_init_fail;
4514 } else if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
4515 ret = g920_get_config(hidpp, &data);
4517 goto hid_hw_init_fail;
4520 schedule_work(&hidpp->work);
4521 flush_work(&hidpp->work);
4524 if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
4525 connect_mask &= ~HID_CONNECT_HIDINPUT;
4527 /* Now export the actual inputs and hidraw nodes to the world */
4528 ret = hid_connect(hdev, connect_mask);
4530 hid_err(hdev, "%s:hid_connect returned error %d\n", __func__, ret);
4531 goto hid_hw_init_fail;
4535 if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
4536 ret = hidpp_ff_init(hidpp, &data);
4538 hid_warn(hidpp->hid_dev,
4539 "Unable to initialize force feedback support, errno %d\n",
4544 * This relies on logi_dj_ll_close() being a no-op so that DJ connection
4545 * events will still be received.
4555 sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4556 cancel_work_sync(&hidpp->work);
4557 mutex_destroy(&hidpp->send_mutex);
4561 static void hidpp_remove(struct hid_device *hdev)
4563 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4566 return hid_hw_stop(hdev);
4568 sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4571 cancel_work_sync(&hidpp->work);
4572 mutex_destroy(&hidpp->send_mutex);
4575 #define LDJ_DEVICE(product) \
4576 HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, \
4577 USB_VENDOR_ID_LOGITECH, (product))
4579 #define L27MHZ_DEVICE(product) \
4580 HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_27MHZ_DEVICE, \
4581 USB_VENDOR_ID_LOGITECH, (product))
4583 static const struct hid_device_id hidpp_devices[] = {
4584 { /* wireless touchpad */
4586 .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT |
4587 HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS },
4588 { /* wireless touchpad T650 */
4590 .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
4591 { /* wireless touchpad T651 */
4592 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
4593 USB_DEVICE_ID_LOGITECH_T651),
4594 .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
4595 { /* Mouse Logitech Anywhere MX */
4596 LDJ_DEVICE(0x1017), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4597 { /* Mouse logitech M560 */
4599 .driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_CLASS_M560 },
4600 { /* Mouse Logitech M705 (firmware RQM17) */
4601 LDJ_DEVICE(0x101b), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4602 { /* Mouse Logitech Performance MX */
4603 LDJ_DEVICE(0x101a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4604 { /* Keyboard logitech K400 */
4606 .driver_data = HIDPP_QUIRK_CLASS_K400 },
4607 { /* Solar Keyboard Logitech K750 */
4609 .driver_data = HIDPP_QUIRK_CLASS_K750 },
4610 { /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */
4612 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4613 { /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */
4615 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4616 { /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
4618 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4620 { LDJ_DEVICE(HID_ANY_ID) },
4622 { /* Keyboard LX501 (Y-RR53) */
4623 L27MHZ_DEVICE(0x0049),
4624 .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4625 { /* Keyboard MX3000 (Y-RAM74) */
4626 L27MHZ_DEVICE(0x0057),
4627 .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4628 { /* Keyboard MX3200 (Y-RAV80) */
4629 L27MHZ_DEVICE(0x005c),
4630 .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4631 { /* S510 Media Remote */
4632 L27MHZ_DEVICE(0x00fe),
4633 .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4635 { L27MHZ_DEVICE(HID_ANY_ID) },
4637 { /* Logitech G403 Wireless Gaming Mouse over USB */
4638 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC082) },
4639 { /* Logitech G502 Lightspeed Wireless Gaming Mouse over USB */
4640 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC08D) },
4641 { /* Logitech G703 Gaming Mouse over USB */
4642 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC087) },
4643 { /* Logitech G703 Hero Gaming Mouse over USB */
4644 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC090) },
4645 { /* Logitech G900 Gaming Mouse over USB */
4646 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC081) },
4647 { /* Logitech G903 Gaming Mouse over USB */
4648 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) },
4649 { /* Logitech G903 Hero Gaming Mouse over USB */
4650 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) },
4651 { /* Logitech G915 TKL Keyboard over USB */
4652 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC343) },
4653 { /* Logitech G920 Wheel over USB */
4654 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
4655 .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
4656 { /* Logitech G923 Wheel (Xbox version) over USB */
4657 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G923_XBOX_WHEEL),
4658 .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS },
4659 { /* Logitech G Pro Gaming Mouse over USB */
4660 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC088) },
4661 { /* Logitech G Pro X Superlight Gaming Mouse over USB */
4662 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC094) },
4664 { /* G935 Gaming Headset */
4665 HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0x0a87),
4666 .driver_data = HIDPP_QUIRK_WIRELESS_STATUS },
4668 { /* MX5000 keyboard over Bluetooth */
4669 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305),
4670 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4671 { /* Dinovo Edge keyboard over Bluetooth */
4672 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309),
4673 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4674 { /* MX5500 keyboard over Bluetooth */
4675 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
4676 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4677 { /* Logitech G915 TKL keyboard over Bluetooth */
4678 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb35f) },
4679 { /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */
4680 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) },
4681 { /* MX Master mouse over Bluetooth */
4682 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb012) },
4683 { /* M720 Triathlon mouse over Bluetooth */
4684 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb015) },
4685 { /* MX Ergo trackball over Bluetooth */
4686 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01d) },
4687 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01e) },
4688 { /* Signature M650 over Bluetooth */
4689 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb02a) },
4690 { /* MX Master 3 mouse over Bluetooth */
4691 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
4692 { /* MX Anywhere 3 mouse over Bluetooth */
4693 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb025) },
4694 { /* MX Master 3S mouse over Bluetooth */
4695 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb034) },
4699 MODULE_DEVICE_TABLE(hid, hidpp_devices);
4701 static const struct hid_usage_id hidpp_usages[] = {
4702 { HID_GD_WHEEL, EV_REL, REL_WHEEL_HI_RES },
4703 { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
4706 static struct hid_driver hidpp_driver = {
4707 .name = "logitech-hidpp-device",
4708 .id_table = hidpp_devices,
4709 .report_fixup = hidpp_report_fixup,
4710 .probe = hidpp_probe,
4711 .remove = hidpp_remove,
4712 .raw_event = hidpp_raw_event,
4713 .usage_table = hidpp_usages,
4714 .event = hidpp_event,
4715 .input_configured = hidpp_input_configured,
4716 .input_mapping = hidpp_input_mapping,
4717 .input_mapped = hidpp_input_mapped,
4720 module_hid_driver(hidpp_driver);