Reset all keys on keyboard reset and also make sure to stop the CTRL+ALT+DEL sending on keyboard reset, fixes spurious "Keyboard not present" errors.
This commit is contained in:
28
src/86box.c
28
src/86box.c
@@ -1250,20 +1250,48 @@ pc_send_ca(uint16_t sc)
|
|||||||
if (keyboard_mode >= 0x81) {
|
if (keyboard_mode >= 0x81) {
|
||||||
/* Use R-Alt because PS/55 DOS and OS/2 assign L-Alt Kanji */
|
/* Use R-Alt because PS/55 DOS and OS/2 assign L-Alt Kanji */
|
||||||
keyboard_input(1, 0x1D); /* Ctrl key pressed */
|
keyboard_input(1, 0x1D); /* Ctrl key pressed */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(1, 0x138); /* R-Alt key pressed */
|
keyboard_input(1, 0x138); /* R-Alt key pressed */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(1, sc);
|
keyboard_input(1, sc);
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
usleep(50000);
|
usleep(50000);
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(0, sc);
|
keyboard_input(0, sc);
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(0, 0x138); /* R-Alt key released */
|
keyboard_input(0, 0x138); /* R-Alt key released */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(0, 0x1D); /* Ctrl key released */
|
keyboard_input(0, 0x1D); /* Ctrl key released */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
keyboard_input(1, 0x1D); /* Ctrl key pressed */
|
keyboard_input(1, 0x1D); /* Ctrl key pressed */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(1, 0x38); /* Alt key pressed */
|
keyboard_input(1, 0x38); /* Alt key pressed */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(1, sc);
|
keyboard_input(1, sc);
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
usleep(50000);
|
usleep(50000);
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(0, sc);
|
keyboard_input(0, sc);
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(0, 0x38); /* Alt key released */
|
keyboard_input(0, 0x38); /* Alt key released */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
keyboard_input(0, 0x1D); /* Ctrl key released */
|
keyboard_input(0, 0x1D); /* Ctrl key released */
|
||||||
|
if (keyboard_get_in_reset())
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ static volatile uint8_t caps_lock = 0;
|
|||||||
static volatile uint8_t num_lock = 0;
|
static volatile uint8_t num_lock = 0;
|
||||||
static volatile uint8_t scroll_lock = 0;
|
static volatile uint8_t scroll_lock = 0;
|
||||||
static volatile uint8_t kana_lock = 0;
|
static volatile uint8_t kana_lock = 0;
|
||||||
|
static volatile uint8_t kbd_in_reset = 0;
|
||||||
static uint8_t shift = 0;
|
static uint8_t shift = 0;
|
||||||
|
|
||||||
static int key5576mode = 0;
|
static int key5576mode = 0;
|
||||||
@@ -111,6 +112,7 @@ keyboard_init(void)
|
|||||||
scroll_lock = 0;
|
scroll_lock = 0;
|
||||||
kana_lock = 0;
|
kana_lock = 0;
|
||||||
shift = 0;
|
shift = 0;
|
||||||
|
kbd_in_reset = 0;
|
||||||
|
|
||||||
memset(recv_key, 0x00, sizeof(recv_key));
|
memset(recv_key, 0x00, sizeof(recv_key));
|
||||||
memset(recv_key_ui, 0x00, sizeof(recv_key));
|
memset(recv_key_ui, 0x00, sizeof(recv_key));
|
||||||
@@ -343,9 +345,9 @@ void
|
|||||||
keyboard_all_up(void)
|
keyboard_all_up(void)
|
||||||
{
|
{
|
||||||
for (unsigned short i = 0; i < 0x200; i++) {
|
for (unsigned short i = 0; i < 0x200; i++) {
|
||||||
if (recv_key_ui[i]) {
|
if (recv_key_ui[i])
|
||||||
recv_key_ui[i] = 0;
|
recv_key_ui[i] = 0;
|
||||||
}
|
|
||||||
if (recv_key[i]) {
|
if (recv_key[i]) {
|
||||||
recv_key[i] = 0;
|
recv_key[i] = 0;
|
||||||
key_process(i, 0);
|
key_process(i, 0);
|
||||||
@@ -353,6 +355,18 @@ keyboard_all_up(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
keyboard_set_in_reset(uint8_t in_reset)
|
||||||
|
{
|
||||||
|
kbd_in_reset = in_reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
keyboard_get_in_reset(void)
|
||||||
|
{
|
||||||
|
return kbd_in_reset;
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
keyboard_do_break(uint16_t scan)
|
keyboard_do_break(uint16_t scan)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3476,7 +3476,10 @@ keyboard_at_bat(void *priv)
|
|||||||
|
|
||||||
keyboard_scan = 1;
|
keyboard_scan = 1;
|
||||||
|
|
||||||
|
keyboard_all_up();
|
||||||
keyboard_update_states(0, 0, 0, 0);
|
keyboard_update_states(0, 0, 0, 0);
|
||||||
|
|
||||||
|
keyboard_set_in_reset(0);
|
||||||
kbc_at_dev_queue_add(dev, 0xaa, 0);
|
kbc_at_dev_queue_add(dev, 0xaa, 0);
|
||||||
} else {
|
} else {
|
||||||
bat_counter--;
|
bat_counter--;
|
||||||
@@ -3714,6 +3717,7 @@ keyboard_at_write(void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xff: /* reset */
|
case 0xff: /* reset */
|
||||||
|
keyboard_set_in_reset(1);
|
||||||
kbc_at_dev_reset(dev, 1);
|
kbc_at_dev_reset(dev, 1);
|
||||||
bat_counter = 1000;
|
bat_counter = 1000;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -273,6 +273,8 @@ extern void keyboard_input(int down, uint16_t scan);
|
|||||||
extern void keyboard_all_up(void);
|
extern void keyboard_all_up(void);
|
||||||
extern void keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl, uint8_t kl);
|
extern void keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl, uint8_t kl);
|
||||||
extern uint8_t keyboard_get_shift(void);
|
extern uint8_t keyboard_get_shift(void);
|
||||||
|
extern void keyboard_set_in_reset(uint8_t in_reset);
|
||||||
|
extern uint8_t keyboard_get_in_reset(void);
|
||||||
extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl, uint8_t *kl);
|
extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl, uint8_t *kl);
|
||||||
extern void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl);
|
extern void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl);
|
||||||
extern int keyboard_recv(uint16_t key);
|
extern int keyboard_recv(uint16_t key);
|
||||||
|
|||||||
Reference in New Issue
Block a user