From: "Felix Hädicke" <felixhaedicke@web.de>
To: John Chen <johnchen902@gmail.com>, linux-input@vger.kernel.org
Subject: Re: [PATCH v2 1/4] HID: magicmouse: add Apple Magic Mouse 2 support
Date: Mon, 05 Apr 2021 19:30:49 +0200 [thread overview]
Message-ID: <86f7cf6626c482ba16f376d19f8648e86311ec35.camel@web.de> (raw)
In-Reply-To: <20210330113319.14010-2-johnchen902@gmail.com>
On Tue, 2021-03-30 at 19:33 +0800, John Chen wrote:
> Bluetooth device
> Vendor 004c (Apple)
> Device 0269 (Magic Mouse 2)
>
> Add support for Apple Magic Mouse 2, putting the device in multi-
> touch
> mode.
>
> Co-authored-by: Rohit Pidaparthi <rohitpid@gmail.com>
> Co-authored-by: RicardoEPRodrigues <ricardo.e.p.rodrigues@gmail.com>
> Signed-off-by: John Chen <johnchen902@gmail.com>
> ---
> drivers/hid/hid-ids.h | 1 +
> drivers/hid/hid-magicmouse.c | 53 ++++++++++++++++++++++++++++++++--
> --
> 2 files changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index e42aaae3138f..fa0edf03570a 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -93,6 +93,7 @@
> #define BT_VENDOR_ID_APPLE 0x004c
> #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304
> #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d
> +#define USB_DEVICE_ID_APPLE_MAGICMOUSE2 0x0269
This device ID should probably also be added to the
hid_have_special_driver list in hid-quirks.c.
> #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e
> #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 0x0265
> #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e
> diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-
> magicmouse.c
> index abd86903875f..7aad6ca56780 100644
> --- a/drivers/hid/hid-magicmouse.c
> +++ b/drivers/hid/hid-magicmouse.c
> @@ -54,6 +54,7 @@ MODULE_PARM_DESC(report_undeciphered, "Report
> undeciphered multi-touch state fie
> #define TRACKPAD2_USB_REPORT_ID 0x02
> #define TRACKPAD2_BT_REPORT_ID 0x31
> #define MOUSE_REPORT_ID 0x29
> +#define MOUSE2_REPORT_ID 0x12
> #define DOUBLE_REPORT_ID 0xf7
> /* These definitions are not precise, but they're close enough.
> (Bits
> * 0x03 seem to indicate the aspect ratio of the touch, bits 0x70
> seem
> @@ -195,7 +196,8 @@ static void magicmouse_emit_touch(struct
> magicmouse_sc *msc, int raw_id, u8 *tda
> int id, x, y, size, orientation, touch_major, touch_minor,
> state, down;
> int pressure = 0;
>
> - if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
> + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE ||
> + input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) {
> id = (tdata[6] << 2 | tdata[5] >> 6) & 0xf;
> x = (tdata[1] << 28 | tdata[0] << 20) >> 20;
> y = -((tdata[2] << 24 | tdata[1] << 16) >> 20);
> @@ -296,7 +298,8 @@ static void magicmouse_emit_touch(struct
> magicmouse_sc *msc, int raw_id, u8 *tda
> input_report_abs(input, ABS_MT_PRESSURE,
> pressure);
>
> if (report_undeciphered) {
> - if (input->id.product ==
> USB_DEVICE_ID_APPLE_MAGICMOUSE)
> + if (input->id.product ==
> USB_DEVICE_ID_APPLE_MAGICMOUSE ||
> + input->id.product ==
> USB_DEVICE_ID_APPLE_MAGICMOUSE2)
> input_event(input, EV_MSC, MSC_RAW,
> tdata[7]);
> else if (input->id.product !=
> USB_DEVICE_ID_APPLE_MAGICTRAC
> KPAD2)
> @@ -380,6 +383,34 @@ static int magicmouse_raw_event(struct
> hid_device *hdev,
> * ts = data[3] >> 6 | data[4] << 2 | data[5] << 10;
> */
> break;
> + case MOUSE2_REPORT_ID:
> + /* Size is either 8 or (14 + 8 * N) */
> + if (size != 8 && (size < 14 || (size - 14) % 8 != 0))
> + return 0;
> + npoints = (size - 14) / 8;
> + if (npoints > 15) {
> + hid_warn(hdev, "invalid size value (%d) for
> MOUSE2_REPORT_ID\n",
> + size);
> + return 0;
> + }
> + msc->ntouches = 0;
> + for (ii = 0; ii < npoints; ii++)
> + magicmouse_emit_touch(msc, ii, data + ii * 8
> + 14);
> +
> + /* When emulating three-button mode, it is important
> + * to have the current touch information before
> + * generating a click event.
> + */
> + x = (int)((data[3] << 24) | (data[2] << 16)) >> 16;
> + y = (int)((data[5] << 24) | (data[4] << 16)) >> 16;
> + clicks = data[1];
> +
> + /* The following bits provide a device specific
> timestamp. They
> + * are unused here.
> + *
> + * ts = data[11] >> 6 | data[12] << 2 | data[13] <<
> 10;
> + */
> + break;
> case DOUBLE_REPORT_ID:
> /* Sometimes the trackpad sends two touch reports in
> one
> * packet.
> @@ -392,7 +423,8 @@ static int magicmouse_raw_event(struct hid_device
> *hdev,
> return 0;
> }
>
> - if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
> + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE ||
> + input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) {
> magicmouse_emit_buttons(msc, clicks & 3);
> input_report_rel(input, REL_X, x);
> input_report_rel(input, REL_Y, y);
> @@ -415,7 +447,8 @@ static int magicmouse_setup_input(struct
> input_dev *input, struct hid_device *hd
>
> __set_bit(EV_KEY, input->evbit);
>
> - if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
> + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE ||
> + input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) {
> __set_bit(BTN_LEFT, input->keybit);
> __set_bit(BTN_RIGHT, input->keybit);
> if (emulate_3button)
> @@ -480,7 +513,8 @@ static int magicmouse_setup_input(struct
> input_dev *input, struct hid_device *hd
> * the origin at the same position, and just uses the
> additive
> * inverse of the reported Y.
> */
> - if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
> + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE ||
> + input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) {
> input_set_abs_params(input, ABS_MT_ORIENTATION, -31,
> 32, 1, 0);
> input_set_abs_params(input, ABS_MT_POSITION_X,
> MOUSE_MIN_X, MOUSE_MAX_X, 4, 0);
> @@ -586,6 +620,7 @@ static int magicmouse_probe(struct hid_device
> *hdev,
> {
> const u8 *feature;
> const u8 feature_mt[] = { 0xD7, 0x01 };
> + const u8 feature_mt_mouse2[] = { 0xF1, 0x02, 0x01 };
> const u8 feature_mt_trackpad2_usb[] = { 0x02, 0x01 };
> const u8 feature_mt_trackpad2_bt[] = { 0xF1, 0x02, 0x01 };
> u8 *buf;
> @@ -631,6 +666,9 @@ static int magicmouse_probe(struct hid_device
> *hdev,
> if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE)
> report = hid_register_report(hdev, HID_INPUT_REPORT,
> MOUSE_REPORT_ID, 0);
> + else if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2)
> + report = hid_register_report(hdev, HID_INPUT_REPORT,
> + MOUSE2_REPORT_ID, 0);
> else if (id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) {
> if (id->vendor == BT_VENDOR_ID_APPLE)
> report = hid_register_report(hdev,
> HID_INPUT_REPORT,
> @@ -660,6 +698,9 @@ static int magicmouse_probe(struct hid_device
> *hdev,
> feature_size =
> sizeof(feature_mt_trackpad2_usb);
> feature = feature_mt_trackpad2_usb;
> }
> + } else if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) {
> + feature_size = sizeof(feature_mt_mouse2);
> + feature = feature_mt_mouse2;
> } else {
> feature_size = sizeof(feature_mt);
> feature = feature_mt;
> @@ -696,6 +737,8 @@ static int magicmouse_probe(struct hid_device
> *hdev,
> static const struct hid_device_id magic_mice[] = {
> { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
> USB_DEVICE_ID_APPLE_MAGICMOUSE), .driver_data = 0 },
> + { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE,
> + USB_DEVICE_ID_APPLE_MAGICMOUSE2), .driver_data = 0 },
> { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
> USB_DEVICE_ID_APPLE_MAGICTRACKPAD), .driver_data = 0
> },
> { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE,
next prev parent reply other threads:[~2021-04-05 17:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-30 11:33 [PATCH v2 0/4] Hid: add Apple Magic Mouse 2 support John Chen
2021-03-30 11:33 ` [PATCH v2 1/4] HID: magicmouse: " John Chen
2021-04-05 17:30 ` Felix Hädicke [this message]
2021-03-30 11:33 ` [PATCH v2 2/4] HID: magicmouse: fix 3 button emulation of Mouse 2 John Chen
2021-04-07 11:15 ` Jiri Kosina
2021-03-30 11:33 ` [PATCH v2 3/4] HID: magicmouse: fix reconnection of Magic " John Chen
2021-03-30 11:33 ` [PATCH v2 4/4] HID: input: map battery capacity (00850065) John Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86f7cf6626c482ba16f376d19f8648e86311ec35.camel@web.de \
--to=felixhaedicke@web.de \
--cc=johnchen902@gmail.com \
--cc=linux-input@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).