Fixed the behavior of PS/2-style keyboard controllers when no PS/2 mouse is attached, fixes NetBSD 7.1 hanging.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Intel 8042 (AT keyboard controller) emulation.
|
* Intel 8042 (AT keyboard controller) emulation.
|
||||||
*
|
*
|
||||||
* Version: @(#)keyboard_at.c 1.0.16 2018/01/04
|
* Version: @(#)keyboard_at.c 1.0.17 2018/01/06
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -130,6 +130,7 @@ uint8_t keyboard_set3_all_break;
|
|||||||
/* Bits 0 - 1 = scan code set, bit 6 = translate or not. */
|
/* Bits 0 - 1 = scan code set, bit 6 = translate or not. */
|
||||||
uint8_t keyboard_mode = 0x42;
|
uint8_t keyboard_mode = 0x42;
|
||||||
|
|
||||||
|
#define ENABLE_KEYBOARD_AT_LOG 1
|
||||||
#ifdef ENABLE_KEYBOARD_AT_LOG
|
#ifdef ENABLE_KEYBOARD_AT_LOG
|
||||||
int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG;
|
int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG;
|
||||||
#endif
|
#endif
|
||||||
@@ -655,7 +656,7 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val)
|
|||||||
static void
|
static void
|
||||||
kbd_output_write(atkbd_t *kbd, uint8_t val)
|
kbd_output_write(atkbd_t *kbd, uint8_t val)
|
||||||
{
|
{
|
||||||
kbdlog("Write output port\n");
|
kbdlog("Write output port: %02X\n", val);
|
||||||
if ((kbd->output_port ^ val) & 0x20) { /*IRQ 12*/
|
if ((kbd->output_port ^ val) & 0x20) { /*IRQ 12*/
|
||||||
if (val & 0x20)
|
if (val & 0x20)
|
||||||
picint(1 << 12);
|
picint(1 << 12);
|
||||||
@@ -663,7 +664,7 @@ kbd_output_write(atkbd_t *kbd, uint8_t val)
|
|||||||
picintc(1 << 12);
|
picintc(1 << 12);
|
||||||
}
|
}
|
||||||
if ((kbd->output_port ^ val) & 0x10) { /*IRQ 1*/
|
if ((kbd->output_port ^ val) & 0x10) { /*IRQ 1*/
|
||||||
if (val & 0x20)
|
if (val & 0x10)
|
||||||
picint(1 << 1);
|
picint(1 << 1);
|
||||||
else
|
else
|
||||||
picintc(1 << 1);
|
picintc(1 << 1);
|
||||||
@@ -725,6 +726,20 @@ kbd_write64_generic(void *p, uint8_t val)
|
|||||||
|
|
||||||
kbd_adddata(kbd->input_port | 4 | fdc_ps1_525());
|
kbd_adddata(kbd->input_port | 4 | fdc_ps1_525());
|
||||||
kbd->input_port = ((kbd->input_port + 1) & 3) | (kbd->input_port & 0xfc) | fdc_ps1_525();
|
kbd->input_port = ((kbd->input_port + 1) & 3) | (kbd->input_port & 0xfc) | fdc_ps1_525();
|
||||||
|
return 0;
|
||||||
|
case 0xd3: /*Write mouse output buffer*/
|
||||||
|
if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) {
|
||||||
|
kbdlog("ATkbd: write mouse output buffer\n");
|
||||||
|
kbd->want60 = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0xd4: /*Write to mouse*/
|
||||||
|
if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) {
|
||||||
|
kbdlog("ATkbd: write to mouse\n");
|
||||||
|
kbd->want60 = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
|
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
|
||||||
case 0xf4: case 0xf5: case 0xf6: case 0xf7:
|
case 0xf4: case 0xf5: case 0xf6: case 0xf7:
|
||||||
@@ -732,7 +747,7 @@ kbd_write64_generic(void *p, uint8_t val)
|
|||||||
case 0xfc: case 0xfd: case 0xfe: case 0xff:
|
case 0xfc: case 0xfd: case 0xfe: case 0xff:
|
||||||
kbdlog("ATkbd: pulse\n");
|
kbdlog("ATkbd: pulse\n");
|
||||||
kbd_output_pulse(kbd, val & 0x0f);
|
kbd_output_pulse(kbd, val & 0x0f);
|
||||||
break;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@@ -838,13 +853,23 @@ kbd_write64_ibm_mca(void *p, uint8_t val)
|
|||||||
atkbd_t *kbd = (atkbd_t *) p;
|
atkbd_t *kbd = (atkbd_t *) p;
|
||||||
|
|
||||||
switch (val) {
|
switch (val) {
|
||||||
|
case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/
|
||||||
|
kbdlog("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n");
|
||||||
|
kbd->status &= 0xf;
|
||||||
|
kbd->status |= ((((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf) << 4);
|
||||||
|
return 0;
|
||||||
|
case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/
|
||||||
|
kbdlog("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n");
|
||||||
|
kbd->status &= 0xf;
|
||||||
|
kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0);
|
||||||
|
return 0;
|
||||||
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
|
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
|
||||||
case 0xf4: case 0xf5: case 0xf6: case 0xf7:
|
case 0xf4: case 0xf5: case 0xf6: case 0xf7:
|
||||||
case 0xf8: case 0xf9: case 0xfa: case 0xfb:
|
case 0xf8: case 0xf9: case 0xfa: case 0xfb:
|
||||||
case 0xfc: case 0xfd: case 0xfe: case 0xff:
|
case 0xfc: case 0xfd: case 0xfe: case 0xff:
|
||||||
kbdlog("ATkbd: pulse\n");
|
kbdlog("ATkbd: pulse\n");
|
||||||
kbd_output_pulse(kbd, val & 0x03);
|
kbd_output_pulse(kbd, val & 0x03);
|
||||||
break;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return kbd_write64_generic(kbd, val);
|
return kbd_write64_generic(kbd, val);
|
||||||
@@ -1012,15 +1037,14 @@ write_register:
|
|||||||
|
|
||||||
case 0xd3: /*Write to mouse output buffer*/
|
case 0xd3: /*Write to mouse output buffer*/
|
||||||
kbdlog("ATkbd: write to mouse output buffer\n");
|
kbdlog("ATkbd: write to mouse output buffer\n");
|
||||||
keyboard_at_adddata_mouse(val);
|
if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1))
|
||||||
|
keyboard_at_adddata_mouse(val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd4: /*Write to mouse*/
|
case 0xd4: /*Write to mouse*/
|
||||||
kbdlog("ATkbd: write to mouse (%02X)\n", val);
|
kbdlog("ATkbd: write to mouse (%02X)\n", val);
|
||||||
if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1))
|
if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1))
|
||||||
mouse_write(val, mouse_p);
|
mouse_write(val, mouse_p);
|
||||||
else
|
|
||||||
keyboard_at_adddata_mouse(0xff);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1295,18 +1319,6 @@ write_register:
|
|||||||
kbd->mem[0] &= ~0x10;
|
kbd->mem[0] &= ~0x10;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/
|
|
||||||
kbdlog("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n");
|
|
||||||
kbd->status &= 0xf;
|
|
||||||
kbd->status |= ((((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf) << 4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/
|
|
||||||
kbdlog("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n");
|
|
||||||
kbd->status &= 0xf;
|
|
||||||
kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xd0: /*Read output port*/
|
case 0xd0: /*Read output port*/
|
||||||
kbdlog("ATkbd: read output port\n");
|
kbdlog("ATkbd: read output port\n");
|
||||||
kbd_adddata(kbd->output_port);
|
kbd_adddata(kbd->output_port);
|
||||||
@@ -1322,16 +1334,6 @@ write_register:
|
|||||||
kbd->want60 = 1;
|
kbd->want60 = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd3: /*Write mouse output buffer*/
|
|
||||||
kbdlog("ATkbd: write mouse output buffer\n");
|
|
||||||
kbd->want60 = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xd4: /*Write to mouse*/
|
|
||||||
kbdlog("ATkbd: write to mouse\n");
|
|
||||||
kbd->want60 = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xdd: /* Disable A20 Address Line */
|
case 0xdd: /* Disable A20 Address Line */
|
||||||
kbdlog("ATkbd: disable A20 Address Line\n");
|
kbdlog("ATkbd: disable A20 Address Line\n");
|
||||||
kbd->output_port &= ~0x02;
|
kbd->output_port &= ~0x02;
|
||||||
|
|||||||
Reference in New Issue
Block a user