Minor keyboard-related fixes.

This commit is contained in:
OBattler
2024-01-20 17:27:24 +01:00
parent 19af46a8c2
commit 530fafe78a
4 changed files with 26 additions and 7 deletions

View File

@@ -30,10 +30,10 @@
#include <time.h> #include <time.h>
#include <wchar.h> #include <wchar.h>
#include <stdatomic.h> #include <stdatomic.h>
#include <unistd.h>
#ifndef _WIN32 #ifndef _WIN32
# include <pwd.h> # include <pwd.h>
# include <unistd.h>
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
# include <string.h> # include <string.h>
@@ -1048,6 +1048,7 @@ pc_send_ca(uint16_t sc)
keyboard_input(1, 0x1D); /* Ctrl key pressed */ keyboard_input(1, 0x1D); /* Ctrl key pressed */
keyboard_input(1, 0x38); /* Alt key pressed */ keyboard_input(1, 0x38); /* Alt key pressed */
keyboard_input(1, sc); keyboard_input(1, sc);
usleep(50000);
keyboard_input(0, sc); keyboard_input(0, sc);
keyboard_input(0, 0x38); /* Alt key released */ keyboard_input(0, 0x38); /* Alt key released */
keyboard_input(0, 0x1D); /* Ctrl key released */ keyboard_input(0, 0x1D); /* Ctrl key released */

View File

