1
0
Fork 0
forked from len0rd/rockbox

Moved archos button reading to target tree. * Cleanup of button.[ch]. * Deactivated serial remote code for recorder FM/V2 as there is no remote pin, saving ~500 bytes of code.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11612 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2006-11-27 02:16:32 +00:00
parent e43f56b58d
commit 0e6dd7efcd
18 changed files with 625 additions and 368 deletions

View file

@ -215,6 +215,7 @@ const struct button_mapping button_context_radio[] = {
};
#if BUTTON_REMOTE != 0
/*****************************************************************************
* Remote control mappings
*****************************************************************************/
@ -254,11 +255,14 @@ static const struct button_mapping* get_context_mapping_remote( int context )
return remote_button_context_standard;
}
}
#endif /* BUTTON_REMOTE != 0 */
const struct button_mapping* get_context_mapping( int context )
{
#if BUTTON_REMOTE != 0
if (context&CONTEXT_REMOTE)
return get_context_mapping_remote(context);
#endif
switch( context )
{

View file

@ -309,8 +309,7 @@ void init(void)
#ifdef DEBUG
debug_init();
#else
#ifndef HAVE_MMC /* FIXME: This is also necessary for debug builds
* (do debug builds on the Ondio make sense?) */
#if !defined(HAVE_FMADC) && !defined(HAVE_MMC)
serial_setup();
#endif
#endif

View file

@ -29,15 +29,17 @@ PLUGIN_HEADER
#define EV_EXIT 1337
/* seems to work with 1300, but who knows... */
#define THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200
#define THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200
#if CONFIG_KEYPAD == RECORDER_PAD
#define BATTERY_ON BUTTON_PLAY
#define BATTERY_RC_ON BUTTON_RC_PLAY
#define BATTERY_OFF BUTTON_OFF
#if BUTTON_REMOTE != 0
#define BATTERY_RC_ON BUTTON_RC_PLAY
#define BATTERY_RC_OFF BUTTON_RC_STOP
#endif
#elif CONFIG_KEYPAD == ONDIO_PAD

View file

@ -47,15 +47,17 @@ PLUGIN_HEADER
#define BTN_DIR_RIGHT BUTTON_RIGHT
#define BTN_PLAYER2_DIR1 BUTTON_F2
#define BTN_PLAYER2_DIR2 BUTTON_F3
#define BTN_RC_UP BUTTON_RC_VOL_UP
#define BTN_RC_DOWN BUTTON_RC_VOL_DOWN
#define BTN_STARTPAUSE BUTTON_PLAY
#define BTN_QUIT BUTTON_OFF
#define BTN_STOPRESET BUTTON_ON
#define BTN_TOGGLE_KEYS BUTTON_F1
#if BUTTON_REMOTE != 0
#define BTN_RC_UP BUTTON_RC_VOL_UP
#define BTN_RC_DOWN BUTTON_RC_VOL_DOWN
#define REMOTE
#define MULTIPLAYER
#endif
#define PLAYERS_TEXT "UP/DN"
#define WORMS_TEXT "L/R"

View file

@ -281,6 +281,7 @@ drivers/i2c.c
#ifdef ARCHOS_PLAYER
#ifndef SIMULATOR
target/sh/archos/player/button-player.c
target/sh/archos/player/lcd-as-player.S
#endif /* SIMULATOR */
#endif /* ARCHOS_PLAYER */
@ -289,6 +290,7 @@ target/sh/archos/player/lcd-as-player.S
#ifndef SIMULATOR
target/sh/archos/lcd-archos-bitmap.c
target/sh/archos/lcd-as-archos-bitmap.S
target/sh/archos/recorder/button-recorder.c
#endif /* SIMULATOR */
#endif /* ARCHOS_RECORDER */
@ -296,6 +298,7 @@ target/sh/archos/lcd-as-archos-bitmap.S
#ifndef SIMULATOR
target/sh/archos/lcd-archos-bitmap.c
target/sh/archos/lcd-as-archos-bitmap.S
target/sh/archos/fm_v2/button-fm_v2.c
#endif /* SIMULATOR */
#endif /* ARCHOS_FMRECORDER || ARCHOS_RECORDERV2 */
@ -303,6 +306,7 @@ target/sh/archos/lcd-as-archos-bitmap.S
#ifndef SIMULATOR
target/sh/archos/lcd-archos-bitmap.c
target/sh/archos/lcd-as-archos-bitmap.S
target/sh/archos/ondio/button-ondio.c
#endif /* SIMULATOR */
#endif /* ARCHOS_ONDIOFM || ARCHOS_ONDIOFM */

View file

@ -9,12 +9,6 @@
*
* Copyright (C) 2002 by Daniel Stenberg
*
* iPod driver based on code from the ipodlinux project - http://ipodlinux.org
* Adapted for Rockbox in December 2005
* Original file: linux/arch/armnommu/mach-ipod/keyboard.c
* Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
*
*
* 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,25 +23,19 @@
#include <stdlib.h>
#include "config.h"
#include "cpu.h"
#include "system.h"
#include "button.h"
#include "kernel.h"
#include "backlight.h"
#include "adc.h"
#include "serial.h"
#include "power.h"
#include "system.h"
#include "powermgmt.h"
#include "button-target.h"
#ifdef HAVE_REMOTE_LCD
#include "lcd-remote.h"
#endif
#ifdef TARGET_TREE
#include "button-target.h"
#endif
struct event_queue button_queue;
static long lastbtn; /* Last valid button status */
@ -60,6 +48,9 @@ static bool filter_first_keypress;
#ifdef HAVE_REMOTE_LCD
static bool remote_filter_first_keypress;
#endif
#endif /* CONFIG_BACKLIGHT */
#ifdef HAVE_HEADPHONE_DETECTION
bool phones_present = false;
#endif
/* how long until repeat kicks in, in ticks */
@ -71,18 +62,8 @@ static bool remote_filter_first_keypress;
/* speed repeat finishes at, in ticks */
#define REPEAT_INTERVAL_FINISH 5
/* the power-off button and number of repeated keys before shutting off */
#if !defined(TARGET_TREE)
#define POWEROFF_BUTTON BUTTON_OFF
#define POWEROFF_COUNT 10
#endif
static int button_read(void);
#ifdef HAVE_HEADPHONE_DETECTION
bool phones_present = false;
#endif
static void button_tick(void)
{
static int count = 0;
@ -99,8 +80,7 @@ static void button_tick(void)
int diff;
int btn;
#if (CONFIG_KEYPAD == PLAYER_PAD) || (CONFIG_KEYPAD == RECORDER_PAD)
#ifdef HAS_SERIAL_REMOTE
/* Post events for the remote control */
btn = remote_control_rx();
if(btn)
@ -180,9 +160,7 @@ static void button_tick(void)
key */
#ifdef HAVE_SW_POWEROFF
if ((btn == POWEROFF_BUTTON
#ifdef BUTTON_RC_STOP
|| btn == BUTTON_RC_STOP
#elif defined(RC_POWEROFF_BUTTON)
#ifdef RC_POWEROFF_BUTTON
|| btn == RC_POWEROFF_BUTTON
#endif
) &&
@ -299,22 +277,8 @@ long button_get_w_tmo(int ticks)
void button_init(void)
{
/* hardware inits */
#ifdef TARGET_TREE
button_init_device();
#elif CONFIG_KEYPAD == RECORDER_PAD
/* Set PB4 and PB8 as input pins */
PBCR1 &= 0xfffc; /* PB8MD = 00 */
PBCR2 &= 0xfcff; /* PB4MD = 00 */
PBIOR &= ~0x0110; /* Inputs */
#elif CONFIG_KEYPAD == PLAYER_PAD
/* set PA5 and PA11 as input pins */
PACR1 &= 0xff3f; /* PA11MD = 00 */
PACR2 &= 0xfbff; /* PA5MD = 0 */
PAIOR &= ~0x0820; /* Inputs */
#elif CONFIG_KEYPAD == ONDIO_PAD
/* nothing to initialize here */
#endif /* CONFIG_KEYPAD */
queue_init(&button_queue, true);
button_read();
lastbtn = button_read();
@ -409,195 +373,13 @@ void set_remote_backlight_filter_keypress(bool value)
#endif
#endif
/*
Archos hardware button hookup
=============================
Recorder / Recorder FM/V2
-------------------------
F1, F2, F3, UP: connected to AN4 through a resistor network
DOWN, PLAY, LEFT, RIGHT: likewise connected to AN5
The voltage on AN4/ AN5 depends on which keys (or key combo) is pressed
FM/V2 has PLAY and RIGHT switched compared to plain recorder
ON: PB8, low active (plain recorder) / AN3, low active (fm/v2)
OFF: PB4, low active (plain recorder) / AN2, high active (fm/v2)
Player
------
LEFT: AN0
MENU: AN1
RIGHT: AN2
PLAY: AN3
STOP: PA11
ON: PA5
All buttons are low active
Ondio
-----
LEFT, RIGHT, UP, DOWN: connected to AN4 through a resistor network
The voltage on AN4 depends on which keys (or key combo) is pressed
OPTION: AN2, high active (assigned as MENU)
ON/OFF: AN3, low active (assigned as OFF)
*/
#if CONFIG_KEYPAD == RECORDER_PAD
#ifdef HAVE_FMADC
/* FM Recorder super-special levels */
#define LEVEL1 150
#define LEVEL2 385
#define LEVEL3 545
#define LEVEL4 700
#define ROW2_BUTTON1 BUTTON_PLAY
#define ROW2_BUTTON3 BUTTON_RIGHT
#else
/* plain bog standard Recorder levels */
#define LEVEL1 250
#define LEVEL2 500
#define LEVEL3 700
#define LEVEL4 900
#define ROW2_BUTTON1 BUTTON_RIGHT
#define ROW2_BUTTON3 BUTTON_PLAY
#endif /* HAVE_FMADC */
#elif CONFIG_KEYPAD == ONDIO_PAD
/* Ondio levels */
#define LEVEL1 165
#define LEVEL2 415
#define LEVEL3 585
#define LEVEL4 755
#endif /* CONFIG_KEYPAD */
/*
* Get button pressed from hardware
*/
static int button_read(void)
{
int btn = BUTTON_NONE;
int btn = button_read_device();
int retval;
#ifndef TARGET_TREE
int data;
#endif
#ifdef TARGET_TREE
btn = button_read_device();
#elif CONFIG_KEYPAD == RECORDER_PAD
#ifndef HAVE_FMADC
static int off_button_count = 0;
#endif
/* check F1..F3 and UP */
data = adc_read(ADC_BUTTON_ROW1);
if (data >= LEVEL1)
{
if (data >= LEVEL3)
if (data >= LEVEL4)
btn = BUTTON_F3;
else
btn = BUTTON_UP;
else
if (data >= LEVEL2)
btn = BUTTON_F2;
else
btn = BUTTON_F1;
}
/* Some units have mushy keypads, so pressing UP also activates
the Left/Right buttons. Let's combat that by skipping the AN5
checks when UP is pressed. */
if(!(btn & BUTTON_UP))
{
/* check DOWN, PLAY, LEFT, RIGHT */
data = adc_read(ADC_BUTTON_ROW2);
if (data >= LEVEL1)
{
if (data >= LEVEL3)
if (data >= LEVEL4)
btn |= BUTTON_DOWN;
else
btn |= ROW2_BUTTON3;
else
if (data >= LEVEL2)
btn |= BUTTON_LEFT;
else
btn |= ROW2_BUTTON1;
}
}
#ifdef HAVE_FMADC
if ( adc_read(ADC_BUTTON_ON) < 512 )
btn |= BUTTON_ON;
if ( adc_read(ADC_BUTTON_OFF) > 512 )
btn |= BUTTON_OFF;
#else
/* check port B pins for ON and OFF */
data = PBDR;
if ((data & 0x0100) == 0)
btn |= BUTTON_ON;
if ((data & 0x0010) == 0)
{
/* When the batteries are low, the low-battery shutdown logic causes
* spurious OFF events due to voltage fluctuation on some units.
* Only accept OFF when read several times in sequence. */
if (++off_button_count > 3)
btn |= BUTTON_OFF;
}
else
off_button_count = 0;
#endif
#elif CONFIG_KEYPAD == PLAYER_PAD
/* buttons are active low */
if (adc_read(0) < 0x180)
btn = BUTTON_LEFT;
if (adc_read(1) < 0x180)
btn |= BUTTON_MENU;
if(adc_read(2) < 0x180)
btn |= BUTTON_RIGHT;
if(adc_read(3) < 0x180)
btn |= BUTTON_PLAY;
/* check port A pins for ON and STOP */
data = PADR;
if ( !(data & 0x0020) )
btn |= BUTTON_ON;
if ( !(data & 0x0800) )
btn |= BUTTON_STOP;
#elif CONFIG_KEYPAD == ONDIO_PAD
/* Check the 4 direction keys */
data = adc_read(ADC_BUTTON_ROW1);
if (data >= LEVEL1)
{
if (data >= LEVEL3)
if (data >= LEVEL4)
btn = BUTTON_LEFT;
else
btn = BUTTON_RIGHT;
else
if (data >= LEVEL2)
btn = BUTTON_UP;
else
btn = BUTTON_DOWN;
}
if(adc_read(ADC_BUTTON_OPTION) > 0x200) /* active high */
btn |= BUTTON_MENU;
if(adc_read(ADC_BUTTON_ONOFF) < 0x120) /* active low */
btn |= BUTTON_OFF;
#endif /* CONFIG_KEYPAD */
#ifdef HAVE_LCD_BITMAP
if (btn && flipped)

View file

@ -33,7 +33,8 @@
/* FIX: this doesn't work on iRiver or iPod yet */
/* iFP7xx has no remote */
#ifndef HAVE_MMC /* MMC takes serial port 1, so don't mess with it */
#if !defined(HAVE_FMADC) /* Recorder FM/V2 has no remote control pin */ \
&& !defined(HAVE_MMC) /* MMC takes serial port 1, so don't mess with it */
/* Received byte identifiers */
#define PLAY 0xC1
@ -51,8 +52,8 @@ void serial_setup (void)
SMR1 = 0x00;
SCR1 = 0;
BRR1 = (FREQ/(32*9600))-1;
SSR1 &= 0; /* The status bits must be read before they are cleared,
so we do an AND operation */
and_b(0, &SSR1); /* The status bits must be read before they are cleared,
so we do an AND operation */
/* Let the hardware settle. The serial port needs to wait "at least
the interval required to transmit or receive one bit" before it
@ -75,7 +76,7 @@ int remote_control_rx(void)
/* Errors? Just clear'em. The receiver stops if we don't */
if(SSR1 & (SCI_ORER | SCI_FER | SCI_PER)) {
SSR1 &= ~(SCI_ORER | SCI_FER | SCI_PER);
and_b(~(SCI_ORER | SCI_FER | SCI_PER), &SSR1);
last_valid_button = BUTTON_NONE;
last_was_error = true;
return BUTTON_NONE;
@ -84,7 +85,7 @@ int remote_control_rx(void)
if(SSR1 & SCI_RDRF) {
/* Read byte and clear the Rx Full bit */
btn = RDR1;
SSR1 &= ~SCI_RDRF;
and_b(~SCI_RDRF, &SSR1);
if(last_was_error)
{
@ -93,38 +94,36 @@ int remote_control_rx(void)
}
else
{
#if CONFIG_KEYPAD != ONDIO_PAD
switch (btn)
{
case STOP:
last_valid_button = BUTTON_RC_STOP;
break;
case PLAY:
last_valid_button = BUTTON_RC_PLAY;
break;
case VOLUP:
last_valid_button = BUTTON_RC_VOL_UP;
break;
case VOLDN:
last_valid_button = BUTTON_RC_VOL_DOWN;
break;
case PREV:
last_valid_button = BUTTON_RC_LEFT;
break;
case NEXT:
last_valid_button = BUTTON_RC_RIGHT;
break;
default:
last_valid_button = BUTTON_NONE;
break;
}
#endif
}
}
else
@ -142,7 +141,7 @@ int remote_control_rx(void)
return ret;
}
#endif /* HAVE_MMC */
#endif /* !HAVE_FMADC && !HAVE_MMC */
#elif defined(CPU_COLDFIRE) && defined(HAVE_SERIAL)
void serial_tx(const unsigned char *buf)

View file

@ -22,11 +22,8 @@
#include <stdbool.h>
#include "config.h"
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
(CONFIG_KEYPAD == IRIVER_H300_PAD)
#define HAS_BUTTON_HOLD
#define HAS_REMOTE_BUTTON_HOLD
#endif
#include "button-target.h"
extern struct event_queue button_queue;
void button_init (void);
@ -44,12 +41,6 @@ void set_remote_backlight_filter_keypress(bool value);
#endif
#endif
#ifdef HAS_BUTTON_HOLD
bool button_hold(void);
#endif
#ifdef HAS_REMOTE_BUTTON_HOLD
bool remote_button_hold(void);
#endif
#ifdef HAVE_HEADPHONE_DETECTION
bool headphones_inserted(void);
#endif
@ -58,116 +49,10 @@ int wheel_status(void);
void wheel_send_events(bool send);
#endif
#define BUTTON_NONE 0x00000000
#define BUTTON_NONE 0x00000000
/* Button modifiers */
#define BUTTON_REL 0x02000000
#define BUTTON_REPEAT 0x04000000
#ifdef TARGET_TREE
#include "button-target.h"
#else
/* Target specific button codes */
#if CONFIG_KEYPAD == RECORDER_PAD
/* Recorder specific button codes */
/* Main unit's buttons */
#define BUTTON_ON 0x00000001
#define BUTTON_OFF 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_UP 0x00000010
#define BUTTON_DOWN 0x00000020
#define BUTTON_PLAY 0x00000040
#define BUTTON_F1 0x00000080
#define BUTTON_F2 0x00000100
#define BUTTON_F3 0x00000200
#define BUTTON_MAIN (BUTTON_ON|BUTTON_OFF|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_UP|BUTTON_DOWN|BUTTON_PLAY\
|BUTTON_F1|BUTTON_F2|BUTTON_F3)
/* Remote control's buttons */
#define BUTTON_RC_PLAY 0x00100000
#define BUTTON_RC_STOP 0x00080000
#define BUTTON_RC_LEFT 0x00040000
#define BUTTON_RC_RIGHT 0x00020000
#define BUTTON_RC_VOL_UP 0x00010000
#define BUTTON_RC_VOL_DOWN 0x00008000
#define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_STOP\
|BUTTON_RC_LEFT|BUTTON_RC_RIGHT\
|BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN)
#elif CONFIG_KEYPAD == PLAYER_PAD
/* Main unit's buttons */
#define BUTTON_ON 0x00000001
#define BUTTON_STOP 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_PLAY 0x00000010
#define BUTTON_MENU 0x00000020
#define BUTTON_MAIN (BUTTON_ON|BUTTON_STOP|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_PLAY|BUTTON_MENU)
/* Remote control's buttons */
#define BUTTON_RC_PLAY 0x00100000
#define BUTTON_RC_STOP 0x00080000
#define BUTTON_RC_LEFT 0x00040000
#define BUTTON_RC_RIGHT 0x00020000
#define BUTTON_RC_VOL_UP 0x00010000
#define BUTTON_RC_VOL_DOWN 0x00008000
#define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_STOP\
|BUTTON_RC_LEFT|BUTTON_RC_RIGHT\
|BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN)
#elif CONFIG_KEYPAD == ONDIO_PAD
/* Ondio specific button codes */
#define BUTTON_OFF 0x00000001
#define BUTTON_MENU 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_UP 0x00000010
#define BUTTON_DOWN 0x00000020
#define BUTTON_MAIN (BUTTON_OFF|BUTTON_MENU|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_UP|BUTTON_DOWN)
#define BUTTON_REMOTE 0
#elif 0
/*
* Please, add the next Rockbox target's button defines here,
* using:
* - bits 0 and up: for main unit's buttons
* - bits 20 (0x00100000) and downwards for the remote buttons (if applicable)
* Don't forget to add BUTTON_MAIN and BUTTON_REMOTE masks
* Currently, main buttons on all targets are up to bit 9 (0x00000200),
* and remote buttons are down to bit 10 (0x00000400)
*/
#endif /* RECORDER/PLAYER/ONDIO KEYPAD */
#endif /* TARGET_TREE */
/* Button modifiers */
#define BUTTON_REL 0x02000000
#define BUTTON_REPEAT 0x04000000
#endif /* _BUTTON_H_ */

View file

@ -80,6 +80,7 @@ bool button_scan_enabled(void);
|BUTTON_RC_SOURCE)
#define POWEROFF_BUTTON BUTTON_OFF
#define RC_POWEROFF_BUTTON BUTTON_RC_STOP
#define POWEROFF_COUNT 10
#endif /* _BUTTON_TARGET_H_ */

View file

@ -0,0 +1,97 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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"
#include "system.h"
#include "button.h"
#include "backlight.h"
#include "adc.h"
/*
Recorder FM/V2 hardware button hookup
=====================================
F1, F2, F3, UP: connected to AN4 through a resistor network
DOWN, PLAY, LEFT, RIGHT: likewise connected to AN5
The voltage on AN4/ AN5 depends on which keys (or key combo) is pressed
FM/V2 has PLAY and RIGHT switched compared to plain recorder
ON: AN3, low active
OFF: AN2, high active
*/
void button_init_device(void)
{
/* Set PB4 and PB8 as input pins */
PBCR1 &= 0xfffc; /* PB8MD = 00 */
PBCR2 &= 0xfcff; /* PB4MD = 00 */
PBIOR &= ~0x0110; /* Inputs */
}
int button_read_device(void)
{
int btn = BUTTON_NONE;
int data;
/* check F1..F3 and UP */
data = adc_read(ADC_BUTTON_ROW1);
if (data >= 150)
{
if (data >= 545)
if (data >= 700)
btn = BUTTON_F3;
else
btn = BUTTON_UP;
else
if (data >= 385)
btn = BUTTON_F2;
else
btn = BUTTON_F1;
}
/* Some units have mushy keypads, so pressing UP also activates
the Left/Right buttons. Let's combat that by skipping the AN5
checks when UP is pressed. */
if(!(btn & BUTTON_UP))
{
/* check DOWN, PLAY, LEFT, RIGHT */
data = adc_read(ADC_BUTTON_ROW2);
if (data >= 150)
{
if (data >= 545)
if (data >= 700)
btn |= BUTTON_DOWN;
else
btn |= BUTTON_RIGHT;
else
if (data >= 385)
btn |= BUTTON_LEFT;
else
btn |= BUTTON_PLAY;
}
}
if ( adc_read(ADC_BUTTON_ON) < 512 )
btn |= BUTTON_ON;
if ( adc_read(ADC_BUTTON_OFF) > 512 )
btn |= BUTTON_OFF;
return btn;
}

View file

@ -0,0 +1,53 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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.
*
****************************************************************************/
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
#include <stdbool.h>
#include "config.h"
void button_init_device(void);
int button_read_device(void);
/* Main unit's buttons */
#define BUTTON_ON 0x00000001
#define BUTTON_OFF 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_UP 0x00000010
#define BUTTON_DOWN 0x00000020
#define BUTTON_PLAY 0x00000040
#define BUTTON_F1 0x00000080
#define BUTTON_F2 0x00000100
#define BUTTON_F3 0x00000200
#define BUTTON_MAIN (BUTTON_ON|BUTTON_OFF|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_UP|BUTTON_DOWN|BUTTON_PLAY\
|BUTTON_F1|BUTTON_F2|BUTTON_F3)
#define BUTTON_REMOTE 0
#define POWEROFF_BUTTON BUTTON_OFF
#define POWEROFF_COUNT 10
#endif /* _BUTTON_TARGET_H_ */

View file

@ -0,0 +1,65 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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"
#include "system.h"
#include "button.h"
#include "backlight.h"
#include "adc.h"
/*
Ondio hardware button hookup
============================
LEFT, RIGHT, UP, DOWN: connected to AN4 through a resistor network
The voltage on AN4 depends on which keys (or key combo) is pressed
OPTION: AN2, high active (assigned as MENU)
ON/OFF: AN3, low active (assigned as OFF)
*/
int button_read_device(void)
{
int btn = BUTTON_NONE;
int data;
/* Check the 4 direction keys */
data = adc_read(ADC_BUTTON_ROW1);
if (data >= 165)
{
if (data >= 585)
if (data >= 755)
btn = BUTTON_LEFT;
else
btn = BUTTON_RIGHT;
else
if (data >= 415)
btn = BUTTON_UP;
else
btn = BUTTON_DOWN;
}
if(adc_read(ADC_BUTTON_OPTION) > 0x200) /* active high */
btn |= BUTTON_MENU;
if(adc_read(ADC_BUTTON_ONOFF) < 0x120) /* active low */
btn |= BUTTON_OFF;
return btn;
}

View file

@ -0,0 +1,45 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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.
*
****************************************************************************/
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
#include <stdbool.h>
#include "config.h"
#define button_init_device()
int button_read_device(void);
#define BUTTON_OFF 0x00000001
#define BUTTON_MENU 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_UP 0x00000010
#define BUTTON_DOWN 0x00000020
#define BUTTON_MAIN (BUTTON_OFF|BUTTON_MENU|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_UP|BUTTON_DOWN)
#define BUTTON_REMOTE 0
#define POWEROFF_BUTTON BUTTON_OFF
#define POWEROFF_COUNT 10
#endif /* _BUTTON_TARGET_H_ */

View file

@ -0,0 +1,74 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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"
#include "system.h"
#include "button.h"
#include "backlight.h"
#include "adc.h"
/*
Player hardware button hookup
=============================
Player
------
LEFT: AN0
MENU: AN1
RIGHT: AN2
PLAY: AN3
STOP: PA11
ON: PA5
All buttons are low active
*/
void button_init_device(void)
{
/* set PA5 and PA11 as input pins */
PACR1 &= 0xff3f; /* PA11MD = 00 */
PACR2 &= 0xfbff; /* PA5MD = 0 */
PAIOR &= ~0x0820; /* Inputs */
}
int button_read_device(void)
{
int btn = BUTTON_NONE;
int data;
/* buttons are active low */
if (adc_read(0) < 0x180)
btn = BUTTON_LEFT;
if (adc_read(1) < 0x180)
btn |= BUTTON_MENU;
if (adc_read(2) < 0x180)
btn |= BUTTON_RIGHT;
if (adc_read(3) < 0x180)
btn |= BUTTON_PLAY;
/* check port A pins for ON and STOP */
data = PADR;
if ( !(data & 0x0020) )
btn |= BUTTON_ON;
if ( !(data & 0x0800) )
btn |= BUTTON_STOP;
return btn;
}

View file

@ -0,0 +1,56 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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.
*
****************************************************************************/
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
#include <stdbool.h>
#include "config.h"
#define HAS_SERIAL_REMOTE
void button_init_device(void);
int button_read_device(void);
/* Main unit's buttons */
#define BUTTON_ON 0x00000001
#define BUTTON_STOP 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_PLAY 0x00000010
#define BUTTON_MENU 0x00000020
#define BUTTON_MAIN (BUTTON_ON|BUTTON_STOP|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_PLAY|BUTTON_MENU)
/* Remote control's buttons */
#define BUTTON_RC_PLAY 0x00100000
#define BUTTON_RC_STOP 0x00080000
#define BUTTON_RC_LEFT 0x00040000
#define BUTTON_RC_RIGHT 0x00020000
#define BUTTON_RC_VOL_UP 0x00010000
#define BUTTON_RC_VOL_DOWN 0x00008000
#define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_STOP\
|BUTTON_RC_LEFT|BUTTON_RC_RIGHT\
|BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN)
#endif /* _BUTTON_TARGET_H_ */

