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,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 #ifdef DEBUG_SERIAL 52 #ifdef DEBUG_SERIAL
46 #define SER_DPRINTF(fmt, args...) \ 53 #define SER_DPRINTF(fmt, args...) \
47 do { printf("SER: " fmt , ##args); } while (0) 54 do { printf("SER: " fmt , ##args); } while (0)
@@ -58,7 +65,7 @@ do { printf("KBD: " fmt , ##args); } while (0) @@ -58,7 +65,7 @@ do { printf("KBD: " fmt , ##args); } while (0)
58 #endif 65 #endif
59 #ifdef DEBUG_MOUSE 66 #ifdef DEBUG_MOUSE
60 #define MS_DPRINTF(fmt, args...) \ 67 #define MS_DPRINTF(fmt, args...) \
61 -do { printf("SER: " fmt , ##args); } while (0) 68 +do { printf("MSC: " fmt , ##args); } while (0)
62 #else 69 #else
63 #define MS_DPRINTF(fmt, args...) 70 #define MS_DPRINTF(fmt, args...)
64 #endif 71 #endif
@@ -71,12 +78,12 @@ typedef enum { @@ -71,12 +78,12 @@ typedef enum {
71 ser, kbd, mouse, 78 ser, kbd, mouse,
72 } chn_type_t; 79 } chn_type_t;
73 80
74 -#define KBD_QUEUE_SIZE 256 81 +#define SERIO_QUEUE_SIZE 256
75 82
76 typedef struct { 83 typedef struct {
77 - uint8_t data[KBD_QUEUE_SIZE]; 84 + uint8_t data[SERIO_QUEUE_SIZE];
78 int rptr, wptr, count; 85 int rptr, wptr, count;
79 -} KBDQueue; 86 +} SERIOQueue;
80 87
81 typedef struct ChannelState { 88 typedef struct ChannelState {
82 int irq; 89 int irq;
@@ -86,7 +93,7 @@ typedef struct ChannelState { @@ -86,7 +93,7 @@ typedef struct ChannelState {
86 chn_type_t type; 93 chn_type_t type;
87 struct ChannelState *otherchn; 94 struct ChannelState *otherchn;
88 uint8_t rx, tx, wregs[16], rregs[16]; 95 uint8_t rx, tx, wregs[16], rregs[16];
89 - KBDQueue queue; 96 + SERIOQueue queue;
90 CharDriverState *chr; 97 CharDriverState *chr;
91 } ChannelState; 98 } ChannelState;
92 99
@@ -103,13 +110,13 @@ static void serial_receive_byte(ChannelState *s, int ch); @@ -103,13 +110,13 @@ static void serial_receive_byte(ChannelState *s, int ch);
103 static void put_queue(void *opaque, int b) 110 static void put_queue(void *opaque, int b)
104 { 111 {
105 ChannelState *s = opaque; 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 return; 117 return;
111 q->data[q->wptr] = b; 118 q->data[q->wptr] = b;
112 - if (++q->wptr == KBD_QUEUE_SIZE) 119 + if (++q->wptr == SERIO_QUEUE_SIZE)
113 q->wptr = 0; 120 q->wptr = 0;
114 q->count++; 121 q->count++;
115 serial_receive_byte(s, 0); 122 serial_receive_byte(s, 0);
@@ -118,14 +125,14 @@ static void put_queue(void *opaque, int b) @@ -118,14 +125,14 @@ static void put_queue(void *opaque, int b)
118 static uint32_t get_queue(void *opaque) 125 static uint32_t get_queue(void *opaque)
119 { 126 {
120 ChannelState *s = opaque; 127 ChannelState *s = opaque;
121 - KBDQueue *q = &s->queue; 128 + SERIOQueue *q = &s->queue;
122 int val; 129 int val;
123 130
124 if (q->count == 0) { 131 if (q->count == 0) {
125 return 0; 132 return 0;
126 } else { 133 } else {
127 val = q->data[q->rptr]; 134 val = q->data[q->rptr];
128 - if (++q->rptr == KBD_QUEUE_SIZE) 135 + if (++q->rptr == SERIO_QUEUE_SIZE)
129 q->rptr = 0; 136 q->rptr = 0;
130 q->count--; 137 q->count--;
131 } 138 }
@@ -326,7 +333,7 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) @@ -326,7 +333,7 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
326 case 1: 333 case 1:
327 s->rregs[0] &= ~1; 334 s->rregs[0] &= ~1;
328 clr_rxint(s); 335 clr_rxint(s);
329 - if (s->type == kbd) 336 + if (s->type == kbd || s->type == mouse)
330 ret = get_queue(s); 337 ret = get_queue(s);
331 else 338 else
332 ret = s->rx; 339 ret = s->rx;
@@ -512,9 +519,41 @@ static void sunmouse_event(void *opaque, @@ -512,9 +519,41 @@ static void sunmouse_event(void *opaque,
512 ChannelState *s = opaque; 519 ChannelState *s = opaque;
513 int ch; 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 void slavio_serial_ms_kbd_init(int base, int irq) 559 void slavio_serial_ms_kbd_init(int base, int irq)