@@ -119,12 +119,13 @@ kbc_at_dev_poll(void *priv)
break; break;
case DEV_STATE_MAIN_2: case DEV_STATE_MAIN_2:
/* Output from scan queue if needed and then return to main loop #1. */ /* Output from scan queue if needed and then return to main loop #1. */
if (*dev->scan && (dev->port->out_new == -1) && (dev->queue_start != dev->queue_end)) { if (!dev->ignore && *dev->scan && (dev->port->out_new == -1) &&
(dev->queue_start != dev->queue_end)) {
kbc_at_dev_log("%s: %02X (DATA) on channel 1\n", dev->name, dev->queue[dev->queue_start]); kbc_at_dev_log("%s: %02X (DATA) on channel 1\n", dev->name, dev->queue[dev->queue_start]);
dev->port->out_new = dev->queue[dev->queue_start]; dev->port->out_new = dev->queue[dev->queue_start];
dev->queue_start = (dev->queue_start + 1) & dev->fifo_mask; dev->queue_start = (dev->queue_start + 1) & dev->fifo_mask;
} }
if (!(*dev->scan) || dev->port->wantcmd) if (dev->ignore || !(*dev->scan) || dev->port->wantcmd)
dev->state = DEV_STATE_MAIN_1; dev->state = DEV_STATE_MAIN_1;
break; break;
case DEV_STATE_MAIN_OUT: case DEV_STATE_MAIN_OUT:
@@ -199,8 +200,7 @@ kbc_at_dev_init(uint8_t inst)
{ {
atkbc_dev_t *dev; atkbc_dev_t *dev;
dev = (atkbc_dev_t *) malloc(sizeof(atkbc_dev_t)); dev = (atkbc_dev_t *) calloc(1, sizeof(atkbc_dev_t));
memset(dev, 0x00, sizeof(atkbc_dev_t));
dev->port = kbc_at_ports[inst]; dev->port = kbc_at_ports[inst];

View File

@@ -523,10 +523,12 @@ static void
add_data_kbd(uint16_t val) add_data_kbd(uint16_t val)
{ {
atkbc_dev_t *dev = SavedKbd; atkbc_dev_t *dev = SavedKbd;
uint8_t fake_shift[4]; uint8_t fake_shift[4] = { 0 };
uint8_t num_lock = 0; uint8_t num_lock = 0;
uint8_t shift_states = 0; uint8_t shift_states = 0;
dev->ignore = 1;
keyboard_get_states(NULL, &num_lock, NULL); keyboard_get_states(NULL, &num_lock, NULL);
shift_states = keyboard_get_shift() & STATE_SHIFT_MASK; shift_states = keyboard_get_shift() & STATE_SHIFT_MASK;
@@ -541,12 +543,14 @@ add_data_kbd(uint16_t val)
/* Num lock on and no shifts are pressed, send non-inverted fake shift. */ /* Num lock on and no shifts are pressed, send non-inverted fake shift. */
switch (keyboard_mode & 0x02) { switch (keyboard_mode & 0x02) {
case 1: case 1:
keyboard_at_log("E0 2A\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0x2a; fake_shift[1] = 0x2a;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
break; break;
case 2: case 2:
keyboard_at_log("E0 12\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0x12; fake_shift[1] = 0x12;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
@@ -562,12 +566,14 @@ add_data_kbd(uint16_t val)
/* Num lock off and left shift pressed. */ /* Num lock off and left shift pressed. */
switch (keyboard_mode & 0x02) { switch (keyboard_mode & 0x02) {
case 1: case 1:
keyboard_at_log("E0 AA\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0xaa; fake_shift[1] = 0xaa;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
break; break;
case 2: case 2:
keyboard_at_log("E0 F0 12\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0xf0; fake_shift[1] = 0xf0;
fake_shift[2] = 0x12; fake_shift[2] = 0x12;
@@ -583,12 +589,14 @@ add_data_kbd(uint16_t val)
/* Num lock off and right shift pressed. */ /* Num lock off and right shift pressed. */
switch (keyboard_mode & 0x02) { switch (keyboard_mode & 0x02) {
case 1: case 1:
keyboard_at_log("E0 B6\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0xb6; fake_shift[1] = 0xb6;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
break; break;
case 2: case 2:
keyboard_at_log("E0 F0 59\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0xf0; fake_shift[1] = 0xf0;
fake_shift[2] = 0x59; fake_shift[2] = 0x59;
@@ -614,12 +622,14 @@ add_data_kbd(uint16_t val)
/* Num lock on and no shifts are pressed, send non-inverted fake shift. */ /* Num lock on and no shifts are pressed, send non-inverted fake shift. */
switch (keyboard_mode & 0x02) { switch (keyboard_mode & 0x02) {
case 1: case 1:
keyboard_at_log("E0 AA\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0xaa; fake_shift[1] = 0xaa;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
break; break;
case 2: case 2:
keyboard_at_log("E0 F0 12\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0xf0; fake_shift[1] = 0xf0;
fake_shift[2] = 0x12; fake_shift[2] = 0x12;
@@ -636,12 +646,14 @@ add_data_kbd(uint16_t val)
/* Num lock off and left shift pressed. */ /* Num lock off and left shift pressed. */
switch (keyboard_mode & 0x02) { switch (keyboard_mode & 0x02) {
case 1: case 1:
keyboard_at_log("E0 2A\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0x2a; fake_shift[1] = 0x2a;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
break; break;
case 2: case 2:
keyboard_at_log("E0 12\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0x12; fake_shift[1] = 0x12;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
@@ -656,12 +668,14 @@ add_data_kbd(uint16_t val)
/* Num lock off and right shift pressed. */ /* Num lock off and right shift pressed. */
switch (keyboard_mode & 0x02) { switch (keyboard_mode & 0x02) {
case 1: case 1:
keyboard_at_log("E0 36\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0x36; fake_shift[1] = 0x36;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
break; break;
case 2: case 2:
keyboard_at_log("E0 59\n");
fake_shift[0] = 0xe0; fake_shift[0] = 0xe0;
fake_shift[1] = 0x59; fake_shift[1] = 0x59;
add_data_vals(dev, fake_shift, 2); add_data_vals(dev, fake_shift, 2);
@@ -680,6 +694,8 @@ add_data_kbd(uint16_t val)
kbc_at_dev_queue_add(dev, val, 1); kbc_at_dev_queue_add(dev, val, 1);
break; break;
} }
dev->ignore = 0;
} }
void void
@@ -860,7 +876,8 @@ keyboard_at_write(void *priv)
case 0xf5: /* set defaults and disable keyboard */ case 0xf5: /* set defaults and disable keyboard */
case 0xf6: /* set defaults */ case 0xf6: /* set defaults */
keyboard_at_log("%s: set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); keyboard_at_log("%s: set defaults%s\n",
dev->name, (val == 0xf6) ? "" : " and disable keyboard");
keyboard_scan = !(val & 0x01); keyboard_scan = !(val & 0x01);
keyboard_at_log("%s: val = %02X, keyboard_scan = %i\n", keyboard_at_log("%s: val = %02X, keyboard_scan = %i\n",
dev->name, val, keyboard_scan); dev->name, val, keyboard_scan);

View File

@@ -79,6 +79,7 @@ typedef struct atkbc_dev_t {
int y; int y;
int z; int z;
int b; int b;
int ignore;
int *scan; int *scan;