adb: fix adb-mouse read length and revert disable-reg3-direct-writes workaround
Commit 84051eb400 "adb: add property to disable direct reg 3 writes" introduced a workaround for spurious writes to ADB register 3 when MacOS 9 enables autopoll on the mouse device. Further analysis shows that the problem is that only a partial request is sent, and since the len parameter is ignored then stale data from the previous request is used causing the incorrect address assignment. Remove the disable-reg3-direct-writes workaround and instead check the length parameter when the write is attempted, discarding the invalid request. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Tested-by: Finn Thain <fthain@telegraphics.com.au> Acked-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20200623204936.24064-3-mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
bcaaefdbb2
commit
167f1667b1
@ -259,21 +259,19 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
|
|||||||
trace_adb_kbd_request_change_addr(d->devaddr);
|
trace_adb_kbd_request_change_addr(d->devaddr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!d->disable_direct_reg3_writes) {
|
d->devaddr = buf[1] & 0xf;
|
||||||
d->devaddr = buf[1] & 0xf;
|
/*
|
||||||
|
* we support handlers:
|
||||||
/* we support handlers:
|
* 1: Apple Standard Keyboard
|
||||||
* 1: Apple Standard Keyboard
|
* 2: Apple Extended Keyboard (LShift = RShift)
|
||||||
* 2: Apple Extended Keyboard (LShift = RShift)
|
* 3: Apple Extended Keyboard (LShift != RShift)
|
||||||
* 3: Apple Extended Keyboard (LShift != RShift)
|
*/
|
||||||
*/
|
if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) {
|
||||||
if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) {
|
d->handler = buf[2];
|
||||||
d->handler = buf[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
trace_adb_kbd_request_change_addr_and_handler(d->devaddr,
|
|
||||||
d->handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace_adb_kbd_request_change_addr_and_handler(d->devaddr,
|
||||||
|
d->handler);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,16 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
|
|||||||
case 2:
|
case 2:
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
/*
|
||||||
|
* MacOS 9 has a bug in its ADB driver whereby after configuring
|
||||||
|
* the ADB bus devices it sends another write of invalid length
|
||||||
|
* to reg 3. Make sure we ignore it to prevent an address clash
|
||||||
|
* with the previous device.
|
||||||
|
*/
|
||||||
|
if (len != 3) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
switch (buf[2]) {
|
switch (buf[2]) {
|
||||||
case ADB_CMD_SELF_TEST:
|
case ADB_CMD_SELF_TEST:
|
||||||
break;
|
break;
|
||||||
@ -145,27 +155,25 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
|
|||||||
trace_adb_mouse_request_change_addr(d->devaddr);
|
trace_adb_mouse_request_change_addr(d->devaddr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!d->disable_direct_reg3_writes) {
|
d->devaddr = buf[1] & 0xf;
|
||||||
d->devaddr = buf[1] & 0xf;
|
/*
|
||||||
|
* we support handlers:
|
||||||
/* we support handlers:
|
* 0x01: Classic Apple Mouse Protocol / 100 cpi operations
|
||||||
* 0x01: Classic Apple Mouse Protocol / 100 cpi operations
|
* 0x02: Classic Apple Mouse Protocol / 200 cpi operations
|
||||||
* 0x02: Classic Apple Mouse Protocol / 200 cpi operations
|
* we don't support handlers (at least):
|
||||||
* we don't support handlers (at least):
|
* 0x03: Mouse systems A3 trackball
|
||||||
* 0x03: Mouse systems A3 trackball
|
* 0x04: Extended Apple Mouse Protocol
|
||||||
* 0x04: Extended Apple Mouse Protocol
|
* 0x2f: Microspeed mouse
|
||||||
* 0x2f: Microspeed mouse
|
* 0x42: Macally
|
||||||
* 0x42: Macally
|
* 0x5f: Microspeed mouse
|
||||||
* 0x5f: Microspeed mouse
|
* 0x66: Microspeed mouse
|
||||||
* 0x66: Microspeed mouse
|
*/
|
||||||
*/
|
if (buf[2] == 1 || buf[2] == 2) {
|
||||||
if (buf[2] == 1 || buf[2] == 2) {
|
d->handler = buf[2];
|
||||||
d->handler = buf[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
trace_adb_mouse_request_change_addr_and_handler(
|
|
||||||
d->devaddr, d->handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace_adb_mouse_request_change_addr_and_handler(d->devaddr,
|
||||||
|
d->handler);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,18 +118,11 @@ static void adb_device_realizefn(DeviceState *dev, Error **errp)
|
|||||||
bus->devices[bus->nb_devices++] = d;
|
bus->devices[bus->nb_devices++] = d;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property adb_device_properties[] = {
|
|
||||||
DEFINE_PROP_BOOL("disable-direct-reg3-writes", ADBDevice,
|
|
||||||
disable_direct_reg3_writes, false),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void adb_device_class_init(ObjectClass *oc, void *data)
|
static void adb_device_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||||
|
|
||||||
dc->realize = adb_device_realizefn;
|
dc->realize = adb_device_realizefn;
|
||||||
device_class_set_props(dc, adb_device_properties);
|
|
||||||
dc->bus_type = TYPE_ADB_BUS;
|
dc->bus_type = TYPE_ADB_BUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,11 +404,9 @@ static void ppc_core99_init(MachineState *machine)
|
|||||||
|
|
||||||
adb_bus = qdev_get_child_bus(dev, "adb.0");
|
adb_bus = qdev_get_child_bus(dev, "adb.0");
|
||||||
dev = qdev_new(TYPE_ADB_KEYBOARD);
|
dev = qdev_new(TYPE_ADB_KEYBOARD);
|
||||||
qdev_prop_set_bit(dev, "disable-direct-reg3-writes", true);
|
|
||||||
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
|
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
|
||||||
|
|
||||||
dev = qdev_new(TYPE_ADB_MOUSE);
|
dev = qdev_new(TYPE_ADB_MOUSE);
|
||||||
qdev_prop_set_bit(dev, "disable-direct-reg3-writes", true);
|
|
||||||
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
|
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,6 @@ struct ADBDevice {
|
|||||||
|
|
||||||
int devaddr;
|
int devaddr;
|
||||||
int handler;
|
int handler;
|
||||||
bool disable_direct_reg3_writes;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ADB_DEVICE_CLASS(cls) \
|
#define ADB_DEVICE_CLASS(cls) \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user