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