summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-04-16 13:37:50 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-04-16 13:37:50 +0000
commitfeef1ed07690c5b027e441d1ffdc381d8e71038c (patch)
tree7edac39fcef9a755c72d9cecd16ae2e029bcdb8f
parentefca1cd39a29afa32a00748e432513c9eec066aa (diff)
downloadrockbox-feef1ed07690c5b027e441d1ffdc381d8e71038c.zip
rockbox-feef1ed07690c5b027e441d1ffdc381d8e71038c.tar.gz
rockbox-feef1ed07690c5b027e441d1ffdc381d8e71038c.tar.bz2
rockbox-feef1ed07690c5b027e441d1ffdc381d8e71038c.tar.xz
Gary's code for reading the Recorder's keyboard. This can't yet be used in
the simulator as we need to tweak how it reads raw input when we simulate this. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@101 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/button.c151
-rw-r--r--firmware/button.h47
2 files changed, 198 insertions, 0 deletions
diff --git a/firmware/button.c b/firmware/button.c
new file mode 100644
index 0000000..2bea498
--- /dev/null
+++ b/firmware/button.c
@@ -0,0 +1,151 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg
+ *
+ * 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.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+/*
+ * Archos Jukebox Recorder button functions
+ */
+
+#include "config.h"
+
+#ifdef HAVE_RECORDER_KEYPAD
+
+#include "types.h"
+#include "sh7034.h"
+#include "button.h"
+
+/* AJBR buttons are connected to the CPU as follows:
+ *
+ * ON and OFF are connected to separate port B input pins.
+ *
+ * F1, F2, F3, and UP are connected to the AN4 analog input, each through
+ * a separate voltage divider. The voltage on AN4 depends on which button
+ * (or none, or a combination) is pressed.
+ *
+ * DOWN, PLAY, LEFT, and RIGHT are likewise connected to AN5. */
+
+/* Button voltage levels on AN4 and AN5 */
+#define LEVEL1 50
+#define LEVEL2 125
+#define LEVEL3 175
+#define LEVEL4 225
+
+/* Number of calls to get_button for a button to stop bouncing
+ * and to be considered held down.
+ * Should really use a hardware timer for this.
+ */
+#define BOUNCE_COUNT 200
+#define HOLD_COUNT 10000
+
+static int last; /* Last button pressed */
+static int count; /* Number of calls button has been down */
+
+
+/*
+ *Initialize buttons
+ */
+void button_init()
+{
+#ifndef SIMULATOR
+ /* Set PB4 and PB8 as input pins */
+ PBCR1 &= 0xfffc; /* PB8MD = 00 */
+ PBCR2 &= 0xfcff; /* PB4MD = 00 */
+ PBIOR &= ~(PBDR_BTN_ON|PBDR_BTN_OFF); /* Inputs */
+
+ /* Set A/D to scan AN4 and AN5.
+ * This needs to be changed to scan other analog pins
+ * for battery level, etc. */
+ ADCSR = 0;
+ ADCR = 0;
+ ADCSR = ADCSR_ADST | ADCSR_SCAN | 0x5;
+#endif
+ last = BUTTON_NONE;
+ count = 0;
+}
+
+/*
+ * Get button pressed from hardware
+ */
+static int get_raw_button (void)
+{
+ /* Check port B pins for ON and OFF */
+ int data = PBDR;
+ if ((data & PBDR_BTN_ON) == 0)
+ return BUTTON_ON;
+ else if ((data & PBDR_BTN_OFF) == 0)
+ return BUTTON_OFF;
+
+ /* Check AN4 pin for F1-3 and UP */
+ data = ADDRAH;
+ if (data >= LEVEL4)
+ return BUTTON_F3;
+ else if (data >= LEVEL3)
+ return BUTTON_UP;
+ else if (data >= LEVEL2)
+ return BUTTON_F2;
+ else if (data >= LEVEL1)
+ return BUTTON_F1;
+
+ /* Check AN5 pin for DOWN, PLAY, LEFT, RIGHT */
+ data = ADDRBH;
+ if (data >= LEVEL4)
+ return BUTTON_DOWN;
+ else if (data >= LEVEL3)
+ return BUTTON_PLAY;
+ else if (data >= LEVEL2)
+ return BUTTON_LEFT;
+ else if (data >= LEVEL1)
+ return BUTTON_RIGHT;
+
+ return BUTTON_NONE;
+}
+
+/*
+ * Get the currently pressed button.
+ * Returns one of BUTTON_xxx codes, with possibly a modifier bit set.
+ * No modifier bits are set when the button is first pressed.
+ * BUTTON_HELD bit is while the button is being held.
+ * BUTTON_REL bit is set when button has been released.
+ */
+int button_get(void)
+{
+ int btn = get_raw_button();
+ int ret;
+
+ /* Last button pressed is still down */
+ if (btn != BUTTON_NONE && btn == last) {
+ count++;
+ if (count == BOUNCE_COUNT)
+ return btn;
+ else if (count >= HOLD_COUNT)
+ return btn | BUTTON_HELD;
+ else
+ return BUTTON_NONE;
+ }
+
+ /* Last button pressed now released */
+ if (btn == BUTTON_NONE && last != BUTTON_NONE)
+ ret = last | BUTTON_REL;
+ else
+ ret = BUTTON_NONE;
+
+ last = btn;
+ count = 0;
+ return ret;
+}
+
+#endif /* HAVE_RECORDER_KEYPAD */
diff --git a/firmware/button.h b/firmware/button.h
new file mode 100644
index 0000000..93ac4b8
--- /dev/null
+++ b/firmware/button.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg
+ *
+ * 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.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "config.h"
+
+#ifdef HAVE_RECORDER_KEYPAD
+/*
+ * Archos Jukebox Recorder button functions
+ */
+
+/* Button codes */
+#define BUTTON_NONE 0x0000
+#define BUTTON_ON 0x0001
+#define BUTTON_OFF 0x0002
+#define BUTTON_PLAY 0x0004
+#define BUTTON_UP 0x0010
+#define BUTTON_DOWN 0x0020
+#define BUTTON_LEFT 0x0040
+#define BUTTON_RIGHT 0x0080
+#define BUTTON_F1 0x0100
+#define BUTTON_F2 0x0200
+#define BUTTON_F3 0x0400
+
+/* Button modifiers */
+#define BUTTON_HELD 0x4000
+#define BUTTON_REL 0x8000
+
+void button_init (void);
+int get_button (void);
+
+#endif