Hi JD,
On Tue, Oct 21, 2014 at 06:40:26PM +0000, Cole, JD wrote:
> Plantronics telephony devices equipped with HID-enabled controls have been
> reported to cause odd mouse behaviors when buttons are clicked. This is due
> to how the hid-input driver handles "unmapped" usages and the fact that
> Plantronics devices send Vendor Unique usages in addition to standards, e.g.
> Consumer Page Mute. It is the vendor unique usages that are mis-interpreted
> by the hid-input driver and mapped as mouse events.
>
> This driver serves to prevent unhandled usages from reaching the hid-input
> driver. Two patches are included:
>
> (1) The minimal driver
> (2) The more complete additions to hid.h Consumer Page MACROS
>
> Cheers,
>
> jd
>
> From ee603e2aa62906a65b08b440c4b440e324269295 Mon Sep 17 00:00:00 2001
> From: JD Cole <[email protected]>
> Date: Fri, 17 Oct 2014 12:21:49 -0700
> Subject: [PATCH 1/2] Created base Plantronics HID driver.
>
> A fix for Plantronics telephony device controls interfering with
> the mouse.
>
> This version of the driver prevents Telephony pages which are not
> mapped as Consumer Control applications AND are not on the Consumer Page
> from being registered by the hid-input driver.
>
> BUG=chromium:417434
> TEST=Tested with multiple Plantronics devices on 'peppy' Acer C720p.
>
> Change-Id: I7a55880d6082467274b693c48415e9331d9bbd81
> Signed-off-by: JD Cole <[email protected]>
> ---
> drivers/hid/Kconfig | 7 ++++
> drivers/hid/Makefile | 1 +
> drivers/hid/hid-ids.h | 2 +
> drivers/hid/hid-plantronics.c | 92
> +++++++++++++++++++++++++++++++++++++++++++
> include/linux/hid.h | 3 ++
> 5 files changed, 105 insertions(+)
> create mode 100644 drivers/hid/hid-plantronics.c
>
> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
> index 2f38a7b..b245c28 100644
> --- a/drivers/hid/Kconfig
> +++ b/drivers/hid/Kconfig
> @@ -594,6 +594,13 @@ config HID_PICOLCD_CIR
> ---help---
> Provide access to PicoLCD's CIR interface via remote control (LIRC).
>
> +config HID_PLANTRONICS
> + tristate "Plantronics USB HID Driver"
> + default !EXPERT
> + depends on HID
> + ---help---
> + Provides HID support for Plantronics telephony devices.
> +
> config HID_PRIMAX
> tristate "Primax non-fully HID-compliant devices"
> depends on HID
> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> index 6684b30..7080637 100644
> --- a/drivers/hid/Makefile
> +++ b/drivers/hid/Makefile
> @@ -93,6 +93,7 @@ ifdef CONFIG_DEBUG_FS
> hid-picolcd-y += hid-picolcd_debugfs.o
> endif
>
> +obj-$(CONFIG_HID_PLANTRONICS) += hid-plantronics.o
> obj-$(CONFIG_HID_PRIMAX) += hid-primax.o
> obj-$(CONFIG_HID_QUICKSTEP) += hid-quickstep.o
> obj-$(CONFIG_HID_ROCCAT) += hid-roccat.o hid-roccat-common.o \
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 7fd93c3..1c8ede1 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -703,6 +703,8 @@
> #define USB_DEVICE_ID_ORTEK_PKB1700 0x1700
> #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000
>
> +#define USB_VENDOR_ID_PLANTRONICS 0x047f
> +
> #define USB_VENDOR_ID_PANASONIC 0x04da
> #define USB_DEVICE_ID_PANABOARD_UBT780 0x1044
> #define USB_DEVICE_ID_PANABOARD_UBT880 0x104d
> diff --git a/drivers/hid/hid-plantronics.c b/drivers/hid/hid-plantronics.c
> new file mode 100644
> index 0000000..c43440a
> --- /dev/null
> +++ b/drivers/hid/hid-plantronics.c
> @@ -0,0 +1,92 @@
> +/*
> + * Plantronics USB HID Driver
> + *
> + * Copyright (c) 2014 JD Cole <[email protected]>
> + * Copyright (c) 2014 Terry Junge <[email protected]>
> + */
> +
> +/*
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the Free
> + * Software Foundation; either version 2 of the License, or (at your option)
> + * any later version.
> + */
> +
> +#include "hid-ids.h"
> +
> +#include <linux/hid.h>
> +#include <linux/module.h>
> +
> +static bool plt_debug;
> +module_param_named(debug, plt_debug, bool, 0644);
> +MODULE_PARM_DESC(debug, "enables extra debugging info");
Instead of introducing module-specific option can we simply use
dbg_hid() and rely on hid's 'debug' option to activate debug output?
> +
> +static bool plt_passall;
> +module_param_named(passall, plt_passall, bool, 0644);
> +MODULE_PARM_DESC(passall, "force all usages to be accepted (requires
> debug=1)");
Can't we simply unload the driver if we want to pass all usages?
Thanks.
> +
> +static int plantronics_input_mapping(struct hid_device *hdev,
> + struct hid_input *hi,
> + struct hid_field *field,
> + struct hid_usage *usage,
> + unsigned long **bit, int *max)
> +{
> + if ((field->application == HID_CP_CONSUMERCONTROL
> + && ((usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER))
> + || (plt_debug && plt_passall)) {
> + if (plt_debug)
> + hid_info(hdev, "usage: %08x (appl: %08x) -
> defaulted\n",
> + usage->hid, field->application);
> + return 0;
> + }
> +
> + if (plt_debug)
> + hid_info(hdev, "usage: %08x (appl: %08x) - ignored\n",
> + usage->hid, field->application);
> +
> + return -1;
> +}
> +
> +static int plantronics_probe(struct hid_device *hdev,
> + const struct hid_device_id *id)
> +{
> + int ret;
> +
> + if (plt_debug)
> + hid_info(hdev, "found plantronics device\n");
> +
> + ret = hid_parse(hdev);
> + if (ret) {
> + hid_err(hdev, "parse failed\n");
> + goto err;
> + }
> +
> + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
> + if (ret) {
> + hid_err(hdev, "hw start failed\n");
> + goto err;
> + }
> +
> + return 0;
> + err:
> + return ret;
> +}
> +
> +static const struct hid_device_id plantronics_devices[] = {
> + { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
> + { }
> +};
> +MODULE_DEVICE_TABLE(hid, plantronics_devices);
> +
> +static struct hid_driver plantronics_driver = {
> + .name = "plantronics",
> + .id_table = plantronics_devices,
> + .input_mapping = plantronics_input_mapping,
> + .probe = plantronics_probe,
> +};
> +module_hid_driver(plantronics_driver);
> +
> +MODULE_AUTHOR("JD Cole <[email protected]>");
> +MODULE_AUTHOR("Terry Junge <[email protected]>");
> +MODULE_DESCRIPTION("Plantronics USB HID Driver");
> +MODULE_LICENSE("GPL");
> diff --git a/include/linux/hid.h b/include/linux/hid.h
> index 10c9be6..2806146 100644
> --- a/include/linux/hid.h
> +++ b/include/linux/hid.h
> @@ -230,6 +230,9 @@ struct hid_item {
> #define HID_DG_BARRELSWITCH 0x000d0044
> #define HID_DG_ERASER 0x000d0045
> #define HID_DG_TABLETPICK 0x000d0046
> +
> +#define HID_CP_CONSUMERCONTROL 0x000c0001
> +
> /*
> * as of May 20, 2009 the usages below are not yet in the official USB spec
> * but are being pushed by Microsft as described in their paper "Digitizer
> --
> 1.8.3.2
>
> From 6564f0972c5d4e9acba9ebbd8d83cd5a1e95f254 Mon Sep 17 00:00:00 2001
> From: JD Cole <[email protected]>
> Date: Fri, 17 Oct 2014 15:52:40 -0700
> Subject: [PATCH 2/2] Added missing HID Consumer Page identifiers, for
> completeness.
>
> Adds CA and NAry usage type identifiers.
>
> BUG=chromium:417434
> TEST=Tested with multiple Plantronics devices on 'peppy' Acer C720p.
>
> Change-Id: I7a55880d6082467274b693c48415e9331d9bbd81
> Signed-off-by: JD Cole <[email protected]>
> ---
> include/linux/hid.h | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/include/linux/hid.h b/include/linux/hid.h
> index 2806146..e923f3d 100644
> --- a/include/linux/hid.h
> +++ b/include/linux/hid.h
> @@ -232,6 +232,30 @@ struct hid_item {
> #define HID_DG_TABLETPICK 0x000d0046
>
> #define HID_CP_CONSUMERCONTROL 0x000c0001
> +#define HID_CP_NUMERICKEYPAD 0x000c0002
> +#define HID_CP_PROGRAMMABLEBUTTONS 0x000c0003
> +#define HID_CP_MICROPHONE 0x000c0004
> +#define HID_CP_HEADPHONE 0x000c0005
> +#define HID_CP_GRAPHICEQUALIZER 0x000c0006
> +#define HID_CP_FUNCTIONBUTTONS 0x000c0036
> +#define HID_CP_SELECTION 0x000c0080
> +#define HID_CP_MEDIASELECTION 0x000c0087
> +#define HID_CP_SELECTDISC 0x000c00ba
> +#define HID_CP_PLAYBACKSPEED 0x000c00f1
> +#define HID_CP_PROXIMITY 0x000c0109
> +#define HID_CP_SPEAKERSYSTEM 0x000c0160
> +#define HID_CP_CHANNELLEFT 0x000c0161
> +#define HID_CP_CHANNELRIGHT 0x000c0162
> +#define HID_CP_CHANNELCENTER 0x000c0163
> +#define HID_CP_CHANNELFRONT 0x000c0164
> +#define HID_CP_CHANNELCENTERFRONT 0x000c0165
> +#define HID_CP_CHANNELSIDE 0x000c0166
> +#define HID_CP_CHANNELSURROUND 0x000c0167
> +#define HID_CP_CHANNELLOWFREQUENCYENHANCEMENT 0x000c0168
> +#define HID_CP_CHANNELTOP 0x000c0169
> +#define HID_CP_CHANNELUNKNOWN 0x000c016a
> +#define HID_CP_APPLICATIONLAUNCHBUTTONS 0x000c0180
> +#define HID_CP_GENERICGUIAPPLICATIONCONTROLS 0x000c0200
>
> /*
> * as of May 20, 2009 the usages below are not yet in the official USB spec
> --
> 1.8.3.2
>
>
>
> ________________________________
>
> CONFIDENTIALITY NOTICE: This e-mail transmission, and any documents, files or
> previous e-mail messages attached to it, may contain information that is
> confidential and/or legally privileged. If you are not the intended
> recipient, or a person responsible for delivering it to the intended
> recipient, please DO NOT disclose the contents to another person, store or
> copy the information in any medium, or use any of the information contained
> in or attached to this transmission for any purpose. If you have received
> this transmission in error, please immediately notify the sender by reply
> email or at [email protected], and destroy the original transmission
> and its attachments without reading or saving in any manner.
>
> For further information about Plantronics - the Company, its products,
> brands, partners, please visit our website www.plantronics.com.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-input" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html