mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-10 05:32:40 -05:00
iPod 1st Gen: Dynamic wheel enable. This reduces wheel power consumption to about 0.5% when hold is not enabled and there is no activity, and keeps it disabled on hold.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14386 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
9110344fbd
commit
7c37c54ce5
1 changed files with 36 additions and 13 deletions
|
|
@ -41,7 +41,14 @@
|
||||||
#include "powermgmt.h"
|
#include "powermgmt.h"
|
||||||
#include "hwcompat.h"
|
#include "hwcompat.h"
|
||||||
|
|
||||||
int int_btn = BUTTON_NONE;
|
static int int_btn = BUTTON_NONE;
|
||||||
|
#ifdef IPOD_1G2G
|
||||||
|
/* The 1st Gen wheel draws ~12mA when enabled permanently. Therefore
|
||||||
|
* we only enable it for a very short time to check for changes every
|
||||||
|
* tick, and only keep it enabled if there is activity. */
|
||||||
|
#define WHEEL_TIMEOUT (HZ/4)
|
||||||
|
static int wheel_timeout = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */
|
/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */
|
||||||
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
|
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
|
||||||
|
|
@ -57,6 +64,10 @@ void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
|
||||||
{0, -1, 1, 0}
|
{0, -1, 1, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef IPOD_1G2G
|
||||||
|
wheel_timeout = WHEEL_TIMEOUT;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( prev_scroll == -1 ) {
|
if ( prev_scroll == -1 ) {
|
||||||
prev_scroll = new_scroll;
|
prev_scroll = new_scroll;
|
||||||
}
|
}
|
||||||
|
|
@ -207,24 +218,36 @@ int button_read_device(void)
|
||||||
{
|
{
|
||||||
static bool hold_button = false;
|
static bool hold_button = false;
|
||||||
bool hold_button_old;
|
bool hold_button_old;
|
||||||
|
#ifdef IPOD_1G2G
|
||||||
|
static unsigned char last_wheel_value = 0;
|
||||||
|
unsigned char wheel_value;
|
||||||
|
|
||||||
|
if ((IPOD_HW_REVISION >> 16) == 1)
|
||||||
|
{
|
||||||
|
if (!hold_button && (wheel_timeout == 0))
|
||||||
|
{
|
||||||
|
GPIOB_OUTPUT_VAL |= 0x01; /* enable wheel */
|
||||||
|
udelay(50); /* let the voltage settle */
|
||||||
|
wheel_value = GPIOA_INPUT_VAL >> 6;
|
||||||
|
if (wheel_value != last_wheel_value)
|
||||||
|
{
|
||||||
|
last_wheel_value = wheel_value;
|
||||||
|
wheel_timeout = WHEEL_TIMEOUT; /* keep wheel enabled */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wheel_timeout)
|
||||||
|
wheel_timeout--;
|
||||||
|
else
|
||||||
|
GPIOB_OUTPUT_VAL &= ~0x01; /* disable wheel */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* normal buttons */
|
/* normal buttons */
|
||||||
hold_button_old = hold_button;
|
hold_button_old = hold_button;
|
||||||
hold_button = button_hold();
|
hold_button = button_hold();
|
||||||
|
|
||||||
if (hold_button != hold_button_old)
|
if (hold_button != hold_button_old)
|
||||||
{
|
|
||||||
backlight_hold_changed(hold_button);
|
backlight_hold_changed(hold_button);
|
||||||
#ifdef IPOD_1G2G
|
|
||||||
/* Disable the 1st gen's wheel on hold in order to save power.
|
|
||||||
* The wheel draws ~12mA when enabled! Toggling the bit doesn't hurt
|
|
||||||
* on 2nd gen, because the pin is set to input (headphone detect). */
|
|
||||||
if (hold_button)
|
|
||||||
GPIOB_OUTPUT_VAL &= ~0x01; /* disable wheel */
|
|
||||||
else
|
|
||||||
GPIOB_OUTPUT_VAL |= 0x01; /* enable wheel */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return int_btn;
|
return int_btn;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue