ps2: fix keyboard set 3 and misc improvements
v2 cover ps2: fix keyboard set 3 and misc improvements
Hi,
This patchset is a welcome cleanup of scancodes used in PS/2 keyboard emulation.
- Patches 1 and 2 are fixes to let Linux use set 3 if instructed so.
- Patch 3 makes scancodes untranslated by default and translates them if required, instead of receiving translated scancodes by default and untranslating them if required.
- Patch 4 switches to use qcodes instead of scancodes.
- Patch 5 is a small cleanup, to prevent sending invalid keycodes to the OS.
See each patch commit for details about what changed.
Missing part are handling of following commands in set 3:
- 0xf7: set all keys to typematic/autorepeat only
- 0xf8: set all keys to make/release
- 0xf9: set all keys to make only
- 0xfa: set all keys to typematic/autorepeat make/release
- 0xfb: set specific key to typematic/autorepeat only
- 0xfc: set specific key to make/release
- 0xfd: set specific key to make only
Translated set 2 and untranslated sets 2 and 3 have been tested with Linux, using kernel parameters "i8042.direct=1" and "atkbd.set=3".
Set 1 has been tested with MIPS Magnum emulation.
Patch 4 doesn't pass checkpatch.pl, due to some key mappings not implemented because of missing an equivalent qcode.
Changes since v1:
- fix checkpatch.pl warning (patch 3)
- fix compilation with mingw (patch 5)
Hervé
Hervé Poussineau (5):
ps2: reject unknown commands, instead of blindly accepting them
ps2: correctly handle 'get/set scancode' command
ps2: allow keycode translation for all scancode sets
ps2: use QEMU qcodes instead of scancodes
ps2: do not generate invalid key codes for unknown keys
hw/input/ps2.c | 612 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 558 insertions(+), 54 deletions(-)
Signature · 1 line
2.1.4
PATCH v2 1/5 ps2: reject unknown commands, instead of blindly accepting them
--- hw/input/ps2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
hw/input/ps2.c +1 -1
@@ -290,7 +290,7 @@ void ps2_write_keyboard(void *opaque, int val)ps2_queue (&s->common,KBD_REPLY_POR );break ;default : -ps2_queue (&s->common,KBD_REPLY_ACK ); +ps2_queue (&s->common,KBD_REPLY_RESEND );break ; }break ;
Signature · 1 line
2.1.4
PATCH v2 2/5 ps2: correctly handle 'get/set scancode' command
In reply to Hervé PoussineauWhen getting scancode, current scancode must be preceded from reply ack. When setting scancode, we must reject invalid scancodes.
--- hw/input/ps2.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
hw/input/ps2.c +5 -3
@@ -296,16 +296,18 @@ void ps2_write_keyboard(void *opaque, int val)break ;case KBD_CMD_SCANCODE :if (val ==0 ) { +ps2_queue (&s->common,KBD_REPLY_ACK );if (s->scancode_set ==1 )ps2_put_keycode (s,0x43 );else if (s->scancode_set ==2 )ps2_put_keycode (s,0x41 );else if (s->scancode_set ==3 )ps2_put_keycode (s,0x3f ); - }else { -if (val >=1 && val <=3 ) - s->scancode_set = val; + }else if (val >=1 && val <=3 ) { + s->scancode_set = val;ps2_queue (&s->common,KBD_REPLY_ACK ); + }else { +ps2_queue (&s->common,KBD_REPLY_RESEND ); } s->common.write_cmd =-1 ;break ;
Signature · 1 line
2.1.4
PATCH v2 3/5 ps2: allow keycode translation for all scancode sets
In reply to Hervé PoussineauChange ps2_put_keycode to get an untranslated scancode, which is translated if needed.
As qemu_input_key_value_to_scancode() gives translated scancodes, untranslate them in ps2_keyboard_event first before giving them to ps2_put_keycode.
Results are not changed, except for some keys in translated set 3.
Translation table is available at
https://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html
--- hw/input/ps2.c | 123 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 26 deletions(-)
hw/input/ps2.c +97 -26
@@ -94,12 +94,10 @@ typedef struct {typedef struct {PS2State common;int scan_enabled; -/* QEMU uses translated PC scancodes internally. To avoid multiple -conversions we do the translation (if any) in the PS/2 emulation -not the keyboard controller. */ int translate;int scancode_set;/* 1=XT, 2=AT, 3=PS/2 */ int ledstate; +bool need_high_bit; }PS2KbdState ; typedef struct {
@@ -138,6 +136,41 @@ static const unsigned char ps2_raw_keycode_set3[128] = {19 ,25 ,57 ,81 ,83 ,92 ,95 ,98 ,99 ,100 ,101 ,103 ,104 ,106 ,109 ,110 }; +static uint8_t translate_table[256 ] = { +0xff ,0x43 ,0x41 ,0x3f ,0x3d ,0x3b ,0x3c ,0x58 , +0x64 ,0x44 ,0x42 ,0x40 ,0x3e ,0x0f ,0x29 ,0x59 , +0x65 ,0x38 ,0x2a ,0x70 ,0x1d ,0x10 ,0x02 ,0x5a , +0x66 ,0x71 ,0x2c ,0x1f ,0x1e ,0x11 ,0x03 ,0x5b , +0x67 ,0x2e ,0x2d ,0x20 ,0x12 ,0x05 ,0x04 ,0x5c , +0x68 ,0x39 ,0x2f ,0x21 ,0x14 ,0x13 ,0x06 ,0x5d , +0x69 ,0x31 ,0x30 ,0x23 ,0x22 ,0x15 ,0x07 ,0x5e , +0x6a ,0x72 ,0x32 ,0x24 ,0x16 ,0x08 ,0x09 ,0x5f , +0x6b ,0x33 ,0x25 ,0x17 ,0x18 ,0x0b ,0x0a ,0x60 , +0x6c ,0x34 ,0x35 ,0x26 ,0x27 ,0x19 ,0x0c ,0x61 , +0x6d ,0x73 ,0x28 ,0x74 ,0x1a ,0x0d ,0x62 ,0x6e , +0x3a ,0x36 ,0x1c ,0x1b ,0x75 ,0x2b ,0x63 ,0x76 , +0x55 ,0x56 ,0x77 ,0x78 ,0x79 ,0x7a ,0x0e ,0x7b , +0x7c ,0x4f ,0x7d ,0x4b ,0x47 ,0x7e ,0x7f ,0x6f , +0x52 ,0x53 ,0x50 ,0x4c ,0x4d ,0x48 ,0x01 ,0x45 , +0x57 ,0x4e ,0x51 ,0x4a ,0x37 ,0x49 ,0x46 ,0x54 , +0x80 ,0x81 ,0x82 ,0x41 ,0x54 ,0x85 ,0x86 ,0x87 , +0x88 ,0x89 ,0x8a ,0x8b ,0x8c ,0x8d ,0x8e ,0x8f , +0x90 ,0x91 ,0x92 ,0x93 ,0x94 ,0x95 ,0x96 ,0x97 , +0x98 ,0x99 ,0x9a ,0x9b ,0x9c ,0x9d ,0x9e ,0x9f , +0xa0 ,0xa1 ,0xa2 ,0xa3 ,0xa4 ,0xa5 ,0xa6 ,0xa7 , +0xa8 ,0xa9 ,0xaa ,0xab ,0xac ,0xad ,0xae ,0xaf , +0xb0 ,0xb1 ,0xb2 ,0xb3 ,0xb4 ,0xb5 ,0xb6 ,0xb7 , +0xb8 ,0xb9 ,0xba ,0xbb ,0xbc ,0xbd ,0xbe ,0xbf , +0xc0 ,0xc1 ,0xc2 ,0xc3 ,0xc4 ,0xc5 ,0xc6 ,0xc7 , +0xc8 ,0xc9 ,0xca ,0xcb ,0xcc ,0xcd ,0xce ,0xcf , +0xd0 ,0xd1 ,0xd2 ,0xd3 ,0xd4 ,0xd5 ,0xd6 ,0xd7 , +0xd8 ,0xd9 ,0xda ,0xdb ,0xdc ,0xdd ,0xde ,0xdf , +0xe0 ,0xe1 ,0xe2 ,0xe3 ,0xe4 ,0xe5 ,0xe6 ,0xe7 , +0xe8 ,0xe9 ,0xea ,0xeb ,0xec ,0xed ,0xee ,0xef , +0xf0 ,0xf1 ,0xf2 ,0xf3 ,0xf4 ,0xf5 ,0xf6 ,0xf7 , +0xf8 ,0xf9 ,0xfa ,0xfb ,0xfc ,0xfd ,0xfe ,0xff , +}; +void ps2_queue (void *opaque,int b) {PS2State *s = (PS2State *)opaque;
@@ -152,29 +185,26 @@ void ps2_queue(void *opaque, int b) s->update_irq (s->update_arg,1 ); } -/* -keycode is expressed as follow: -bit 7 - 0 key pressed, 1 = key released -bits 6-0 - translated scancode set 2 -*/ +/* keycode is the untranslated scancode in the current scancode set. */ static void ps2_put_keycode (void *opaque,int keycode) {PS2KbdState *s = opaque;trace_ps2_put_keycode (opaque, keycode);qemu_system_wakeup_request (QEMU_WAKEUP_REASON_OTHER ); -/* XXX: add support for scancode set 1 */ -if (!s->translate && keycode <0xe0 && s->scancode_set >1 ) { -if (keycode &0x80 ) { -ps2_queue (&s->common,0xf0 ); - } -if (s->scancode_set ==2 ) { - keycode = ps2_raw_keycode[keycode &0x7f ]; - }else if (s->scancode_set ==3 ) { - keycode = ps2_raw_keycode_set3[keycode &0x7f ]; + +if (s->translate) { +if (keycode ==0xf0 ) { + s->need_high_bit = true; + }else if (s->need_high_bit) { +ps2_queue (&s->common, translate_table[keycode] |0x80 ); + s->need_high_bit = false; + }else { +ps2_queue (&s->common, translate_table[keycode]); } - } -ps2_queue (&s->common, keycode); + }else { +ps2_queue (&s->common, keycode); + } } static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
@@ -183,13 +213,41 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,PS2KbdState *s = (PS2KbdState *)dev;int scancodes[3 ], i, count;InputKeyEvent *key = evt->u.key.data; +int keycode;qemu_system_wakeup_request (QEMU_WAKEUP_REASON_OTHER ); count =qemu_input_key_value_to_scancode (key->key, key->down, scancodes); + +/* handle invalid key */ +if (count ==1 && scancodes[0 ] ==0x00 ) { +ps2_queue (&s->common,0x00 ); +return ; + }else if (count ==1 && scancodes[0 ] ==0x80 ) { +if (s->translate || s->scancode_set ==1 ) { +ps2_queue (&s->common,0x80 ); + }else { +ps2_queue (&s->common,0xf0 ); +ps2_queue (&s->common,0x00 ); + } +return ; + } +for (i =0 ; i < count; i++) { -ps2_put_keycode (s, scancodes[i]); +/* XXX: add support for scancode set 1 */ + keycode = scancodes[i]; +if (keycode <0xe0 && (s->scancode_set >1 || s->translate)) { +if (keycode &0x80 ) { +ps2_put_keycode (&s->common,0xf0 ); + } +if (s->scancode_set ==1 || s->scancode_set ==2 ) { + keycode = ps2_raw_keycode[keycode &0x7f ]; + }else if (s->scancode_set ==3 ) { + keycode = ps2_raw_keycode_set3[keycode &0x7f ]; + } + } +ps2_put_keycode (s, keycode); } }
@@ -297,12 +355,7 @@ void ps2_write_keyboard(void *opaque, int val)case KBD_CMD_SCANCODE :if (val ==0 ) {ps2_queue (&s->common,KBD_REPLY_ACK ); -if (s->scancode_set ==1 ) -ps2_put_keycode (s,0x43 ); -else if (s->scancode_set ==2 ) -ps2_put_keycode (s,0x41 ); -else if (s->scancode_set ==3 ) -ps2_put_keycode (s,0x3f ); +ps2_put_keycode (s, s->scancode_set); }else if (val >=1 && val <=3 ) { s->scancode_set = val;ps2_queue (&s->common,KBD_REPLY_ACK );
@@ -692,6 +745,23 @@ static const VMStateDescription vmstate_ps2_keyboard_ledstate = { } }; +static bool ps2_keyboard_need_high_bit_needed (void *opaque) +{ +PS2KbdState *s = opaque; +return s->need_high_bit !=0 ;/* 0 is the usual state */ +} + +static const VMStateDescription vmstate_ps2_keyboard_need_high_bit = { + .name ="ps2kbd/need_high_bit" , + .version_id =1 , + .minimum_version_id =1 , + .needed = ps2_keyboard_need_high_bit_needed, + .fields = (VMStateField []) { +VMSTATE_BOOL (need_high_bit, PS2KbdState), +VMSTATE_END_OF_LIST () + } +}; +static int ps2_kbd_post_load (void * opaque,int version_id) {PS2KbdState *s = (PS2KbdState *)opaque;
@@ -728,6 +798,7 @@ static const VMStateDescription vmstate_ps2_keyboard = { }, .subsections = (const VMStateDescription*[]) { &vmstate_ps2_keyboard_ledstate, + &vmstate_ps2_keyboard_need_high_bit,NULL } };
Signature · 1 line
2.1.4
PATCH v2 4/5 ps2: use QEMU qcodes instead of scancodes
In reply to Hervé PoussineauThis fixes problems with translated set 1, where most make code were wrong. This fixes problems with set 3 for extended keys (like arrows) and lot of other keys. Added a FIXME for set 3, where most keys must not (by default) deliver a break code.
Detailed list of changes on untranslated set 2:
- change of ALTGR break code from 0xe4 to 0xf0 0x08
- change of ALTGR_R break code from 0xe0 0xe4 to 0xe0 0xf0 0x08
- change of F7 make code from 0x02 to 0x83
- change of F7 break code from 0xf0 0x02 to 0xf0 0x83
- change of PRINT make code from 0xe0 0x7c to 0xe0 0x12 0xe0 0x7c
- change of PRINT break code from 0xe0 0xf0 0x7c to 0xe0 0xf0 0x7c 0xe0 0xf0 0x12
- change of PAUSE key: new make code = old make code + old break code, no more break code
- change on RO break code from 0xf3 to 0xf0 0x51
- change on KP_COMMA break code from 0xfe to 0xf0 0x6d
Detailed list of changes on translated set 2 (the most commonly used):
- change of PRINT make code from 0xe0 0x37 to 0xe0 0x2a 0xe0 0x37
- change of PRINT break code from 0xe0 0xb7 to 0xe0 0xb7 0xe0 0xaa
- change of PAUSE key: new make code = old make code + old break code, no more break code
Reference:
http://www.computer-engineering.org/ps2keyboard/scancodes1.html
http://www.computer-engineering.org/ps2keyboard/scancodes2.html
http://www.computer-engineering.org/ps2keyboard/scancodes3.html
--- hw/input/ps2.c | 533 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 485 insertions(+), 48 deletions(-)
hw/input/ps2.c +485 -48
@@ -114,26 +114,395 @@ typedef struct {uint8_t mouse_buttons; } PS2MouseState; -/* Table to convert from PC scancodes to raw scancodes. */ -static const unsigned char ps2_raw_keycode[128 ] = { -0 ,118 ,22 ,30 ,38 ,37 ,46 ,54 ,61 ,62 ,70 ,69 ,78 ,85 ,102 ,13 , -21 ,29 ,36 ,45 ,44 ,53 ,60 ,67 ,68 ,77 ,84 ,91 ,90 ,20 ,28 ,27 , -35 ,43 ,52 ,51 ,59 ,66 ,75 ,76 ,82 ,14 ,18 ,93 ,26 ,34 ,33 ,42 , -50 ,49 ,58 ,65 ,73 ,74 ,89 ,124 ,17 ,41 ,88 ,5 ,6 ,4 ,12 ,3 , -11 ,2 ,10 ,1 ,9 ,119 ,126 ,108 ,117 ,125 ,123 ,107 ,115 ,116 ,121 ,105 , -114 ,122 ,112 ,113 ,127 ,96 ,97 ,120 ,7 ,15 ,23 ,31 ,39 ,47 ,55 ,63 , -71 ,79 ,86 ,94 ,8 ,16 ,24 ,32 ,40 ,48 ,56 ,64 ,72 ,80 ,87 ,111 , -19 ,25 ,57 ,81 ,83 ,92 ,95 ,98 ,99 ,100 ,101 ,103 ,104 ,106 ,109 ,110 +/* 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 , + +#if 0 + [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_AC_SEARCH ] =0xe065 , + [Q_KEY_CODE_AC_HOME ] =0xe032 , + [Q_KEY_CODE_AC_BACK ] =0xe06a , + [Q_KEY_CODE_AC_FORWARD ] =0xe069 , + [Q_KEY_CODE_AC_STOP ] =0xe068 , + [Q_KEY_CODE_AC_REFRESH ] =0xe067 , + [Q_KEY_CODE_AC_BOOKMARKS ] =0xe066 , +#endif + + [Q_KEY_CODE_ASTERISK ] =0x37 , + [Q_KEY_CODE_LESS ] =0x56 , + [Q_KEY_CODE_RO ] =0x73 , + [Q_KEY_CODE_KP_COMMA ] =0x7e , }; -static const unsigned char ps2_raw_keycode_set3[128 ] = { -0 ,8 ,22 ,30 ,38 ,37 ,46 ,54 ,61 ,62 ,70 ,69 ,78 ,85 ,102 ,13 , -21 ,29 ,36 ,45 ,44 ,53 ,60 ,67 ,68 ,77 ,84 ,91 ,90 ,17 ,28 ,27 , -35 ,43 ,52 ,51 ,59 ,66 ,75 ,76 ,82 ,14 ,18 ,92 ,26 ,34 ,33 ,42 , -50 ,49 ,58 ,65 ,73 ,74 ,89 ,126 ,25 ,41 ,20 ,7 ,15 ,23 ,31 ,39 , -47 ,2 ,63 ,71 ,79 ,118 ,95 ,108 ,117 ,125 ,132 ,107 ,115 ,116 ,124 ,105 , -114 ,122 ,112 ,113 ,127 ,96 ,97 ,86 ,94 ,15 ,23 ,31 ,39 ,47 ,55 ,63 , -71 ,79 ,86 ,94 ,8 ,16 ,24 ,32 ,40 ,48 ,56 ,64 ,72 ,80 ,87 ,111 , -19 ,25 ,57 ,81 ,83 ,92 ,95 ,98 ,99 ,100 ,101 ,103 ,104 ,106 ,109 ,110 + +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 , + +#if 0 + [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_AC_SEARCH ] =0xe010 , + [Q_KEY_CODE_AC_HOME ] =0xe03a , + [Q_KEY_CODE_AC_BACK ] =0xe038 , + [Q_KEY_CODE_AC_FORWARD ] =0xe030 , + [Q_KEY_CODE_AC_STOP ] =0xe028 , + [Q_KEY_CODE_AC_REFRESH ] =0xe020 , + [Q_KEY_CODE_AC_BOOKMARKS ] =0xe018 , +#endif + + [Q_KEY_CODE_ALTGR ] =0x08 , + [Q_KEY_CODE_ALTGR_R ] =0xe008 , + [Q_KEY_CODE_ASTERISK ] =0x7c , + [Q_KEY_CODE_LESS ] =0x61 , + [Q_KEY_CODE_SYSRQ ] =0x7f , + [Q_KEY_CODE_RO ] =0x51 , + [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 , };static uint8_t translate_table[256 ] = {
@@ -211,43 +580,111 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) {PS2KbdState *s = (PS2KbdState *)dev; -int scancodes[3 ], i, count;InputKeyEvent *key = evt->u.key.data; -int keycode; +int qcode; +uint16_t keycode;qemu_system_wakeup_request (QEMU_WAKEUP_REASON_OTHER ); - count =qemu_input_key_value_to_scancode (key->key, - key->down, - scancodes); - -/* handle invalid key */ -if (count ==1 && scancodes[0 ] ==0x00 ) { -ps2_queue (&s->common,0x00 ); -return ; - }else if (count ==1 && scancodes[0 ] ==0x80 ) { -if (s->translate || s->scancode_set ==1 ) { -ps2_queue (&s->common,0x80 ); +assert (evt->type ==INPUT_EVENT_KIND_KEY ); + qcode =qemu_input_key_value_to_qcode (key->key); + +if (s->scancode_set ==1 ) { +if (qcode ==Q_KEY_CODE_PAUSE ) { +if (key->down) { +ps2_put_keycode (s,0xe1 ); +ps2_put_keycode (s,0x1d ); +ps2_put_keycode (s,0x45 ); +ps2_put_keycode (s,0x91 ); +ps2_put_keycode (s,0x9d ); +ps2_put_keycode (s,0xc5 ); + } + }else if (qcode ==Q_KEY_CODE_PRINT ) { +if (key->down) { +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0x2a ); +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0x37 ); + }else { +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0xb7 ); +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0xaa ); + } }else { -ps2_queue (&s->common,0xf0 ); -ps2_queue (&s->common,0x00 ); + keycode = qcode_to_keycode_set1[qcode]; +if (keycode) { +if (keycode &0xff00 ) { +ps2_put_keycode (s, keycode >>8 ); + } +if (!key->down) { + keycode |=0x80 ; + } +ps2_put_keycode (s, keycode &0xff ); + }else { +ps2_queue (&s->common, key->down ?0x00 :0x80 ); + } } -return ; - } - -for (i =0 ; i < count; i++) { -/* XXX: add support for scancode set 1 */ - keycode = scancodes[i]; -if (keycode <0xe0 && (s->scancode_set >1 || s->translate)) { -if (keycode &0x80 ) { -ps2_put_keycode (&s->common,0xf0 ); + }else if (s->scancode_set ==2 ) { +if (qcode ==Q_KEY_CODE_PAUSE ) { +if (key->down) { +ps2_put_keycode (s,0xe1 ); +ps2_put_keycode (s,0x14 ); +ps2_put_keycode (s,0x77 ); +ps2_put_keycode (s,0xe1 ); +ps2_put_keycode (s,0xf0 ); +ps2_put_keycode (s,0x14 ); +ps2_put_keycode (s,0xf0 ); +ps2_put_keycode (s,0x77 ); } -if (s->scancode_set ==1 || s->scancode_set ==2 ) { - keycode = ps2_raw_keycode[keycode &0x7f ]; - }else if (s->scancode_set ==3 ) { - keycode = ps2_raw_keycode_set3[keycode &0x7f ]; + }else if (qcode ==Q_KEY_CODE_PRINT ) { +if (key->down) { +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0x12 ); +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0x7c ); + }else { +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0xf0 ); +ps2_put_keycode (s,0x7c ); +ps2_put_keycode (s,0xe0 ); +ps2_put_keycode (s,0xf0 ); +ps2_put_keycode (s,0x12 ); } + }else { + keycode = qcode_to_keycode_set2[qcode]; +if (keycode) { +if (keycode &0xff00 ) { +ps2_put_keycode (s, keycode >>8 ); + } +if (!key->down) { +ps2_put_keycode (s,0xf0 ); + } +ps2_put_keycode (s, keycode &0xff ); + }else if (key->down) { +ps2_queue (&s->common,0x00 ); + }else if (s->translate) { +ps2_queue (&s->common,0x80 ); + }else { +ps2_queue (&s->common,0xf0 ); +ps2_queue (&s->common,0x00 ); + } + } + }else if (s->scancode_set ==3 ) { + keycode = qcode_to_keycode_set3[qcode]; +if (keycode) { +/* FIXME: break code should be configured on a key by key basis */ +if (!key->down) { +ps2_put_keycode (s,0xf0 ); + } +ps2_put_keycode (s, keycode); + }else if (key->down) { +ps2_queue (&s->common,0x00 ); + }else if (s->translate) { +ps2_queue (&s->common,0x80 ); + }else { +ps2_queue (&s->common,0xf0 ); +ps2_queue (&s->common,0x00 ); } -ps2_put_keycode (s, keycode); } }
Signature · 1 line
2.1.4
PATCH v2 5/5 ps2: do not generate invalid key codes for unknown keys
In reply to Hervé PoussineauInstead, print a warning message.
--- hw/input/ps2.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)
hw/input/ps2.c +7 -13
@@ -22,6 +22,7 @@* THE SOFTWARE. */ #include "qemu/osdep.h" +#include "qemu/log.h" #include "hw/hw.h" #include "hw/input/ps2.h" #include "ui/console.h"
@@ -621,7 +622,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, }ps2_put_keycode (s, keycode &0xff ); }else { -ps2_queue (&s->common, key->down ?0x00 :0x80 ); +qemu_log_mask (LOG_UNIMP , +"ps2: ignoring key with qcode %d\n" , qcode); } } }else if (s->scancode_set ==2 ) {
@@ -660,13 +662,9 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,ps2_put_keycode (s,0xf0 ); }ps2_put_keycode (s, keycode &0xff ); - }else if (key->down) { -ps2_queue (&s->common,0x00 ); - }else if (s->translate) { -ps2_queue (&s->common,0x80 ); }else { -ps2_queue (&s->common,0xf0 ); -ps2_queue (&s->common,0x00 ); +qemu_log_mask (LOG_UNIMP , +"ps2: ignoring key with qcode %d\n" , qcode); } } }else if (s->scancode_set ==3 ) {
@@ -677,13 +675,9 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,ps2_put_keycode (s,0xf0 ); }ps2_put_keycode (s, keycode); - }else if (key->down) { -ps2_queue (&s->common,0x00 ); - }else if (s->translate) { -ps2_queue (&s->common,0x80 ); }else { -ps2_queue (&s->common,0xf0 ); -ps2_queue (&s->common,0x00 ); +qemu_log_mask (LOG_UNIMP , +"ps2: ignoring key with qcode %d\n" , qcode); } } }
Signature · 1 line
2.1.4
Your series seems to have some coding style problems. See output below for more information:
Hi,
Your series seems to have some coding style problems. See output below for more information:
Type: series
Message-id: [email protected]
Subject: [Qemu-devel] [PATCH v2 0/5] ps2: fix keyboard set 3 and misc improvements
=== TEST SCRIPT BEGIN ===
#!/bin/bash
BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0
# Useful git options
git config --local diff.renamelimit 0
git config --local diff.renames True
commits="$(git log --format=%H --reverse $BASE..)" for c in $commits; do
echo "Checking PATCH $n/$total: $(git show --no-patch --format=%s $c)..."
if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
failed=1
echo
fi
n=$((n+1))done
exit $failed
=== TEST SCRIPT END ===
Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
e82b14a ps2: do not generate invalid key codes for unknown keys 5ae3f51 ps2: use QEMU qcodes instead of scancodes
dae4ee9 ps2: allow keycode translation for all scancode sets fddf389 ps2: correctly handle 'get/set scancode' command 806a85d ps2: reject unknown commands, instead of blindly accepting them
=== OUTPUT BEGIN ===
Checking PATCH 1/5: ps2: reject unknown commands, instead of blindly accepting them... Checking PATCH 2/5: ps2: correctly handle 'get/set scancode' command... Checking PATCH 3/5: ps2: allow keycode translation for all scancode sets... Checking PATCH 4/5: ps2: use QEMU qcodes instead of scancodes...
ERROR: if this code is redundant consider removing it
#163: FILE: hw/input/ps2.c:226:
+#if 0
ERROR: if this code is redundant consider removing it #311: FILE: hw/input/ps2.c:365:
+#if 0
total: 2 errors, 0 warnings, 554 lines checked
Your patch has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS.
Checking PATCH 5/5: ps2: do not generate invalid key codes for unknown keys... === OUTPUT END ===
Test command exited with code: 1
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to [email protected]