aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/opensimpad/simpad-switches-input.patch
blob: 792b1af42761c74092a8bc755c9eacda5e842d43 (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
127
128
129
130
131
#
# Patch managed by http://www.holgerschurig.de/patcher.html
#

--- linux-2.4.27/drivers/misc/switches.h~simpad-switches-input
+++ linux-2.4.27/drivers/misc/switches.h
@@ -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) */
--- linux-2.4.27/drivers/misc/switches-core.c~simpad-switches-input
+++ linux-2.4.27/drivers/misc/switches-core.c
@@ -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) ? 0 : 1);
+			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_F10, (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_POWER)] |= BIT(KEY_POWER);
+	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_F10)] |= BIT(KEY_F10);
+
+	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);