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>
This commit is contained in:
Mark Cave-Ayland 2018-06-12 17:44:01 +01:00 committed by David Gibson
parent fb6649f172
commit 84051eb400
4 changed files with 42 additions and 28 deletions

View File

@ -261,7 +261,9 @@ 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)
@ -273,6 +275,7 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
trace_adb_kbd_request_change_addr_and_handler(d->devaddr, trace_adb_kbd_request_change_addr_and_handler(d->devaddr,
d->handler); d->handler);
}
break; break;
} }
} }

View File

@ -142,7 +142,9 @@ 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
@ -158,8 +160,9 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
d->handler = buf[2]; d->handler = buf[2];
} }
trace_adb_mouse_request_change_addr_and_handler(d->devaddr, trace_adb_mouse_request_change_addr_and_handler(
d->handler); d->devaddr, d->handler);
}
break; break;
} }
} }

View File

@ -113,11 +113,18 @@ 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;
dc->props = adb_device_properties;
dc->bus_type = TYPE_ADB_BUS; dc->bus_type = TYPE_ADB_BUS;
} }

View File

@ -49,6 +49,7 @@ 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) \