Commit 9e61ec315374120c92cc7a20e1e078b89b217e69

Authored by pbrook
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 2 * Arm PrimeCell PL050 Keyboard / Mouse Interface
3 3 *
4   - * Copyright (c) 2006 CodeSourcery.
  4 + * Copyright (c) 2006-2007 CodeSourcery.
5 5 * Written by Paul Brook
6 6 *
7 7 * This code is licenced under the GPL.
... ... @@ -20,6 +20,14 @@ typedef struct {
20 20 int is_mouse;
21 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 31 static const unsigned char pl050_id[] =
24 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 53 case 0: /* KMICR */
46 54 return s->cr;
47 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 73 case 2: /* KMIDATA */
55 74 if (s->pending)
... ...