forked from len0rd/rockbox
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
This commit is contained in:
parent
efca1cd39a
commit
feef1ed076
2 changed files with 198 additions and 0 deletions
151
firmware/button.c
Normal file
151
firmware/button.c
Normal file
|
@ -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 */
|
47
firmware/button.h
Normal file
47
firmware/button.h
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue