]> Joshua Wise's Git repositories - netwatch.git/blame_incremental - aseg/keyboard.c
Enable caching while in SMM.
[netwatch.git] / aseg / keyboard.c
... / ...
CommitLineData
1#include "keyboard.h"
2#include <output.h>
3
4static unsigned char kbd_inj_buffer[128];
5static int kbd_inj_start = 0;
6static int kbd_inj_end = 0;
7int kbd_mode = 1;
8
9static 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"
112};
113
114const 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
131};
132
133unsigned char sc_convert_1(unsigned char in)
134{
135 static int shifted = 0;
136
137 if (shifted)
138 {
139 shifted = 0;
140 return convert_table[in] | 0x80;
141 }
142
143 if (in == 0xF0)
144 {
145 shifted = 1;
146 return 0;
147 } else {
148 return convert_table[in];
149 }
150}
151
152void kbd_inject_scancode (unsigned char sc)
153{
154 outputf("Buffering %02x", sc);
155 kbd_inj_buffer[kbd_inj_end] = sc;
156 kbd_inj_end += 1;
157 kbd_inj_end %= sizeof(kbd_inj_buffer);
158}
159
160void kbd_inject_key(unsigned char k)
161{
162 const char * c;
163
164 if (kbd_mode == 1) {
165 c = scancodes2[k];
166 if (!c) return;
167 while (*c) {
168 char cconv = sc_convert_1(*c);
169 if (cconv) kbd_inject_scancode(cconv);
170 c++;
171 }
172 } else {
173 c = scancodes2[k];
174 if (!c) return;
175 while (*c) {
176 kbd_inject_scancode(*c);
177 c++;
178 }
179 }
180}
181
182unsigned char kbd_get_injected_scancode()
183{
184 unsigned char b;
185
186 if (kbd_inj_end != kbd_inj_start)
187 {
188 b = kbd_inj_buffer[kbd_inj_start];
189 kbd_inj_start += 1;
190 kbd_inj_start %= sizeof(kbd_inj_buffer);
191 outputf("Injecting %02x", b);
192 return b;
193 } else {
194 outputf("Not injecting");
195 return 0;
196 }
197}
198
199int kbd_has_injected_scancode()
200{
201 if (kbd_inj_end != kbd_inj_start)
202 {
203 return 1;
204 } else {
205 return 0;
206 }
207}
This page took 0.028156 seconds and 4 git commands to generate.