diff -Naur kbdd.orig/kbd.c kbdd/kbd.c --- kbdd.orig/kbd.c 2005-12-06 08:07:57.000000000 +0000 +++ kbdd/kbd.c 2005-12-18 08:21:52.000000000 +0000 @@ -924,6 +924,53 @@ return 0; } +int hp_bt_foldable(void){ +int fd; +unsigned char buf[1]; +unsigned char cnew; +char symb=0; + + fd = open_serial(TTY_PORT, B9600); + if (fd < 0) + return -1; + + for (;;) { + if (read (fd, buf, 1) < 0) { + perror(TTY_PORT); + return -1; + } + if (debug) fprintf(stderr, "got %d (0x%x)\n", buf[0], buf[0]); + if (buf[0] & 0x80) { /* release */ + buf[0] &= 0x7f; + if (buf[0] == 2) { + symb = 0; + continue; + } + if (symb) + cnew = btfoldable_function[buf[0]]; + else + cnew = btfoldable_normal[buf[0]]; + + if (debug) fprintf(stderr, " release cnew=%d (0x%x)\n", cnew, cnew); + if (cnew != 0) + dev_uinput_key(uindev, (unsigned short)cnew, KEY_RELEASED); + } else { /* press */ + if (buf[0] == 2) { + symb = 1; + continue; + } + if (symb) + cnew = btfoldable_function[buf[0]]; + else + cnew = btfoldable_normal[buf[0]]; + if (debug) fprintf(stderr, " press cnew=%d (0x%x)\n", cnew, cnew); + if (cnew != 0) + dev_uinput_key(uindev, (unsigned short)cnew, KEY_PRESSED); + } + } +return 0; +}; + int compaq_microkbd(void) { int fd; @@ -1033,7 +1080,8 @@ fprintf (stderr, "\tmicrofold - Micro Innovations Foldaway keyboard\n"); fprintf (stderr, "\tmicropad - Micro Innovations Datapad\n"); fprintf (stderr, "\tmicrokbd - Compaq MicroKeyboard\n"); - fprintf (stderr, "\ttargusir - Targus Universal Wireless keyboard\n\n"); + fprintf (stderr, "\ttargusir - Targus Universal Wireless keyboard\n"); + fprintf (stderr, "\tbtfoldable - HP iPAQ Bluetooth Foldable Keyboard\n\n"); fprintf (stderr, "Example:\n\t%s -t foldable\n", arg0); } @@ -1054,6 +1102,8 @@ #define KBD_TYPE_MICRO_DATAPAD 13 #define KBD_TYPE_COMPAQ_MICROKBD 14 #define KBD_TYPE_TARGUSIR 15 +#define KBD_TYPE_BTFOLDABLE 16 + int find_kbd_type(const char *ktype) @@ -1088,6 +1138,8 @@ return KBD_TYPE_COMPAQ_MICROKBD; else if (strncmp("targusir", ktype, 8) == 0) return KBD_TYPE_TARGUSIR; + if (strncmp("btfoldable", ktype, 10) == 0) + return KBD_TYPE_BTFOLDABLE; fprintf(stderr, "unrecognised keyboard type %s\n", ktype); @@ -1184,6 +1236,8 @@ if (kbdtype == KBD_TYPE_FOLDABLE) compaq_foldable(); + else if (kbdtype == KBD_TYPE_BTFOLDABLE) + hp_bt_foldable(); else if (kbdtype == KBD_TYPE_SNAPNTYPE) snapntype(); else if (kbdtype == KBD_TYPE_STOWAWAY) diff -Naur kbdd.orig/keyboards.h kbdd/keyboards.h --- kbdd.orig/keyboards.h 2005-12-06 08:07:57.000000000 +0000 +++ kbdd/keyboards.h 2005-12-03 16:01:41.000000000 +0000 @@ -156,6 +156,48 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /*********************************************************************************** + * HP iPAQ Bluetooth Foldable + * + * Key down sends one byte: (KEY) + * Key up sends one byte: (KEY | 0x80) + ***********************************************************************************/ + + /* normal keys */ + + unsigned char btfoldable_normal[128] = { + /*0x00*/ 0, 0, 0, 0, 0, 0, 0, KEY_LEFTMETA, KEY_ESC, 0, 0, 0, 0, KEY_TAB, KEY_GRAVE, 0, + /*0x10*/ KEY_LEFTALT, 0, KEY_LEFTSHIFT,KEY_RIGHTALT, KEY_LEFTCTRL, KEY_Q, KEY_1, 0, 0, 0, KEY_Z, KEY_S, KEY_A, KEY_W, KEY_2, 0, + /*0x20*/ 0, KEY_C, KEY_X, KEY_D, KEY_E, KEY_4, KEY_3, 0, KEY_UP, 0, KEY_V, KEY_F, KEY_T, KEY_R, KEY_5, KEY_RIGHT, + /*0x30*/ 0, KEY_N, KEY_B, KEY_H, KEY_G, KEY_Y, KEY_6, 0, 0, 0, KEY_M, KEY_J, KEY_U, KEY_7, KEY_8, 0, + /*0x40*/ 0, KEY_COMMA, KEY_K, KEY_I, KEY_O, KEY_0, KEY_9, 0, 0, KEY_DOT, KEY_SLASH, KEY_L, KEY_SEMICOLON, KEY_P, KEY_MINUS, 0, + /*0x50*/ 0, 0, KEY_APOSTROPHE, 0, KEY_LEFTBRACE, KEY_EQUAL, 0, 0, KEY_CAPSLOCK, KEY_RIGHTSHIFT, KEY_ENTER, KEY_RIGHTBRACE, KEY_SPACE, KEY_BACKSLASH, KEY_LEFT, 0, + /*0x60*/ KEY_DOWN, 0, 0, 0, 0, 0, KEY_DELETE, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /*0x70*/ 0, KEY_BACKSPACE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + +/* + keys with blue Fn key, contains also modifiers (shift,alt,ctrl,..) to let them work also with Fn pressed + some blue symbols are also mapped to its equivalent but some are not + + Fn keyboard labels: + q=mail,r=calendar,t=todo,y=document viewer?,backspace=off,baskslash=OK,a=file manager?,s=today?,d=web browser,f=itask, + ;=pgup, '=pgdown, /=battery symbol, left=home,right=end + + real Fn mappings: + q=mail, d=www, f=menu, ;=pageup, '=pagedown,left=home,right=end,backspace=sleep + 1-0,-,= =F1-F12 + up=pageup,down=pagedown +*/ + +unsigned char btfoldable_function[128] = { +/*0x00*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/*0x10*/ KEY_LEFTALT, 0, KEY_LEFTSHIFT, KEY_RIGHTALT, KEY_LEFTCTRL, KEY_MAIL, KEY_F1, 0, 0, 0, 0, 0, 0, 0, KEY_F2, 0, +/*0x20*/ 0, 0, 0, KEY_WWW, 0, KEY_F4, KEY_F3, 0, KEY_PAGEUP, 0, 0, KEY_MENU, 0, 0, KEY_F5, KEY_END, +/*0x30*/ 0, 0, 0, 0, 0, 0, KEY_F6, 0, 0, 0, 0, 0, 0, KEY_F7, KEY_F8, 0, +/*0x40*/ 0, 0, 0, 0, 0, KEY_F10, KEY_F9, 0, 0, 0, 0, 0, KEY_PAGEUP, 0, KEY_F11, 0, +/*0x50*/ 0, 0, KEY_PAGEDOWN, 0, 0, KEY_F12, 0, 0, 0, 0, 0, 0, 0, 0, KEY_HOME, 0, +/*0x60*/ KEY_PAGEDOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/*0x70*/ KEY_SLEEP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +/*********************************************************************************** * Targus Stowaway keyboard * * 9600 baud, 8N1 @@ -782,6 +824,8 @@ h3600_hpslim_process_char, 4800, UTCR0_8BitData | UTCR0_1StpBit, &g_uart_3 }, { "Belkin Wireless PDA Keyboard", "belkin-irda", h3600_belkin_irda_process_char, 9600, UTCR0_8BitData | UTCR0_1StpBit, &g_uart_2 }, + { "HP iPAQ Bluetooth Foldable Keyboard", "btfoldable", + h3600_btfoldable_process_char, 4800, UTCR0_8BitData | UTCR0_1StpBit, &g_uart_3 }, }; #define NUM_KEYBOARDS ARRAY_SIZE(keyboards)