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,47 @@
  *
  ****************************************************************************/
 
-#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;
+    int key = BUTTON_NONE;
 
-    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;
+    /* 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)
@@ -90,26 +68,19 @@
     return !gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_HEADPHONE_SENSE, 0, 0);
 }
 
-/* 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 */
 }
 
 #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,33 @@
 
 /* Some meaningful pins used in the R0 */
 
-#define GPIO_HEADPHONE_SENSE          GPIO1_5
-//26
-#define GPIO_EXT_PWR_SENSE            GPIO1_26
-//59
-#define GPIO_SD_SENSE                 GPIO2_24
+#define GPIO_HEADPHONE_SENSE        GPIO1_5
+#define GPIO_EXT_PWR_SENSE          GPIO1_26
+#define GPIO_SD_SENSE               GPIO2_27
+#define GPIO_AS3543_INTERUPT        GPIO1_25
+#define GPIO_PCB_VER_DETECT         GPIO_10
+/* I2C bus for AS3543 codec */
+#define GPIO_I2C_CLK0               GPIO_1_0
+#define GPIO_I2C_DAT0               GPIO_1_1
+/* I2C bus for the SI4079 FM radio chip */
+#define GPIO_I2C_CLK1               GPIO_2_12
+#define GPIO_I2C_DAT1               GPIO_2_13
+#define GPIO_FM_SEARCH              GPIO1_4
+#define GPIO_FM_BUS_EN              GPIO2_19
 
+/* Keypad */
+
+#define GPIO_BACK_KEY               GPIO2_29
+#define GPIO_USER_KEY               GPIO2_30
+#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);
