mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
move the iriver h1x0/h3x0 button driver to target tree
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11380 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
3b54ab3224
commit
cad563b00f
6 changed files with 590 additions and 285 deletions
|
|
@ -46,6 +46,9 @@
|
||||||
|
|
||||||
#ifdef TARGET_TREE
|
#ifdef TARGET_TREE
|
||||||
#include "button-target.h"
|
#include "button-target.h"
|
||||||
|
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) \
|
||||||
|
|| (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||||
|
#include "button-target.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct event_queue button_queue;
|
struct event_queue button_queue;
|
||||||
|
|
@ -82,10 +85,6 @@ static bool remote_filter_first_keypress;
|
||||||
|
|
||||||
static int button_read(void);
|
static int button_read(void);
|
||||||
|
|
||||||
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
|
||||||
static bool remote_button_hold_only(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_HEADPHONE_DETECTION
|
#ifdef HAVE_HEADPHONE_DETECTION
|
||||||
bool phones_present = false;
|
bool phones_present = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -309,17 +308,9 @@ void button_init(void)
|
||||||
#ifdef TARGET_TREE
|
#ifdef TARGET_TREE
|
||||||
button_init_device();
|
button_init_device();
|
||||||
|
|
||||||
#elif CONFIG_KEYPAD == IRIVER_H100_PAD
|
#elif CONFIG_KEYPAD == IRIVER_H100_PAD \
|
||||||
/* Set GPIO33, GPIO37, GPIO38 and GPIO52 as general purpose inputs */
|
|| CONFIG_KEYPAD == IRIVER_H300_PAD
|
||||||
GPIO1_FUNCTION |= 0x00100062;
|
button_init_device(); /* temp untill TARGET_TREE is defined */
|
||||||
GPIO1_ENABLE &= ~0x00100060;
|
|
||||||
#elif CONFIG_KEYPAD == IRIVER_H300_PAD
|
|
||||||
/* 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;
|
|
||||||
#elif CONFIG_KEYPAD == RECORDER_PAD
|
#elif CONFIG_KEYPAD == RECORDER_PAD
|
||||||
/* Set PB4 and PB8 as input pins */
|
/* Set PB4 and PB8 as input pins */
|
||||||
PBCR1 &= 0xfffc; /* PB8MD = 00 */
|
PBCR1 &= 0xfffc; /* PB8MD = 00 */
|
||||||
|
|
@ -505,213 +496,18 @@ static int button_read(void)
|
||||||
int btn = BUTTON_NONE;
|
int btn = BUTTON_NONE;
|
||||||
int retval;
|
int retval;
|
||||||
#ifndef TARGET_TREE
|
#ifndef TARGET_TREE
|
||||||
|
#if (CONFIG_KEYPAD != IRIVER_H100_PAD) \
|
||||||
|
&& (CONFIG_KEYPAD != IRIVER_H300_PAD)
|
||||||
int data;
|
int data;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TARGET_TREE
|
#ifdef TARGET_TREE
|
||||||
btn = button_read_device();
|
btn = button_read_device();
|
||||||
|
|
||||||
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) \
|
||||||
static bool hold_button = false;
|
|| (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||||
static bool remote_hold_button = false;
|
btn = button_read_device(); /* temp untill TARGET_TREE is defined */
|
||||||
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 CONFIG_KEYPAD == IRIVER_H100_PAD
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
#else /* H300 */
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* special buttons */
|
|
||||||
#if CONFIG_KEYPAD == IRIVER_H300_PAD
|
|
||||||
if (!hold_button)
|
|
||||||
{
|
|
||||||
data = GPIO_READ;
|
|
||||||
if ((data & 0x0200) == 0)
|
|
||||||
btn |= BUTTON_MODE;
|
|
||||||
if ((data & 0x8000) == 0)
|
|
||||||
btn |= BUTTON_REC;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
||||||
static bool hold_button = false;
|
static bool hold_button = false;
|
||||||
|
|
@ -910,31 +706,6 @@ static int button_read(void)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
|
||||||
bool button_hold(void)
|
|
||||||
{
|
|
||||||
return (GPIO1_READ & 0x00000002)?true:false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static 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;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
#if CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
||||||
bool button_hold(void)
|
bool button_hold(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -72,51 +72,9 @@ void wheel_send_events(bool send);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Target specific button codes */
|
/* Target specific button codes */
|
||||||
|
|
||||||
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
|
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
|
||||||
|| (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
|| (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||||
|
#include "button-target.h"
|
||||||
/* 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)
|
|
||||||
|
|
||||||
#elif CONFIG_KEYPAD == RECORDER_PAD
|
#elif CONFIG_KEYPAD == RECORDER_PAD
|
||||||
|
|
||||||
/* Recorder specific button codes */
|
/* Recorder specific button codes */
|
||||||
|
|
|
||||||
81
firmware/target/coldfire/iriver/button-target.h
Normal file
81
firmware/target/coldfire/iriver/button-target.h
Normal file
|
|
@ -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_ */
|
||||||
240
firmware/target/coldfire/iriver/h100/button-h100.c
Normal file
240
firmware/target/coldfire/iriver/h100/button-h100.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
246
firmware/target/coldfire/iriver/h300/button-h300.c
Normal file
246
firmware/target/coldfire/iriver/h300/button-h300.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
9
tools/configure
vendored
9
tools/configure
vendored
|
|
@ -685,6 +685,9 @@ EOF
|
||||||
# toolset is the tools within the tools directory that we build for
|
# toolset is the tools within the tools directory that we build for
|
||||||
# this particular target.
|
# this particular target.
|
||||||
toolset=$iriverbitmaptools
|
toolset=$iriverbitmaptools
|
||||||
|
t_cpu="coldfire"
|
||||||
|
t_manufacturer="iriver"
|
||||||
|
t_model="h100"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
11|h300)
|
11|h300)
|
||||||
|
|
@ -707,6 +710,9 @@ EOF
|
||||||
# toolset is the tools within the tools directory that we build for
|
# toolset is the tools within the tools directory that we build for
|
||||||
# this particular target.
|
# this particular target.
|
||||||
toolset=$iriverbitmaptools
|
toolset=$iriverbitmaptools
|
||||||
|
t_cpu="coldfire"
|
||||||
|
t_manufacturer="iriver"
|
||||||
|
t_model="h300"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
12|h100)
|
12|h100)
|
||||||
|
|
@ -729,6 +735,9 @@ EOF
|
||||||
# toolset is the tools within the tools directory that we build for
|
# toolset is the tools within the tools directory that we build for
|
||||||
# this particular target.
|
# this particular target.
|
||||||
toolset=$iriverbitmaptools
|
toolset=$iriverbitmaptools
|
||||||
|
t_cpu="coldfire"
|
||||||
|
t_manufacturer="iriver"
|
||||||
|
t_model="h100"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
30|x5)
|
30|x5)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue