blob: a25a71e1fc946cb0e8017a794a64916d1e031104 [file] [log] [blame]
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: $
*
* Copyright (C) 2007 by Karl Kurbjun
*
* 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 "config.h"
#include "cpu.h"
#include "system.h"
#include "button.h"
#include "kernel.h"
#include "backlight.h"
#include "adc.h"
#include "system.h"
#include "backlight-target.h"
#include "uart-target.h"
#define BUTTON_TIMEOUT 50
#define BUTTON_START_BYTE 0xF0
#define BUTTON_START_BYTE2 0xF4 /* not sure why, but sometimes you get F0 or F4, */
/* but always the same one for the session? */
void button_init_device(void)
{
/* GIO is the power button, set as input */
outw(inw(IO_GIO_DIR0)|0x01, IO_GIO_DIR0);
}
inline bool button_hold(void)
{
return false;
}
int button_read_device(void)
{
char data[5], c;
int val;
int i = 0;
int btn = BUTTON_NONE, timeout = BUTTON_TIMEOUT;
if ((inw(IO_GIO_BITSET0)&0x01) == 0)
btn |= BUTTON_POWER;
uartHeartbeat();
while (timeout > 0)
{
val = uartPollch(BUTTON_TIMEOUT*100);
if (val > -1)
{
c = val&0xff;
if (i && (data[0] == BUTTON_START_BYTE || data[0] == BUTTON_START_BYTE2))
{
data[i++] = c;
}
else if (c == BUTTON_START_BYTE ||
c == BUTTON_START_BYTE2)
{
data[0] = c;
i = 1;
}
if (i == 5)
{
if (data[1]& (1<<7))
btn |= BUTTON_RC_HEART;
if (data[1]& (1<<6))
btn |= BUTTON_RC_MODE;
if (data[1]& (1<<5))
btn |= BUTTON_RC_VOL_DOWN;
if (data[1]& (1<<4))
btn |= BUTTON_RC_VOL_UP;
if (data[1]& (1<<3))
btn |= BUTTON_RC_REW;
if (data[1]& (1<<2))
btn |= BUTTON_RC_FF;
if (data[1]& (1<<1))
btn |= BUTTON_RC_DOWN;
if (data[1]& (1<<0))
btn |= BUTTON_RC_PLAY;
break;
}
}
timeout--;
}
return btn;
}