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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
Index: firmware/target/hosted/ypr0/button-ypr0.c
===================================================================
--- firmware/target/hosted/ypr0/button-ypr0.c  (revision 31581)
+++ firmware/target/hosted/ypr0/button-ypr0.c  (working copy)
@@ -19,69 +19,46 @@
  *
  ****************************************************************************/
 
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>         /* EXIT_SUCCESS */
 #include "config.h"
 #include "button.h"
 #include "kernel.h"
 #include "system.h"
 #include "button-target.h"
-#include <gpio_ypr0.h> /* For headphones sense */
+#include <gpio_ypr0.h> /* For headphones sense and buttons */
 
-/* R0 physical key codes */
-enum ypr0_buttons {
-    R0BTN_NONE = BUTTON_NONE,
-    R0BTN_POWER = 1,
-    R0BTN_UP,
-    R0BTN_DOWN,
-    R0BTN_RIGHT,
-    R0BTN_LEFT,
-    R0BTN_CENTRAL,
-    R0BTN_MENU,
-    R0BTN_BACK,
-    R0BTN_3DOTS = 11,
-};
-
-
-static int r0_btn_fd = 0;
-
-/* Samsung keypad driver doesn't allow multiple key combinations :( */
-static enum ypr0_buttons r0_read_key(void)
+int button_read_device(void)
 {
-    unsigned char keys;
-
-    if (r0_btn_fd < 0)
-        return 0;
-
-    if (read(r0_btn_fd, &keys, 1))
-        return keys;
-
-    return 0;
-}
-
-/* Conversion from physical keypress code to logic key code */
-static int key_to_button(enum ypr0_buttons keyboard_button)
-{
-    switch (keyboard_button)
-    {
-        default:            return BUTTON_NONE;
-        case R0BTN_POWER:   return BUTTON_POWER;
-        case R0BTN_UP:      return BUTTON_UP;
-        case R0BTN_DOWN:    return BUTTON_DOWN;
-        case R0BTN_RIGHT:   return BUTTON_RIGHT;
-        case R0BTN_LEFT:    return BUTTON_LEFT;
-        case R0BTN_CENTRAL: return BUTTON_SELECT;
-        case R0BTN_MENU:    return BUTTON_MENU;
-        case R0BTN_BACK:    return BUTTON_BACK;
-        case R0BTN_3DOTS:   return BUTTON_USER;
+    int key = BUTTON_NONE;
+    /* Check for all the keys */
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_USER_KEY, 0, 0)) {
+        key |= BUTTON_USER;
     }
-}
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_CENTRAL_KEY, 0, 0)) {
+        key |= BUTTON_SELECT;
+    }
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_UP_KEY, 0, 0)) {
+        key |= BUTTON_UP;
+    }
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_DOWN_KEY, 0, 0)) {
+        key |= BUTTON_DOWN;
+    }
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_LEFT_KEY, 0, 0)) {
+        key |= BUTTON_LEFT;
+    }
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_RIGHT_KEY, 0, 0)) {
+        key |= BUTTON_RIGHT;
+    }
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_MENU_KEY, 0, 0)) {
+        key |= BUTTON_MENU;
+    }
+    if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_BACK_KEY, 0, 0)) {
+        key |= BUTTON_BACK;
+    }
+    if (gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_POWER_KEY, 0, 0)) {
+        key |= BUTTON_POWER;
+    }
 
-int button_read_device(void)
-{
-    return key_to_button(r0_read_key());
+    return key;
 }
 
 bool headphones_inserted(void)
