- _delay_ms(20);
- mouse_handler = adb_host_talk(ADB_ADDR_MOUSE, ADB_REG_3) & 0xff;
- mouse_handler = mouse_handler ? mouse_handler : ADB_HANDLER_CLASSIC1_MOUSE;
+#ifdef ADB_MOUSE_ENABLE
+static void mouse_init(uint8_t orig_addr)
+{
+ uint16_t reg3;
+ uint8_t mouse_handler;
+ uint8_t addr;
+
+again:
+ // Move to tmp address 15 to setup mouse function
+ mouse_handler = (reg3 = adb_host_talk(orig_addr, ADB_REG_3)) & 0xFF;
+ if (!reg3) return;
+ dmprintf("addr%d reg3: %04X\n", orig_addr, reg3);
+
+ // Move device to tmp address
+ adb_host_flush(orig_addr);
+ adb_host_listen(orig_addr, ADB_REG_3, ((reg3 >> 8) & 0xF0) | ADB_ADDR_TMP, 0xFE);
+ adb_host_flush(ADB_ADDR_TMP);
+
+ mouse_handler = (reg3 = adb_host_talk(ADB_ADDR_TMP, ADB_REG_3)) & 0xFF;
+ if (!reg3) {
+ dmprintf("move fail\n");
+ goto again;
+ }
+ addr = ADB_ADDR_TMP;
+
+
+detect_again:
+ // Try to escalate into extended/classic2 protocol
+ if (mouse_handler == ADB_HANDLER_CLASSIC1_MOUSE || mouse_handler == ADB_HANDLER_CLASSIC2_MOUSE) {
+ adb_host_flush(addr);
+ adb_host_listen(addr, ADB_REG_3, (reg3 >> 8), ADB_HANDLER_EXTENDED_MOUSE);