]> Joshua Wise's Git repositories - netwatch.git/blob - aseg/keyboard.c
878fa33879883c404fb82b039048b3246b9369e2
[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'] = "\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",
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         static int shifted = 0;
127
128         if (shifted) {
129                 shifted = 0;
130                 return convert_table[in] | 0x80;
131         }
132
133         if (in == 0xF0) {
134                 shifted = 1;
135                 return 0;
136         } else {
137                 return convert_table[in];
138         } 
139 }
140
141 void kbd_inject_scancode (unsigned char sc) {
142         outputf("Buffering %02x", sc);
143         kbd_inj_buffer[kbd_inj_end] = sc;
144         kbd_inj_end += 1;
145         kbd_inj_end %= sizeof(kbd_inj_buffer);
146 }
147
148 void kbd_inject_key(unsigned char k) {
149
150         if (kbd_mode == 1) {
151                 const char * c = scancodes2[k];
152                 if (!c) return;
153                 while (*c) {
154                         char cconv = sc_convert_1(*c);
155                         if (cconv) kbd_inject_scancode(cconv);
156                         c++;
157                 }
158         } else {
159                 const char * c = scancodes2[k];
160                 if (!c) return;
161                 while (*c) {
162                         kbd_inject_scancode(*c);
163                         c++;
164                 }
165         }
166 }
167
168 unsigned char kbd_get_injected_scancode()
169 {
170         unsigned char b;
171
172         if (kbd_inj_end != kbd_inj_start) {
173                 b = kbd_inj_buffer[kbd_inj_start];
174                 kbd_inj_start += 1;
175                 kbd_inj_start %= sizeof(kbd_inj_buffer);
176                 outputf("Injecting %02x", b);
177                 return b;
178         } else {
179                 outputf("Not injecting");
180                 return 0;
181         }
182 }
This page took 0.022327 seconds and 2 git commands to generate.