1 --- kbd.c 2004-07-06 08:07:38.000000000 -0700
2 +++ ../kbdd.works/kbd.c 2005-01-01 07:59:00.000000000 -0800
7 +#include <sys/ioctl.h>
16 #include "keyboards.h"
17 #include "dev_uinput.h"
23 char TTY_PORT[PATH_MAX];
25 int open_serial(char *port, speed_t baud)
30 +int stowaway_init(int fd)
33 +unsigned char buf[16];
37 + ioctl(fd, TIOCMGET, &status);
38 + status |= TIOCM_DTR; /* Set DTR */
39 + status &= ~TIOCM_RTS; /* Clear RTS */
40 + ioctl(fd, TIOCMSET, &status);
42 + /* Unfortunately, DCD seems to be high all of the time on H3900, so the following can't be used */
43 + /* ioctl(fd, TIOCMIWAIT, TIOCM_CAR */
44 + /* So we just wait instead */
47 + ioctl(fd, TIOCMGET, &status);
48 + status |= TIOCM_RTS; /* Set RTS */
49 + ioctl(fd, TIOCMSET, &status);
50 + /* Stowaway will send back 0xFA 0xFD indicating successful init */
55 + if(select(fd+1, &fds, NULL, NULL, &tv)) {
57 + if((buf[0] = 0xFA) && (buf[0] = 0xFD))
58 + if (debug) fprintf(stderr, "keyboard initialised\n");
64 +void stowaway_sig(int sig) {
71 +unsigned char buf[16];
73 +struct sigaction act;
76 + fd = open_serial(TTY_PORT, B9600);
80 + /* Make SIGHUP cause a reinit of the keyboard */
81 + act.sa_handler = stowaway_sig;
82 + sigemptyset(&act.sa_mask);
84 + sigaction(SIGHUP, &act, NULL);
91 + rc = read (fd, buf, 1);
103 + if ( ((unsigned char)buf[0] & (unsigned char)0x80) == 0 ) {
104 + if (debug) fprintf(stderr, "press: %d\n", buf[0]);
105 + if (buf[0] == 0x08) {
110 + buf[0]=stowaway_function[buf[0]];
112 + buf[0]=stowaway_normal[buf[0]];
113 + if (debug) fprintf(stderr,"= 0x%02x\n", buf[0]);
115 + dev_uinput_key(uindev, (unsigned short)buf[0], KEY_PRESSED);
117 + if (debug) fprintf(stderr, "rel. : %d\n", buf[0] & ~0x80);
118 + if ((buf[0] & ~0x80) == 0x08) {
123 + buf[0]=stowaway_function[(unsigned char)buf[0] & (unsigned char)~0x80];
125 + buf[0]=stowaway_normal[(unsigned char)buf[0] & (unsigned char)~0x80];
126 + if (debug) fprintf(stderr,"= 0x%02x\n", buf[0]);
128 + dev_uinput_key(uindev, (unsigned short)buf[0], KEY_RELEASED);
139 +#define FELLOWES_GR_FN 33
140 +#define FELLOWES_BL_FN 34
144 + unsigned char buf[16];
145 + char bluefn=0,greenfn=0;
146 + struct sigaction act;
150 + fd = open_serial(TTY_PORT, B9600);
154 + /* Make SIGHUP cause a reinit of the keyboard */
155 + act.sa_handler = stowaway_sig;
156 + sigemptyset(&act.sa_mask);
158 + sigaction(SIGHUP, &act, NULL);
164 + rc = read (fd, buf, 1);
178 + if ( ((unsigned char)buf[0] & (unsigned char)0x80) == 0 ) {
180 + if (debug) fprintf(stderr, "press: %d\n", buf[0]);
181 + if (buf[0] == FELLOWES_BL_FN) {
186 + if (buf[0] == FELLOWES_GR_FN) {
188 + dev_uinput_key(uindev,42,KEY_PRESSED);
193 + buf[0]=fellowes_function[buf[0]];
194 + else if (greenfn) {
195 + buf[0]=fellowes_function[buf[0]];
197 + /* fixup where green function is not shift blue function */
206 + buf[0]=KEY_PAGEDOWN;
217 + buf[0]=fellowes_normal[buf[0]];
219 + if (debug) fprintf(stderr,"= 0x%02x\n", buf[0]);
220 + if (buf[0] != KEY_RESERVED)
221 + dev_uinput_key(uindev, (unsigned short)buf[0], KEY_PRESSED);
225 + if (debug) fprintf(stderr, "rel. : %d\n", buf[0] & ~0x80);
227 + if ((buf[0] & ~0x80) == FELLOWES_BL_FN) {
232 + if ((buf[0] & ~0x80) == FELLOWES_GR_FN) {
234 + dev_uinput_key(uindev,42,KEY_RELEASED);
239 + buf[0]=fellowes_function[(unsigned char)buf[0] & (unsigned char)~0x80];
240 + else if (greenfn) {
241 + buf[0]=fellowes_function[(unsigned char)buf[0] & (unsigned char)~0x80];
243 + /* fixup where green function is not shift blue function */
252 + buf[0]=KEY_PAGEDOWN;
262 + buf[0]=fellowes_normal[(unsigned char)buf[0] & (unsigned char)~0x80];
264 + if (debug) fprintf(stderr,"= 0x%02x\n", buf[0]);
265 + if (buf[0] != KEY_RESERVED)
266 + dev_uinput_key(uindev, (unsigned short)buf[0], KEY_RELEASED);
278 fprintf (stderr, "-t <kbd type>\n");
279 fprintf (stderr, "\tspecify the serial keyboard type, supported are:\n");
280 fprintf (stderr, "\tfoldable - Compaq/HP foldable keyboard\n");
281 + fprintf (stderr, "\tstowaway - Targus Stowaway keyboard\n");
282 + fprintf (stderr, "\tfellowes - fellowes serial keyboard\n");
283 fprintf (stderr, "\tsnapntype- Snap'n'Type\n\n");
284 fprintf (stderr, "Example:\n\t%s -t foldable\n", arg0);
287 #define KBD_TYPE_NONE 0
288 #define KBD_TYPE_FOLDABLE 1
289 #define KBD_TYPE_SNAPNTYPE 2
290 +#define KBD_TYPE_STOWAWAY 3
291 +#define KBD_TYPE_FELLOWES 4
293 int main(int argc, char **argv)
296 kbdtype = KBD_TYPE_FOLDABLE;
297 } else if (strncmp("snapntype", optarg, 9) == 0) {
298 kbdtype = KBD_TYPE_SNAPNTYPE;
299 + } else if (strncmp("stowaway", optarg, 8) == 0) {
300 + kbdtype = KBD_TYPE_STOWAWAY;
301 + } else if (strncmp("fellowes", optarg, 8) == 0) {
302 + kbdtype = KBD_TYPE_FELLOWES;
305 + fprintf(stderr, "unrecognised keyboard type %s\n", optarg);
308 strcpy(TTY_PORT, optarg);
311 else if (kbdtype == KBD_TYPE_SNAPNTYPE)
313 + else if (kbdtype == KBD_TYPE_STOWAWAY)
315 + else if (kbdtype == KBD_TYPE_FELLOWES)
320 --- keyboards.h 2004-07-09 17:15:52.000000000 -0700
321 +++ ../kbdd.works/keyboards.h 2005-01-01 07:58:19.000000000 -0800
327 /***********************************************************************************
331 108, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
334 +/***********************************************************************************
335 + * Targus Stowaway keyboard
339 + * Initialisation: raise DTR and drop RTS, wait for DCD pulse, then raise RTS
340 + * keyboard will then send back 0xFA 0xFD
342 + * Key down sends one byte
343 + * Key up sends one byte & 0x80, and if the key up is the last key up (ie, no more
344 + * keys held down), then the key code & 0x80 is repeated
345 + ***********************************************************************************/
347 +static unsigned char stowaway_normal[128] = {
348 + /* 0, 001, 002, 003, 004, 005, 006, 007, 008, 009 */
349 +/*000*/ 2, 3, 4, 44, 5, 6, 7, 8, 0, 16,
350 +/*010*/ 17, 18, 19, 20, 21, 41, 45, 30, 31, 32,
351 +/*020*/ 33, 34, 35, 57, 58, 15, 29, 0, 0, 0,
352 +/*030*/ 0, 0, 0, 0, 0, 56, 0, 0, 0, 0,
353 +/*040*/ 0, 0, 0, 0, 46, 47, 48, 49, 12, 13,
354 +/*050*/ 14, 87, 9, 10, 11, 57, 26, 27, 43, 220,
355 +/*060*/ 22, 23, 24, 25, 40, 28, 219, 0, 36, 37,
356 +/*070*/ 38, 39, 53, 144, 183, 0, 50, 51, 52, 0,
357 +/*080*/ 111, 146, 155, 151, 0, 0, 0, 0, 42, 54,
358 +/*090*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
359 +/*100*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
360 +/*110*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
361 +/*120*/ 0, 0, 0, 0, 0, 0, 0, 0, };
363 +static unsigned char stowaway_function[128] = {
364 + /* 0, 001, 002, 003, 004, 005, 006, 007, 008, 009 */
365 +/*000*/ 59, 60, 61, 0, 62, 63, 64, 65, 0, 0,
366 +/*010*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
367 +/*020*/ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
368 +/*030*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
369 +/*040*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
370 +/*050*/ 92, 0, 66, 67, 68, 0, 0, 0, 0, 0,
371 +/*060*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
372 +/*070*/ 0, 0, 0, 104, 0, 0, 0, 0, 0, 0,
373 +/*080*/ 0, 102, 109, 107, 0, 0, 0, 0, 0, 0,
374 +/*090*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
375 +/*100*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
376 +/*110*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
377 +/*120*/ 0, 0, 0, 0, 0, 0, 0, 0, };
381 +/***********************************************************************************
382 + * ThinkOutside / Fellowes Stowaway XT
387 + * the green function key is basically shift + scancode - handled elsewhere
389 + ***********************************************************************************/
390 +unsigned char fellowes_normal[128] = {
391 + /* 000 */ 0, 0, 0, KEY_Z, 0, 0, 0, 0, KEY_LEFTMETA, KEY_Q,
392 + /* 010 */ KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, 0,KEY_X, KEY_A, KEY_S, KEY_D,
393 + /* 020 */ KEY_F, KEY_G, KEY_H, KEY_SPACE, KEY_CAPSLOCK, KEY_TAB, KEY_LEFTCTRL, 0, 0, 0,
394 + /* 030 */ 0, 0, 0, 0, 0, KEY_LEFTALT, 0, 0, 0, 0,
395 + /* 040 */ 0, 0, 0, 0, KEY_C, KEY_V, KEY_B, KEY_N, 0, 0,
396 + /* 050 */ KEY_BACKSPACE, 0, 0, 0, 0, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_SLASH, 0,
397 + /* 060 */ KEY_U, KEY_I, KEY_O, KEY_P, KEY_APOSTROPHE, KEY_ENTER, 0, 0, KEY_J, KEY_K,
398 + /* 070 */ KEY_L, KEY_SEMICOLON, KEY_UP, 0, 0, 0, KEY_M, KEY_COMMA, KEY_DOT, 0,
399 + /* 080 */ KEY_DELETE, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, KEY_LEFTSHIFT, KEY_RIGHTSHIFT,
400 + /* 090 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
401 + /* 100 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
402 + /* 110 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
403 + /* 120 */ 0, 0, 0, 0, 0, 0, 0, 0
406 +unsigned fellowes_function[128] = {
407 + /* 000 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_1,
408 + /* 010 */ KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, 0, 0, KEY_F9, KEY_F10, KEY_F11,
409 + /* 020 */ KEY_F12, 0, 0, 0, KEY_NUMLOCK, KEY_ESC, 0, 0, 0, 0,
410 + /* 030 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
411 + /* 040 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
412 + /* 050 */ 0, 0, 0, 0, 0, 0, KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_BACKSLASH, 0,
413 + /* 060 */ KEY_7, KEY_8, KEY_9, KEY_0, 0, 0, 0, 0, 0, 0,
414 + /* 070 */ 0, KEY_WWW, KEY_UP, 0, 0, 0, 0, KEY_INTL1, KEY_INTL2, 0,
415 + /* 080 */ 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, 0, 0,
416 + /* 090 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
417 + /* 100 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
418 + /* 110 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
419 + /* 120 */ 0, 0, 0, 0, 0, 0, 0, 0
424 /***********************************************************************************
425 * HP foldable keyboard