summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-11-27 02:16:32 +0000
committerJens Arnold <amiconn@rockbox.org>2006-11-27 02:16:32 +0000
commit0e6dd7efcd21d48665b5a799fe081a75cdcb960f (patch)
tree9c0db844416a114adebb725f6172e38009b317f8 /firmware/drivers
parente43f56b58d8540492d83b44abfdf4c758b0e74bf (diff)
downloadrockbox-0e6dd7efcd21d48665b5a799fe081a75cdcb960f.zip
rockbox-0e6dd7efcd21d48665b5a799fe081a75cdcb960f.tar.gz
rockbox-0e6dd7efcd21d48665b5a799fe081a75cdcb960f.tar.bz2
rockbox-0e6dd7efcd21d48665b5a799fe081a75cdcb960f.tar.xz
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
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/button.c234
-rw-r--r--firmware/drivers/serial.c27
2 files changed, 21 insertions, 240 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index 01b9174..deaf7f2 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)
diff --git a/firmware/drivers/serial.c b/firmware/drivers/serial.c
index 866d761..142f67e 100644
--- a/firmware/drivers/serial.c
+++ b/firmware/drivers/serial.c
@@ -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)