summaryrefslogtreecommitdiffstats
path: root/firmware/drivers/button.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/button.c')
-rw-r--r--firmware/drivers/button.c234
1 files changed, 8 insertions, 226 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index 01b9174dae..deaf7f2fdd 100644
--- a/firmware/drivers/button.c
+++ b/firmware/drivers/button.c
@@ -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();
@@ -410,194 +374,12 @@ void set_remote_backlight_filter_keypress(bool value)
#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)