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_ */