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);
|