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) |