4 static unsigned char kbd_inj_buffer[128];
5 static int kbd_inj_start = 0;
6 static int kbd_inj_end = 0;
9 static const char scancodes2[][8] = {
10 ['a'] = "\x1c\xf0\x1c",
11 ['b'] = "\x32\xf0\x32",
12 ['c'] = "\x21\xf0\x21",
13 ['d'] = "\x23\xf0\x23",
14 ['e'] = "\x24\xf0\x24",
15 ['f'] = "\x2b\xf0\x2b",
16 ['g'] = "\x34\xf0\x34",
17 ['h'] = "\x33\xf0\x33",
18 ['i'] = "\x43\xf0\x43",
19 ['j'] = "\x3b\xf0\x3b",
20 ['k'] = "\x42\xf0\x42",
21 ['l'] = "\x4b\xf0\x4b",
22 ['m'] = "\x3a\xf0\x3a",
23 ['n'] = "\x31\xf0\x31",
24 ['o'] = "\x44\xf0\x44",
25 ['p'] = "\x4d\xf0\x4d",
26 ['q'] = "\x15\xf0\x15",
27 ['r'] = "\x2d\xf0\x2d",
28 ['s'] = "\x1b\xf0\x1b",
29 ['t'] = "\x2c\xf0\x2c",
30 ['u'] = "\x3c\xf0\x3c",
31 ['v'] = "\x2a\xf0\x2a",
32 ['w'] = "\x1d\xf0\x1d",
33 ['x'] = "\x22\xf0\x22",
34 ['y'] = "\x35\xf0\x35",
35 ['z'] = "\x1a\xf0\x1a",
36 ['A'] = "\x12\x1c\xf0\x1c\xf0\x12",
37 ['B'] = "\x12\x32\xf0\x32\xf0\x12",
38 ['C'] = "\x12\x21\xf0\x21\xf0\x12",
39 ['D'] = "\x12\x23\xf0\x23\xf0\x12",
40 ['E'] = "\x12\x24\xf0\x24\xf0\x12",
41 ['F'] = "\x12\x2b\xf0\x2b\xf0\x12",
42 ['G'] = "\x12\x34\xf0\x34\xf0\x12",
43 ['H'] = "\x12\x33\xf0\x33\xf0\x12",
44 ['I'] = "\x12\x43\xf0\x43\xf0\x12",
45 ['J'] = "\x12\x3b\xf0\x3b\xf0\x12",
46 ['K'] = "\x12\x42\xf0\x42\xf0\x12",
47 ['L'] = "\x12\x4b\xf0\x4b\xf0\x12",
48 ['M'] = "\x12\x3a\xf0\x3a\xf0\x12",
49 ['N'] = "\x12\x31\xf0\x31\xf0\x12",
50 ['O'] = "\x12\x44\xf0\x44\xf0\x12",
51 ['P'] = "\x12\x4d\xf0\x4d\xf0\x12",
52 ['Q'] = "\x12\x15\xf0\x15\xf0\x12",
53 ['R'] = "\x12\x2d\xf0\x2d\xf0\x12",
54 ['S'] = "\x12\x1b\xf0\x1b\xf0\x12",
55 ['T'] = "\x12\x2c\xf0\x2c\xf0\x12",
56 ['U'] = "\x12\x3c\xf0\x3c\xf0\x12",
57 ['V'] = "\x12\x2a\xf0\x2a\xf0\x12",
58 ['W'] = "\x12\x1d\xf0\x1d\xf0\x12",
59 ['X'] = "\x12\x22\xf0\x22\xf0\x12",
60 ['Y'] = "\x12\x35\xf0\x35\xf0\x12",
61 ['Z'] = "\x12\x1a\xf0\x1a\xf0\x12",
62 ['`'] = "\x0e\xf0\x0e",
63 ['~'] = "\x12\x0e\xf0\x0e\xf0\x12",
64 ['1'] = "\x16\xf0\x16",
65 ['!'] = "\x12\x16\xf0\x16\xf0\x12",
66 ['2'] = "\x1e\xf0\x1e",
67 ['@'] = "\x12\x1e\xf0\x1e\xf0\x12",
68 ['3'] = "\x26\xf0\x26",
69 ['#'] = "\x12\x26\xf0\x26\xf0\x12",
70 ['4'] = "\x25\xf0\x25",
71 ['$'] = "\x12\x25\xf0\x25\xf0\x12",
72 ['5'] = "\x2e\xf0\x2e",
73 ['%'] = "\x12\x2e\xf0\x2e\xf0\x12",
74 ['6'] = "\x36\xf0\x36",
75 ['^'] = "\x12\x36\xf0\x36\xf0\x12",
76 ['7'] = "\x3d\xf0\x3d",
77 ['&'] = "\x12\x3d\xf0\x3d\xf0\x12",
78 ['8'] = "\x3e\xf0\x3e",
79 ['*'] = "\x12\x3e\xf0\x3e\xf0\x12",
80 ['9'] = "\x46\xf0\x46",
81 ['('] = "\x12\x46\xf0\x46\xf0\x12",
82 ['0'] = "\x45\xf0\x45",
83 [')'] = "\x12\x45\xf0\x45\xf0\x12",
84 ['-'] = "\x4e\xf0\x4e",
85 ['_'] = "\x12\x4e\xf0\x4e\xf0\x12",
86 ['='] = "\x55\xf0\x55",
87 ['+'] = "\x12\x55\xf0\x55\xf0\x12",
88 ['['] = "\x54\xf0\x54",
89 ['{'] = "\x12\x54\xf0\x54\xf0\x12",
90 [']'] = "\x5b\xf0\x5b",
91 ['}'] = "\x12\x5b\xf0\x5b\xf0\x12",
92 ['\\'] = "\x5d\xf0\x5d",
93 ['|'] = "\x12\x5d\xf0\x5d\xf0\x12",
94 [';'] = "\x4c\xf0\x4c",
95 [':'] = "\x12\x4c\xf0\x4c\xf0\x12",
96 ['\''] = "\x52\xf0\x52",
97 ['"'] = "\x12\x52\xf0\x52\xf0\x12",
98 [','] = "\x41\xf0\x41",
99 ['<'] = "\x12\x41\xf0\x41\xf0\x12",
100 ['.'] = "\x49\xf0\x49",
101 ['>'] = "\x12\x49\xf0\x49\xf0\x12",
102 ['/'] = "\x4a\xf0\x4a",
103 ['?'] = "\x12\x4a\xf0\x4a\xf0\x12",
104 ['\n'] = "\x5a\xf0\x5a",
105 ['\t'] = "\x0d\xf0\x0d",
106 ['\b'] = "\x66\xf0\x66",
107 [' '] = "\x29\xf0\x29",
108 [0x82] = "\xE0\x75\xE0\xF0\x75",
109 [0x83] = "\xE0\x72\xE0\xF0\x72",
110 [0x84] = "\xE0\x6B\xE0\xF0\x6B",
111 [0x85] = "\xE0\x74\xE0\xF0\x74"
114 const unsigned char convert_table[] = {
115 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
116 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
117 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
118 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
119 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
120 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
121 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
122 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
123 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
124 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
125 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
126 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
127 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
128 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
129 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
130 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
133 unsigned char sc_convert_1(unsigned char in)
135 static int shifted = 0;
140 return convert_table[in] | 0x80;
148 return convert_table[in];
152 void kbd_inject_scancode (unsigned char sc)
154 outputf("Buffering %02x", sc);
155 kbd_inj_buffer[kbd_inj_end] = sc;
157 kbd_inj_end %= sizeof(kbd_inj_buffer);
160 void kbd_inject_key(unsigned char k)
168 char cconv = sc_convert_1(*c);
169 if (cconv) kbd_inject_scancode(cconv);
176 kbd_inject_scancode(*c);
182 unsigned char kbd_get_injected_scancode()
186 if (kbd_inj_end != kbd_inj_start)
188 b = kbd_inj_buffer[kbd_inj_start];
190 kbd_inj_start %= sizeof(kbd_inj_buffer);
191 outputf("Injecting %02x", b);
194 outputf("Not injecting");
199 int kbd_has_injected_scancode()
201 if (kbd_inj_end != kbd_inj_start)