]> Joshua Wise's Git repositories - netwatch.git/blob - aseg/keyboard.c
correct scan codes
[netwatch.git] / aseg / keyboard.c
1 #include "keyboard.h"
2 #include <output.h>
3
4 static unsigned char kbd_inj_buffer[128];
5 static int kbd_inj_start = 0;
6 static int kbd_inj_end = 0;
7 int kbd_mode = 2;
8
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 };
105
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
123 };
124
125 unsigned char sc_convert_1(unsigned char in)
126 {
127         static int shifted = 0;
128
129         if (shifted)
130         {
131                 shifted = 0;
132                 return convert_table[in] | 0x80;
133         }
134
135         if (in == 0xF0)
136         {
137                 shifted = 1;
138                 return 0;
139         } else {
140                 return convert_table[in];
141         } 
142 }
143
144 void kbd_inject_scancode (unsigned char sc)
145 {
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
152 void kbd_inject_key(unsigned char k)
153 {
154         const char * c;
155
156         if (kbd_mode == 1) {
157                 c = scancodes2[k];
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 {
165                 c = scancodes2[k];
166                 if (!c) return;
167                 while (*c) {
168                         kbd_inject_scancode(*c);
169                         c++;
170                 }
171         }
172 }
173
174 unsigned char kbd_get_injected_scancode()
175 {
176         unsigned char b;
177
178         if (kbd_inj_end != kbd_inj_start)
179         {
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 }
190
191 int 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.03412 seconds and 4 git commands to generate.