@@ -93,23 +70,21 @@
 /* Open the keypad device: it is offered by r0Btn.ko module */
 void button_init_device(void)
 {
-    r0_btn_fd = open("/dev/r0Btn", O_RDONLY);
-    if (r0_btn_fd < 0)
-        printf("/dev/r0Btn open error!");
-
     /* Setup GPIO pin for headphone sense, copied from OF */
     gpio_control(DEV_CTRL_GPIO_SET_MUX, GPIO_HEADPHONE_SENSE, CONFIG_SION, PAD_CTL_47K_PU);
     gpio_control(DEV_CTRL_GPIO_SET_INPUT, GPIO_HEADPHONE_SENSE, CONFIG_SION, PAD_CTL_47K_PU);
+    
+    /* No need to initialize any GPIO pin, since this is done loading the r0Btn module */
+    /* initialization of every button */
+    //gpio_control(DEV_CTRL_GPIO_SET_MUX, GPIO_USER_KEY , 4, 0);
+    //gpio_control(DEV_CTRL_GPIO_SET_INPUT, GPIO_USER_KEY, 0x1f0, 0);
+    
 }
 
 #ifdef BUTTON_DRIVER_CLOSE
 /* I'm not sure it's called at shutdown...give a check! */
 void button_close_device(void)
 {
-    if (r0_btn_fd >= 0) {
-        close(r0_btn_fd);
-        printf("/dev/r0Btn closed!");
-    }
     /* Don't know the precise meaning, but it's done as in the OF, so copied there */
     gpio_control(DEV_CTRL_GPIO_UNSET_MUX, GPIO_HEADPHONE_SENSE, CONFIG_SION, 0);
 }
Index: firmware/target/hosted/ypr0/button-target.h
===================================================================
--- firmware/target/hosted/ypr0/button-target.h  (revision 31581)
+++ firmware/target/hosted/ypr0/button-target.h  (working copy)
@@ -42,7 +42,7 @@
 #define BUTTON_POWER        0x00000080
 #define BUTTON_SELECT       0x00000100
 
-#define BUTTON_MAIN         0x1FF /* all buttons */
+#define BUTTON_MAIN         (BUTTON_UP|BUTTON_DOWN|BUTTON_LEFT|BUTTON_RIGHT|BUTTON_USER|BUTTON_MENU|BUTTON_BACK|BUTTON_POWER|BUTTON_SELECT) /* all buttons */
 
 /* No remote */
 #define BUTTON_REMOTE 0
Index: firmware/target/hosted/ypr0/gpio_ypr0.h
===================================================================
--- firmware/target/hosted/ypr0/gpio_ypr0.h  (revision 31581)
+++ firmware/target/hosted/ypr0/gpio_ypr0.h  (working copy)
@@ -5,7 +5,7 @@
  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
  *                     \/            \/     \/    \/            \/
- * $Id: ascodec-target.h 26116 2010-05-17 20:53:25Z funman $
+ * $Id$
  *
  * Module wrapper for GPIO, using /dev/r0GPIO (r0Gpio.ko) of Samsung YP-R0
  *
@@ -28,12 +28,22 @@
 
 /* Some meaningful pins used in the R0 */
 
-#define GPIO_HEADPHONE_SENSE          GPIO1_5
-//26
-#define GPIO_EXT_PWR_SENSE            GPIO1_26
+#define GPIO_HEADPHONE_SENSE        GPIO1_5
+#define GPIO_EXT_PWR_SENSE          GPIO1_26
 //59
-#define GPIO_SD_SENSE                 GPIO2_24
+#define GPIO_SD_SENSE               GPIO2_27
 
+#define GPIO_USER_KEY               GPIO2_30
+#define GPIO_BACK_KEY               GPIO2_29
+#define GPIO_MENU_KEY               GPIO2_31
+#define GPIO_POWER_KEY              GPIO2_16
+#define GPIO_CENTRAL_KEY            GPIO3_5
+#define GPIO_UP_KEY                 GPIO3_9
+#define GPIO_DOWN_KEY               GPIO3_8
+#define GPIO_LEFT_KEY               GPIO2_28
+#define GPIO_RIGHT_KEY              GPIO3_7
+
+
 void gpio_init(void);
 void gpio_close(void);
 int gpio_control_struct(int request, R0GPIOInfo pin);