View file

@ -0,0 +1,108 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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"
#include "system.h"
#include "button.h"
#include "backlight.h"
#include "adc.h"
/*
Recorder hardware button hookup
===============================
F1, F2, F3, UP: connected to AN4 through a resistor network
DOWN, PLAY, LEFT, RIGHT: likewise connected to AN5
The voltage on AN4/ AN5 depends on which keys (or key combo) is pressed
ON: PB8, low active
OFF: PB4, low active
*/
void button_init_device(void)
{
/* Set PB4 and PB8 as input pins */
PBCR1 &= 0xfffc; /* PB8MD = 00 */
PBCR2 &= 0xfcff; /* PB4MD = 00 */
PBIOR &= ~0x0110; /* Inputs */
}
int button_read_device(void)
{
int btn = BUTTON_NONE;
int data;
static int off_button_count = 0;
/* check F1..F3 and UP */
data = adc_read(ADC_BUTTON_ROW1);
if (data >= 250)
{
if (data >= 700)
if (data >= 900)
btn = BUTTON_F3;
else
btn = BUTTON_UP;
else
if (data >= 500)
btn = BUTTON_F2;
else
btn = BUTTON_F1;
}
/* Some units have mushy keypads, so pressing UP also activates
the Left/Right buttons. Let's combat that by skipping the AN5
checks when UP is pressed. */
if(!(btn & BUTTON_UP))
{
/* check DOWN, PLAY, LEFT, RIGHT */
data = adc_read(ADC_BUTTON_ROW2);
if (data >= 250)
{
if (data >= 700)
if (data >= 900)
btn |= BUTTON_DOWN;
else
btn |= BUTTON_PLAY;
else
if (data >= 500)
btn |= BUTTON_LEFT;
else
btn |= BUTTON_RIGHT;
}
}
/* check port B pins for ON and OFF */
data = PBDR;
if ((data & 0x0100) == 0)
btn |= BUTTON_ON;
if ((data & 0x0010) == 0)
{
/* When the batteries are low, the low-battery shutdown logic causes
* spurious OFF events due to voltage fluctuation on some units.
* Only accept OFF when read several times in sequence. */
if (++off_button_count > 3)
btn |= BUTTON_OFF;
}
else
off_button_count = 0;
return btn;
}

