From feef1ed07690c5b027e441d1ffdc381d8e71038c Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 16 Apr 2002 13:37:50 +0000 Subject: 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 --- firmware/button.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ firmware/button.h | 47 +++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 firmware/button.c create mode 100644 firmware/button.h diff --git a/firmware/button.c b/firmware/button.c new file mode 100644 index 0000000000..2bea49879c --- /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 0000000000..93ac4b8eac --- /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 -- cgit v1.2.3