aboutsummaryrefslogtreecommitdiff
path: root/hw/input
diff options
context:
space:
mode:
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2018-06-12 17:44:01 +0100
committerDavid Gibson <david@gibson.dropbear.id.au>2018-06-16 16:32:33 +1000
commit84051eb400495745035b52e27fe67b962b7a58fa (patch)
treece84d40f0677c11a4ff1739c8c1b5cab0be1a4c6 /hw/input
parentfb6649f172d6ea1a8d8980b7f93d31808eb06ff8 (diff)
downloadqemu-84051eb400495745035b52e27fe67b962b7a58fa.zip
qemu-84051eb400495745035b52e27fe67b962b7a58fa.tar.gz
qemu-84051eb400495745035b52e27fe67b962b7a58fa.tar.bz2
adb: add property to disable direct reg 3 writes
MacOS 9 has a bug in its PMU driver whereby after configuring the ADB bus devices it sends another write to reg 3 on both devices resetting them both back to the same address. Add a new disable_direct_reg3_writes property to ADBDevice to disable these direct writes which can enabled just for the upcoming pmu-adb support. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw/input')
-rw-r--r--hw/input/adb-kbd.c25
-rw-r--r--hw/input/adb-mouse.c37
-rw-r--r--hw/input/adb.c7
3 files changed, 41 insertions, 28 deletions
diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c
index 0ad384d..b026e9d 100644
--- a/hw/input/adb-kbd.c
+++ b/hw/input/adb-kbd.c
@@ -261,18 +261,21 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
trace_adb_kbd_request_change_addr(d->devaddr);
break;
default:
- d->devaddr = buf[1] & 0xf;
- /* we support handlers:
- * 1: Apple Standard Keyboard
- * 2: Apple Extended Keyboard (LShift = RShift)
- * 3: Apple Extended Keyboard (LShift != RShift)
- */
- if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) {
- d->handler = buf[2];
+ if (!d->disable_direct_reg3_writes) {
+ d->devaddr = buf[1] & 0xf;
+
+ /* we support handlers:
+ * 1: Apple Standard Keyboard
+ * 2: Apple Extended Keyboard (LShift = RShift)
+ * 3: Apple Extended Keyboard (LShift != RShift)
+ */
+ if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) {
+ 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;
}
}
diff --git a/hw/input/adb-mouse.c b/hw/input/adb-mouse.c
index 473045f..83833b0 100644
--- a/hw/input/adb-mouse.c
+++ b/hw/input/adb-mouse.c
@@ -142,24 +142,27 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
trace_adb_mouse_request_change_addr(d->devaddr);
break;
default:
- d->devaddr = buf[1] & 0xf;
- /* we support handlers:
- * 0x01: Classic Apple Mouse Protocol / 100 cpi operations
- * 0x02: Classic Apple Mouse Protocol / 200 cpi operations
- * we don't support handlers (at least):
- * 0x03: Mouse systems A3 trackball
- * 0x04: Extended Apple Mouse Protocol
- * 0x2f: Microspeed mouse
- * 0x42: Macally
- * 0x5f: Microspeed mouse
- * 0x66: Microspeed mouse
- */
- if (buf[2] == 1 || buf[2] == 2) {
- d->handler = buf[2];
+ if (!d->disable_direct_reg3_writes) {
+ d->devaddr = buf[1] & 0xf;
+
+ /* we support handlers:
+ * 0x01: Classic Apple Mouse Protocol / 100 cpi operations
+ * 0x02: Classic Apple Mouse Protocol / 200 cpi operations
+ * we don't support handlers (at least):
+ * 0x03: Mouse systems A3 trackball
+ * 0x04: Extended Apple Mouse Protocol
+ * 0x2f: Microspeed mouse
+ * 0x42: Macally
+ * 0x5f: Microspeed mouse
+ * 0x66: Microspeed mouse
+ */
+ if (buf[2] == 1 || buf[2] == 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;
}
}
diff --git a/hw/input/adb.c b/hw/input/adb.c
index 23ae6f0..bbb40ae 100644
--- a/hw/input/adb.c
+++ b/hw/input/adb.c
@@ -113,11 +113,18 @@ static void adb_device_realizefn(DeviceState *dev, Error **errp)
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)
{
DeviceClass *dc = DEVICE_CLASS(oc);
dc->realize = adb_device_realizefn;
+ dc->props = adb_device_properties;
dc->bus_type = TYPE_ADB_BUS;
}