From 1c4afad095e5c452f151886cd09a2b73265b07f6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 9 Apr 2023 23:24:03 +0200 Subject: [PATCH] The keyboard controller now waits for the keyboard or mouse to process a command, hopefully fixes the remaining 301 errors on the IBM PS/2 models. --- src/device/keyboard_at.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index bfa6fa0be..86e87cc9b 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -99,7 +99,9 @@ enum { KBC_STATE_MAIN_BOTH, KBC_STATE_KBC_OUT, KBC_STATE_KBC_PARAM, + KBC_STATE_SEND_KBD, KBC_STATE_KBD, + KBC_STATE_SEND_MOUSE, KBC_STATE_MOUSE }; #define KBC_STATE_SCAN_KBD KBC_STATE_KBD @@ -836,7 +838,7 @@ kbc_ibf_process(atkbd_t *dev) set_enable_kbd(dev, 1); dev->key_wantcmd = 1; dev->key_dat = dev->ib; - dev->kbc_state = KBC_STATE_SCAN_KBD; + dev->kbc_state = KBC_STATE_SEND_KBD; } } @@ -892,8 +894,7 @@ kbc_poll_at(atkbd_t *dev) } break; case KBC_STATE_MAIN_IBF: - case KBC_STATE_MAIN_MOUSE: - case KBC_STATE_SCAN_MOUSE: + default: if (dev->status & STAT_OFULL) { /* OBF set, wait until it is cleared but still process commands. */ if ((dev->status & STAT_IFULL) && (dev->status & STAT_CD)) { @@ -941,6 +942,10 @@ kbc_poll_at(atkbd_t *dev) kbc_process_cmd(dev); } break; + case KBC_STATE_SEND_KBD: + if (!dev->key_wantcmd) + dev->kbc_state = KBC_STATE_SCAN_KBD; + break; case KBC_STATE_SCAN_KBD: kbc_scan_kbd_at(dev); break; @@ -997,6 +1002,7 @@ kbc_poll_ps2(atkbd_t *dev) } break; case KBC_STATE_MAIN_IBF: + default: // pclog("KBC_STATE_MAIN_IBF\n"); if (dev->status & STAT_IFULL) kbc_ibf_process(dev); @@ -1071,10 +1077,18 @@ kbc_poll_ps2(atkbd_t *dev) kbc_process_cmd(dev); } break; + case KBC_STATE_SEND_KBD: + if (!dev->key_wantcmd) + dev->kbc_state = KBC_STATE_SCAN_KBD; + break; case KBC_STATE_SCAN_KBD: // pclog("KBC_STATE_SCAN_KBD\n"); (void) kbc_scan_kbd_ps2(dev); break; + case KBC_STATE_SEND_MOUSE: + if (!dev->mouse_wantcmd) + dev->kbc_state = KBC_STATE_SCAN_MOUSE; + break; case KBC_STATE_SCAN_MOUSE: // pclog("KBC_STATE_SCAN_MOUSE\n"); (void) kbc_scan_aux_ps2(dev); @@ -2695,7 +2709,7 @@ kbc_process_cmd(void *priv) if (mouse_write) { dev->mouse_wantcmd = 1; dev->mouse_dat = dev->ib; - dev->kbc_state = KBC_STATE_SCAN_MOUSE; + dev->kbc_state = KBC_STATE_SEND_MOUSE; } else add_to_kbc_queue_front(dev, 0xfe, 2, 0x40); }