1
0
Fork 0
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:
William Wilgus 2020-09-06 06:23:48 -04:00 committed by William Wilgus
parent 53142ae9f5
commit af24ff1fc3

View file

@ -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
{
__gpio_mask_irq(PIN_KEY_INT);
__gpio_clear_pin(PIN_KEY_BOP);
__gpio_unmask_irq(PIN_KEY_INT);
}
#endif
} }
if(state & ADCTRL_VRDYM) else if(UNLIKELY(state & ADCTRL_VRDYM))
{ {
bat_val = REG_SADC_ADVDAT; bat_val = REG_SADC_ADVDAT;
} }