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:
parent
e43f56b58d
commit
0e6dd7efcd
18 changed files with 625 additions and 368 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue