diff options
author | Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 2020-06-23 21:49:29 +0100 |
---|---|---|
committer | Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 2020-06-26 10:13:51 +0100 |
commit | 4e5df0369fb5a49ed26518dccffeb03a252352db (patch) | |
tree | 1f4e744eeb8a264e4b7f92218b0a7712667b5a98 /hw/input/adb.c | |
parent | d2288b75845d86d4a9486e72f966676ce5c3ed1e (diff) | |
download | qemu-4e5df0369fb5a49ed26518dccffeb03a252352db.zip qemu-4e5df0369fb5a49ed26518dccffeb03a252352db.tar.gz qemu-4e5df0369fb5a49ed26518dccffeb03a252352db.tar.bz2 |
adb: add autopoll_blocked variable to block autopoll
Whilst autopoll is enabled it is necessary to prevent the ADB buffer contents
from being overwritten until the host has read back the response in its
entirety.
Add adb_autopoll_block() and adb_autopoll_unblock() functions in preparation
for ensuring that the ADB buffer contents are protected for explicit ADB
requests.
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-16-mark.cave-ayland@ilande.co.uk>
Diffstat (limited to 'hw/input/adb.c')
-rw-r--r-- | hw/input/adb.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/hw/input/adb.c b/hw/input/adb.c index b3ad7c5..70aa1f4 100644 --- a/hw/input/adb.c +++ b/hw/input/adb.c @@ -157,6 +157,26 @@ void adb_set_autopoll_mask(ADBBusState *s, uint16_t mask) } } +void adb_autopoll_block(ADBBusState *s) +{ + s->autopoll_blocked = true; + + if (s->autopoll_enabled) { + timer_del(s->autopoll_timer); + } +} + +void adb_autopoll_unblock(ADBBusState *s) +{ + s->autopoll_blocked = false; + + if (s->autopoll_enabled) { + timer_mod(s->autopoll_timer, + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + s->autopoll_rate_ms); + } +} + static void adb_autopoll(void *opaque) { ADBBusState *s = opaque; @@ -184,6 +204,7 @@ static const VMStateDescription vmstate_adb_bus = { VMSTATE_BOOL(autopoll_enabled, ADBBusState), VMSTATE_UINT8(autopoll_rate_ms, ADBBusState), VMSTATE_UINT16(autopoll_mask, ADBBusState), + VMSTATE_BOOL(autopoll_blocked, ADBBusState), VMSTATE_END_OF_LIST() } }; |