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