1 // 2 // Copyright (c) 2010-2018 Antmicro 3 // Copyright (c) 2011-2015 Realtime Embedded 4 // 5 // This file is licensed under the MIT License. 6 // Full license text is available in 'licenses/MIT.txt'. 7 // 8 using System.Collections.Generic; 9 10 namespace Antmicro.Renode.Peripherals.Input 11 { 12 public sealed class PS2ScanCodeTranslator 13 { 14 public static PS2ScanCodeTranslator Instance { get; private set; } 15 PS2ScanCodeTranslator()16 static PS2ScanCodeTranslator() 17 { 18 Instance = new PS2ScanCodeTranslator(); 19 } 20 GetCode(KeyScanCode scanCode)21 public int GetCode(KeyScanCode scanCode) 22 { 23 int result; 24 if(!mapping.TryGetValue(scanCode, out result)) 25 { 26 result = 0; 27 } 28 return result; 29 } 30 PS2ScanCodeTranslator()31 private PS2ScanCodeTranslator() 32 { 33 mapping = new Dictionary<KeyScanCode, int>(); 34 35 mapping.Add(KeyScanCode.Number1, 0x16); 36 mapping.Add(KeyScanCode.Number2, 0x1E); 37 mapping.Add(KeyScanCode.Number3, 0x26); 38 mapping.Add(KeyScanCode.Number4, 0x25); 39 mapping.Add(KeyScanCode.Number5, 0x2E); 40 mapping.Add(KeyScanCode.Number6, 0x36); 41 mapping.Add(KeyScanCode.Number7, 0x3D); 42 mapping.Add(KeyScanCode.Number8, 0x3E); 43 mapping.Add(KeyScanCode.Number9, 0x46); 44 mapping.Add(KeyScanCode.Number0, 0x45); 45 mapping.Add(KeyScanCode.Q, 0x15); 46 mapping.Add(KeyScanCode.W, 0x1D); 47 mapping.Add(KeyScanCode.E, 0x24); 48 mapping.Add(KeyScanCode.R, 0x2D); 49 mapping.Add(KeyScanCode.T, 0x2C); 50 mapping.Add(KeyScanCode.Y, 0x35); 51 mapping.Add(KeyScanCode.U, 0x3C); 52 mapping.Add(KeyScanCode.I, 0x43); 53 mapping.Add(KeyScanCode.O, 0x44); 54 mapping.Add(KeyScanCode.P, 0x4D); 55 mapping.Add(KeyScanCode.A, 0x1C); 56 mapping.Add(KeyScanCode.S, 0x1B); 57 mapping.Add(KeyScanCode.D, 0x23); 58 mapping.Add(KeyScanCode.F, 0x2B); 59 mapping.Add(KeyScanCode.G, 0x34); 60 mapping.Add(KeyScanCode.H, 0x33); 61 mapping.Add(KeyScanCode.J, 0x3B); 62 mapping.Add(KeyScanCode.K, 0x42); 63 mapping.Add(KeyScanCode.L, 0x4B); 64 mapping.Add(KeyScanCode.Z, 0x1A); 65 mapping.Add(KeyScanCode.X, 0x22); 66 mapping.Add(KeyScanCode.C, 0x21); 67 mapping.Add(KeyScanCode.V, 0x2A); 68 mapping.Add(KeyScanCode.B, 0x32); 69 mapping.Add(KeyScanCode.N, 0x31); 70 mapping.Add(KeyScanCode.M, 0x3A); 71 mapping.Add(KeyScanCode.OemMinus, 0x4E); 72 mapping.Add(KeyScanCode.OemPlus, 0x55); 73 mapping.Add(KeyScanCode.OemOpenBrackets, 0x54); 74 mapping.Add(KeyScanCode.OemCloseBrackets, 0x5B); 75 mapping.Add(KeyScanCode.BackSpace, 0x66); 76 mapping.Add(KeyScanCode.OemPipe, 0x5D); 77 mapping.Add(KeyScanCode.OemComma, 0x49); 78 mapping.Add(KeyScanCode.OemSemicolon, 0x4C); 79 mapping.Add(KeyScanCode.OemQuotes, 0x52); 80 mapping.Add(KeyScanCode.OemPeriod, 0x41); 81 mapping.Add(KeyScanCode.OemQuestion, 0x4A); 82 mapping.Add(KeyScanCode.Tab, 0x0D); 83 mapping.Add(KeyScanCode.ShiftL, 0x12); 84 mapping.Add(KeyScanCode.CapsLock, 0x58); 85 mapping.Add(KeyScanCode.ShiftR, 0x59); 86 mapping.Add(KeyScanCode.F1, 0x05); 87 mapping.Add(KeyScanCode.F2, 0x06); 88 mapping.Add(KeyScanCode.F3, 0x04); 89 mapping.Add(KeyScanCode.F4, 0x0C); 90 mapping.Add(KeyScanCode.F5, 0x03); 91 mapping.Add(KeyScanCode.F6, 0x0B); 92 mapping.Add(KeyScanCode.F7, 0x83); 93 mapping.Add(KeyScanCode.F8, 0x0A); 94 mapping.Add(KeyScanCode.F9, 0x01); 95 mapping.Add(KeyScanCode.F10, 0x09); 96 mapping.Add(KeyScanCode.F11, 0x78); 97 mapping.Add(KeyScanCode.F12, 0x07); 98 mapping.Add(KeyScanCode.Pause, 0x777E); 99 mapping.Add(KeyScanCode.Insert, 0xE070); 100 mapping.Add(KeyScanCode.Delete, 0xE071); 101 mapping.Add(KeyScanCode.Left, 0xE06B); 102 mapping.Add(KeyScanCode.Right, 0xE074); 103 mapping.Add(KeyScanCode.Up, 0xE075); 104 mapping.Add(KeyScanCode.Down, 0xE072); 105 mapping.Add(KeyScanCode.Keypad1, 0x69); 106 mapping.Add(KeyScanCode.Keypad2, 0x72); 107 mapping.Add(KeyScanCode.Keypad3, 0x7A); 108 mapping.Add(KeyScanCode.Keypad4, 0x6B); 109 mapping.Add(KeyScanCode.Keypad5, 0x73); 110 mapping.Add(KeyScanCode.Keypad6, 0x74); 111 mapping.Add(KeyScanCode.Keypad7, 0x6C); 112 mapping.Add(KeyScanCode.Keypad8, 0x75); 113 mapping.Add(KeyScanCode.Keypad9, 0x7D); 114 mapping.Add(KeyScanCode.Keypad0, 0x70); 115 // mapping.Add(KeyScanCode.KDiv, 0x4A); 116 mapping.Add(KeyScanCode.KeypadMultiply, 0x7C); 117 mapping.Add(KeyScanCode.KeypadMinus, 0x7B); 118 mapping.Add(KeyScanCode.KeypadPlus, 0x79); 119 mapping.Add(KeyScanCode.KeypadComma, 0x71); 120 mapping.Add(KeyScanCode.NumLock, 0x77); 121 mapping.Add(KeyScanCode.Enter, 0x5A); 122 mapping.Add(KeyScanCode.KeypadEnter, 0xE01C); 123 mapping.Add(KeyScanCode.CtrlL, 0x14); 124 mapping.Add(KeyScanCode.CtrlR, 0xE014); 125 mapping.Add(KeyScanCode.AltL, 0x11); 126 mapping.Add(KeyScanCode.AltR, 0xE011); 127 mapping.Add(KeyScanCode.WinL, 0xE01F); 128 mapping.Add(KeyScanCode.WinR, 0xE027); 129 mapping.Add(KeyScanCode.WinMenu, 0xE02F); 130 mapping.Add(KeyScanCode.Escape, 0x76); 131 mapping.Add(KeyScanCode.Tilde, 0x0E); 132 mapping.Add(KeyScanCode.Space, 0x29); 133 mapping.Add(KeyScanCode.Home, 0xE06C); 134 mapping.Add(KeyScanCode.End, 0xE069); 135 mapping.Add(KeyScanCode.PageUp, 0xE07D); 136 mapping.Add(KeyScanCode.PageDown, 0xE07A); 137 mapping.Add(KeyScanCode.ScrollLock, 0x7E); 138 } 139 140 private readonly Dictionary<KeyScanCode, int> mapping; 141 } 142 } 143 144