Minor keyboard-related fixes.
This commit is contained in:
@@ -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 */
|
||||||
|
@@ -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];
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user