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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.