View file

@ -0,0 +1,63 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Jens Arnold
*
* 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.
*
****************************************************************************/
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
#include <stdbool.h>
#include "config.h"
#define HAS_SERIAL_REMOTE
void button_init_device(void);
int button_read_device(void);
/* Main unit's buttons */
#define BUTTON_ON 0x00000001
#define BUTTON_OFF 0x00000002
#define BUTTON_LEFT 0x00000004
#define BUTTON_RIGHT 0x00000008
#define BUTTON_UP 0x00000010
#define BUTTON_DOWN 0x00000020
#define BUTTON_PLAY 0x00000040
#define BUTTON_F1 0x00000080
#define BUTTON_F2 0x00000100
#define BUTTON_F3 0x00000200
#define BUTTON_MAIN (BUTTON_ON|BUTTON_OFF|BUTTON_LEFT|BUTTON_RIGHT\
|BUTTON_UP|BUTTON_DOWN|BUTTON_PLAY\
|BUTTON_F1|BUTTON_F2|BUTTON_F3)
/* Remote control's buttons */
#define BUTTON_RC_PLAY 0x00100000
#define BUTTON_RC_STOP 0x00080000
#define BUTTON_RC_LEFT 0x00040000
#define BUTTON_RC_RIGHT 0x00020000
#define BUTTON_RC_VOL_UP 0x00010000
#define BUTTON_RC_VOL_DOWN 0x00008000
#define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_STOP\
|BUTTON_RC_LEFT|BUTTON_RC_RIGHT\
|BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN)
#endif /* _BUTTON_TARGET_H_ */

18
tools/configure vendored
View file

@ -640,6 +640,9 @@ EOF
# firmware/Makefile assumes it is present always, and 2) we will need it when we
# build the player simulator
t_cpu="sh"
t_manufacturer="archos"
t_model="player"
;;
1|recorder)
@ -659,6 +662,9 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$archosbitmaptools
t_cpu="sh"
t_manufacturer="archos"
t_model="recorder"
;;
2|fmrecorder)
@ -678,6 +684,9 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$archosbitmaptools
t_cpu="sh"
t_manufacturer="archos"
t_model="fm_v2"
;;
3|recorderv2)
@ -697,6 +706,9 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$archosbitmaptools
t_cpu="sh"
t_manufacturer="archos"
t_model="fm_v2"
;;
4|ondiosp)
@ -716,6 +728,9 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$archosbitmaptools
t_cpu="sh"
t_manufacturer="archos"
t_model="ondio"
;;
5|ondiofm)
@ -733,6 +748,9 @@ EOF
plugins="yes"
codecs=""
toolset=$archosbitmaptools
t_cpu="sh"
t_manufacturer="archos"
t_model="ondio"
;;
10|h120)