summaryrefslogtreecommitdiff
path: root/linux/opensimpad-2.4.25-vrs2-pxa1-jpm1/simpad-switches-input.diff
blob: c07dafd17a07e7d22986ccb62724d11249a6b0e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
--- /mnt/bdisk/openembedded/oetmp/base/opensimpad-2.4.25-vrs2-pxa1-jpm1-r5/linux-2.4.25/drivers/misc/switches.h	2004-07-01 21:10:30.000000000 +0200
+++ drivers/misc/switches.h	2004-07-03 23:45:46.000000000 +0200
@@ -25,4 +25,14 @@
 extern int  switches_ucb1x00_init(void);
 extern void switches_ucb1x00_exit(void);
 
+#ifdef CONFIG_SA1100_SIMPAD	
+#define SIMPAD_KEY_SUSPEND	0x0002
+#define SIMPAD_KEY_WWW		0x0008
+#define SIMPAD_KEY_ENTER	0x0010
+#define SIMPAD_KEY_UP		0x0020
+#define SIMPAD_KEY_DOWN		0x0040
+#define SIMPAD_KEY_LEFT		0x0080
+#define SIMPAD_KEY_RIGHT	0x0100
+#endif
+
 #endif  /* !defined(_SWITCHES_H) */
--- /mnt/bdisk/openembedded/oetmp/base/opensimpad-2.4.25-vrs2-pxa1-jpm1-r5/linux-2.4.25/drivers/misc/switches-core.c	2004-07-01 21:10:30.000000000 +0200
+++ drivers/misc/switches-core.c	2004-07-04 17:57:37.000000000 +0200
@@ -16,6 +16,9 @@
  *  11 September 2001 - UCB1200 driver framework support added.
  *
  *  19 December 2001 - separated out SA-1100 and UCB1x00 code.
+ *
+ *  3 July 2004 - Added generating of keyboard events. 
+ *                Florian Boor <florian@handhelds.org>
  */
 
 #include <linux/config.h>
@@ -30,7 +33,11 @@
 #include <linux/slab.h>
 #include <linux/wait.h>
 
+#include <linux/input.h>
+
 #include <asm/uaccess.h>
+#include <asm/hardware.h>
+#include <asm/keyboard.h>
 
 #include "switches.h"
 
@@ -53,6 +60,19 @@
 DECLARE_WAIT_QUEUE_HEAD(switches_wait);
 LIST_HEAD(switches_event_queue);
 
+#ifdef CONFIG_INPUT
+static struct input_dev idev;
+	
+int 
+dummy_k_translate(unsigned char scancode, unsigned char *keycode, char raw_mode)
+{
+	*keycode = scancode;
+	return 1;
+}
+
+extern int (*k_translate)(unsigned char, unsigned char *, char);
+
+#endif
 
 static ssize_t switches_read(struct file *file, char *buffer,
 			     size_t count, loff_t *pos)
@@ -148,6 +168,31 @@
 {
 	struct switches_action *action;
 
+#ifdef CONFIG_INPUT
+	/* create input events, the events to send depends on the platform */
+#ifdef CONFIG_SA1100_SIMPAD	
+	if (machine_is_simpad()) {
+		if (SWITCHES_COUNT(mask) > 0)
+		{
+			if (mask->events[0] & SIMPAD_KEY_SUSPEND)
+				input_report_key(&idev, KEY_POWER, (mask->states[0] & SIMPAD_KEY_SUSPEND) ? 1 : 0);
+			if (mask->events[0] & SIMPAD_KEY_ENTER)
+				input_report_key(&idev, KEY_ENTER, (mask->states[0] & SIMPAD_KEY_ENTER) ? 1 : 0);
+			if (mask->events[0] & SIMPAD_KEY_UP)
+				input_report_key(&idev, KEY_UP, (mask->states[0] & SIMPAD_KEY_UP) ? 1 : 0);
+			if (mask->events[0] & SIMPAD_KEY_DOWN)
+				input_report_key(&idev, KEY_DOWN, (mask->states[0] & SIMPAD_KEY_DOWN) ? 1 : 0);
+			if (mask->events[0] & SIMPAD_KEY_LEFT)
+				input_report_key(&idev, KEY_LEFT, (mask->states[0] & SIMPAD_KEY_LEFT) ? 1 : 0);
+			if (mask->events[0] & SIMPAD_KEY_RIGHT)
+				input_report_key(&idev, KEY_RIGHT, (mask->states[0] & SIMPAD_KEY_RIGHT) ? 1 : 0);
+			if (mask->events[0] & SIMPAD_KEY_WWW)
+				input_report_key(&idev, KEY_WWW, (mask->states[0] & SIMPAD_KEY_WWW) ? 1 : 0);
+		}
+	}
+#endif
+#endif
+	/* take care of switches device */
 	if ((switches_users > 0) && (SWITCHES_COUNT(mask) > 0)) {
 
 		if ((action = (struct switches_action *)
@@ -197,6 +242,21 @@
 		return -EIO;
 	}
 
+#ifdef CONFIG_INPUT
+	/* init input driver stuff */
+	k_translate = dummy_k_translate;
+	idev.evbit[0] = BIT(EV_KEY); /* handle key events */
+
+	idev.keybit[LONG(KEY_SUSPEND)] |= BIT(KEY_SUSPEND);
+	idev.keybit[LONG(KEY_UP)] |= BIT(KEY_UP);
+	idev.keybit[LONG(KEY_DOWN)] |= BIT(KEY_DOWN);
+	idev.keybit[LONG(KEY_LEFT)] |= BIT(KEY_LEFT);
+	idev.keybit[LONG(KEY_RIGHT)] |= BIT(KEY_RIGHT);
+	idev.keybit[LONG(KEY_ENTER)] |= BIT(KEY_ENTER);
+	idev.keybit[LONG(KEY_WWW)] |= BIT(KEY_WWW);
+
+	input_register_device(&idev);
+#endif	
 	printk("Console switches initialized\n");
 
 	return 0;
@@ -214,6 +274,10 @@
 	switches_ucb1x00_exit();
 #endif
 
+#ifdef CONFIG_INPUT
+	input_unregister_device(&idev);
+#endif
+	
 	if (misc_deregister(&switches_misc) < 0)
 		printk(KERN_ERR "%s: unable to deregister misc device\n",
 		       SWITCHES_NAME);