diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-04-30 02:39:55 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-04-30 02:39:55 +0000 |
commit | 9e61ec315374120c92cc7a20e1e078b89b217e69 (patch) | |
tree | 28a7cd47d04d25cae8473dd3618cf2641205a5c4 /hw | |
parent | 2a1d1880e53d25fbec0e5d3f29f86cf65ad06241 (diff) |
PL050 status register fixes.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2759 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw')
-rw-r--r-- | hw/pl050.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/hw/pl050.c b/hw/pl050.c index eed729461e..40274e1d8e 100644 --- a/hw/pl050.c +++ b/hw/pl050.c @@ -1,7 +1,7 @@ /* * Arm PrimeCell PL050 Keyboard / Mouse Interface * - * Copyright (c) 2006 CodeSourcery. + * Copyright (c) 2006-2007 CodeSourcery. * Written by Paul Brook * * This code is licenced under the GPL. @@ -20,6 +20,14 @@ typedef struct { int is_mouse; } pl050_state; +#define PL050_TXEMPTY (1 << 6) +#define PL050_TXBUSY (1 << 5) +#define PL050_RXFULL (1 << 4) +#define PL050_RXBUSY (1 << 3) +#define PL050_RXPARITY (1 << 2) +#define PL050_KMIC (1 << 1) +#define PL050_KMID (1 << 0) + static const unsigned char pl050_id[] = { 0x50, 0x10, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 }; @@ -45,11 +53,22 @@ static uint32_t pl050_read(void *opaque, target_phys_addr_t offset) case 0: /* KMICR */ return s->cr; case 1: /* KMISTAT */ - /* KMIC and KMID bits not implemented. */ - if (s->pending) { - return 0x10; - } else { - return 0; + { + uint8_t val; + uint32_t stat; + + val = s->last; + val = val ^ (val >> 4); + val = val ^ (val >> 2); + val = (val ^ (val >> 1)) & 1; + + stat = PL050_TXEMPTY; + if (val) + stat |= PL050_RXPARITY; + if (s->pending) + stat |= PL050_RXFULL; + + return stat; } case 2: /* KMIDATA */ if (s->pending) |