Commit 715748fa08b35690b15c0557ad1e92cd73c8fbb3

Authored by bellard
1 parent 21206a10

added mouse protocol (Igor Kovalenko)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2150 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 54 additions and 15 deletions
hw/slavio_serial.c
... ... @@ -42,6 +42,13 @@
42 42 *
43 43 */
44 44  
  45 +/*
  46 + * Modifications:
  47 + * 2006-Aug-10 Igor Kovalenko : Renamed KBDQueue to SERIOQueue, implemented
  48 + * serial mouse queue.
  49 + * Implemented serial mouse protocol.
  50 + */
  51 +
45 52 #ifdef DEBUG_SERIAL
46 53 #define SER_DPRINTF(fmt, args...) \
47 54 do { printf("SER: " fmt , ##args); } while (0)
... ... @@ -58,7 +65,7 @@ do { printf("KBD: " fmt , ##args); } while (0)
58 65 #endif
59 66 #ifdef DEBUG_MOUSE
60 67 #define MS_DPRINTF(fmt, args...) \
61   -do { printf("SER: " fmt , ##args); } while (0)
  68 +do { printf("MSC: " fmt , ##args); } while (0)
62 69 #else
63 70 #define MS_DPRINTF(fmt, args...)
64 71 #endif
... ... @@ -71,12 +78,12 @@ typedef enum {
71 78 ser, kbd, mouse,
72 79 } chn_type_t;
73 80  
74   -#define KBD_QUEUE_SIZE 256
  81 +#define SERIO_QUEUE_SIZE 256
75 82  
76 83 typedef struct {
77   - uint8_t data[KBD_QUEUE_SIZE];
  84 + uint8_t data[SERIO_QUEUE_SIZE];
78 85 int rptr, wptr, count;
79   -} KBDQueue;
  86 +} SERIOQueue;
80 87  
81 88 typedef struct ChannelState {
82 89 int irq;
... ... @@ -86,7 +93,7 @@ typedef struct ChannelState {
86 93 chn_type_t type;
87 94 struct ChannelState *otherchn;
88 95 uint8_t rx, tx, wregs[16], rregs[16];
89   - KBDQueue queue;
  96 + SERIOQueue queue;
90 97 CharDriverState *chr;
91 98 } ChannelState;
92 99  
... ... @@ -103,13 +110,13 @@ static void serial_receive_byte(ChannelState *s, int ch);
103 110 static void put_queue(void *opaque, int b)
104 111 {
105 112 ChannelState *s = opaque;
106   - KBDQueue *q = &s->queue;
  113 + SERIOQueue *q = &s->queue;
107 114  
108   - KBD_DPRINTF("put: 0x%02x\n", b);
109   - if (q->count >= KBD_QUEUE_SIZE)
  115 + SER_DPRINTF("put: 0x%02x\n", b);
  116 + if (q->count >= SERIO_QUEUE_SIZE)
110 117 return;
111 118 q->data[q->wptr] = b;
112   - if (++q->wptr == KBD_QUEUE_SIZE)
  119 + if (++q->wptr == SERIO_QUEUE_SIZE)
113 120 q->wptr = 0;
114 121 q->count++;
115 122 serial_receive_byte(s, 0);
... ... @@ -118,14 +125,14 @@ static void put_queue(void *opaque, int b)
118 125 static uint32_t get_queue(void *opaque)
119 126 {
120 127 ChannelState *s = opaque;
121   - KBDQueue *q = &s->queue;
  128 + SERIOQueue *q = &s->queue;
122 129 int val;
123 130  
124 131 if (q->count == 0) {
125 132 return 0;
126 133 } else {
127 134 val = q->data[q->rptr];
128   - if (++q->rptr == KBD_QUEUE_SIZE)
  135 + if (++q->rptr == SERIO_QUEUE_SIZE)
129 136 q->rptr = 0;
130 137 q->count--;
131 138 }
... ... @@ -326,7 +333,7 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
326 333 case 1:
327 334 s->rregs[0] &= ~1;
328 335 clr_rxint(s);
329   - if (s->type == kbd)
  336 + if (s->type == kbd || s->type == mouse)
330 337 ret = get_queue(s);
331 338 else
332 339 ret = s->rx;
... ... @@ -512,9 +519,41 @@ static void sunmouse_event(void *opaque,
512 519 ChannelState *s = opaque;
513 520 int ch;
514 521  
515   - // XXX
516   - ch = 0x42;
517   - serial_receive_byte(s, ch);
  522 + MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx, dy, buttons_state);
  523 +
  524 + ch = 0x80 | 0x7; /* protocol start byte, no buttons pressed */
  525 +
  526 + if (buttons_state & MOUSE_EVENT_LBUTTON)
  527 + ch ^= 0x4;
  528 + if (buttons_state & MOUSE_EVENT_MBUTTON)
  529 + ch ^= 0x2;
  530 + if (buttons_state & MOUSE_EVENT_RBUTTON)
  531 + ch ^= 0x1;
  532 +
  533 + put_queue(s, ch);
  534 +
  535 + ch = dx;
  536 +
  537 + if (ch > 127)
  538 + ch=127;
  539 + else if (ch < -127)
  540 + ch=-127;
  541 +
  542 + put_queue(s, ch & 0xff);
  543 +
  544 + ch = -dy;
  545 +
  546 + if (ch > 127)
  547 + ch=127;
  548 + else if (ch < -127)
  549 + ch=-127;
  550 +
  551 + put_queue(s, ch & 0xff);
  552 +
  553 + // MSC protocol specify two extra motion bytes
  554 +
  555 + put_queue(s, 0);
  556 + put_queue(s, 0);
518 557 }
519 558  
520 559 void slavio_serial_ms_kbd_init(int base, int irq)
... ...