mr-500 button driver


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14766 a1c6a512-1295-4272-9138-f99709370657
diff --git a/firmware/target/arm/olympus/mrobe-500/button-mr500.c b/firmware/target/arm/olympus/mrobe-500/button-mr500.c
index 9cafab5..388dbf0 100644
--- a/firmware/target/arm/olympus/mrobe-500/button-mr500.c
+++ b/firmware/target/arm/olympus/mrobe-500/button-mr500.c
@@ -27,22 +27,11 @@
 #include "system.h"
 #include "backlight-target.h"
 
-static int const remote_buttons[] =
-{
-    BUTTON_NONE,        /* Headphones connected - remote disconnected */
-    BUTTON_RC_PLAY,
-    BUTTON_RC_DSP,
-    BUTTON_RC_REW,
-    BUTTON_RC_FF,
-    BUTTON_RC_VOL_UP,
-    BUTTON_RC_VOL_DOWN,
-    BUTTON_NONE,        /* Remote control attached - no buttons pressed */
-    BUTTON_NONE,        /* Nothing in the headphone socket */
-};
-
+#define BUTTON_TIMEOUT 50
 void button_init_device(void)
 {
-    /* Power, Remote Play & Hold switch */
+    /* GIO is the power button, set as input */
+    outw(inw(IO_GIO_DIR0)|0x01, IO_GIO_DIR0);
 }
 
 inline bool button_hold(void)
@@ -52,5 +41,51 @@
 
 int button_read_device(void)
 {
-    return 0;
+    char data[5], c;
+    int i = 0;
+    int btn = BUTTON_NONE, timeout = BUTTON_TIMEOUT;
+    
+    if ((inw(IO_GIO_BITSET0)&0x01) == 0)
+        btn |= BUTTON_POWER;
+        
+    uartHeartbeat();
+    while (timeout > 0)
+    {
+        c = uartPollch(BUTTON_TIMEOUT*100);
+        if (c > -1)
+        {
+            if (i && data[0] == 0xf4)
+            {
+                data[i++] = c;
+            }
+            else if (c == 0xf4)
+            {
+                data[0] = c;
+                i = 1;
+            }
+            
+            if (i == 5)
+            {
+                if (data[1]& (1<<7))
+                    btn |= BUTTON_RC_HEART;
+                if (data[1]& (1<<6))
+                    btn |= BUTTON_RC_MODE;
+                if (data[1]& (1<<5))
+                    btn |= BUTTON_RC_VOL_DOWN;
+                if (data[1]& (1<<4))
+                    btn |= BUTTON_RC_VOL_UP;
+                if (data[1]& (1<<3))
+                    btn |= BUTTON_RC_REW;
+                if (data[1]& (1<<2))
+                    btn |= BUTTON_RC_FF;
+                if (data[1]& (1<<1))
+                    btn |= BUTTON_RC_DOWN;
+                if (data[1]& (1<<0))
+                    btn |= BUTTON_RC_PLAY;
+                break;
+            }
+        }
+        timeout--;
+    }
+    return btn;
 }
diff --git a/firmware/target/arm/olympus/mrobe-500/button-target.h b/firmware/target/arm/olympus/mrobe-500/button-target.h
index 6637c5b..80dd246 100644
--- a/firmware/target/arm/olympus/mrobe-500/button-target.h
+++ b/firmware/target/arm/olympus/mrobe-500/button-target.h
@@ -7,7 +7,7 @@
  *                     \/            \/     \/    \/            \/
  * $Id: $
  *
- * Copyright (C) 2007 by Karl Kurbjun
+ * Copyright (C) 2007 by Jonathan Gordon
  *
  * All files in this archive are subject to the GNU General Public License.
  * See the file COPYING in the source tree root for full license agreement.
@@ -29,71 +29,35 @@
 void button_init_device(void);
 int button_read_device(void);
 
-/* Toshiba Gigabeat specific button codes */
+/* m:robe 500 specific button codes */
 
 #define BUTTON_POWER        0x00000001
