]> Joshua Wise's Git repositories - netwatch.git/blob - aseg/keyboard.c
Ref only the head of a pbuf chain, instead of the whole thing, to avoid leaking pbufs.
[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 = 1;
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         ['\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
114 const 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
133 unsigned 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
152 void 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
160 void 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
182 unsigned 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
199 int 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.040221 seconds and 4 git commands to generate.