Added the option to force constant mouse updating.

This commit is contained in:
OBattler
2025-08-19 21:03:09 +02:00
parent ed4b90ebf4
commit 58d3073775
32 changed files with 639 additions and 89 deletions

View File

@@ -82,6 +82,11 @@
#define KBC_VEN_SIEMENS 0x2c
#define KBC_VEN_COMPAQ 0x30
#define KBC_VEN_IBM 0x34
#define KBC_VEN_AWARD 0x38
#define KBC_VEN_VIA 0x3c
#define KBC_VEN_CHIPS 0x40
#define KBC_VEN_HOLTEK 0x44
#define KBC_VEN_UMC 0x48
#define KBC_VEN_MASK 0x7c
#define KBC_FLAG_IS_ASIC 0x80000000
@@ -167,8 +172,12 @@ typedef struct atkbc_t {
/* Keyboard controller ports. */
kbc_at_port_t *kbc_at_ports[2] = { NULL, NULL };
static uint8_t kbc_ami_revision = '8';
static uint8_t kbc_award_revision = 0x42;
static uint8_t kbc_ami_revision = '8';
static uint8_t kbc_award_revision = 0x42;
static uint8_t kbc_chips_revision = 0xa6;
static uint16_t kbc_phoenix_version = 0x0416;
static void (*kbc_at_do_poll)(atkbc_t *dev);
@@ -391,6 +400,7 @@ kbc_send_to_ob(atkbc_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi)
return;
if ((kbc_ven == KBC_VEN_AMI) || (kbc_ven == KBC_VEN_TRIGEM_AMI) ||
(kbc_ven == KBC_VEN_HOLTEK) || (kbc_ven == KBC_VEN_UMC) ||
(dev->misc_flags & FLAG_PS2))
stat_hi |= ((dev->p1 & 0x80) ? 0x10 : 0x00);
else
@@ -945,6 +955,26 @@ pulse_poll(void *priv)
write_p2(dev, dev->p2 | dev->old_p2);
}
static uint8_t
write_cmd_acer(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
break;
case 0xaf:
kbc_at_log("ATkbc: ??? - appears in the probes of the real controller\n");
kbc_delay_to_ob(dev, 0x00, 0, 0x00);
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_data_ami(void *priv, uint8_t val)
{
@@ -1001,7 +1031,7 @@ write_cmd_data_ami(void *priv, uint8_t val)
void
kbc_at_set_ps2(void *priv, const uint8_t ps2)
{
atkbc_t *dev = (atkbc_t *) priv;
atkbc_t *dev = (atkbc_t *) priv;
dev->ami_flags = (dev->ami_flags & 0xfe) | (!!ps2);
dev->misc_flags &= ~FLAG_PS2;
@@ -1216,6 +1246,12 @@ write_cmd_ami(void *priv, uint8_t val)
ret = 0;
break;
case 0xca: /* read keyboard mode */
kbc_at_log("ATkbc: AMI - read keyboard mode\n");
kbc_delay_to_ob(dev, dev->ami_flags, 0, 0x00);
ret = 0;
break;
case 0xcb: /* set keyboard mode */
kbc_at_log("ATkbc: AMI - set keyboard mode\n");
dev->wantdata = 1;
@@ -1250,11 +1286,283 @@ write_cmd_ami(void *priv, uint8_t val)
}
static uint8_t
write_cmd_data_phoenix(void *priv, uint8_t val)
write_cmd_umc(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
break;
case 0xa0: /* copyright message */
kbc_at_queue_add(dev, 0x28);
kbc_at_queue_add(dev, 0x28);
kbc_at_queue_add(dev, 0x28);
kbc_at_queue_add(dev, 0x00);
ret = 0;
break;
case 0xa1: /* get controller version */
kbc_at_log("ATkbc: UMC - get controller version\n");
kbc_delay_to_ob(dev, kbc_ami_revision, 0, 0x00);
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_data_award(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
break;
case 0xcb: /* set keyboard mode */
kbc_at_log("ATkbc: AMI - set keyboard mode\n");
dev->ami_flags = val;
dev->misc_flags &= ~FLAG_PS2;
if (val & 0x01) {
kbc_at_log("ATkbc: AMI: Emulate PS/2 keyboard\n");
dev->misc_flags |= FLAG_PS2;
kbc_at_do_poll = kbc_at_poll_ps2;
} else {
kbc_at_log("ATkbc: AMI: Emulate AT keyboard\n");
kbc_at_do_poll = kbc_at_poll_at;
}
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_award(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
break;
case 0x90 ... 0x9f: /* Write low nibble to (Port13-Port10) */
kbc_at_log("ATkbc: Award - write low nibble to (Port13-Port10)\n");
dev->p1 = (dev->p1 & 0xf0) | (val & 0x0f);
ret = 0;
break;
case 0xa1: /* get controller version */
kbc_at_log("ATkbc: AMI - get controller version\n");
kbc_delay_to_ob(dev, kbc_ami_revision, 0, 0x00);
ret = 0;
break;
case 0xa4: /* check if password installed */
kbc_at_log("ATkbc: check if password installed\n");
kbc_delay_to_ob(dev, 0xf1, 0, 0x00);
ret = 0;
break;
case 0xa5: /* do nothing */
kbc_at_log("ATkbc: do nothing\n");
ret = 0;
break;
/* TODO: Make this command do nothing on the Regional HT6542,
or else, Efflixi's Award OPTi 495 BIOS gets a stuck key
in Norton Commander 3.0. */
case 0xaf: /* read keyboard version */
kbc_at_log("ATkbc: read keyboard version\n");
kbc_delay_to_ob(dev, kbc_award_revision, 0, 0x00);
ret = 0;
break;
case 0xb0 ... 0xb3:
/* set KBC lines P10-P13 (P1 bits 0-3) low */
kbc_at_log("ATkbc: set KBC lines P10-P13 (P1 bits 0-3) low\n");
dev->p1 &= ~(1 << (val & 0x03));
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
ret = 0;
break;
/* TODO: The ICS SB486PV sends command B4 but expects to read *TWO* bytes. */
case 0xb4: case 0xb5:
/* set KBC lines P22-P23 (P2 bits 2-3) low */
kbc_at_log("ATkbc: set KBC lines P22-P23 (P2 bits 2-3) low\n");
write_p2(dev, dev->p2 & ~(4 << (val & 0x01)));
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
ret = 0;
break;
case 0xb6 ... 0xb7:
/* set KBC lines P14-P15 (P1 bits 4-5) low */
kbc_at_log("ATkbc: set KBC lines P14-P15 (P1 bits 4-5) low\n");
dev->p1 &= ~(0x10 << (val & 0x01));
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
ret = 0;
break;
case 0xb8 ... 0xbb:
/* set KBC lines P10-P13 (P1 bits 0-3) high */
kbc_at_log("ATkbc: set KBC lines P10-P13 (P1 bits 0-3) high\n");
dev->p1 |= (1 << (val & 0x03));
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
ret = 0;
break;
case 0xbc: case 0xbd:
/* set KBC lines P22-P23 (P2 bits 2-3) high */
kbc_at_log("ATkbc: set KBC lines P22-P23 (P2 bits 2-3) high\n");
write_p2(dev, dev->p2 | (4 << (val & 0x01)));
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
ret = 0;
break;
case 0xbe ... 0xbf:
/* set KBC lines P14-P15 (P1 bits 4-5) high */
kbc_at_log("ATkbc: set KBC lines P14-P15 (P1 bits 4-5) high\n");
dev->p1 |= (0x10 << (val & 0x01));
kbc_delay_to_ob(dev, dev->ob, 0, 0x00);
ret = 0;
break;
case 0xc8:
/*
* unblock KBC lines P22/P23
* (allow command D1 to change bits 2/3 of P2)
*/
kbc_at_log("ATkbc: AMI - unblock KBC lines P22 and P23\n");
dev->ami_flags &= 0xfb;
ret = 0;
break;
case 0xc9:
/*
* block KBC lines P22/P23
* (disallow command D1 from changing bits 2/3 of the port)
*/
kbc_at_log("ATkbc: AMI - block KBC lines P22 and P23\n");
dev->ami_flags |= 0x04;
ret = 0;
break;
case 0xca: /* read keyboard mode */
kbc_at_log("ATkbc: AMI - read keyboard mode\n");
kbc_delay_to_ob(dev, dev->ami_flags, 0, 0x00);
ret = 0;
break;
case 0xcb: /* set keyboard mode */
kbc_at_log("ATkbc: AMI - set keyboard mode\n");
dev->wantdata = 1;
dev->state = STATE_KBC_PARAM;
ret = 0;
break;
case 0xe1 ... 0xef: /* Active output ports */
kbc_at_log("ATkbc: Award - active output ports\n");
write_p2(dev, (dev->p2 & 0xf1) | (val & 0x0e));
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_data_chips(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
break;
case 0xa1: /* CHIPS extensions */
kbc_at_log("ATkbc: C&T - CHIPS extensions\n");
if (dev->command_phase == 1) {
switch (val) {
default:
break;
case 0x00: /* return ID */
kbc_at_log("ATkbc: C&T - return ID\n");
kbc_delay_to_ob(dev, kbc_chips_revision, 0, 0x00);
break;
case 0x02: /* write input port */
kbc_at_log("ATkbc: C&T - write input port\n");
dev->mem_addr = val;
dev->wantdata = 1;
dev->state = STATE_KBC_PARAM;
dev->command_phase = 2;
break;
case 0x04: /* select turbo switch input */
kbc_at_log("ATkbc: C&T - select turbo switch input\n");
dev->mem_addr = val;
dev->wantdata = 1;
dev->state = STATE_KBC_PARAM;
dev->command_phase = 2;
break;
case 0x05: /* select turbo LED output */
kbc_at_log("ATkbc: Cselect turbo LED output\n");
dev->mem_addr = val;
dev->wantdata = 1;
dev->state = STATE_KBC_PARAM;
dev->command_phase = 2;
break;
}
} else if (dev->command_phase == 2) {
switch (dev->mem_addr) {
default:
break;
case 0x02: /* write input port */
kbc_at_log("ATkbc: C&T - write iput port\n");
dev->p1 = val;
break;
}
dev->command_phase = 0;
}
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_chips(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
break;
case 0xa1: /* CHIPS extensions */
kbc_at_log("ATkbc: C&T - CHIPS extensions\n");
dev->wantdata = 1;
dev->state = STATE_KBC_PARAM;
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_data_phoenix(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (dev->command) {
default:
break;
@@ -1452,18 +1760,8 @@ write_cmd_phoenix(void *priv, uint8_t val)
revision level and proper CPU bits. */
case 0xd5: /* Read MultiKey code revision level */
kbc_at_log("ATkbc: Phoenix - Read MultiKey code revision level\n");
if (dev->misc_flags & FLAG_PS2) {
if (dev->flags & DEVICE_PCI) {
kbc_at_queue_add(dev, 0x04);
kbc_at_queue_add(dev, 0x16);
} else {
kbc_at_queue_add(dev, 0x01);
kbc_at_queue_add(dev, 0x38);
}
} else {
kbc_at_queue_add(dev, 0x01);
kbc_at_queue_add(dev, 0x29);
}
kbc_at_queue_add(dev, kbc_phoenix_version >> 8);
kbc_at_queue_add(dev, kbc_phoenix_version & 0xff);
ret = 0;
break;
@@ -1496,44 +1794,18 @@ write_cmd_phoenix(void *priv, uint8_t val)
}
ret = 0;
break;
}
return ret;
}
static uint8_t
write_cmd_siemens(void *priv, uint8_t val)
{
atkbc_t *dev = (atkbc_t *) priv;
uint8_t ret = 1;
switch (val) {
default:
ret = write_cmd_ami(dev, val);
break;
case 0x92: /*Siemens Award - 92 sent by PCD-2L BIOS*/
kbc_at_log("Siemens Award - 92 sent by PCD-2L BIOS\n");
ret = 0;
break;
case 0x94: /*Siemens Award - 94 sent by PCD-2L BIOS*/
kbc_at_log("Siemens Award - 94 sent by PCD-2L BIOS\n");
ret = 0;
break;
case 0x9a: /*Siemens Award - 9A sent by PCD-2L BIOS*/
kbc_at_log("Siemens Award - 9A sent by PCD-2L BIOS\n");
ret = 0;
break;
case 0x9c: /*Siemens Award - 9C sent by PCD-2L BIOS*/
kbc_at_log("Siemens Award - 9C sent by PCD-2L BIOS\n");
ret = 0;
break;
case 0xa9: /*Siemens Award - A9 sent by PCD-2L BIOS*/
kbc_at_log("Siemens Award - A9 sent by PCD-2L BIOS\n");
/* NOTE: The MultiKey/42i reference does not document these at all.
The ADI 386SX BIOS uses these commands but it also uses
commands B8 and BB with a parameters, which clearly indicates a
Phoenix KBC. So either these are undocumented or were present
in an early Phoenix MultiKey variant but later removed - the
MultiKey/42i reference does say a number of features were
removed, so these may have been among them, and we have no
earlier MultiKey reference to look at. */
case 0xe1 ... 0xef: /* Active output ports */
kbc_at_log("ATkbc: Phoenix - active output ports\n");
write_p2(dev, (dev->p2 & 0xf1) | (val & 0x0e));
ret = 0;
break;
}
@@ -2091,14 +2363,6 @@ kbc_at_process_cmd(void *priv)
set_enable_kbd(dev, 1);
break;
/* TODO: Make this command do nothing on the Regional HT6542,
or else, Efflixi's Award OPTi 495 BIOS gets a stuck key
in Norton Commander 3.0. */
case 0xaf: /* read keyboard version */
kbc_at_log("ATkbc: read keyboard version\n");
kbc_delay_to_ob(dev, kbc_award_revision, 0, 0x00);
break;
case 0xc0: /* read P1 */
kbc_at_log("ATkbc: read P1\n");
kbc_delay_to_ob(dev, read_p1(dev), 0, 0x00);
@@ -2120,11 +2384,6 @@ kbc_at_process_cmd(void *priv)
}
break;
case 0xca: /* read keyboard mode */
kbc_at_log("ATkbc: AMI - read keyboard mode\n");
kbc_delay_to_ob(dev, dev->ami_flags, 0, 0x00);
break;
case 0xd0: /* read P2 */
kbc_at_log("ATkbc: read P2\n");
mask = 0xff;
@@ -2574,20 +2833,32 @@ kbc_at_init(const device_t *info)
timer_add(&dev->kbc_dev_poll_timer, kbc_at_dev_poll, dev, 1);
dev->write_cmd_data_ven = NULL;
dev->write_cmd_ven = NULL;
dev->write_cmd_ven = NULL;
kbc_ami_revision = '8';
kbc_award_revision = 0x42;
kbc_ami_revision = '8';
kbc_award_revision = 0x42;
kbc_chips_revision = 0xa6;
kbc_phoenix_version = 0x0416;
switch (dev->flags & KBC_VEN_MASK) {
default:
break;
case KBC_VEN_SIEMENS:
kbc_ami_revision = '8';
kbc_award_revision = 0x42;
dev->write_cmd_data_ven = write_cmd_data_ami;
dev->write_cmd_ven = write_cmd_siemens;
case KBC_VEN_AWARD:
case KBC_VEN_VIA:
if ((info->local & 0xff00) != 0x0000)
kbc_ami_revision = (info->local >> 8) & 0xff;
if ((info->local & 0xff0000) != 0x000000)
kbc_award_revision = (info->local >> 16) & 0xff;
dev->write_cmd_data_ven = write_cmd_data_award;
dev->write_cmd_ven = write_cmd_award;
break;
case KBC_VEN_ACER:
dev->write_cmd_ven = write_cmd_acer;
break;
case KBC_VEN_OLIVETTI:
@@ -2608,7 +2879,10 @@ kbc_at_init(const device_t *info)
break;
case KBC_VEN_AMI:
if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_GREEN)
case KBC_VEN_HOLTEK:
if ((info->local & 0xff00) != 0x0000)
kbc_ami_revision = (info->local >> 8) & 0xff;
else if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_GREEN)
kbc_ami_revision = '5';
else if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) {
if (cpu_64bitbus)
@@ -2631,7 +2905,25 @@ kbc_at_init(const device_t *info)
dev->write_cmd_ven = write_cmd_ami;
break;
case KBC_VEN_UMC:
if ((info->local & 0xff00) != 0x0000)
kbc_ami_revision = (info->local >> 8) & 0xff;
else
kbc_ami_revision = 0x48;
dev->write_cmd_ven = write_cmd_umc;
break;
case KBC_VEN_CHIPS:
if ((info->local & 0xff00) != 0x0000)
kbc_chips_revision = (info->local >> 8) & 0xff;
dev->write_cmd_data_ven = write_cmd_data_chips;
dev->write_cmd_ven = write_cmd_chips;
break;
case KBC_VEN_PHOENIX:
if ((info->local & 0xffff00) != 0x000000)
kbc_phoenix_version = (info->local >> 8) & 0xffff;
dev->write_cmd_data_ven = write_cmd_data_phoenix;
dev->write_cmd_ven = write_cmd_phoenix;
break;
@@ -2721,6 +3013,76 @@ const device_t kbc_at_ami_device = {
.config = NULL
};
const device_t kbc_at_holtek_device = {
.name = "PC/AT Keyboard (Holtek)",
.internal_name = "keyboard_at_holtek",
.flags = DEVICE_KBC,
.local = KBC_TYPE_ISA | KBC_VEN_HOLTEK | KBC_FLAG_IS_ASIC,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_at_umc_device = {
.name = "PC/AT Keyboard (UMC)",
.internal_name = "keyboard_at_umc",
.flags = DEVICE_KBC,
.local = KBC_TYPE_ISA | KBC_VEN_UMC | KBC_FLAG_IS_ASIC,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_at_award_device = {
.name = "PC/AT Keyboard (Award)",
.internal_name = "keyboard_at_award",
.flags = DEVICE_KBC,
.local = KBC_TYPE_ISA | KBC_VEN_AWARD,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_at_chips_device = {
.name = "PC/AT Keyboard (C&T)",
.internal_name = "keyboard_at_chips",
.flags = DEVICE_KBC,
.local = KBC_TYPE_ISA | KBC_VEN_CHIPS,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_at_quadtel_device = {
.name = "PC/AT Keyboard (Quadtel)",
.internal_name = "keyboard_at_quadtel",
.flags = DEVICE_KBC,
.local = KBC_TYPE_ISA | KBC_VEN_QUADTEL,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_at_tg_ami_device = {
.name = "PC/AT Keyboard Controller (TriGem AMI)",
.internal_name = "kbc_at_tg_ami",
@@ -2777,6 +3139,20 @@ const device_t kbc_at_ncr_device = {
.config = NULL
};
const device_t kbc_at_via_device = {
.name = "PC/AT Keyboard (VIA)",
.internal_name = "keyboard_at_via",
.flags = DEVICE_KBC,
.local = KBC_TYPE_ISA | KBC_VEN_VIA | KBC_FLAG_IS_ASIC,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_at_compaq_device = {
.name = "PC/AT Keyboard Controller (Compaq)",
.internal_name = "kbc_at_compaq",
@@ -2861,6 +3237,20 @@ const device_t kbc_ps2_xi8088_device = {
.config = NULL
};
const device_t kbc_ps2_acer_device = {
.name = "PS/2 Keyboard (Acer 90M002A)",
.internal_name = "keyboard_ps2_acer_pci",
.flags = DEVICE_KBC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_ACER,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_ps2_ami_device = {
.name = "PS/2 Keyboard Controller (AMI)",
.internal_name = "kbc_ps2_ami",
@@ -2893,7 +3283,50 @@ const device_t kbc_ps2_holtek_device = {
.name = "PS/2 Keyboard Controller (Holtek)",
.internal_name = "kbc_ps2_holtek",
.flags = DEVICE_KBC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_AMI | KBC_FLAG_IS_ASIC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_HOLTEK | KBC_FLAG_IS_ASIC,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_ps2_umc_device = {
.name = "PS/2 Keyboard (UMC)",
.internal_name = "keyboard_ps2_umc",
.flags = DEVICE_KBC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_UMC | KBC_FLAG_IS_ASIC,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_ps2_award_device = {
.name = "PS/2 Keyboard (Award)",
.internal_name = "keyboard_ps2_award",
.flags = DEVICE_KBC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_AWARD,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t kbc_ps2_via_device = {
.name = "PS/2 Keyboard (VIA)",
.internal_name = "keyboard_ps2_via",
.flags = DEVICE_KBC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_VIA | KBC_FLAG_IS_ASIC,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,

View File

@@ -559,7 +559,7 @@ mouse_get_buttons_ex(void)
void
mouse_set_sample_rate(double new_rate)
{
mouse_timed = (new_rate > 0.0);
mouse_timed = !force_constant_mouse && (new_rate > 0.0);
timer_stop(&mouse_timer);
@@ -568,6 +568,12 @@ mouse_set_sample_rate(double new_rate)
timer_on_auto(&mouse_timer, 1000000.0 / sample_rate);
}
void
mouse_update_sample_rate(void)
{
mouse_set_sample_rate(sample_rate);
}
/* Callback from the hardware driver. */
void
mouse_set_buttons(int buttons)