Commit 715748fa08b35690b15c0557ad1e92cd73c8fbb3
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) | ... | ... |