Commit 35c4d671ebfa9509ba915188836070717088bd13
1 parent
3bee8bd0
Fix keyboard emulation for ARM versatile board:
- 0xab is actually a keyboard reply. It should not be escaped. - Because of translated value 0x41, translated to raw conversion is not a bijection. Instead of creating two translation tables, test for s->translate before writing this value. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4209 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
11 additions
and
3 deletions
hw/ps2.c
| ... | ... | @@ -44,6 +44,7 @@ |
| 44 | 44 | |
| 45 | 45 | /* Keyboard Replies */ |
| 46 | 46 | #define KBD_REPLY_POR 0xAA /* Power on reset */ |
| 47 | +#define KBD_REPLY_ID 0xAB /* Keyboard ID */ | |
| 47 | 48 | #define KBD_REPLY_ACK 0xFA /* Command ACK */ |
| 48 | 49 | #define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */ |
| 49 | 50 | |
| ... | ... | @@ -133,7 +134,11 @@ void ps2_queue(void *opaque, int b) |
| 133 | 134 | s->update_irq(s->update_arg, 1); |
| 134 | 135 | } |
| 135 | 136 | |
| 136 | -/* keycode is expressed in scancode set 2 */ | |
| 137 | +/* | |
| 138 | + keycode is expressed as follow: | |
| 139 | + bit 7 - 0 key pressed, 1 = key released | |
| 140 | + bits 6-0 - translated scancode set 2 | |
| 141 | + */ | |
| 137 | 142 | static void ps2_put_keycode(void *opaque, int keycode) |
| 138 | 143 | { |
| 139 | 144 | PS2KbdState *s = opaque; |
| ... | ... | @@ -199,8 +204,11 @@ void ps2_write_keyboard(void *opaque, int val) |
| 199 | 204 | case KBD_CMD_GET_ID: |
| 200 | 205 | ps2_queue(&s->common, KBD_REPLY_ACK); |
| 201 | 206 | /* We emulate a MF2 AT keyboard here */ |
| 202 | - ps2_put_keycode(s, 0xab); | |
| 203 | - ps2_put_keycode(s, 0x83); | |
| 207 | + ps2_queue(&s->common, KBD_REPLY_ID); | |
| 208 | + if (s->translate) | |
| 209 | + ps2_queue(&s->common, 0x41); | |
| 210 | + else | |
| 211 | + ps2_queue(&s->common, 0x83); | |
| 204 | 212 | break; |
| 205 | 213 | case KBD_CMD_ECHO: |
| 206 | 214 | ps2_queue(&s->common, KBD_CMD_ECHO); | ... | ... |