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"
110 const unsigned char convert_table[] = {
111 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
112 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
113 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
114 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
115 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
116 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
117 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
118 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
119 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
120 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
121 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
122 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
123 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
124 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
125 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
126 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
129 unsigned char sc_convert_1(unsigned char in)
131 static int shifted = 0;
136 return convert_table[in] | 0x80;
144 return convert_table[in];
148 void kbd_inject_scancode (unsigned char sc)
150 outputf("Buffering %02x", sc);
151 kbd_inj_buffer[kbd_inj_end] = sc;
153 kbd_inj_end %= sizeof(kbd_inj_buffer);
156 void kbd_inject_key(unsigned char k)
164 char cconv = sc_convert_1(*c);
165 if (cconv) kbd_inject_scancode(cconv);
172 kbd_inject_scancode(*c);
178 unsigned char kbd_get_injected_scancode()
182 if (kbd_inj_end != kbd_inj_start)
184 b = kbd_inj_buffer[kbd_inj_start];
186 kbd_inj_start %= sizeof(kbd_inj_buffer);
187 outputf("Injecting %02x", b);
190 outputf("Not injecting");
195 int kbd_has_injected_scancode()
197 if (kbd_inj_end != kbd_inj_start)