From 2080d391a7e8ec1dca7d81a6b2bce0b7da94f0fd Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 4 Apr 2022 22:54:37 +0900 Subject: [PATCH] adb_usb: Add Microspeed/Contour/CH Products support --- converter/adb_usb/matrix.c | 47 ++++++++++++++++++++++++++++++++++++++ tmk_core/protocol/adb.h | 4 ++++ 2 files changed, 51 insertions(+) diff --git a/converter/adb_usb/matrix.c b/converter/adb_usb/matrix.c index 8fe2d873..921edb3f 100644 --- a/converter/adb_usb/matrix.c +++ b/converter/adb_usb/matrix.c @@ -181,6 +181,21 @@ again: mouse_handler = reg3 & 0xFF; + if (mouse_handler == ADB_HANDLER_MICROSPEED_MACTRAC || + mouse_handler == ADB_HANDLER_MICROSPEED_UNKNOWN || + mouse_handler == ADB_HANDLER_CONTOUR_MOUSE || + mouse_handler == ADB_HANDLER_CHPRODUCTS_PRO) { + // https://github.com/NetBSD/src/blob/netbsd-9/sys/arch/macppc/dev/ams.c#L226-L255 + // https://github.com/torvalds/linux/blob/v5.17/drivers/macintosh/adbhid.c#L1007-L1018 + // https://github.com/torvalds/linux/blob/v5.17/drivers/macintosh/adbhid.c#L1204-L1239 + uint8_t cmd[] = { 0x00, // alt speed max + 0x00, // speed max + 0x10, // ext protocol enabled + 0x07 }; // buttons without locking + //adb_host_flush(ADB_ADDR_MOUSE_TMP); + adb_host_listen_buf(ADB_ADDR_MOUSE_TMP, ADB_REG_1, cmd, sizeof(cmd)); + } + // Try to escalate into extended/classic2 protocol if (mouse_handler == ADB_HANDLER_CLASSIC1_MOUSE || mouse_handler == ADB_HANDLER_CLASSIC2_MOUSE) { adb_host_flush(ADB_ADDR_MOUSE_TMP); @@ -416,6 +431,38 @@ void adb_mouse_task(void) if (buf[1] & 0x40) xneg = true; // Ignore Byte2 and 3 len = 2; + } else if (mouse_handler == ADB_HANDLER_MICROSPEED_MACTRAC || + mouse_handler == ADB_HANDLER_MICROSPEED_UNKNOWN || + mouse_handler == ADB_HANDLER_CONTOUR_MOUSE) { + // Microspeed: + // Byte0: ??? y06 y05 y04 y03 y02 y01 y00 + // Byte1: ??? x06 x05 x04 x03 x02 x01 x00 + // Byte2: ??? ??? ??? ??? ??? bM bR bL + // Contour Mouse: + // Byte0: bbb y06 y05 y04 y03 y02 y01 y00 + // Byte1: 1 x06 x05 x04 x03 x02 x01 x00 + // Byte2: 0 0 0 0 1 bM bR bL + // Byte3: 0 0 0 0 1 bM bR bL + // b--: button state(0:pressed, 1:released) + if (buf[0] & 0x40) yneg = true; + if (buf[1] & 0x40) xneg = true; + buf[0] = ((buf[2] & 1) << 7) | (buf[0] & 0x7F); + buf[1] = ((buf[2] & 2) << 6) | (buf[1] & 0x7F) ; + buf[2] = ((buf[2] & 4) << 5) | (buf[2] & 8) | (yneg ? 0x70 : 0x00) | (xneg ? 0x07 : 0x00); + len = 3; + } else if (mouse_handler == ADB_HANDLER_CHPRODUCTS_PRO) { + // CH Products Trackball Pro: + // Byte0: ??? y06 y05 y04 y03 y02 y01 y00 + // Byte1: ??? x06 x05 x04 x03 x02 x01 x00 + // Byte2: ??? ??? ??? ??? bL0 bL1 bR bM + // b--: button state(0:pressed, 1:released) + // L=(bL0 & bL1) + if (buf[0] & 0x40) yneg = true; + if (buf[1] & 0x40) xneg = true; + buf[0] = (((buf[2] & 4) << 5) & ((buf[2] & 8) << 4)) | (buf[0] & 0x7F); + buf[1] = ((buf[2] & 2) << 6) | (buf[1] & 0x7F) ; + buf[2] = ((buf[2] & 1) << 7) | (yneg ? 0x70 : 0x00) | (xneg ? 0x0F : 0x08); + len = 3; } else { if (buf[len - 1] & 0x40) yneg = true; if (buf[len - 1] & 0x04) xneg = true; diff --git a/tmk_core/protocol/adb.h b/tmk_core/protocol/adb.h index 980a49b9..1847d4a0 100644 --- a/tmk_core/protocol/adb.h +++ b/tmk_core/protocol/adb.h @@ -96,6 +96,10 @@ POSSIBILITY OF SUCH DAMAGE. #define ADB_HANDLER_EXTENDED_MOUSE 0x04 #define ADB_HANDLER_TURBO_MOUSE 0x32 #define ADB_HANDLER_MACALLY2_MOUSE 0x42 +#define ADB_HANDLER_MICROSPEED_MACTRAC 0x2F +#define ADB_HANDLER_MICROSPEED_UNKNOWN 0x5F +#define ADB_HANDLER_CONTOUR_MOUSE 0x66 +#define ADB_HANDLER_CHPRODUCTS_PRO 0x42 // pseudo handler #define ADB_HANDLER_LOGITECH 0x4C