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
