rockbox/firmware/target/arm/rk27xx/ihifi2/button-ihifi.c

100 lines
2.7 KiB
C
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2016 by Roman Stolyarov
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "system.h"
#include "kernel.h"
#include "button.h"
#include "adc.h"
#include "backlight.h"
static bool soft_hold = false;
#ifndef BOOTLOADER
static unsigned hold_counter = 0;
#ifndef IHIFI800
#define HOLDBUTTON gpio_btn
#define HOLDCNTMAX HZ
#else
#define HOLDBUTTON (gpio_btn) && (adc_val > 325) && (adc_val < 480)
#define HOLDCNTMAX (HZ/10)
#endif
#endif
void button_init_device(void) {
GPIO_PCCON &= ~(1<<1); /* PWR BTN */
GPIO_PCCON &= ~(1<<7); /* CD */
}
bool button_hold(void)
{
return soft_hold;
}
int button_read_device(void) {
int adc_val = adc_read(ADC_BUTTONS);
int gpio_btn = GPIO_PCDR & (1<<1);
int button = BUTTON_NONE;
if (gpio_btn)
button |= BUTTON_POWER;
#ifndef BOOTLOADER
if (HOLDBUTTON) {
if (++hold_counter == HOLDCNTMAX) {
soft_hold = !soft_hold;
backlight_hold_changed(soft_hold);
}
} else {
hold_counter = 0;
}
if (soft_hold) {
return (hold_counter <= HOLDCNTMAX) ? BUTTON_NONE : button;
}
#endif
if (adc_val < 792) {
if (adc_val < 480) {
if (adc_val < 170) {
if (adc_val < 46) {
button |= BUTTON_HOME; // 0-45
} else {
button |= BUTTON_PLAY; // 46-169
}
} else {
if (adc_val < 325) {
button |= BUTTON_NEXT; // 170-324
} else {
button |= BUTTON_VOL_UP;// 325-479
}
}
} else {
if (adc_val < 636) {
button |= BUTTON_VOL_DOWN;// 480-635
} else {
button |= BUTTON_PREV; // 636-791
}
}
}
return button;
}