]> Joshua Wise's Git repositories - netwatch.git/blame - aseg/keyboard.c
correct scan codes
[netwatch.git] / aseg / keyboard.c
CommitLineData
50d89a31
JP
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 = 2;
8
9static const char scancodes2[][8] = {
a4b84140
JP
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",
50d89a31 23 ['n'] = "\x31\xf0\x31",
a4b84140
JP
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",
50d89a31 49 ['N'] = "\x12\x31\xf0\x31\xf0\x12",
a4b84140
JP
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",
50d89a31
JP
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};
105
106const 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
123};
124
46486ad5
JP
125unsigned char sc_convert_1(unsigned char in)
126{
50d89a31
JP
127 static int shifted = 0;
128
46486ad5
JP
129 if (shifted)
130 {
50d89a31
JP
131 shifted = 0;
132 return convert_table[in] | 0x80;
133 }
134
46486ad5
JP
135 if (in == 0xF0)
136 {
50d89a31
JP
137 shifted = 1;
138 return 0;
139 } else {
140 return convert_table[in];
141 }
142}
143
46486ad5
JP
144void kbd_inject_scancode (unsigned char sc)
145{
50d89a31
JP
146 outputf("Buffering %02x", sc);
147 kbd_inj_buffer[kbd_inj_end] = sc;
148 kbd_inj_end += 1;
149 kbd_inj_end %= sizeof(kbd_inj_buffer);
150}
151
46486ad5
JP
152void kbd_inject_key(unsigned char k)
153{
154 const char * c;
50d89a31
JP
155
156 if (kbd_mode == 1) {
46486ad5 157 c = scancodes2[k];
50d89a31
JP
158 if (!c) return;
159 while (*c) {
160 char cconv = sc_convert_1(*c);
161 if (cconv) kbd_inject_scancode(cconv);
162 c++;
163 }
164 } else {
46486ad5 165 c = scancodes2[k];
50d89a31
JP
166 if (!c) return;
167 while (*c) {
168 kbd_inject_scancode(*c);
169 c++;
170 }
171 }
172}
173
174unsigned char kbd_get_injected_scancode()
175{
176 unsigned char b;
177
46486ad5
JP
178 if (kbd_inj_end != kbd_inj_start)
179 {
50d89a31
JP
180 b = kbd_inj_buffer[kbd_inj_start];
181 kbd_inj_start += 1;
182 kbd_inj_start %= sizeof(kbd_inj_buffer);
183 outputf("Injecting %02x", b);
184 return b;
185 } else {
186 outputf("Not injecting");
187 return 0;
188 }
189}
46486ad5
JP
190
191int kbd_has_injected_scancode()
192{
193 if (kbd_inj_end != kbd_inj_start)
194 {
195 return 1;
196 } else {
197 return 0;
198 }
199}
This page took 0.040286 seconds and 4 git commands to generate.