@ -124,401 +124,6 @@ typedef struct {
uint8_t mouse_buttons ;
} PS2MouseState ;
/* Table to convert from QEMU codes to scancodes. */
static const uint16_t qcode_to_keycode_set1 [ Q_KEY_CODE__MAX ] = {
[ 0 . . . Q_KEY_CODE__MAX - 1 ] = 0 ,
[ Q_KEY_CODE_A ] = 0x1e ,
[ Q_KEY_CODE_B ] = 0x30 ,
[ Q_KEY_CODE_C ] = 0x2e ,
[ Q_KEY_CODE_D ] = 0x20 ,
[ Q_KEY_CODE_E ] = 0x12 ,
[ Q_KEY_CODE_F ] = 0x21 ,
[ Q_KEY_CODE_G ] = 0x22 ,
[ Q_KEY_CODE_H ] = 0x23 ,
[ Q_KEY_CODE_I ] = 0x17 ,
[ Q_KEY_CODE_J ] = 0x24 ,
[ Q_KEY_CODE_K ] = 0x25 ,
[ Q_KEY_CODE_L ] = 0x26 ,
[ Q_KEY_CODE_M ] = 0x32 ,
[ Q_KEY_CODE_N ] = 0x31 ,
[ Q_KEY_CODE_O ] = 0x18 ,
[ Q_KEY_CODE_P ] = 0x19 ,
[ Q_KEY_CODE_Q ] = 0x10 ,
[ Q_KEY_CODE_R ] = 0x13 ,
[ Q_KEY_CODE_S ] = 0x1f ,
[ Q_KEY_CODE_T ] = 0x14 ,
[ Q_KEY_CODE_U ] = 0x16 ,
[ Q_KEY_CODE_V ] = 0x2f ,
[ Q_KEY_CODE_W ] = 0x11 ,
[ Q_KEY_CODE_X ] = 0x2d ,
[ Q_KEY_CODE_Y ] = 0x15 ,
[ Q_KEY_CODE_Z ] = 0x2c ,
[ Q_KEY_CODE_0 ] = 0x0b ,
[ Q_KEY_CODE_1 ] = 0x02 ,
[ Q_KEY_CODE_2 ] = 0x03 ,
[ Q_KEY_CODE_3 ] = 0x04 ,
[ Q_KEY_CODE_4 ] = 0x05 ,
[ Q_KEY_CODE_5 ] = 0x06 ,
[ Q_KEY_CODE_6 ] = 0x07 ,
[ Q_KEY_CODE_7 ] = 0x08 ,
[ Q_KEY_CODE_8 ] = 0x09 ,
[ Q_KEY_CODE_9 ] = 0x0a ,
[ Q_KEY_CODE_GRAVE_ACCENT ] = 0x29 ,
[ Q_KEY_CODE_MINUS ] = 0x0c ,
[ Q_KEY_CODE_EQUAL ] = 0x0d ,
[ Q_KEY_CODE_BACKSLASH ] = 0x2b ,
[ Q_KEY_CODE_BACKSPACE ] = 0x0e ,
[ Q_KEY_CODE_SPC ] = 0x39 ,
[ Q_KEY_CODE_TAB ] = 0x0f ,
[ Q_KEY_CODE_CAPS_LOCK ] = 0x3a ,
[ Q_KEY_CODE_SHIFT ] = 0x2a ,
[ Q_KEY_CODE_CTRL ] = 0x1d ,
[ Q_KEY_CODE_META_L ] = 0xe05b ,
[ Q_KEY_CODE_ALT ] = 0x38 ,
[ Q_KEY_CODE_SHIFT_R ] = 0x36 ,
[ Q_KEY_CODE_CTRL_R ] = 0xe01d ,
[ Q_KEY_CODE_META_R ] = 0xe05c ,
[ Q_KEY_CODE_ALT_R ] = 0xe038 ,
[ Q_KEY_CODE_MENU ] = 0xe05d ,
[ Q_KEY_CODE_RET ] = 0x1c ,
[ Q_KEY_CODE_ESC ] = 0x01 ,
[ Q_KEY_CODE_F1 ] = 0x3b ,
[ Q_KEY_CODE_F2 ] = 0x3c ,
[ Q_KEY_CODE_F3 ] = 0x3d ,
[ Q_KEY_CODE_F4 ] = 0x3e ,
[ Q_KEY_CODE_F5 ] = 0x3f ,
[ Q_KEY_CODE_F6 ] = 0x40 ,
[ Q_KEY_CODE_F7 ] = 0x41 ,
[ Q_KEY_CODE_F8 ] = 0x42 ,
[ Q_KEY_CODE_F9 ] = 0x43 ,
[ Q_KEY_CODE_F10 ] = 0x44 ,
[ Q_KEY_CODE_F11 ] = 0x57 ,
[ Q_KEY_CODE_F12 ] = 0x58 ,
/* special handling for Q_KEY_CODE_PRINT */
[ Q_KEY_CODE_SCROLL_LOCK ] = 0x46 ,
/* special handling for Q_KEY_CODE_PAUSE */
[ Q_KEY_CODE_BRACKET_LEFT ] = 0x1a ,
[ Q_KEY_CODE_INSERT ] = 0xe052 ,
[ Q_KEY_CODE_HOME ] = 0xe047 ,
[ Q_KEY_CODE_PGUP ] = 0xe049 ,
[ Q_KEY_CODE_DELETE ] = 0xe053 ,
[ Q_KEY_CODE_END ] = 0xe04f ,
[ Q_KEY_CODE_PGDN ] = 0xe051 ,
[ Q_KEY_CODE_UP ] = 0xe048 ,
[ Q_KEY_CODE_LEFT ] = 0xe04b ,
[ Q_KEY_CODE_DOWN ] = 0xe050 ,
[ Q_KEY_CODE_RIGHT ] = 0xe04d ,
[ Q_KEY_CODE_NUM_LOCK ] = 0x45 ,
[ Q_KEY_CODE_KP_DIVIDE ] = 0xe035 ,
[ Q_KEY_CODE_KP_MULTIPLY ] = 0x37 ,
[ Q_KEY_CODE_KP_SUBTRACT ] = 0x4a ,
[ Q_KEY_CODE_KP_ADD ] = 0x4e ,
[ Q_KEY_CODE_KP_ENTER ] = 0xe01c ,
[ Q_KEY_CODE_KP_DECIMAL ] = 0x53 ,
[ Q_KEY_CODE_KP_0 ] = 0x52 ,
[ Q_KEY_CODE_KP_1 ] = 0x4f ,
[ Q_KEY_CODE_KP_2 ] = 0x50 ,
[ Q_KEY_CODE_KP_3 ] = 0x51 ,
[ Q_KEY_CODE_KP_4 ] = 0x4b ,
[ Q_KEY_CODE_KP_5 ] = 0x4c ,
[ Q_KEY_CODE_KP_6 ] = 0x4d ,
[ Q_KEY_CODE_KP_7 ] = 0x47 ,
[ Q_KEY_CODE_KP_8 ] = 0x48 ,
[ Q_KEY_CODE_KP_9 ] = 0x49 ,
[ Q_KEY_CODE_BRACKET_RIGHT ] = 0x1b ,
[ Q_KEY_CODE_SEMICOLON ] = 0x27 ,
[ Q_KEY_CODE_APOSTROPHE ] = 0x28 ,
[ Q_KEY_CODE_COMMA ] = 0x33 ,
[ Q_KEY_CODE_DOT ] = 0x34 ,
[ Q_KEY_CODE_SLASH ] = 0x35 ,
[ Q_KEY_CODE_POWER ] = 0x0e5e ,
[ Q_KEY_CODE_SLEEP ] = 0x0e5f ,
[ Q_KEY_CODE_WAKE ] = 0x0e63 ,
[ Q_KEY_CODE_AUDIONEXT ] = 0xe019 ,
[ Q_KEY_CODE_AUDIOPREV ] = 0xe010 ,
[ Q_KEY_CODE_AUDIOSTOP ] = 0xe024 ,
[ Q_KEY_CODE_AUDIOPLAY ] = 0xe022 ,
[ Q_KEY_CODE_AUDIOMUTE ] = 0xe020 ,
[ Q_KEY_CODE_VOLUMEUP ] = 0xe030 ,
[ Q_KEY_CODE_VOLUMEDOWN ] = 0xe02e ,
[ Q_KEY_CODE_MEDIASELECT ] = 0xe06d ,
[ Q_KEY_CODE_MAIL ] = 0xe06c ,
[ Q_KEY_CODE_CALCULATOR ] = 0xe021 ,
[ Q_KEY_CODE_COMPUTER ] = 0xe06b ,
[ Q_KEY_CODE_FIND ] = 0xe065 ,
[ Q_KEY_CODE_AC_HOME ] = 0xe032 ,
[ Q_KEY_CODE_AC_BACK ] = 0xe06a ,
[ Q_KEY_CODE_AC_FORWARD ] = 0xe069 ,
[ Q_KEY_CODE_STOP ] = 0xe068 ,
[ Q_KEY_CODE_AC_REFRESH ] = 0xe067 ,
[ Q_KEY_CODE_AC_BOOKMARKS ] = 0xe066 ,
[ Q_KEY_CODE_ASTERISK ] = 0x37 ,
[ Q_KEY_CODE_LESS ] = 0x56 ,
[ Q_KEY_CODE_RO ] = 0x73 ,
[ Q_KEY_CODE_HIRAGANA ] = 0x70 ,
[ Q_KEY_CODE_HENKAN ] = 0x79 ,
[ Q_KEY_CODE_YEN ] = 0x7d ,
[ Q_KEY_CODE_KP_COMMA ] = 0x7e ,
} ;
static const uint16_t qcode_to_keycode_set2 [ Q_KEY_CODE__MAX ] = {
[ 0 . . . Q_KEY_CODE__MAX - 1 ] = 0 ,
[ Q_KEY_CODE_A ] = 0x1c ,
[ Q_KEY_CODE_B ] = 0x32 ,
[ Q_KEY_CODE_C ] = 0x21 ,
[ Q_KEY_CODE_D ] = 0x23 ,
[ Q_KEY_CODE_E ] = 0x24 ,
[ Q_KEY_CODE_F ] = 0x2b ,
[ Q_KEY_CODE_G ] = 0x34 ,
[ Q_KEY_CODE_H ] = 0x33 ,
[ Q_KEY_CODE_I ] = 0x43 ,
[ Q_KEY_CODE_J ] = 0x3b ,
[ Q_KEY_CODE_K ] = 0x42 ,
[ Q_KEY_CODE_L ] = 0x4b ,
[ Q_KEY_CODE_M ] = 0x3a ,
[ Q_KEY_CODE_N ] = 0x31 ,
[ Q_KEY_CODE_O ] = 0x44 ,
[ Q_KEY_CODE_P ] = 0x4d ,
[ Q_KEY_CODE_Q ] = 0x15 ,
[ Q_KEY_CODE_R ] = 0x2d ,
[ Q_KEY_CODE_S ] = 0x1b ,
[ Q_KEY_CODE_T ] = 0x2c ,
[ Q_KEY_CODE_U ] = 0x3c ,
[ Q_KEY_CODE_V ] = 0x2a ,
[ Q_KEY_CODE_W ] = 0x1d ,
[ Q_KEY_CODE_X ] = 0x22 ,
[ Q_KEY_CODE_Y ] = 0x35 ,
[ Q_KEY_CODE_Z ] = 0x1a ,
[ Q_KEY_CODE_0 ] = 0x45 ,
[ Q_KEY_CODE_1 ] = 0x16 ,
[ Q_KEY_CODE_2 ] = 0x1e ,
[ Q_KEY_CODE_3 ] = 0x26 ,
[ Q_KEY_CODE_4 ] = 0x25 ,
[ Q_KEY_CODE_5 ] = 0x2e ,
[ Q_KEY_CODE_6 ] = 0x36 ,
[ Q_KEY_CODE_7 ] = 0x3d ,
[ Q_KEY_CODE_8 ] = 0x3e ,
[ Q_KEY_CODE_9 ] = 0x46 ,
[ Q_KEY_CODE_GRAVE_ACCENT ] = 0x0e ,
[ Q_KEY_CODE_MINUS ] = 0x4e ,
[ Q_KEY_CODE_EQUAL ] = 0x55 ,
[ Q_KEY_CODE_BACKSLASH ] = 0x5d ,
[ Q_KEY_CODE_BACKSPACE ] = 0x66 ,
[ Q_KEY_CODE_SPC ] = 0x29 ,
[ Q_KEY_CODE_TAB ] = 0x0d ,
[ Q_KEY_CODE_CAPS_LOCK ] = 0x58 ,
[ Q_KEY_CODE_SHIFT ] = 0x12 ,
[ Q_KEY_CODE_CTRL ] = 0x14 ,
[ Q_KEY_CODE_META_L ] = 0xe01f ,
[ Q_KEY_CODE_ALT ] = 0x11 ,
[ Q_KEY_CODE_SHIFT_R ] = 0x59 ,
[ Q_KEY_CODE_CTRL_R ] = 0xe014 ,
[ Q_KEY_CODE_META_R ] = 0xe027 ,
[ Q_KEY_CODE_ALT_R ] = 0xe011 ,
[ Q_KEY_CODE_MENU ] = 0xe02f ,
[ Q_KEY_CODE_RET ] = 0x5a ,
[ Q_KEY_CODE_ESC ] = 0x76 ,
[ Q_KEY_CODE_F1 ] = 0x05 ,
[ Q_KEY_CODE_F2 ] = 0x06 ,
[ Q_KEY_CODE_F3 ] = 0x04 ,
[ Q_KEY_CODE_F4 ] = 0x0c ,
[ Q_KEY_CODE_F5 ] = 0x03 ,
[ Q_KEY_CODE_F6 ] = 0x0b ,
[ Q_KEY_CODE_F7 ] = 0x83 ,
[ Q_KEY_CODE_F8 ] = 0x0a ,
[ Q_KEY_CODE_F9 ] = 0x01 ,
[ Q_KEY_CODE_F10 ] = 0x09 ,
[ Q_KEY_CODE_F11 ] = 0x78 ,
[ Q_KEY_CODE_F12 ] = 0x07 ,
/* special handling for Q_KEY_CODE_PRINT */
[ Q_KEY_CODE_SCROLL_LOCK ] = 0x7e ,
/* special handling for Q_KEY_CODE_PAUSE */
[ Q_KEY_CODE_BRACKET_LEFT ] = 0x54 ,
[ Q_KEY_CODE_INSERT ] = 0xe070 ,
[ Q_KEY_CODE_HOME ] = 0xe06c ,
[ Q_KEY_CODE_PGUP ] = 0xe07d ,
[ Q_KEY_CODE_DELETE ] = 0xe071 ,
[ Q_KEY_CODE_END ] = 0xe069 ,
[ Q_KEY_CODE_PGDN ] = 0xe07a ,
[ Q_KEY_CODE_UP ] = 0xe075 ,
[ Q_KEY_CODE_LEFT ] = 0xe06b ,
[ Q_KEY_CODE_DOWN ] = 0xe072 ,
[ Q_KEY_CODE_RIGHT ] = 0xe074 ,
[ Q_KEY_CODE_NUM_LOCK ] = 0x77 ,
[ Q_KEY_CODE_KP_DIVIDE ] = 0xe04a ,
[ Q_KEY_CODE_KP_MULTIPLY ] = 0x7c ,
[ Q_KEY_CODE_KP_SUBTRACT ] = 0x7b ,
[ Q_KEY_CODE_KP_ADD ] = 0x79 ,
[ Q_KEY_CODE_KP_ENTER ] = 0xe05a ,
[ Q_KEY_CODE_KP_DECIMAL ] = 0x71 ,
[ Q_KEY_CODE_KP_0 ] = 0x70 ,
[ Q_KEY_CODE_KP_1 ] = 0x69 ,
[ Q_KEY_CODE_KP_2 ] = 0x72 ,
[ Q_KEY_CODE_KP_3 ] = 0x7a ,
[ Q_KEY_CODE_KP_4 ] = 0x6b ,
[ Q_KEY_CODE_KP_5 ] = 0x73 ,
[ Q_KEY_CODE_KP_6 ] = 0x74 ,
[ Q_KEY_CODE_KP_7 ] = 0x6c ,
[ Q_KEY_CODE_KP_8 ] = 0x75 ,
[ Q_KEY_CODE_KP_9 ] = 0x7d ,
[ Q_KEY_CODE_BRACKET_RIGHT ] = 0x5b ,
[ Q_KEY_CODE_SEMICOLON ] = 0x4c ,
[ Q_KEY_CODE_APOSTROPHE ] = 0x52 ,
[ Q_KEY_CODE_COMMA ] = 0x41 ,
[ Q_KEY_CODE_DOT ] = 0x49 ,
[ Q_KEY_CODE_SLASH ] = 0x4a ,
[ Q_KEY_CODE_POWER ] = 0x0e37 ,
[ Q_KEY_CODE_SLEEP ] = 0x0e3f ,
[ Q_KEY_CODE_WAKE ] = 0x0e5e ,
[ Q_KEY_CODE_AUDIONEXT ] = 0xe04d ,
[ Q_KEY_CODE_AUDIOPREV ] = 0xe015 ,
[ Q_KEY_CODE_AUDIOSTOP ] = 0xe03b ,
[ Q_KEY_CODE_AUDIOPLAY ] = 0xe034 ,
[ Q_KEY_CODE_AUDIOMUTE ] = 0xe023 ,
[ Q_KEY_CODE_VOLUMEUP ] = 0xe032 ,
[ Q_KEY_CODE_VOLUMEDOWN ] = 0xe021 ,
[ Q_KEY_CODE_MEDIASELECT ] = 0xe050 ,
[ Q_KEY_CODE_MAIL ] = 0xe048 ,
[ Q_KEY_CODE_CALCULATOR ] = 0xe02b ,
[ Q_KEY_CODE_COMPUTER ] = 0xe040 ,
[ Q_KEY_CODE_FIND ] = 0xe010 ,
[ Q_KEY_CODE_AC_HOME ] = 0xe03a ,
[ Q_KEY_CODE_AC_BACK ] = 0xe038 ,
[ Q_KEY_CODE_AC_FORWARD ] = 0xe030 ,
[ Q_KEY_CODE_STOP ] = 0xe028 ,
[ Q_KEY_CODE_AC_REFRESH ] = 0xe020 ,
[ Q_KEY_CODE_AC_BOOKMARKS ] = 0xe018 ,
[ Q_KEY_CODE_ASTERISK ] = 0x7c ,
[ Q_KEY_CODE_LESS ] = 0x61 ,
[ Q_KEY_CODE_SYSRQ ] = 0x7f ,
[ Q_KEY_CODE_RO ] = 0x51 ,
[ Q_KEY_CODE_HIRAGANA ] = 0x13 ,
[ Q_KEY_CODE_HENKAN ] = 0x64 ,
[ Q_KEY_CODE_YEN ] = 0x6a ,
[ Q_KEY_CODE_KP_COMMA ] = 0x6d ,
} ;
static const uint16_t qcode_to_keycode_set3 [ Q_KEY_CODE__MAX ] = {
[ 0 . . . Q_KEY_CODE__MAX - 1 ] = 0 ,
[ Q_KEY_CODE_A ] = 0x1c ,
[ Q_KEY_CODE_B ] = 0x32 ,
[ Q_KEY_CODE_C ] = 0x21 ,
[ Q_KEY_CODE_D ] = 0x23 ,
[ Q_KEY_CODE_E ] = 0x24 ,
[ Q_KEY_CODE_F ] = 0x2b ,
[ Q_KEY_CODE_G ] = 0x34 ,
[ Q_KEY_CODE_H ] = 0x33 ,
[ Q_KEY_CODE_I ] = 0x43 ,
[ Q_KEY_CODE_J ] = 0x3b ,
[ Q_KEY_CODE_K ] = 0x42 ,
[ Q_KEY_CODE_L ] = 0x4b ,
[ Q_KEY_CODE_M ] = 0x3a ,
[ Q_KEY_CODE_N ] = 0x31 ,
[ Q_KEY_CODE_O ] = 0x44 ,
[ Q_KEY_CODE_P ] = 0x4d ,
[ Q_KEY_CODE_Q ] = 0x15 ,
[ Q_KEY_CODE_R ] = 0x2d ,
[ Q_KEY_CODE_S ] = 0x1b ,
[ Q_KEY_CODE_T ] = 0x2c ,
[ Q_KEY_CODE_U ] = 0x3c ,
[ Q_KEY_CODE_V ] = 0x2a ,
[ Q_KEY_CODE_W ] = 0x1d ,
[ Q_KEY_CODE_X ] = 0x22 ,
[ Q_KEY_CODE_Y ] = 0x35 ,
[ Q_KEY_CODE_Z ] = 0x1a ,
[ Q_KEY_CODE_0 ] = 0x45 ,
[ Q_KEY_CODE_1 ] = 0x16 ,
[ Q_KEY_CODE_2 ] = 0x1e ,
[ Q_KEY_CODE_3 ] = 0x26 ,
[ Q_KEY_CODE_4 ] = 0x25 ,
[ Q_KEY_CODE_5 ] = 0x2e ,
[ Q_KEY_CODE_6 ] = 0x36 ,
[ Q_KEY_CODE_7 ] = 0x3d ,
[ Q_KEY_CODE_8 ] = 0x3e ,
[ Q_KEY_CODE_9 ] = 0x46 ,
[ Q_KEY_CODE_GRAVE_ACCENT ] = 0x0e ,
[ Q_KEY_CODE_MINUS ] = 0x4e ,
[ Q_KEY_CODE_EQUAL ] = 0x55 ,
[ Q_KEY_CODE_BACKSLASH ] = 0x5c ,
[ Q_KEY_CODE_BACKSPACE ] = 0x66 ,
[ Q_KEY_CODE_SPC ] = 0x29 ,
[ Q_KEY_CODE_TAB ] = 0x0d ,
[ Q_KEY_CODE_CAPS_LOCK ] = 0x14 ,
[ Q_KEY_CODE_SHIFT ] = 0x12 ,
[ Q_KEY_CODE_CTRL ] = 0x11 ,
[ Q_KEY_CODE_META_L ] = 0x8b ,
[ Q_KEY_CODE_ALT ] = 0x19 ,
[ Q_KEY_CODE_SHIFT_R ] = 0x59 ,
[ Q_KEY_CODE_CTRL_R ] = 0x58 ,
[ Q_KEY_CODE_META_R ] = 0x8c ,
[ Q_KEY_CODE_ALT_R ] = 0x39 ,
[ Q_KEY_CODE_MENU ] = 0x8d ,
[ Q_KEY_CODE_RET ] = 0x5a ,
[ Q_KEY_CODE_ESC ] = 0x08 ,
[ Q_KEY_CODE_F1 ] = 0x07 ,
[ Q_KEY_CODE_F2 ] = 0x0f ,
[ Q_KEY_CODE_F3 ] = 0x17 ,
[ Q_KEY_CODE_F4 ] = 0x1f ,
[ Q_KEY_CODE_F5 ] = 0x27 ,
[ Q_KEY_CODE_F6 ] = 0x2f ,
[ Q_KEY_CODE_F7 ] = 0x37 ,
[ Q_KEY_CODE_F8 ] = 0x3f ,
[ Q_KEY_CODE_F9 ] = 0x47 ,
[ Q_KEY_CODE_F10 ] = 0x4f ,
[ Q_KEY_CODE_F11 ] = 0x56 ,
[ Q_KEY_CODE_F12 ] = 0x5e ,
[ Q_KEY_CODE_PRINT ] = 0x57 ,
[ Q_KEY_CODE_SCROLL_LOCK ] = 0x5f ,
[ Q_KEY_CODE_PAUSE ] = 0x62 ,
[ Q_KEY_CODE_BRACKET_LEFT ] = 0x54 ,
[ Q_KEY_CODE_INSERT ] = 0x67 ,
[ Q_KEY_CODE_HOME ] = 0x6e ,
[ Q_KEY_CODE_PGUP ] = 0x6f ,
[ Q_KEY_CODE_DELETE ] = 0x64 ,
[ Q_KEY_CODE_END ] = 0x65 ,
[ Q_KEY_CODE_PGDN ] = 0x6d ,
[ Q_KEY_CODE_UP ] = 0x63 ,
[ Q_KEY_CODE_LEFT ] = 0x61 ,
[ Q_KEY_CODE_DOWN ] = 0x60 ,
[ Q_KEY_CODE_RIGHT ] = 0x6a ,
[ Q_KEY_CODE_NUM_LOCK ] = 0x76 ,
[ Q_KEY_CODE_KP_DIVIDE ] = 0x4a ,
[ Q_KEY_CODE_KP_MULTIPLY ] = 0x7e ,
[ Q_KEY_CODE_KP_SUBTRACT ] = 0x4e ,
[ Q_KEY_CODE_KP_ADD ] = 0x7c ,
[ Q_KEY_CODE_KP_ENTER ] = 0x79 ,
[ Q_KEY_CODE_KP_DECIMAL ] = 0x71 ,
[ Q_KEY_CODE_KP_0 ] = 0x70 ,
[ Q_KEY_CODE_KP_1 ] = 0x69 ,
[ Q_KEY_CODE_KP_2 ] = 0x72 ,
[ Q_KEY_CODE_KP_3 ] = 0x7a ,
[ Q_KEY_CODE_KP_4 ] = 0x6b ,
[ Q_KEY_CODE_KP_5 ] = 0x73 ,
[ Q_KEY_CODE_KP_6 ] = 0x74 ,
[ Q_KEY_CODE_KP_7 ] = 0x6c ,
[ Q_KEY_CODE_KP_8 ] = 0x75 ,
[ Q_KEY_CODE_KP_9 ] = 0x7d ,
[ Q_KEY_CODE_BRACKET_RIGHT ] = 0x5b ,
[ Q_KEY_CODE_SEMICOLON ] = 0x4c ,
[ Q_KEY_CODE_APOSTROPHE ] = 0x52 ,
[ Q_KEY_CODE_COMMA ] = 0x41 ,
[ Q_KEY_CODE_DOT ] = 0x49 ,
[ Q_KEY_CODE_SLASH ] = 0x4a ,
[ Q_KEY_CODE_HIRAGANA ] = 0x87 ,
[ Q_KEY_CODE_HENKAN ] = 0x86 ,
[ Q_KEY_CODE_YEN ] = 0x5d ,
} ;
static uint8_t translate_table [ 256 ] = {
0xff , 0x43 , 0x41 , 0x3f , 0x3d , 0x3b , 0x3c , 0x58 ,
0x64 , 0x44 , 0x42 , 0x40 , 0x3e , 0x0f , 0x29 , 0x59 ,
@ -624,7 +229,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
PS2KbdState * s = ( PS2KbdState * ) dev ;
InputKeyEvent * key = evt - > u . key . data ;
int qcode ;
uint16_t keycode ;
uint16_t keycode = 0 ;
int mod ;
qemu_system_wakeup_request ( QEMU_WAKEUP_REASON_OTHER ) ;
@ -706,7 +311,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
}
}
} else {
keycode = qcode_to_keycode_set1 [ qcode ] ;
if ( qcode < qemu_input_map_qcode_to_atset1_len )
keycode = qemu_input_map_qcode_to_atset1 [ qcode ] ;
if ( keycode ) {
if ( keycode & 0xff00 ) {
ps2_put_keycode ( s , keycode > > 8 ) ;
@ -799,7 +405,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
}
}
} else {
keycode = qcode_to_keycode_set2 [ qcode ] ;
if ( qcode < qemu_input_map_qcode_to_atset2_len )
keycode = qemu_input_map_qcode_to_atset2 [ qcode ] ;
if ( keycode ) {
if ( keycode & 0xff00 ) {
ps2_put_keycode ( s , keycode > > 8 ) ;
@ -814,7 +421,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
}
}
} else if ( s - > scancode_set = = 3 ) {
keycode = qcode_to_keycode_set3 [ qcode ] ;
if ( qcode < qemu_input_map_qcode_to_atset3_len )
keycode = qemu_input_map_qcode_to_atset3 [ qcode ] ;
if ( keycode ) {
/* FIXME: break code should be configured on a key by key basis */
if ( ! key - > down ) {