|
From: <z7...@us...> - 2007-01-08 09:56:04
|
Revision: 736
http://svn.sourceforge.net/hackndev/?rev=736&view=rev
Author: z72ka
Date: 2007-01-08 01:56:01 -0800 (Mon, 08 Jan 2007)
Log Message:
-----------
Added basic driver for 4-row Palm IR keyboard
Added Paths:
-----------
linux4palm/linux/trunk/drivers/input/keyboard/palmwk.c
Added: linux4palm/linux/trunk/drivers/input/keyboard/palmwk.c
===================================================================
--- linux4palm/linux/trunk/drivers/input/keyboard/palmwk.c (rev 0)
+++ linux4palm/linux/trunk/drivers/input/keyboard/palmwk.c 2007-01-08 09:56:01 UTC (rev 736)
@@ -0,0 +1,254 @@
+/*
+ * linux/drivers/input/keyboard/palmwk.c
+ *
+ * A 4-row Palm Wireless Keyboard driver
+ * Author: Jan Herman <2h...@se...>
+ *
+ * This driver is light modified from original
+ * "Basic 5-row driver" from Alex Osborne <bob...@gm...>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+#include <linux/init.h>
+#include <linux/input.h>
+
+#define STATE_OUTSIDE 0
+#define STATE_BEGIN 1
+#define STATE_SCANCODE 2
+#define STATE_CRC 3
+
+#define XBOF 0xff
+#define BOF 0xc0
+#define EOF 0xc1
+
+#define MASK_CODE 0x7f
+#define MASK_KEYUP 0x80
+
+static unsigned char keycode_table[] = {
+// Normal Fn_Blue Fn_Green ScanCode
+ 0, 0, 0, /* 0 */
+ 0, 0, 0, /* 1 */
+ 0, 0, 0, /* 2 */
+ KEY_Z, KEY_OK, 0, /* 3 */
+ 0, 0, 0, /* 4 */
+ 0, 0, 0, /* 5 */
+ 0, 0, 0, /* 6 */
+ 0, 0, 0, /* 7 */
+ 0, 0, 0, /* 8 */
+ KEY_Q, KEY_1, KEY_F1, /* 9 */
+ KEY_W, KEY_2, KEY_F2, /* 10 */
+ KEY_E, KEY_3, KEY_F3, /* 11 */
+ KEY_R, KEY_4, KEY_F4, /* 12 */
+ KEY_T, KEY_5, KEY_F5, /* 13 */
+ KEY_Y, KEY_6, KEY_F6, /* 14 */
+ 0, 0, 0, /* 15 */
+ KEY_X, 0, 0, /* 16 */
+ KEY_A, 0, 0, /* 17 */
+ KEY_S, 0, 0, /* 18 */
+ KEY_D, 0, 0, /* 19 */
+ KEY_F, 0, 0, /* 20 */
+ KEY_G, 0, 0, /* 21 */
+ KEY_H, 0, 0, /* 22 */
+ KEY_SPACE, 0, 0, /* 23 */
+ KEY_CAPSLOCK, 0, 0, /* 24 */
+ 0, 0, 0, /* 25 */
+ KEY_RIGHTCTRL, 0, 0, /* 26 */
+ KEY_TAB, 0, 0, /* 27 */
+ 0, 0, 0, /* 28 */
+ 0, 0, 0, /* 29 */
+ 0, 0, 0, /* 30 */
+ 0, 0, 0, /* 31 */
+ 0, 0, 0, /* 32 */
+ 0, 0, 0, /* 33 */
+ KEY_RIGHTMETA, 0, 0, /* 34 */
+ KEY_LEFTALT, 0, 0, /* 35 */
+ KEY_LEFTMETA, 0, 0, /* 36 */
+ 0, 0, 0, /* 37 */
+ 0, 0, 0, /* 38 */
+ 0, 0, 0, /* 39 */
+ 0, 0, 0, /* 40 */
+ 0, 0, 0, /* 41 */
+ 0, 0, 0, /* 42 */
+ 0, 0, 0, /* 43 */
+ KEY_C, KEY_CANCEL, 0, /* 44 */
+ KEY_V, 0, 0, /* 45 */
+ KEY_B, 0, 0, /* 46 */
+ KEY_N, KEY_NEW, 0, /* 47 */
+ 0, 0, 0, /* 48 */
+ 0, 0, 0, /* 49 */
+ KEY_BACKSPACE, 0, 0, /* 50 */
+ 0, 0, 0, /* 51 */
+ 0, 0, 0, /* 52 */
+ 0, 0, 0, /* 53 */
+ 0, 0, 0, /* 54 */
+ KEY_SPACE, 0, 0, /* 55 */
+ KEY_MINUS, KEY_LEFTBRACE, KEY_F11, /* 56 */
+ KEY_EQUAL, KEY_RIGHTBRACE, KEY_F12, /* 57 */
+ KEY_SLASH, KEY_BACKSLASH, 0, /* 58 */
+ 0, 0, 0, /* 59 */
+ KEY_U, KEY_7, KEY_F7, /* 60 */
+ KEY_I, KEY_8, KEY_F8, /* 61 */
+ KEY_O, KEY_9, KEY_F9, /* 62 */
+ KEY_P, KEY_0, KEY_F10, /* 63 */
+ 0, 0, 0, /* 64 */
+ 0, 0, 0, /* 65 */
+ 0, 0, 0, /* 66 */
+ 0, 0, 0, /* 67 */
+ KEY_J, KEY_HOME, 0, /* 68 */
+ KEY_K, KEY_MENU, 0, /* 69 */
+ KEY_L, KEY_BOOKMARKS, 0, /* 70 */
+ KEY_SEMICOLON, 0, 0, /* 71 */
+ KEY_UP, 0, KEY_PAGEUP, /* 72 */
+ 0, 0, 0, /* 73 */
+ 0, 0, 0, /* 74 */
+ 0, 0, 0, /* 75 */
+ KEY_M, KEY_DELETE, KEY_KPPLUS, /* 76 */
+ KEY_COMMA, 0, KEY_KPMINUS, /* 77 */
+ KEY_DOT, KEY_SEND, 0, /* 78 */
+ 0, 0, 0, /* 79 */
+ KEY_DELETE, 0, 0, /* 80 */
+ KEY_LEFT, 0, KEY_HOME, /* 81 */
+ KEY_DOWN, 0, KEY_PAGEDOWN, /* 82 */
+ KEY_RIGHT, 0, KEY_END, /* 83 */
+ 0, 0, 0, /* 84 */
+ 0, 0, 0, /* 85 */
+ KEY_APOSTROPHE, 0, 0, /* 86 */
+ KEY_ENTER, 0, 0, /* 87 */
+ KEY_LEFTSHIFT, 0, 0, /* 88 */
+ KEY_RIGHTSHIFT, 0, 0, /* 89 */
+ 0, 0, 0, /* 90 */
+ 0, 0, 0, /* 91 */
+ 0, 0, 0, /* 92 */
+ 0, 0, 0, /* 93 */
+ 0, 0, 0, /* 94 */
+ 0, 0, 0, /* 95 */
+ 0, 0, 0, /* 96 */
+ 0, 0, 0, /* 97 */
+ 0, 0, 0, /* 98*/
+ 0, 0, 0, /* 99 */
+ 0, 0, 0, /* 100 */
+ 0, 0, 0, /* 101 */
+ 0, 0, 0, /* 102 */
+ 0, 0, 0, /* 103 */
+ 0, 0, 0, /* 104 */
+ 0, 0, 0, /* 105 */
+ 0, 0, 0, /* 106 */
+ 0, 0, 0, /* 107 */
+ 0, 0, 0, /* 108 */
+ 0, 0, 0, /* 109 */
+ 0, 0, 0, /* 110 */
+ 0, 0, 0, /* 111 */
+ 0, 0, 0, /* 112 */
+ 0, 0, 0, /* 113 */
+ 0, 0, 0, /* 114 */
+ 0, 0, 0, /* 115 */
+ 0, 0, 0, /* 116 */
+ 0, 0, 0, /* 117 */
+ 0, 0, 0, /* 118 */
+
+};
+
+struct input_dev *palmwk_dev;
+int state = STATE_OUTSIDE;
+int fn_pressed = 0;
+int fn2_pressed = 0;
+
+void palmwk_process_scancode(unsigned char data)
+{
+ int code = data & MASK_CODE;
+ int keyup = data & MASK_KEYUP;
+ int key = 0;
+
+ if(fn_pressed) key = keycode_table[code*3 + 1];
+ if(fn2_pressed) key = keycode_table[code*3 + 2];
+ if(!key) key = keycode_table[code*3];
+
+
+ if(!key) {
+ printk("palmwk_process_scancode: invalid scancode %d\n", code);
+ return;
+ }
+
+ input_report_key(palmwk_dev, key, !keyup);
+ if(key == KEY_RIGHTMETA) fn_pressed = !keyup; /* Blue Fn key */
+ if(key == KEY_LEFTMETA) fn2_pressed = !keyup; /* Green Fn key */
+}
+
+void palmwk_process_byte(unsigned char data)
+{
+ /* at any stage, c1 means end of frame */
+ if(data == EOF) {
+ state = STATE_OUTSIDE;
+ return;
+ }
+
+ switch(state) {
+ case STATE_OUTSIDE:
+ if(data == XBOF)
+ state = STATE_BEGIN;
+ break;
+
+ case STATE_BEGIN:
+ if(data == BOF)
+ state = STATE_SCANCODE;
+ else
+ state = STATE_OUTSIDE;
+ break;
+
+ case STATE_SCANCODE:
+ palmwk_process_scancode(data);
+ state = STATE_CRC;
+ break;
+
+ case STATE_CRC:
+ /* todo: process this */
+ break;
+ }
+}
+
+
+int palmwk_receive(void *dev, const unsigned char *cp, size_t count)
+{
+ int i;
+
+ for(i=0; i<count; i++) {
+ palmwk_process_byte(cp[i]);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(palmwk_receive);
+
+static int __init palmwk_init(void)
+{
+ int i, key;
+
+ palmwk_dev = input_allocate_device();
+
+ for(i=0; i<(127*3); i++) {
+ if((key = keycode_table[i])) {
+ palmwk_dev->keybit[LONG(key)] |= BIT(key);
+ }
+ }
+
+ palmwk_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
+ palmwk_dev->name = "Palm wireless keyboard";
+ palmwk_dev->id.bustype = BUS_HOST;
+
+ return input_register_device(palmwk_dev);
+}
+
+static void __exit palmwk_exit(void)
+{
+ input_unregister_device(palmwk_dev);
+}
+
+
+module_init(palmwk_init);
+module_exit(palmwk_exit);
+
+MODULE_AUTHOR ("Jan Herman <2h...@se...>");
+MODULE_DESCRIPTION ("Palm 4-row Wireless Keyboard driver");
+MODULE_LICENSE ("GPL");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|