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
diff --git a/firmware/target/arm/ipod/button-1g-3g.c b/firmware/target/arm/ipod/button-1g-3g.c
index 5455205..d5592f0 100644
--- a/firmware/target/arm/ipod/button-1g-3g.c
+++ b/firmware/target/arm/ipod/button-1g-3g.c
@@ -41,7 +41,14 @@
#include "powermgmt.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 */
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
@@ -56,6 +63,10 @@
{1, 0, 0, -1},
{0, -1, 1, 0}
};
+
+#ifdef IPOD_1G2G
+ wheel_timeout = WHEEL_TIMEOUT;
+#endif
if ( prev_scroll == -1 ) {
prev_scroll = new_scroll;
@@ -207,25 +218,37 @@
{
static bool hold_button = false;
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 */
hold_button_old = hold_button;
hold_button = button_hold();
if (hold_button != hold_button_old)
- {
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;
}