adb_usb: Fix Address Resolution timing

- when there is no data transfer for 1000 ms
This commit is contained in:
tmk 2022-05-13 23:24:18 +09:00
parent 15b401a8f2
commit ca1af1a03f

View file

@ -442,7 +442,7 @@ static int32_t scroll_state = 0;
static uint8_t scroll_speed = ADB_MOUSE_SCROLL_SPEED; static uint8_t scroll_speed = ADB_MOUSE_SCROLL_SPEED;
static uint8_t scroll_button_mask = (1 << ADB_MOUSE_SCROLL_BUTTON) >> 1; static uint8_t scroll_button_mask = (1 << ADB_MOUSE_SCROLL_BUTTON) >> 1;
static void mouse_proc(uint8_t addr) static uint8_t mouse_proc(uint8_t addr)
{ {
uint8_t len; uint8_t len;
uint8_t buf[5]; uint8_t buf[5];
@ -454,7 +454,7 @@ static void mouse_proc(uint8_t addr)
len = adb_host_talk_buf(addr, ADB_REG_0, buf, sizeof(buf)); len = adb_host_talk_buf(addr, ADB_REG_0, buf, sizeof(buf));
if (len < 2) { if (len < 2) {
return; return 0;
}; };
xprintf("M:$%X[ ", addr); xprintf("M:$%X[ ", addr);
@ -627,7 +627,7 @@ static void mouse_proc(uint8_t addr)
// Send result by usb. // Send result by usb.
host_mouse_send(&mouse_report); host_mouse_send(&mouse_report);
return; return 1;
} }
uint8_t adb_mouse_buttons(void) uint8_t adb_mouse_buttons(void)
@ -660,11 +660,11 @@ static uint8_t appliance_keymap(uint8_t code)
} }
} }
static void appliance_proc(uint8_t addr) static uint8_t appliance_proc(uint8_t addr)
{ {
// Adjustable keybaord M1242 media keys: handler=2 // Adjustable keybaord M1242 media keys: handler=2
uint16_t codes = adb_host_kbd_recv(addr); uint16_t codes = adb_host_kbd_recv(addr);
if (!codes) return; if (!codes) return 0;
xprintf("m:$%X:%04X ", addr, codes); xprintf("m:$%X:%04X ", addr, codes);
uint8_t key; uint8_t key;
@ -680,6 +680,8 @@ static void appliance_proc(uint8_t addr)
register_key(key); register_key(key);
} }
} }
return 1;
} }
@ -842,47 +844,40 @@ void hook_main_loop(void)
} }
} }
// Address Resolution
if (timer_elapsed(detect_ms) > 1000) {
detect_ms = timer_read();
resolve_address();
poll_ms = timer_read();
return;
}
// Polling with 11ms interval
if (timer_elapsed(poll_ms) < 11) return;
uint8_t len; uint8_t len;
uint8_t buf[8]; uint8_t buf[8];
uint8_t addr = active_addr; uint8_t addr = active_addr;
do { uint8_t busy = 0;
// Polling with 11ms interval
if (timer_elapsed(poll_ms) >= 11) do {
addr %= 16; addr %= 16;
// Ignore Address 0 // Ignore Address 0
if (addr == 0) continue; if (addr == 0) continue;
poll_ms = timer_read();
switch (device_table[addr].addr_default) { switch (device_table[addr].addr_default) {
case ADB_ADDR_KEYBOARD: case ADB_ADDR_KEYBOARD:
keyboard_proc(addr); busy = keyboard_proc(addr);
break; break;
case ADB_ADDR_MOUSE: case ADB_ADDR_MOUSE:
mouse_proc(addr); busy = mouse_proc(addr);
break; break;
case ADB_ADDR_APPLIANCE: case ADB_ADDR_APPLIANCE:
appliance_proc(addr); busy = appliance_proc(addr);
break; break;
case 0: case 0:
// No device or dumb device #733 // No device entry but 'dumb' device may exist #733
switch (addr) { switch (addr) {
case ADB_ADDR_KEYBOARD: case ADB_ADDR_KEYBOARD:
keyboard_proc(addr); busy = keyboard_proc(addr);
break; break;
case ADB_ADDR_MOUSE: case ADB_ADDR_MOUSE:
mouse_proc(addr); busy = mouse_proc(addr);
break; break;
case ADB_ADDR_APPLIANCE: case ADB_ADDR_APPLIANCE:
appliance_proc(addr); busy = appliance_proc(addr);
break; break;
} }
break; break;
@ -896,6 +891,7 @@ void hook_main_loop(void)
} }
xprintf("]\n"); xprintf("]\n");
#endif #endif
busy = 1;
} }
break; break;
} }
@ -906,5 +902,14 @@ void hook_main_loop(void)
} }
} while (++addr != active_addr); } while (++addr != active_addr);
active_addr = addr % 16; active_addr = addr % 16;
poll_ms = timer_read();
// Address Resolution
if (!busy) {
if (timer_elapsed(detect_ms) >= 1000) {
detect_ms = timer_read();
resolve_address();
}
} else {
detect_ms = timer_read();
}
} }