From ef4cb332590203160a763e0bfb78a4bc35de5d8e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 3 Aug 2022 00:19:13 +0200 Subject: [PATCH] Reverted the old AMIkeyboard controller fix and implemented proper fixes to some AMI keyboard controller commands to make the Vi15G work with a 'F' keyboard controller. --- src/device/keyboard_at.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 24b0775c4..5d38088ed 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -1398,7 +1398,7 @@ write64_ami(void *priv, uint8_t val) else add_data(dev, 'H'); } else - add_data(dev, 'H'); + add_data(dev, 'F'); return 0; case 0xa2: /* clear keyboard controller lines P22/P23 */ @@ -1438,7 +1438,7 @@ write64_ami(void *priv, uint8_t val) case 0xa6: /* read clock */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - read clock\n"); - add_data(dev, !!(dev->ami_stat & 1)); + add_to_kbc_queue_front(dev, (dev->ami_stat & 1) ? 0xff : 0x00, 0, 0x00); return 0; } break; @@ -1462,7 +1462,7 @@ write64_ami(void *priv, uint8_t val) case 0xa9: /* read cache */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - read cache\n"); - add_data(dev, !!(dev->ami_stat & 2)); + add_to_kbc_queue_front(dev, (dev->ami_stat & 2) ? 0xff : 0x00, 0, 0x00); return 0; } break; @@ -1535,7 +1535,7 @@ write64_ami(void *priv, uint8_t val) * (allow command D1 to change bits 2/3 of the output port) */ kbd_log("ATkbc: AMI - unblock KBC lines P22 and P23\n"); - dev->output_locked = 1; + dev->ami_flags &= 0xfb; return 0; case 0xc9: @@ -1544,7 +1544,7 @@ write64_ami(void *priv, uint8_t val) * (disallow command D1 from changing bits 2/3 of the port) */ kbd_log("ATkbc: AMI - block KBC lines P22 and P23\n"); - dev->output_locked = 1; + dev->ami_flags |= 0x04; return 0; case 0xcc: @@ -1796,7 +1796,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv) case 0xd1: /* write output port */ kbd_log("ATkbc: write output port\n"); - if (dev->output_locked) { + /* Bit 2 of AMI flags is P22-P23 blocked (1 = yes, 0 = no), + discovered by reverse-engineering the AOpeN Vi15G BIOS. */ + if (dev->ami_flags & 0x04) { /*If keyboard controller lines P22-P23 are blocked, we force them to remain unchanged.*/ val &= ~0x0c; @@ -2259,6 +2261,7 @@ kbd_reset(void *priv) set_scancode_map(dev); dev->ami_flags = ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x01 : 0x00; + dev->ami_stat |= 0x02; }