forked from len0rd/rockbox
XduooX3 Gpio reconfigure button system #2
Fix issue with first battery sample taking 30 seconds Clean up code Change-Id: If2437d241e0ab4e3d23b141f5d853b6cf3209b07
This commit is contained in:
parent
53142ae9f5
commit
af24ff1fc3
1 changed files with 45 additions and 79 deletions
|
@ -8,6 +8,7 @@
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Roman Stolyarov
|
* Copyright (C) 2016 by Roman Stolyarov
|
||||||
|
* Copyright (C) 2020 by William Wilgus
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -38,7 +39,7 @@
|
||||||
#define PIN_KEY_INT (32*4+13)
|
#define PIN_KEY_INT (32*4+13)
|
||||||
#define KEY_INT_IRQ GPIO141
|
#define KEY_INT_IRQ GPIO141
|
||||||
|
|
||||||
#define PIN_KEY_BOP (32*3+17) /* Back Option Play */
|
#define PIN_COM_BOP (32*3+17) /* common pin for Back Option Play */
|
||||||
|
|
||||||
#define PIN_CHARGE_CON (32*1+7)
|
#define PIN_CHARGE_CON (32*1+7)
|
||||||
|
|
||||||
|
@ -50,9 +51,11 @@
|
||||||
#define IRQ_LO_DECT GPIO_IRQ(PIN_LO_DECT)
|
#define IRQ_LO_DECT GPIO_IRQ(PIN_LO_DECT)
|
||||||
#define GPIO_LO_DECT GPIO44
|
#define GPIO_LO_DECT GPIO44
|
||||||
|
|
||||||
/*#define ENABLE_BUTTON_COMBOS*/
|
#define KEY_IS_DOWN(pin) (__gpio_get_pin(pin) == 0)
|
||||||
|
|
||||||
static volatile unsigned short bat_val,key_val;
|
#define ADC_MASK 0x0FFF
|
||||||
|
|
||||||
|
static volatile unsigned short bat_val, key_val;
|
||||||
|
|
||||||
bool headphones_inserted(void)
|
bool headphones_inserted(void)
|
||||||
{
|
{
|
||||||
|
@ -68,7 +71,7 @@ bool lineout_inserted(void)
|
||||||
|
|
||||||
void button_init_device(void)
|
void button_init_device(void)
|
||||||
{
|
{
|
||||||
key_val = 0xfff;
|
key_val = ADC_MASK;
|
||||||
|
|
||||||
__gpio_as_input(PIN_BTN_POWER);
|
__gpio_as_input(PIN_BTN_POWER);
|
||||||
__gpio_as_input(PIN_BTN_HOLD);
|
__gpio_as_input(PIN_BTN_HOLD);
|
||||||
|
@ -76,21 +79,15 @@ void button_init_device(void)
|
||||||
__gpio_disable_pull(PIN_BTN_POWER);
|
__gpio_disable_pull(PIN_BTN_POWER);
|
||||||
__gpio_disable_pull(PIN_BTN_HOLD);
|
__gpio_disable_pull(PIN_BTN_HOLD);
|
||||||
|
|
||||||
#ifdef ENABLE_BUTTON_COMBOS
|
|
||||||
__gpio_as_output(PIN_KEY_BOP);
|
|
||||||
__gpio_disable_pull(PIN_KEY_BOP);
|
|
||||||
__gpio_clear_pin(PIN_KEY_BOP);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__gpio_as_irq_fall_edge(PIN_KEY_INT);
|
__gpio_as_irq_fall_edge(PIN_KEY_INT);
|
||||||
__gpio_enable_pull(PIN_KEY_INT);
|
__gpio_disable_pull(PIN_KEY_INT);
|
||||||
system_enable_irq(GPIO_IRQ(PIN_KEY_INT));
|
system_enable_irq(GPIO_IRQ(PIN_KEY_INT));
|
||||||
|
|
||||||
__gpio_set_pin(PIN_CHARGE_CON); /* 0.7 A */
|
__gpio_set_pin(PIN_CHARGE_CON); /* 0.7 A */
|
||||||
__gpio_as_output(PIN_CHARGE_CON);
|
__gpio_as_output(PIN_CHARGE_CON);
|
||||||
|
|
||||||
__gpio_as_input(PIN_PH_DECT);
|
__gpio_as_input(PIN_PH_DECT);
|
||||||
__gpio_disable_pull(PIN_PH_DECT);
|
/*__gpio_disable_pull(PIN_PH_DECT); // Spurious Detections */
|
||||||
|
|
||||||
__gpio_as_input(PIN_LO_DECT);
|
__gpio_as_input(PIN_LO_DECT);
|
||||||
__gpio_disable_pull(PIN_LO_DECT);
|
__gpio_disable_pull(PIN_LO_DECT);
|
||||||
|
@ -98,63 +95,54 @@ void button_init_device(void)
|
||||||
|
|
||||||
bool button_hold(void)
|
bool button_hold(void)
|
||||||
{
|
{
|
||||||
return (__gpio_get_pin(PIN_BTN_HOLD) ? true : false);
|
bool hold_button = __gpio_get_pin(PIN_BTN_HOLD) == 1;
|
||||||
|
#ifndef BOOTLOADER
|
||||||
|
static bool hold_button_old = false;
|
||||||
|
if (hold_button != hold_button_old)
|
||||||
|
{
|
||||||
|
hold_button_old = hold_button;
|
||||||
|
backlight_hold_changed(hold_button);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return hold_button;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: Due to how this is wired, button combinations are not allowed
|
/* NOTE: Due to how this is wired, button combinations are not allowed
|
||||||
unless one of the two buttons is the POWER
|
unless one of the two buttons is the POWER
|
||||||
ENABLE_BUTTON_COMBOS when defined also allows 'Back, Option, Play'
|
|
||||||
*/
|
*/
|
||||||
int button_read_device(void)
|
int button_read_device(void)
|
||||||
{
|
{
|
||||||
int btn = BUTTON_NONE;
|
int btn = BUTTON_NONE;
|
||||||
#ifndef BOOTLOADER
|
unsigned short key = (key_val & ADC_MASK);
|
||||||
static bool hold_button = false;
|
|
||||||
bool hold_button_old;
|
|
||||||
|
|
||||||
hold_button_old = hold_button;
|
if (button_hold())
|
||||||
hold_button = (__gpio_get_pin(PIN_BTN_HOLD) ? true : false);
|
|
||||||
|
|
||||||
if (hold_button != hold_button_old) {
|
|
||||||
backlight_hold_changed(hold_button);
|
|
||||||
}
|
|
||||||
if (hold_button) {
|
|
||||||
return BUTTON_NONE;
|
return BUTTON_NONE;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool gpio_btn = (__gpio_get_pin(PIN_BTN_POWER) ? false : true);
|
if (KEY_IS_DOWN(PIN_BTN_POWER))
|
||||||
if (gpio_btn)
|
|
||||||
btn |= BUTTON_POWER;
|
btn |= BUTTON_POWER;
|
||||||
|
|
||||||
#ifdef ENABLE_BUTTON_COMBOS
|
if (!KEY_IS_DOWN(PIN_KEY_INT))
|
||||||
if (__gpio_get_pin(PIN_KEY_INT) && (!__gpio_get_pin(PIN_KEY_BOP)))
|
|
||||||
#else
|
|
||||||
if (__gpio_get_pin(PIN_KEY_INT))
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return btn;
|
return btn;
|
||||||
}
|
|
||||||
|
|
||||||
if (key_val < 261)
|
if (key < 261)
|
||||||
btn |= BUTTON_VOL_UP;
|
btn |= BUTTON_VOL_UP;
|
||||||
else
|
else
|
||||||
if (key_val < 653)
|
if (key < 653)
|
||||||
btn |= BUTTON_VOL_DOWN;
|
btn |= BUTTON_VOL_DOWN;
|
||||||
else
|
else
|
||||||
if (key_val < 1101)
|
if (key < 1101)
|
||||||
btn |= BUTTON_PREV;
|
btn |= BUTTON_PREV;
|
||||||
else
|
else
|
||||||
if (key_val < 1498)
|
if (key < 1498)
|
||||||
btn |= BUTTON_NEXT;
|
btn |= BUTTON_NEXT;
|
||||||
else
|
else
|
||||||
if (key_val < 1839)
|
if (key < 1839)
|
||||||
btn |= BUTTON_PLAY;
|
btn |= BUTTON_PLAY;
|
||||||
else
|
else
|
||||||
if (key_val < 2213)
|
if (key < 2213)
|
||||||
btn |= BUTTON_OPTION;
|
btn |= BUTTON_OPTION;
|
||||||
else
|
else
|
||||||
if (key_val < 2600)
|
if (key < 2600)
|
||||||
btn |= BUTTON_HOME;
|
btn |= BUTTON_HOME;
|
||||||
|
|
||||||
return btn;
|
return btn;
|
||||||
|
@ -163,15 +151,9 @@ int button_read_device(void)
|
||||||
/* called on button press interrupt */
|
/* called on button press interrupt */
|
||||||
void KEY_INT_IRQ(void)
|
void KEY_INT_IRQ(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Don't initiate a new request if we have one pending */
|
/* Don't initiate a new request if we have one pending */
|
||||||
if(!(REG_SADC_ADENA & (ADENA_AUXEN))
|
if(!(REG_SADC_ADENA & (ADENA_AUXEN)))
|
||||||
#ifdef ENABLE_BUTTON_COMBOS
|
|
||||||
&& (!__gpio_get_pin(PIN_KEY_BOP))
|
|
||||||
#endif
|
|
||||||
){
|
|
||||||
REG_SADC_ADENA |= ADENA_AUXEN;
|
REG_SADC_ADENA |= ADENA_AUXEN;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Notes on batteries
|
/* Notes on batteries
|
||||||
|
@ -217,17 +199,22 @@ int _battery_voltage(void)
|
||||||
{
|
{
|
||||||
static long last_tick = 0;
|
static long last_tick = 0;
|
||||||
|
|
||||||
if (TIME_AFTER(current_tick, last_tick + BATT_WAIT_TIME))
|
if (TIME_AFTER(current_tick, last_tick) && REG_SADC_ADENA == 0)
|
||||||
{
|
{
|
||||||
last_tick = current_tick;
|
last_tick = current_tick;
|
||||||
REG_SADC_ADENA |= ADENA_VBATEN;
|
|
||||||
__intc_mask_irq(IRQ_SADC);
|
__intc_mask_irq(IRQ_SADC);
|
||||||
while ((REG_SADC_ADENA & ADENA_VBATEN) &&
|
REG_SADC_ADENA |= ADENA_VBATEN;
|
||||||
|
/* poll for value from our context instead of ISR */
|
||||||
|
while (!(REG_SADC_ADSTATE & ADCTRL_VRDYM) &&
|
||||||
TIME_BEFORE(current_tick, last_tick + HZ / 20))
|
TIME_BEFORE(current_tick, last_tick + HZ / 20))
|
||||||
;;
|
;;
|
||||||
__intc_unmask_irq(IRQ_SADC);
|
if ((REG_SADC_ADSTATE & ADCTRL_VRDYM))
|
||||||
if (!(REG_SADC_ADENA & ADENA_VBATEN))
|
{
|
||||||
|
last_tick += BATT_WAIT_TIME;
|
||||||
bat_val = REG_SADC_ADVDAT;
|
bat_val = REG_SADC_ADVDAT;
|
||||||
|
REG_SADC_ADSTATE &= ADCTRL_VRDYM; /* clear ready bit by writing 1*/
|
||||||
|
}
|
||||||
|
__intc_unmask_irq(IRQ_SADC);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (bat_val*BATTERY_SCALE_FACTOR)>>10;
|
return (bat_val*BATTERY_SCALE_FACTOR)>>10;
|
||||||
|
@ -240,10 +227,10 @@ int _battery_voltage(void)
|
||||||
*/
|
*/
|
||||||
void adc_init(void)
|
void adc_init(void)
|
||||||
{
|
{
|
||||||
bat_val = 0xfff;
|
bat_val = ADC_MASK;
|
||||||
|
|
||||||
__cpm_start_sadc();
|
__cpm_start_sadc();
|
||||||
mdelay(10);
|
mdelay(20);
|
||||||
REG_SADC_ADENA = 0; /* Power Up */
|
REG_SADC_ADENA = 0; /* Power Up */
|
||||||
mdelay(70);
|
mdelay(70);
|
||||||
REG_SADC_ADSTATE = 0;
|
REG_SADC_ADSTATE = 0;
|
||||||
|
@ -266,7 +253,6 @@ void SADC(void)
|
||||||
{
|
{
|
||||||
unsigned char state;
|
unsigned char state;
|
||||||
unsigned char sadcstate;
|
unsigned char sadcstate;
|
||||||
|
|
||||||
sadcstate = REG_SADC_ADSTATE;
|
sadcstate = REG_SADC_ADSTATE;
|
||||||
state = REG_SADC_ADSTATE & (~REG_SADC_ADCTRL);
|
state = REG_SADC_ADSTATE & (~REG_SADC_ADCTRL);
|
||||||
REG_SADC_ADSTATE &= sadcstate;
|
REG_SADC_ADSTATE &= sadcstate;
|
||||||
|
@ -274,30 +260,10 @@ void SADC(void)
|
||||||
if(state & ADCTRL_ARDYM)
|
if(state & ADCTRL_ARDYM)
|
||||||
{
|
{
|
||||||
key_val = REG_SADC_ADADAT;
|
key_val = REG_SADC_ADADAT;
|
||||||
#ifdef ENABLE_BUTTON_COMBOS
|
if (KEY_IS_DOWN(PIN_KEY_INT)) /* key(s) are down kick off another read */
|
||||||
__gpio_mask_irq(PIN_KEY_INT);
|
|
||||||
__gpio_clear_pin(PIN_KEY_BOP);
|
|
||||||
__gpio_unmask_irq(PIN_KEY_INT);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!__gpio_get_pin(PIN_KEY_INT)) /* key(s) are down kick off another read */
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_BUTTON_COMBOS
|
|
||||||
/* setting bit high removes BOP from ADC circuit*/
|
|
||||||
__gpio_set_pin(PIN_KEY_BOP);
|
|
||||||
#endif
|
|
||||||
REG_SADC_ADENA = ADENA_AUXEN;
|
REG_SADC_ADENA = ADENA_AUXEN;
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_BUTTON_COMBOS
|
else if(UNLIKELY(state & ADCTRL_VRDYM))
|
||||||
else
|
|
||||||
{
|
|
||||||
__gpio_mask_irq(PIN_KEY_INT);
|
|
||||||
__gpio_clear_pin(PIN_KEY_BOP);
|
|
||||||
__gpio_unmask_irq(PIN_KEY_INT);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if(state & ADCTRL_VRDYM)
|
|
||||||
{
|
{
|
||||||
bat_val = REG_SADC_ADVDAT;
|
bat_val = REG_SADC_ADVDAT;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue