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;
 }