diff -Naur kbdd.orig/kbd.c kbdd/kbd.c --- kbdd.orig/kbd.c 2006-05-09 07:55:19.000000000 +0000 +++ kbdd/kbd.c 2006-05-27 08:44:43.000000000 +0000 @@ -211,6 +211,42 @@ return 0; } +int freedom_keyboard(void) +{ +int fd; +unsigned char buf[16]; +unsigned char key; +unsigned int key_down; +unsigned char keycode; + + fd = open_serial(TTY_PORT, B9600); + if (fd <= 0) + return (-1); + + while (fd > 0) { + read (fd, buf, 1); + key = buf[0]; + //keyboard sends n when pressing a key + // and n+63 when releasing the key + key_down = ( key < 63 ); + if (!key_down) + key = (key-63)&0x3F; // convert key code for key up + keycode = freedom_kbd[key]; + if (debug) + fprintf(stdout, "0x%02x 0x%02x\n", buf[0], keycode); + if ( key_down ) { + if (debug) + fprintf(stdout,"press %d\n", keycode); + dev_uinput_key(uindev, (unsigned short)keycode, KEY_PRESSED); + } else { + if (debug) + fprintf(stdout,"release %d\n", keycode); + dev_uinput_key(uindev, (unsigned short)keycode, KEY_RELEASED); + } + } + +return 0; +} int select_read(int fd, int timeout_sec, int timeout_us) { @@ -1081,6 +1117,7 @@ fprintf (stderr, "\tmicropad - Micro Innovations Datapad\n"); fprintf (stderr, "\tmicrokbd - Compaq MicroKeyboard\n"); fprintf (stderr, "\ttargusir - Targus Universal Wireless keyboard\n"); + fprintf (stderr, "\tfreedom - Freedom keyboard\n"); fprintf (stderr, "\tbtfoldable - HP iPAQ Bluetooth Foldable Keyboard\n\n"); fprintf (stderr, "Example:\n\t%s -t foldable\n", arg0); } @@ -1103,7 +1140,7 @@ #define KBD_TYPE_COMPAQ_MICROKBD 14 #define KBD_TYPE_TARGUSIR 15 #define KBD_TYPE_BTFOLDABLE 16 - +#define KBD_TYPE_FREEDOM 17 int find_kbd_type(const char *ktype) @@ -1138,6 +1175,8 @@ return KBD_TYPE_COMPAQ_MICROKBD; else if (strncmp("targusir", ktype, 8) == 0) return KBD_TYPE_TARGUSIR; + else if (strncmp("freedom", ktype, 7) == 0) + return KBD_TYPE_FREEDOM; if (strncmp("btfoldable", ktype, 10) == 0) return KBD_TYPE_BTFOLDABLE; @@ -1273,6 +1312,8 @@ belkin_infrared(); else if (kbdtype == KBD_TYPE_TARGUSIR) targus_infrared(); + else if (kbdtype == KBD_TYPE_FREEDOM) + freedom_keyboard(); return 0; } diff -Naur kbdd.orig/keyboards.h kbdd/keyboards.h --- kbdd.orig/keyboards.h 2006-05-09 07:55:19.000000000 +0000 +++ kbdd/keyboards.h 2006-05-24 18:59:55.000000000 +0000 @@ -743,6 +743,30 @@ /* 60 */ KEY_LEFTSHIFT, KEY_DELETE, KEY_LEFTALT, KEY_INTL1 }; +/*********************************************************************************** + * Freedom keyboard + * + * David Lapetina ntic at lapetina dot org + * + * Key down sends one byte: (KEY) + * Key up sends one byte: (KEY+63(!!)) + ***********************************************************************************/ +unsigned char freedom_kbd[63] = { +/* keys without modificators */ +/* 00 */ KEY_RESERVED, KEY_1, KEY_2, KEY_3, KEY_4, +/* 05 */ KEY_5, KEY_6, KEY_A, KEY_Z, KEY_E, +/* 10 */ KEY_R, KEY_T, KEY_Q, KEY_S, KEY_D, +/* 15 */ KEY_F, KEY_G, KEY_W, KEY_X, KEY_C, +/* 20 */ KEY_V, KEY_B, KEY_SPACE, KEY_TAB, KEY_CAPSLOCK, +/* 25 */ KEY_MENU/*HOME*/, KEY_7, KEY_8, KEY_9, KEY_0, +/* 30 */ KEY_RIGHTBRACE, KEY_EQUAL, KEY_BACKSPACE, KEY_Y, KEY_U, +/* 35 */ KEY_I, KEY_O, KEY_P, KEY_APOSTROPHE, KEY_SPACE/*$*/, +/* 40 */ KEY_H, KEY_J, KEY_K, KEY_L, KEY_M, +/* 45 */ KEY_SPACE/*.*/, KEY_ENTER, KEY_N, KEY_COMMA, KEY_SEMICOLON, +/* 50 */ KEY_SLASH, 0/*!*/, KEY_UP, KEY_SPACE, KEY_ESC /*key with "circle"*/, +/* 55 */ KEY_LEFT, KEY_DOWN, KEY_RIGHT, KEY_LEFTCTRL, KEY_RIGHTSHIFT, +/* 60 */ KEY_LEFTSHIFT, KEY_DELETE, 0 +}; /*********************************************************************************** * Belkin Wireless PDA IRDA Type keyboard