diff options
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r-- | firmware/target/coldfire/iriver/button-target.h | 81 | ||||
-rw-r--r-- | firmware/target/coldfire/iriver/h100/button-h100.c | 240 | ||||
-rw-r--r-- | firmware/target/coldfire/iriver/h300/button-h300.c | 246 |
3 files changed, 567 insertions, 0 deletions
diff --git a/firmware/target/coldfire/iriver/button-target.h b/firmware/target/coldfire/iriver/button-target.h new file mode 100644 index 0000000000..b89761b317 --- /dev/null +++ b/firmware/target/coldfire/iriver/button-target.h @@ -0,0 +1,81 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 by Jonathan Gordon + * + * 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. + * + ****************************************************************************/ + +/* Custom written for the Hxxx */ + +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ + +#include <stdbool.h> +#include "config.h" + +#define HAS_BUTTON_HOLD +#define HAS_REMOTE_BUTTON_HOLD + +bool button_hold(void); +bool remote_button_hold(void); +bool remote_button_hold_only(void); +void button_init_device(void); +int button_read_device(void); + +/* iRiver H100/H300 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_REC 0x00000040 +#define BUTTON_MODE 0x00000080 + +#define BUTTON_SELECT 0x00000100 + +#define BUTTON_MAIN (BUTTON_ON|BUTTON_OFF|BUTTON_LEFT|BUTTON_RIGHT|\ + BUTTON_UP|BUTTON_DOWN|BUTTON_REC|BUTTON_MODE|BUTTON_SELECT) + + /* Remote control's buttons */ +#define BUTTON_RC_ON 0x00100000 +#define BUTTON_RC_STOP 0x00080000 + +#define BUTTON_RC_REW 0x00040000 +#define BUTTON_RC_FF 0x00020000 +#define BUTTON_RC_VOL_UP 0x00010000 +#define BUTTON_RC_VOL_DOWN 0x00008000 + +#define BUTTON_RC_REC 0x00004000 +#define BUTTON_RC_MODE 0x00002000 + +#define BUTTON_RC_MENU 0x00001000 + +#define BUTTON_RC_BITRATE 0x00000800 +#define BUTTON_RC_SOURCE 0x00000400 + +#define BUTTON_REMOTE (BUTTON_RC_ON|BUTTON_RC_STOP|BUTTON_RC_REW|BUTTON_RC_FF\ + |BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN|BUTTON_RC_REC\ + |BUTTON_RC_MODE|BUTTON_RC_MENU|BUTTON_RC_BITRATE\ + |BUTTON_RC_SOURCE) + +#define POWEROFF_BUTTON BUTTON_OFF +#define POWEROFF_COUNT 10 + +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/coldfire/iriver/h100/button-h100.c b/firmware/target/coldfire/iriver/h100/button-h100.c new file mode 100644 index 0000000000..caf7cfdaca --- /dev/null +++ b/firmware/target/coldfire/iriver/h100/button-h100.c @@ -0,0 +1,240 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 by Jonathan Gordon + * + * 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 <stdlib.h> +#include "config.h" +#include "cpu.h" +#include "system.h" +#include "button.h" +#include "kernel.h" +#include "backlight.h" +#include "adc.h" +#include "system.h" +#ifdef HAVE_REMOTE_LCD +#include "lcd-remote.h" +#endif + +void button_init_device(void) +{ + /* Set GPIO33, GPIO37, GPIO38 and GPIO52 as general purpose inputs */ + GPIO1_FUNCTION |= 0x00100062; + GPIO1_ENABLE &= ~0x00100060; +} + +bool button_hold(void) +{ + return (GPIO1_READ & 0x00000002)?true:false; +} + +bool remote_button_hold_only(void) +{ + if(remote_type() == REMOTETYPE_H300_NONLCD) + return adc_scan(ADC_REMOTE)<0x0d; /* hold should be 0x00 */ + else + return (GPIO1_READ & 0x00100000)?true:false; +} + +/* returns true only if there is remote present */ +bool remote_button_hold(void) +{ + /* H300's NON-LCD remote doesn't set the "remote present" bit */ + if(remote_type() == REMOTETYPE_H300_NONLCD) + return remote_button_hold_only(); + else + return ((GPIO_READ & 0x40000000) == 0)?remote_button_hold_only():false; +} + +/* + * Get button pressed from hardware + */ +int button_read_device(void) +{ + int btn = BUTTON_NONE; + int data; + static bool hold_button = false; + static bool remote_hold_button = false; + static int prev_data = 0xff; + static int last_valid = 0xff; + bool hold_button_old; + bool remote_hold_button_old; + + /* normal buttons */ + hold_button_old = hold_button; + hold_button = button_hold(); + + +#ifndef BOOTLOADER + if (hold_button != hold_button_old) + backlight_hold_changed(hold_button); +#endif + + if (!hold_button) + { + data = adc_scan(ADC_BUTTONS); + + /* ADC debouncing: Only accept new reading if it's + * stable (+/-1). Use latest stable value otherwise. */ + if ((unsigned)(data - prev_data + 1) <= 2) + last_valid = data; + prev_data = data; + data = last_valid; + + if (data < 0xf0) + { + if (data < 0x80) + if (data < 0x30) + if (data < 0x18) + btn = BUTTON_SELECT; + else + btn = BUTTON_UP; + else + if (data < 0x50) + btn = BUTTON_LEFT; + else + btn = BUTTON_DOWN; + else + if (data < 0xb0) + if (data < 0xa0) + btn = BUTTON_RIGHT; + else + btn = BUTTON_OFF; + else + if (data < 0xd0) + btn = BUTTON_MODE; + else + btn = BUTTON_REC; + } + } + + /* remote buttons */ + remote_hold_button_old = remote_hold_button; + remote_hold_button = remote_button_hold_only(); + +#ifndef BOOTLOADER + if (remote_hold_button != remote_hold_button_old) + remote_backlight_hold_changed(remote_hold_button); +#endif + + if (!remote_hold_button) + { + data = adc_scan(ADC_REMOTE); + switch (remote_type()) + { + case REMOTETYPE_H100_LCD: + if (data < 0xf5) + { + if (data < 0x73) + if (data < 0x3f) + if (data < 0x25) + if(data < 0x0c) + btn |= BUTTON_RC_STOP; + else + btn |= BUTTON_RC_VOL_DOWN; + else + btn |= BUTTON_RC_MODE; + else + if (data < 0x5a) + btn |= BUTTON_RC_VOL_UP; + else + btn |= BUTTON_RC_BITRATE; + else + if (data < 0xa8) + if (data < 0x8c) + btn |= BUTTON_RC_REC; + else + btn |= BUTTON_RC_SOURCE; + else + if (data < 0xdf) + if(data < 0xc5) + btn |= BUTTON_RC_FF; + else + btn |= BUTTON_RC_MENU; + else + btn |= BUTTON_RC_REW; + } + break; + case REMOTETYPE_H300_LCD: + if (data < 0xf5) + { + if (data < 0x73) + if (data < 0x42) + if (data < 0x27) + if(data < 0x0c) + btn |= BUTTON_RC_VOL_DOWN; + else + btn |= BUTTON_RC_FF; + else + btn |= BUTTON_RC_STOP; + else + if (data < 0x5b) + btn |= BUTTON_RC_MODE; + else + btn |= BUTTON_RC_REC; + else + if (data < 0xab) + if (data < 0x8e) + btn |= BUTTON_RC_ON; + else + btn |= BUTTON_RC_BITRATE; + else + if (data < 0xde) + if(data < 0xc5) + btn |= BUTTON_RC_SOURCE; + else + btn |= BUTTON_RC_VOL_UP; + else + btn |= BUTTON_RC_REW; + } + break; + case REMOTETYPE_H300_NONLCD: + if (data < 0xf1) + { + if (data < 0x7d) + if (data < 0x25) + btn |= BUTTON_RC_FF; + else + btn |= BUTTON_RC_REW; + else + if (data < 0xd5) + btn |= BUTTON_RC_VOL_DOWN; + else + btn |= BUTTON_RC_VOL_UP; + } + break; + } + } + + data = GPIO1_READ; + if (!hold_button && ((data & 0x20) == 0)) + btn |= BUTTON_ON; + if (!remote_hold_button && ((data & 0x40) == 0)) + switch(remote_type()) + { + case REMOTETYPE_H100_LCD: + case REMOTETYPE_H300_NONLCD: + btn |= BUTTON_RC_ON; + break; + case REMOTETYPE_H300_LCD: + btn |= BUTTON_RC_MENU; + break; + } + + return btn; +} diff --git a/firmware/target/coldfire/iriver/h300/button-h300.c b/firmware/target/coldfire/iriver/h300/button-h300.c new file mode 100644 index 0000000000..80210b6c19 --- /dev/null +++ b/firmware/target/coldfire/iriver/h300/button-h300.c @@ -0,0 +1,246 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 by Jonathan Gordon + * + * 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 <stdlib.h> +#include "config.h" +#include "cpu.h" +#include "system.h" +#include "button.h" +#include "kernel.h" +#include "backlight.h" +#include "adc.h" +#include "system.h" +#ifdef HAVE_REMOTE_LCD +#include "lcd-remote.h" +#endif + +void button_init_device(void) +{ + /* Set GPIO9 and GPIO15 as general purpose inputs */ + GPIO_ENABLE &= ~0x00008200; + GPIO_FUNCTION |= 0x00008200; + /* Set GPIO33, GPIO37, GPIO38 and GPIO52 as general purpose inputs */ + GPIO1_ENABLE &= ~0x00100060; + GPIO1_FUNCTION |= 0x00100062; +} + +bool button_hold(void) +{ + return (GPIO1_READ & 0x00000002)?true:false; +} + +bool remote_button_hold_only(void) +{ + if(remote_type() == REMOTETYPE_H300_NONLCD) + return adc_scan(ADC_REMOTE)<0x0d; /* hold should be 0x00 */ + else + return (GPIO1_READ & 0x00100000)?true:false; +} + +/* returns true only if there is remote present */ +bool remote_button_hold(void) +{ + /* H300's NON-LCD remote doesn't set the "remote present" bit */ + if(remote_type() == REMOTETYPE_H300_NONLCD) + return remote_button_hold_only(); + else + return ((GPIO_READ & 0x40000000) == 0)?remote_button_hold_only():false; +} + +/* + * Get button pressed from hardware + */ +int button_read_device(void) +{ + int btn = BUTTON_NONE; + int data; + static bool hold_button = false; + static bool remote_hold_button = false; + static int prev_data = 0xff; + static int last_valid = 0xff; + bool hold_button_old; + bool remote_hold_button_old; + + /* normal buttons */ + hold_button_old = hold_button; + hold_button = button_hold(); + + +#ifndef BOOTLOADER + if (hold_button != hold_button_old) + backlight_hold_changed(hold_button); +#endif + + if (!hold_button) + { + data = adc_scan(ADC_BUTTONS); + + /* ADC debouncing: Only accept new reading if it's + * stable (+/-1). Use latest stable value otherwise. */ + if ((unsigned)(data - prev_data + 1) <= 2) + last_valid = data; + prev_data = data; + data = last_valid; + + if (data < 0xba) + { + if (data < 0x54) + if (data < 0x30) + if (data < 0x10) + btn = BUTTON_SELECT; + else + btn = BUTTON_UP; + else + btn = BUTTON_LEFT; + else + if (data < 0x98) + if (data < 0x76) + btn = BUTTON_DOWN; + else + btn = BUTTON_RIGHT; + else + btn = BUTTON_OFF; + } + } + + /* remote buttons */ + remote_hold_button_old = remote_hold_button; + remote_hold_button = remote_button_hold_only(); + +#ifndef BOOTLOADER + if (remote_hold_button != remote_hold_button_old) + remote_backlight_hold_changed(remote_hold_button); +#endif + + if (!remote_hold_button) + { + data = adc_scan(ADC_REMOTE); + switch (remote_type()) + { + case REMOTETYPE_H100_LCD: + if (data < 0xf5) + { + if (data < 0x73) + if (data < 0x3f) + if (data < 0x25) + if(data < 0x0c) + btn |= BUTTON_RC_STOP; + else + btn |= BUTTON_RC_VOL_DOWN; + else + btn |= BUTTON_RC_MODE; + else + if (data < 0x5a) + btn |= BUTTON_RC_VOL_UP; + else + btn |= BUTTON_RC_BITRATE; + else + if (data < 0xa8) + if (data < 0x8c) + btn |= BUTTON_RC_REC; + else + btn |= BUTTON_RC_SOURCE; + else + if (data < 0xdf) + if(data < 0xc5) + btn |= BUTTON_RC_FF; + else + btn |= BUTTON_RC_MENU; + else + btn |= BUTTON_RC_REW; + } + break; + case REMOTETYPE_H300_LCD: + if (data < 0xf5) + { + if (data < 0x73) + if (data < 0x42) + if (data < 0x27) + if(data < 0x0c) + btn |= BUTTON_RC_VOL_DOWN; + else + btn |= BUTTON_RC_FF; + else + btn |= BUTTON_RC_STOP; + else + if (data < 0x5b) + btn |= BUTTON_RC_MODE; + else + btn |= BUTTON_RC_REC; + else + if (data < 0xab) + if (data < 0x8e) + btn |= BUTTON_RC_ON; + else + btn |= BUTTON_RC_BITRATE; + else + if (data < 0xde) + if(data < 0xc5) + btn |= BUTTON_RC_SOURCE; + else + btn |= BUTTON_RC_VOL_UP; + else + btn |= BUTTON_RC_REW; + } + break; + case REMOTETYPE_H300_NONLCD: + if (data < 0xf1) + { + if (data < 0x7d) + if (data < 0x25) + btn |= BUTTON_RC_FF; + else + btn |= BUTTON_RC_REW; + else + if (data < 0xd5) + btn |= BUTTON_RC_VOL_DOWN; + else + btn |= BUTTON_RC_VOL_UP; + } + break; + } + } + + if (!hold_button) + { + data = GPIO_READ; + if ((data & 0x0200) == 0) + btn |= BUTTON_MODE; + if ((data & 0x8000) == 0) + btn |= BUTTON_REC; + } + + data = GPIO1_READ; + if (!hold_button && ((data & 0x20) == 0)) + btn |= BUTTON_ON; + if (!remote_hold_button && ((data & 0x40) == 0)) + switch(remote_type()) + { + case REMOTETYPE_H100_LCD: + case REMOTETYPE_H300_NONLCD: + btn |= BUTTON_RC_ON; + break; + case REMOTETYPE_H300_LCD: + btn |= BUTTON_RC_MENU; + break; + } + + return btn; +} |