-#define BUTTON_MENU         0x00000002
-
-#define BUTTON_LEFT         0x00000004
-#define BUTTON_RIGHT        0x00000008
-#define BUTTON_UP           0x00000010
-#define BUTTON_DOWN         0x00000020
-
-#define BUTTON_VOL_UP       0x00000040
-#define BUTTON_VOL_DOWN     0x00000080
-
-#define BUTTON_SELECT       0x00000100
-#define BUTTON_A            0x00000200
 
 /* Remote control buttons */
 
-#define BUTTON_RC_VOL_UP    0x00000400
-#define BUTTON_RC_VOL_DOWN  0x00000800
-#define BUTTON_RC_FF        0x00001000
-#define BUTTON_RC_REW       0x00002000
-
-#define BUTTON_RC_PLAY      0x00004000
-#define BUTTON_RC_DSP       0x00008000
-
-/* Toshiba Gigabeat specific remote button ADC values */
-/* The remote control uses ADC 1 to emulate button pushes
-    Reading (approx)     Button      HP plugged in?      Remote plugged in?
-         0                 N/A            Yes                  No
-        125             Play/Pause      Cant tell             Yes
-        241             Speaker+        Cant tell             Yes
-        369             Rewind          Cant tell             Yes
-        492             Fast Fwd        Cant tell             Yes
-        616             Vol +           Cant tell             Yes
-        742             Vol -           Cant tell             Yes
-        864             None            Cant tell             Yes
-       1023              N/A               No                  No
-*/
-
-/* 
-    Notes:
-
-    Buttons on the remote are translated into equivalent button presses just
-    as if you were pressing them on the Gigabeat itself.
-    
-    We cannot tell if the hold is asserted on the remote. The Hold function on 
-    the remote is to block the output of the buttons changing.
-
-    Only one button can be sensed at a time. If another is pressed, the button
-    with the lowest reading is dominant. So, if Rewind and Vol + are pressed
-    at the same time, Rewind value is the one that is read.
-*/
-    
+#define BUTTON_RC_HEART     0x00000002
+#define BUTTON_RC_MODE      0x00000004
+#define BUTTON_RC_VOL_DOWN  0x00000008
+#define BUTTON_RC_VOL_UP    0x00000010
 
 
+#define BUTTON_RC_PLAY      0x00000020
+#define BUTTON_RC_REW       0x00000040
+#define BUTTON_RC_FF        0x00000080
+#define BUTTON_RC_DOWN      0x00000100
+#define BUTTON_TOUCH        0x00000200
 
-#define BUTTON_MAIN (BUTTON_POWER|BUTTON_MENU|BUTTON_LEFT|BUTTON_RIGHT\
-                |BUTTON_UP|BUTTON_DOWN|BUTTON_VOL_UP|BUTTON_VOL_DOWN\
-                |BUTTON_SELECT|BUTTON_A)
-
-#define BUTTON_REMOTE (BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN|BUTTON_RC_FF\
-                |BUTTON_RC_REW|BUTTON_RC_PLAY|BUTTON_RC_DSP)
-
+/* compatibility hacks */
+#define BUTTON_LEFT     BUTTON_RC_REW
+#define BUTTON_RIGHT    BUTTON_RC_FF
 #define POWEROFF_BUTTON BUTTON_POWER
-#define POWEROFF_COUNT 10
+#define POWEROFF_COUNT  40
+
+#define BUTTON_MAIN BUTTON_POWER
+
+#define BUTTON_REMOTE (BUTTON_RC_HEART|BUTTON_RC_MODE|      \
+                       BUTTON_RC_VOL_DOWN|BUTTON_RC_VOL_UP| \
+                       BUTTON_RC_PLAY|BUTTON_RC_DOWN|       \
+                       BUTTON_RC_REW|BUTTON_RC_FF)
 
 #endif /* _BUTTON_TARGET_H_ */