From 376429dc9d60701604dcead5b19af5c8bdc4054f Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Thu, 20 Sep 2007 08:42:06 +0000 Subject: mr-500 button driver git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14766 a1c6a512-1295-4272-9138-f99709370657 --- .../target/arm/olympus/mrobe-500/button-mr500.c | 65 +++++++++++++----- .../target/arm/olympus/mrobe-500/button-target.h | 78 ++++++---------------- 2 files changed, 71 insertions(+), 72 deletions(-) diff --git a/firmware/target/arm/olympus/mrobe-500/button-mr500.c b/firmware/target/arm/olympus/mrobe-500/button-mr500.c index 9cafab5c14..388dbf0689 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 @@ inline bool button_hold(void) 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 6637c5bf2b..80dd246744 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 @@ bool button_hold(void); 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 -*/ +#define BUTTON_RC_HEART 0x00000002 +#define BUTTON_RC_MODE 0x00000004 +#define BUTTON_RC_VOL_DOWN 0x00000008 +#define BUTTON_RC_VOL_UP 0x00000010 -/* - 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. +#define BUTTON_RC_PLAY 0x00000020 +#define BUTTON_RC_REW 0x00000040 +#define BUTTON_RC_FF 0x00000080 +#define BUTTON_RC_DOWN 0x00000100 +#define BUTTON_TOUCH 0x00000200 - 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_MAIN (BUTTON_POWER|BUTTON_MENU|BUTTON_LEFT|BUTTON_RIGHT\ - |BUTTON_UP|BUTTON_DOWN|BUTTON_VOL_UP|BUTTON_VOL_DOWN\ - |BUTTON_SELECT|BUTTON_A) +/* compatibility hacks */ +#define BUTTON_LEFT BUTTON_RC_REW +#define BUTTON_RIGHT BUTTON_RC_FF +#define POWEROFF_BUTTON BUTTON_POWER +#define POWEROFF_COUNT 40 -#define BUTTON_REMOTE (BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN|BUTTON_RC_FF\ - |BUTTON_RC_REW|BUTTON_RC_PLAY|BUTTON_RC_DSP) +#define BUTTON_MAIN BUTTON_POWER -#define POWEROFF_BUTTON BUTTON_POWER -#define POWEROFF_COUNT 10 +#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_ */ -- cgit