adb_usb: Add Microspeed/Contour/CH Products support

This commit is contained in:
tmk 2022-04-04 22:54:37 +09:00
parent 64de561818
commit 2080d391a7
2 changed files with 51 additions and 0 deletions

View file

@ -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;

View file

@ -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