Commit 9e61ec315374120c92cc7a20e1e078b89b217e69
1 parent
2a1d1880
PL050 status register fixes.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2759 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
25 additions
and
6 deletions
hw/pl050.c
| 1 | /* | 1 | /* |
| 2 | * Arm PrimeCell PL050 Keyboard / Mouse Interface | 2 | * Arm PrimeCell PL050 Keyboard / Mouse Interface |
| 3 | * | 3 | * |
| 4 | - * Copyright (c) 2006 CodeSourcery. | 4 | + * Copyright (c) 2006-2007 CodeSourcery. |
| 5 | * Written by Paul Brook | 5 | * Written by Paul Brook |
| 6 | * | 6 | * |
| 7 | * This code is licenced under the GPL. | 7 | * This code is licenced under the GPL. |
| @@ -20,6 +20,14 @@ typedef struct { | @@ -20,6 +20,14 @@ typedef struct { | ||
| 20 | int is_mouse; | 20 | int is_mouse; |
| 21 | } pl050_state; | 21 | } pl050_state; |
| 22 | 22 | ||
| 23 | +#define PL050_TXEMPTY (1 << 6) | ||
| 24 | +#define PL050_TXBUSY (1 << 5) | ||
| 25 | +#define PL050_RXFULL (1 << 4) | ||
| 26 | +#define PL050_RXBUSY (1 << 3) | ||
| 27 | +#define PL050_RXPARITY (1 << 2) | ||
| 28 | +#define PL050_KMIC (1 << 1) | ||
| 29 | +#define PL050_KMID (1 << 0) | ||
| 30 | + | ||
| 23 | static const unsigned char pl050_id[] = | 31 | static const unsigned char pl050_id[] = |
| 24 | { 0x50, 0x10, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 }; | 32 | { 0x50, 0x10, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 }; |
| 25 | 33 | ||
| @@ -45,11 +53,22 @@ static uint32_t pl050_read(void *opaque, target_phys_addr_t offset) | @@ -45,11 +53,22 @@ static uint32_t pl050_read(void *opaque, target_phys_addr_t offset) | ||
| 45 | case 0: /* KMICR */ | 53 | case 0: /* KMICR */ |
| 46 | return s->cr; | 54 | return s->cr; |
| 47 | case 1: /* KMISTAT */ | 55 | case 1: /* KMISTAT */ |
| 48 | - /* KMIC and KMID bits not implemented. */ | ||
| 49 | - if (s->pending) { | ||
| 50 | - return 0x10; | ||
| 51 | - } else { | ||
| 52 | - return 0; | 56 | + { |
| 57 | + uint8_t val; | ||
| 58 | + uint32_t stat; | ||
| 59 | + | ||
| 60 | + val = s->last; | ||
| 61 | + val = val ^ (val >> 4); | ||
| 62 | + val = val ^ (val >> 2); | ||
| 63 | + val = (val ^ (val >> 1)) & 1; | ||
| 64 | + | ||
| 65 | + stat = PL050_TXEMPTY; | ||
| 66 | + if (val) | ||
| 67 | + stat |= PL050_RXPARITY; | ||
| 68 | + if (s->pending) | ||
| 69 | + stat |= PL050_RXFULL; | ||
| 70 | + | ||
| 71 | + return stat; | ||
| 53 | } | 72 | } |
| 54 | case 2: /* KMIDATA */ | 73 | case 2: /* KMIDATA */ |
| 55 | if (s->pending) | 74 | if (s->pending) |