Minor keyboard-related fixes.
This commit is contained in:
@@ -30,10 +30,10 @@
|
||||
#include <time.h>
|
||||
#include <wchar.h>
|
||||
#include <stdatomic.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
# include <pwd.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
# include <string.h>
|
||||
@@ -1048,6 +1048,7 @@ pc_send_ca(uint16_t sc)
|
||||
keyboard_input(1, 0x1D); /* Ctrl key pressed */
|
||||
keyboard_input(1, 0x38); /* Alt key pressed */
|
||||
keyboard_input(1, sc);
|
||||
usleep(50000);
|
||||
keyboard_input(0, sc);
|
||||
keyboard_input(0, 0x38); /* Alt key released */
|
||||
keyboard_input(0, 0x1D); /* Ctrl key released */
|
||||
|
@@ -119,12 +119,13 @@ kbc_at_dev_poll(void *priv)
|
||||
break;
|
||||
case DEV_STATE_MAIN_2:
|
||||
/* 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]);
|
||||
dev->port->out_new = dev->queue[dev->queue_start];
|
||||
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;
|
||||
break;
|
||||
case DEV_STATE_MAIN_OUT:
|
||||
@@ -199,8 +200,7 @@ kbc_at_dev_init(uint8_t inst)
|
||||
{
|
||||
atkbc_dev_t *dev;
|
||||
|
||||
dev = (atkbc_dev_t *) malloc(sizeof(atkbc_dev_t));
|
||||
memset(dev, 0x00, sizeof(atkbc_dev_t));
|
||||
dev = (atkbc_dev_t *) calloc(1, sizeof(atkbc_dev_t));
|
||||
|
||||
dev->port = kbc_at_ports[inst];
|
||||
|
||||
|
@@ -523,10 +523,12 @@ static void
|
||||
add_data_kbd(uint16_t val)
|
||||
{
|
||||
atkbc_dev_t *dev = SavedKbd;
|
||||
uint8_t fake_shift[4];
|
||||
uint8_t fake_shift[4] = { 0 };
|
||||
uint8_t num_lock = 0;
|
||||
uint8_t shift_states = 0;
|
||||
|
||||
dev->ignore = 1;
|
||||
|
||||
keyboard_get_states(NULL, &num_lock, NULL);
|
||||
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. */
|
||||
switch (keyboard_mode & 0x02) {
|
||||
case 1:
|
||||
keyboard_at_log("E0 2A\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0x2a;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
keyboard_at_log("E0 12\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0x12;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
@@ -562,12 +566,14 @@ add_data_kbd(uint16_t val)
|
||||
/* Num lock off and left shift pressed. */
|
||||
switch (keyboard_mode & 0x02) {
|
||||
case 1:
|
||||
keyboard_at_log("E0 AA\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0xaa;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
keyboard_at_log("E0 F0 12\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0xf0;
|
||||
fake_shift[2] = 0x12;
|
||||
@@ -583,12 +589,14 @@ add_data_kbd(uint16_t val)
|
||||
/* Num lock off and right shift pressed. */
|
||||
switch (keyboard_mode & 0x02) {
|
||||
case 1:
|
||||
keyboard_at_log("E0 B6\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0xb6;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
keyboard_at_log("E0 F0 59\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0xf0;
|
||||
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. */
|
||||
switch (keyboard_mode & 0x02) {
|
||||
case 1:
|
||||
keyboard_at_log("E0 AA\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0xaa;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
keyboard_at_log("E0 F0 12\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0xf0;
|
||||
fake_shift[2] = 0x12;
|
||||
@@ -636,12 +646,14 @@ add_data_kbd(uint16_t val)
|
||||
/* Num lock off and left shift pressed. */
|
||||
switch (keyboard_mode & 0x02) {
|
||||
case 1:
|
||||
keyboard_at_log("E0 2A\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0x2a;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
keyboard_at_log("E0 12\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0x12;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
@@ -656,12 +668,14 @@ add_data_kbd(uint16_t val)
|
||||
/* Num lock off and right shift pressed. */
|
||||
switch (keyboard_mode & 0x02) {
|
||||
case 1:
|
||||
keyboard_at_log("E0 36\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0x36;
|
||||
add_data_vals(dev, fake_shift, 2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
keyboard_at_log("E0 59\n");
|
||||
fake_shift[0] = 0xe0;
|
||||
fake_shift[1] = 0x59;
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
||||
dev->ignore = 0;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -860,7 +876,8 @@ keyboard_at_write(void *priv)
|
||||
|
||||
case 0xf5: /* set defaults and disable keyboard */
|
||||
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_at_log("%s: val = %02X, keyboard_scan = %i\n",
|
||||
dev->name, val, keyboard_scan);
|
||||
|
@@ -79,6 +79,7 @@ typedef struct atkbc_dev_t {
|
||||
int y;
|
||||
int z;
|
||||
int b;
|
||||
int ignore;
|
||||
|
||||
int *scan;
|
||||
|
||||
|
Reference in New Issue
Block a user