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'] = "\x1e\xf0\x1e",
11 ['b'] = "\x30\xf0\x30",
12 ['c'] = "\x2e\xf0\x2e",
13 ['d'] = "\x20\xf0\x20",
14 ['e'] = "\x12\xf0\x12",
15 ['f'] = "\x21\xf0\x21",
16 ['g'] = "\x22\xf0\x22",
17 ['h'] = "\x23\xf0\x23",
18 ['i'] = "\x17\xf0\x17",
19 ['j'] = "\x24\xf0\x24",
20 ['k'] = "\x25\xf0\x25",
21 ['l'] = "\x26\xf0\x26",
22 ['m'] = "\x32\xf0\x32",
23 ['n'] = "\x31\xf0\x31",
24 ['o'] = "\x18\xf0\x18",
25 ['p'] = "\x19\xf0\x19",
26 ['q'] = "\x10\xf0\x10",
27 ['r'] = "\x13\xf0\x13",
28 ['s'] = "\x1f\xf0\x1f",
29 ['t'] = "\x14\xf0\x14",
30 ['u'] = "\x16\xf0\x16",
31 ['v'] = "\x2f\xf0\x2f",
32 ['w'] = "\x11\xf0\x11",
33 ['x'] = "\x2d\xf0\x2d",
34 ['y'] = "\x15\xf0\x15",
35 ['z'] = "\x2c\xf0\x2c",
36 ['A'] = "\x12\x1e\xf0\x1e\xf0\x12",
37 ['B'] = "\x12\x30\xf0\x30\xf0\x12",
38 ['C'] = "\x12\x2e\xf0\x2e\xf0\x12",
39 ['D'] = "\x12\x20\xf0\x20\xf0\x12",
40 ['E'] = "\x12\x12\xf0\x12\xf0\x12",
41 ['F'] = "\x12\x21\xf0\x21\xf0\x12",
42 ['G'] = "\x12\x22\xf0\x22\xf0\x12",
43 ['H'] = "\x12\x23\xf0\x23\xf0\x12",
44 ['I'] = "\x12\x17\xf0\x17\xf0\x12",
45 ['J'] = "\x12\x24\xf0\x24\xf0\x12",
46 ['K'] = "\x12\x25\xf0\x25\xf0\x12",
47 ['L'] = "\x12\x26\xf0\x26\xf0\x12",
48 ['M'] = "\x12\x32\xf0\x32\xf0\x12",
49 ['N'] = "\x12\x31\xf0\x31\xf0\x12",
50 ['O'] = "\x12\x18\xf0\x18\xf0\x12",
51 ['P'] = "\x12\x19\xf0\x19\xf0\x12",
52 ['Q'] = "\x12\x10\xf0\x10\xf0\x12",
53 ['R'] = "\x12\x13\xf0\x13\xf0\x12",
54 ['S'] = "\x12\x1f\xf0\x1f\xf0\x12",
55 ['T'] = "\x12\x14\xf0\x14\xf0\x12",
56 ['U'] = "\x12\x16\xf0\x16\xf0\x12",
57 ['V'] = "\x12\x2f\xf0\x2f\xf0\x12",
58 ['W'] = "\x12\x11\xf0\x11\xf0\x12",
59 ['X'] = "\x12\x2d\xf0\x2d\xf0\x12",
60 ['Y'] = "\x12\x15\xf0\x15\xf0\x12",
61 ['Z'] = "\x12\x2c\xf0\x2c\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) {
126 static int shifted = 0;
130 return convert_table[in] | 0x80;
137 return convert_table[in];
141 void kbd_inject_scancode (unsigned char sc) {
142 outputf("Buffering %02x", sc);
143 kbd_inj_buffer[kbd_inj_end] = sc;
145 kbd_inj_end %= sizeof(kbd_inj_buffer);
148 void kbd_inject_key(unsigned char k) {
151 const char * c = scancodes2[k];
154 char cconv = sc_convert_1(*c);
155 if (cconv) kbd_inject_scancode(cconv);
159 const char * c = scancodes2[k];
162 kbd_inject_scancode(*c);
168 unsigned char kbd_get_injected_scancode()
172 if (kbd_inj_end != kbd_inj_start) {
173 b = kbd_inj_buffer[kbd_inj_start];
175 kbd_inj_start %= sizeof(kbd_inj_buffer);
176 outputf("Injecting %02x", b);
179 outputf("Not injecting");