Switch to using millivolt for battery voltage and other internal voltages. * Fix debug voltage history display. * Some code cleanup.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14364 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index d3cfb30..064c711 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -1048,10 +1048,9 @@
         snprintf(buf, 32, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7));
         lcd_puts(0, 5, buf);
 
-        battery_read_info(NULL, &adc_battery_voltage,
-                          &adc_battery_level);
-        snprintf(buf, 32, "Batt: %d.%02dV %d%%  ", adc_battery_voltage / 100,
-                 adc_battery_voltage % 100, adc_battery_level);
+        battery_read_info(&adc_battery_voltage, &adc_battery_level);
+        snprintf(buf, 32, "Batt: %d.%03dV %d%%  ", adc_battery_voltage / 1000,
+                 adc_battery_voltage % 1000, adc_battery_level);
         lcd_puts(0, 6, buf);
 
         lcd_update();
@@ -1068,7 +1067,7 @@
     unsigned int gpio_enable;
     unsigned int gpio1_enable;
     int adc_buttons, adc_remote;
-    int adc_battery, adc_battery_voltage, adc_battery_level;
+    int adc_battery_voltage, adc_battery_level;
     char buf[128];
     int line;
 
@@ -1108,8 +1107,7 @@
 
         adc_buttons = adc_read(ADC_BUTTONS);
         adc_remote  = adc_read(ADC_REMOTE);
-        battery_read_info(&adc_battery, &adc_battery_voltage,
-                          &adc_battery_level);
+        battery_read_info(&adc_battery_voltage, &adc_battery_level);
 #if defined(IAUDIO_X5) ||  defined(IAUDIO_M5) || defined(IRIVER_H300_SERIES)
         snprintf(buf, sizeof(buf), "ADC_BUTTONS (%c): %02x",
             button_scan_enabled() ? '+' : '-', adc_buttons);
@@ -1123,9 +1121,6 @@
 #else
         snprintf(buf, sizeof(buf), "ADC_REMOTE:  %02x", adc_remote);
 #endif
-
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "ADC_BATTERY: %02x", adc_battery);
         lcd_puts(0, line++, buf);
 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
         snprintf(buf, sizeof(buf), "ADC_REMOTEDETECT: %02x",
@@ -1133,8 +1128,8 @@
         lcd_puts(0, line++, buf);
 #endif
 
-        snprintf(buf, 32, "Batt: %d.%02dV %d%%  ", adc_battery_voltage / 100,
-                 adc_battery_voltage % 100, adc_battery_level);
+        snprintf(buf, 32, "Batt: %d.%03dV %d%%  ", adc_battery_voltage / 1000,
+                 adc_battery_voltage % 1000, adc_battery_level);
         lcd_puts(0, line++, buf);
 
 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
@@ -1401,9 +1396,9 @@
         }
         lcd_puts(0, 0, buf);
 
-        battery_read_info(NULL, &adc_battery_voltage, NULL);
-        snprintf(buf, 32, "Batt: %d.%02dV", adc_battery_voltage / 100,
-                 adc_battery_voltage % 100);
+        battery_read_info(&adc_battery_voltage, NULL);
+        snprintf(buf, 32, "Batt: %d.%03dV", adc_battery_voltage / 1000,
+                 adc_battery_voltage % 1000);
         lcd_puts(0, 1, buf);
         lcd_update();
 
@@ -1510,29 +1505,20 @@
         switch (view) {
             case 0: /* voltage history graph */
                 /* Find maximum and minimum voltage for scaling */
-                maxv = 0;
-                minv = 65535;
-                for (i = 0; i < BAT_LAST_VAL; i++) {
+                minv = power_history[0];
+                maxv = minv + 1;
+                for (i = 1; i < BAT_LAST_VAL && power_history[i]; i++) {
                     if (power_history[i] > maxv)
                         maxv = power_history[i];
-                    if (power_history[i] && (power_history[i] < minv))
-                    {
+                    if (power_history[i] < minv)
                         minv = power_history[i];
-                    }
                 }
 
-                if ((minv < 1) || (minv >= 65535))
-                    minv = 1;
-                if (maxv < 2)
-                    maxv = 2;
-                if (minv == maxv)
-                    maxv < 65535 ? maxv++ : minv--;
-
-                snprintf(buf, 30, "Battery %d.%02d", power_history[0] / 100,
-                         power_history[0] % 100);
+                snprintf(buf, 30, "Battery %d.%03d", power_history[0] / 1000,
+                         power_history[0] % 1000);
                 lcd_puts(0, 0, buf);
-                snprintf(buf, 30, "scale %d.%02d-%d.%02d V",
-                         minv / 100, minv % 100, maxv / 100, maxv % 100);
+                snprintf(buf, 30, "scale %d.%03d-%d.%03dV",
+                         minv / 1000, minv % 1000, maxv / 1000, maxv % 1000);
                 lcd_puts(0, 1, buf);
 
                 x = 0;
@@ -1551,12 +1537,12 @@
             case 1: /* status: */
                 lcd_puts(0, 0, "Power status:");
 
-                battery_read_info(NULL, &y, NULL);
-                snprintf(buf, 30, "Battery: %d.%02d V", y / 100, y % 100);
+                battery_read_info(&y, NULL);
+                snprintf(buf, 30, "Battery: %d.%03d V", y / 1000, y % 1000);
                 lcd_puts(0, 1, buf);
 #ifdef ADC_EXT_POWER
-                y = (adc_read(ADC_EXT_POWER) * EXT_SCALE_FACTOR) / 10000;
-                snprintf(buf, 30, "External: %d.%02d V", y / 100, y % 100);
+                y = (adc_read(ADC_EXT_POWER) * EXT_SCALE_FACTOR) / 1000;
+                snprintf(buf, 30, "External: %d.%03d V", y / 1000, y % 1000);
                 lcd_puts(0, 2, buf);
 #endif
 #if CONFIG_CHARGING
@@ -1614,10 +1600,10 @@
                 lcd_puts(0, 0, "Voltage deltas:");
 
                 for (i = 0; i <= 6; i++) {
-                    y = power_history[i] - power_history[i+i];
-                    snprintf(buf, 30, "-%d min: %s%d.%02d V", i,
-                             (y < 0) ? "-" : "", ((y < 0) ? y * -1 : y) / 100,
-                             ((y < 0) ? y * -1 : y ) % 100);
+                    y = power_history[i] - power_history[i+1];
+                    snprintf(buf, 30, "-%d min: %s%d.%03d V", i,
+                             (y < 0) ? "-" : "", ((y < 0) ? y * -1 : y) / 1000,
+                             ((y < 0) ? y * -1 : y ) % 1000);
                     lcd_puts(0, i+1, buf);
                 }
                 break;
@@ -1641,9 +1627,9 @@
                 lcd_puts(0, 4, buf);
 #endif /* CONFIG_CHARGING == CHARGING_CONTROL */
 
-                snprintf(buf, 30, "Last PwrHist: %d.%02d V",
-                    power_history[0] / 100,
-                    power_history[0] % 100);
+                snprintf(buf, 30, "Last PwrHist: %d.%03dV",
+                    power_history[0] / 1000,
+                    power_history[0] % 1000);
                 lcd_puts(0, 5, buf);
 
                 snprintf(buf, 30, "battery level: %d%%", battery_level());
diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c
index 233bcfa..694bc2a2 100644
--- a/apps/gui/gwps-common.c
+++ b/apps/gui/gwps-common.c
@@ -1015,7 +1015,7 @@
         case WPS_TOKEN_BATTERY_VOLTS:
         {
             unsigned int v = battery_voltage();
-            snprintf(buf, buf_size, "%d.%02d", v/100, v%100);
+            snprintf(buf, buf_size, "%d.%02d", v / 1000, (v % 1000) / 10);
             return buf;
         }
 
diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c
index 8c71f0e..1d3694c 100644
--- a/apps/plugins/battery_bench.c
+++ b/apps/plugins/battery_bench.c
@@ -250,10 +250,9 @@
                                 bat[j].eta / 60, bat[j].eta % 60, 
 #if CONFIG_CHARGING || defined(HAVE_USB_POWER)
                                 (bat[j].voltage & 
-                                 (~(BIT_CHARGER|BIT_CHARGING|BIT_USB_POWER)))
-                                *10,
+                                 (~(BIT_CHARGER|BIT_CHARGING|BIT_USB_POWER))),
 #else
-                                bat[j].voltage * 10,
+                                bat[j].voltage,
 #endif
                                 temp + 1 + (j-i)
 #if CONFIG_CHARGING
diff --git a/apps/screens.c b/apps/screens.c
index 700164f..cb691b8 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -194,8 +194,8 @@
 #endif
     {
         int battv = battery_voltage();
-        snprintf(buf, 32, "  Batt: %d.%02dV %d%%  ", battv / 100,
-                 battv % 100, battery_level());
+        snprintf(buf, 32, "  Batt: %d.%02dV %d%%  ", battv / 1000,
+                 (battv % 1000) / 10, battery_level());
         lcd_puts(0, 7, buf);
     }
 
@@ -291,7 +291,7 @@
     char buf[32];
 
     battv = battery_voltage();
-    snprintf(buf, sizeof(buf), " %d.%02dV", battv / 100, battv % 100);
+    snprintf(buf, sizeof(buf), " %d.%02dV", battv / 1000, (battv % 1000) / 10);
     lcd_puts(4, 1, buf);
 
     memcpy(buf, logo_pattern, 32); /* copy logo patterns */
diff --git a/firmware/export/powermgmt.h b/firmware/export/powermgmt.h
index 4bdaa43..89a0350 100644
--- a/firmware/export/powermgmt.h
+++ b/firmware/export/powermgmt.h
@@ -65,15 +65,14 @@
                                  /* actual max time depends also on BATTERY_CAPACITY! */
 #define CHARGE_MIN_TIME   10     /* minutes: minimum charging time */
 #define TOPOFF_MAX_TIME   90     /* After charging, go to top off charge. How long should top off charge be? */
-#define TOPOFF_VOLTAGE    565    /* which voltage is best? (centivolts) */
+#define TOPOFF_VOLTAGE    5650   /* which voltage is best? (millivolts) */
 #define TRICKLE_MAX_TIME  12*60  /* After top off charge, go to trickle charge. How long should trickle charge be? */
-#define TRICKLE_VOLTAGE   545    /* which voltage is best? (centivolts) */
+#define TRICKLE_VOLTAGE   5450   /* which voltage is best? (millivolts) */
 
 #define START_TOPOFF_SEC    25   /* initial trickle_sec for topoff */
 #define START_TRICKLE_SEC   15   /* initial trickle_sec for trickle */
 
-#define PID_PCONST          2   /* PID proportional constant */
-#define PID_DEADZONE        2   /* PID proportional deadzone */
+#define PID_DEADZONE        4    /* PID proportional deadzone */
 
 extern char power_message[POWER_MESSAGE_LEN];
 
@@ -147,11 +146,11 @@
 /* Returns battery statust */
 int battery_level(void); /* percent */
 int battery_time(void); /* minutes */
-int battery_adc_voltage(void); /* voltage from ADC in centivolts */
-unsigned int battery_voltage(void); /* filtered batt. voltage in centivolts */
+int battery_adc_voltage(void); /* voltage from ADC in millivolts */
+unsigned int battery_voltage(void); /* filtered batt. voltage in millivolts */
 
 /* read unfiltered battery info */
-void battery_read_info(int *adc, int *voltage, int *level);
+void battery_read_info(int *voltage, int *level);
 
 /* Tells if the battery level is safe for disk writes */
 bool battery_level_safe(void);
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c
index a202c71..596922f 100644
--- a/firmware/powermgmt.c
+++ b/firmware/powermgmt.c
@@ -86,11 +86,11 @@
 
 #ifdef SIMULATOR /***********************************************************/
 
-#define BATT_MINCVOLT   250             /* minimum centivolts of battery */
-#define BATT_MAXCVOLT   450             /* maximum centivolts of battery */
+#define BATT_MINMVOLT   2500            /* minimum millivolts of battery */
+#define BATT_MAXMVOLT   4500            /* maximum millivolts of battery */
 #define BATT_MAXRUNTIME (10 * 60)       /* maximum runtime with full battery in minutes */
 
-static unsigned int batt_centivolts = (unsigned int)BATT_MAXCVOLT;
+static unsigned int batt_millivolts = (unsigned int)BATT_MAXMVOLT;
 static int batt_level = 100;            /* battery capacity level in percent */
 static int batt_time = BATT_MAXRUNTIME; /* estimated remaining time in minutes */
 static time_t last_change = 0;
@@ -104,24 +104,21 @@
         last_change = now;
 
         /* change the values: */
-        batt_centivolts -= (unsigned int)(BATT_MAXCVOLT - BATT_MINCVOLT) / 101;
-        if (batt_centivolts < (unsigned int)BATT_MINCVOLT)
-            batt_centivolts = (unsigned int)BATT_MAXCVOLT;
+        batt_millivolts -= (unsigned int)(BATT_MAXMVOLT - BATT_MINMVOLT) / 101;
+        if (batt_millivolts < (unsigned int)BATT_MINMVOLT)
+            batt_millivolts = (unsigned int)BATT_MAXMVOLT;
 
-        batt_level = 100 * (batt_centivolts - BATT_MINCVOLT) / (BATT_MAXCVOLT - BATT_MINCVOLT);
+        batt_level = 100 * (batt_millivolts - BATT_MINMVOLT) / (BATT_MAXMVOLT - BATT_MINMVOLT);
         batt_time = batt_level * BATT_MAXRUNTIME / 100;
     }
 }
 
-void battery_read_info(int *adc, int *voltage, int *level)
+void battery_read_info(int *voltage, int *level)
 {
     battery_status_update();
 
-    if (adc)
-        *adc = batt_centivolts; /* just return something */
-
     if (voltage)
-        *voltage = batt_centivolts;
+        *voltage = batt_millivolts;
 
     if (level)
         *level = batt_level;
@@ -130,7 +127,7 @@
 unsigned int battery_voltage(void)
 {
     battery_status_update();
-    return batt_centivolts;
+    return batt_millivolts;
 }
 
 int battery_level(void)
@@ -181,136 +178,136 @@
 static const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
 {
 #if CONFIG_BATTERY == BATT_LIION2200    /* FM Recorder, LiIon */
-    280
+    2800
 #elif CONFIG_BATTERY == BATT_3AAA       /* Ondio: Alkaline, NiHM */
-    310, 345
+    3100, 3450
 #elif CONFIG_BATTERY == BATT_1AA        /* iRiver iFP: Alkaline, NiHM */
-    105, 115
+    1050, 1150
 #elif CONFIG_BATTERY == BATT_LIPOL1300  /* iRiver H1x0: LiPolymer */
-    338
+    3380
 #elif CONFIG_BATTERY == BATT_LIION300   /* ipod nano */
-    333
+    3330
 #elif CONFIG_BATTERY == BATT_LIION400   /* iPOD Video 30GB */
-    345
+    3450
 #elif CONFIG_BATTERY == BATT_LIION750   /* Sansa e200 */
-    340
+    3400
 #elif CONFIG_BATTERY == BATT_LIION830   /* Gigabeat F */
-    345
+    3450
 #elif CONFIG_BATTERY == BATT_IAUDIO_X5M5  /* iAudio X5 */
-    354
+    3540
 #elif CONFIG_BATTERY == BATT_LPCS355385 /* iriver H10 20GB: LiPolymer*/
-    376
+    3760
 #elif CONFIG_BATTERY == BATT_BP009      /* iriver H10 5/6GB: LiPolymer */
-    372
+    3720
 #else                                   /* Player/recorder: NiMH */
-    475
+    4750
 #endif
 };
 
 static const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
 {
 #if   CONFIG_BATTERY == BATT_LIION2200  /* FM Recorder */
-    258
+    2580
 #elif CONFIG_BATTERY == BATT_3AAA       /* Ondio */
-    270, 280
+    2700, 2800
 #elif CONFIG_BATTERY == BATT_LIPOL1300  /* iRiver Hxxx */
-    302
+    3020
 #elif CONFIG_BATTERY == BATT_LIION300   /* ipod nano */
-    323
+    3230
 #elif CONFIG_BATTERY == BATT_LIION400   /* iPOD Video 30GB */
-    345
+    3450
 #elif CONFIG_BATTERY == BATT_LIION750   /* Sansa e200 */
-    330
+    3300
 #elif CONFIG_BATTERY == BATT_LIION830   /* Gigabeat F */
-    340
+    3400
 #elif CONFIG_BATTERY == BATT_IAUDIO_X5M5  /* iAudio X5 */
-    350
+    3500
 #elif CONFIG_BATTERY == BATT_LPCS355385 /* iriver H10 20GB */
-    365
+    3650
 #elif CONFIG_BATTERY == BATT_BP009      /* iriver H10 5/6GB */
-    365
+    3650
 #else                                   /* Player/recorder: NiMH */
-    440
+    4400
 #endif
 };
 
-/* voltages (centivolt) of 0%, 10%, ... 100% when charging disabled */
+/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
 static const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
 {
 #if CONFIG_BATTERY == BATT_LIION2200
     /* measured values */
-    { 260, 285, 295, 303, 311, 320, 330, 345, 360, 380, 400 }
+    { 2600, 2850, 2950, 3030, 3110, 3200, 3300, 3450, 3600, 3800, 4000 }
 #elif CONFIG_BATTERY == BATT_3AAA
     /* measured values */
-    { 280, 325, 341, 353, 364, 374, 385, 395, 409, 427, 475 }, /* Alkaline */
-    { 310, 355, 363, 369, 372, 374, 376, 378, 380, 386, 405 }  /* NiMH */
+    { 2800, 3250, 3410, 3530, 3640, 3740, 3850, 3950, 4090, 4270, 4750 }, /* Alkaline */
+    { 3100, 3550, 3630, 3690, 3720, 3740, 3760, 3780, 3800, 3860, 4050 }  /* NiMH */
 #elif CONFIG_BATTERY == BATT_LIPOL1300
-    /* Below 337 the backlight starts flickering during HD access */
-    { 337, 365, 370, 374, 378, 382, 387, 393, 400, 408, 416 }
+    /* Below 3370 the backlight starts flickering during HD access */
+    { 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 }
 #elif CONFIG_BATTERY == BATT_IAUDIO_X5M5
     /* average measured values from X5 and M5L */
-    { 350, 365, 372, 374, 376, 379, 384, 390, 395, 404, 412 }
+    { 3500, 3650, 3720, 3740, 3760, 3790, 3840, 3900, 3950, 4040, 4120 }
 #elif CONFIG_BATTERY == BATT_LPCS355385
     /* iriver H10 20GB */
-    { 376, 380, 385, 387, 390, 395, 402, 407, 411, 418, 424 }
+    { 3760, 3800, 3850, 3870, 3900, 3950, 4020, 4070, 4110, 4180, 4240 }
 #elif CONFIG_BATTERY == BATT_BP009
     /* iriver H10 5/6GB */
-    { 372, 374, 380, 382, 384, 388, 394, 402, 406, 415, 424 }
+    { 3720, 3740, 3800, 3820, 3840, 3880, 3940, 4020, 4060, 4150, 4240 }
 #elif CONFIG_BATTERY == BATT_1AA
     /* These values are the same as for 3AAA divided by 3. */
     /* May need recalibration. */
-    {  93, 108, 114, 118, 121, 125, 128, 132, 136, 142, 158 }, /* alkaline */
-    { 103, 118, 121, 123, 124, 125, 126, 127, 128, 129, 135 }  /* NiMH */
+    {  930, 1080, 1140, 1180, 1210, 1250, 1280, 1320, 1360, 1420, 1580 }, /* alkaline */
+    { 1030, 1180, 1210, 1230, 1240, 1250, 1260, 1270, 1280, 1290, 1350 }  /* NiMH */
 #elif CONFIG_BATTERY == BATT_LIION830
     /* Toshiba Gigabeat Li Ion 830mAH figured from discharge curve */
-    { 348, 355, 359, 361, 363, 365, 370, 376, 380, 391, 399 },
+    { 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990 },
 #elif CONFIG_BATTERY == BATT_LIION750
     /* Sansa Li Ion 750mAH FIXME this is a first linear approach */
-    { 330, 339, 348, 357, 366, 375, 384, 393, 402, 411, 420 },
+    { 3300, 3390, 3480, 3570, 3660, 3750, 3840, 3930, 4020, 4110, 4200 },
 #elif CONFIG_BATTERY == BATT_LIION400  /* iPOD Video 30GB */
     /* iPOD Video 30GB Li-Ion 400mAh, first approach based upon measurements */
-    { 345, 367, 371, 375, 379, 383, 387, 393, 401, 410, 418 },
+    { 3450, 3670, 3710, 3750, 3790, 3830, 3870, 3930, 4010, 4100, 4180 },
 #elif CONFIG_BATTERY == BATT_LIION300
     /* measured values */
-    { 323, 362, 370, 373, 375, 378, 383, 389, 395, 403, 416 },
+    { 3230, 3620, 3700, 3730, 3750, 3780, 3830, 3890, 3950, 4030, 4160 },
 #else /* NiMH */
     /* original values were taken directly after charging, but it should show
        100% after turning off the device for some hours, too */
-    { 450, 481, 491, 497, 503, 507, 512, 514, 517, 525, 540 }
-                                            /* orig. values: ...,528,560 */
+    { 4500, 4810, 4910, 4970, 5030, 5070, 5120, 5140, 5170, 5250, 5400 }
+                                            /* orig. values: ...,5280,5600 */
 #endif
 };
 
 #if CONFIG_CHARGING
-/* voltages (centivolt) of 0%, 10%, ... 100% when charging enabled */
+/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
 static const unsigned short percent_to_volt_charge[11] =
 {
 #if CONFIG_BATTERY == BATT_LIPOL1300
     /* values measured over one full charging cycle */
-    354, 386, 393, 398, 400, 402, 404, 408, 413, 418, 423 /* LiPo */
+    3540, 3860, 3930, 3980, 4000, 4020, 4040, 4080, 4130, 4180, 4230 /* LiPo */
 #elif CONFIG_BATTERY == BATT_LIION300
     /* measured values */
-    323, 362, 370, 373, 375, 378, 383, 389, 395, 403, 416
+    3230, 3620, 3700, 3730, 3750, 3780, 3830, 3890, 3950, 4030, 4160
 #elif CONFIG_BATTERY == BATT_LIION400
     /* iPOD Video 30GB Li-Ion 400mAh, first approach based upon measurements */
-    345, 367, 371, 375, 379, 383, 387, 393, 401, 410, 418
+    3450, 3670, 3710, 3750, 3790, 3830, 3870, 3930, 4010, 4100, 4180
 #elif CONFIG_BATTERY == BATT_LIION750
     /* Sansa Li Ion 750mAH FIXME*/
-    330, 339, 348, 357, 366, 375, 384, 393, 402, 411, 420 
+    3300, 3390, 3480, 3570, 3660, 3750, 3840, 3930, 4020, 4110, 4200
 #elif CONFIG_BATTERY == BATT_LIION830
     /* Toshiba Gigabeat Li Ion 830mAH */
-    348, 355, 359, 361, 363, 365, 370, 376, 380, 391, 399
+    3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990
 #elif CONFIG_BATTERY == BATT_LPCS355385
     /* iriver H10 20GB */
-    399, 403, 406, 408, 410, 412, 415, 418, 422, 426, 431
+    3990, 4030, 4060, 4080, 4100, 4120, 4150, 4180, 4220, 4260, 4310
 #elif CONFIG_BATTERY == BATT_BP009
     /* iriver H10 5/6GB: Not yet calibrated */
-    388, 392, 396, 400, 406, 410, 415, 419, 424, 428, 433
+    3880, 3920, 3960, 4000, 4060, 4100, 4150, 4190, 4240, 4280, 4330
 #else
     /* values guessed, see
        http://www.seattlerobotics.org/encoder/200210/LiIon2.pdf until someone
        measures voltages over a charging cycle */
-    476, 544, 551, 556, 561, 564, 566, 576, 582, 584, 585 /* NiMH */
+    4760, 5440, 5510, 5560, 5610, 5640, 5660, 5760, 5820, 5840, 5850 /* NiMH */
 #endif
 };
 #endif /* CONFIG_CHARGING */
@@ -342,7 +339,7 @@
  * exponential filter.
  */
 static unsigned int avgbat;     /* average battery voltage (filtering) */
-static unsigned int battery_centivolts;/* filtered battery voltage, centvolts */
+static unsigned int battery_millivolts;/* filtered battery voltage, millivolts */
 #ifdef HAVE_CHARGE_CTRL
 #define BATT_AVE_SAMPLES    32  /* filter constant / @ 2Hz sample rate */
 #elif CONFIG_BATTERY == BATT_LIPOL1300
@@ -370,23 +367,19 @@
 
 static long last_event_tick;
 
-static int voltage_to_battery_level(int battery_centivolts);
+static int voltage_to_battery_level(int battery_millivolts);
 static void battery_status_update(void);
 static int runcurrent(void);
 
-void battery_read_info(int *adc, int *voltage, int *level)
+void battery_read_info(int *voltage, int *level)
 {
-    int adc_battery = adc_read(ADC_UNREG_POWER);
-    int centivolts  = adc_battery*BATTERY_SCALE_FACTOR / 10000;
-
-    if (adc)
-        *adc = adc_battery;
+    int millivolts  = adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR / 1000;
 
     if (voltage)
-        *voltage = centivolts;
+        *voltage = millivolts;
 
     if (level)
-        *level = voltage_to_battery_level(centivolts);
+        *level = voltage_to_battery_level(millivolts);
 }
 
 void reset_poweroff_timer(void)
@@ -425,22 +418,22 @@
     return battery_percent;
 }
 
-/* Returns filtered battery voltage [centivolts] */
+/* Returns filtered battery voltage [millivolts] */
 unsigned int battery_voltage(void)
 {
-    return battery_centivolts;
+    return battery_millivolts;
 }
 
-/* Returns battery voltage from ADC [centivolts] */
+/* Returns battery voltage from ADC [millivolts] */
 int battery_adc_voltage(void)
 {
-    return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR + 5000) / 10000;
+    return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR + 500) / 1000;
 }
 
 /* Tells if the battery level is safe for disk writes */
 bool battery_level_safe(void)
 {
-    return battery_centivolts > battery_level_dangerous[battery_type];
+    return battery_millivolts > battery_level_dangerous[battery_type];
 }
 
 void set_poweroff_timeout(int timeout)
@@ -490,44 +483,44 @@
 
 /* update battery level and estimated runtime, called once per minute or
  * when battery capacity / type settings are changed */
-static int voltage_to_battery_level(int battery_centivolts)
+static int voltage_to_battery_level(int battery_millivolts)
 {
     int level;
 
 #if defined(CONFIG_CHARGER) && CONFIG_BATTERY == BATT_LIPOL1300
     if (charger_input_state == NO_CHARGER) {
         /* discharging. calculate new battery level and average with last */
-        level = voltage_to_percent(battery_centivolts,
+        level = voltage_to_percent(battery_millivolts,
                 percent_to_volt_discharge[battery_type]);
         if (level != (battery_percent - 1))
             level = (level + battery_percent + 1) / 2;
     }
     else if (charger_input_state == CHARGER_UNPLUGGED) {
         /* just unplugged. adjust filtered values */
-        battery_centivolts -= percent_to_volt_charge[battery_percent/10] -
+        battery_millivolts -= percent_to_volt_charge[battery_percent/10] -
                               percent_to_volt_discharge[0][battery_percent/10];
-        avgbat = battery_centivolts * 10000 * BATT_AVE_SAMPLES;
+        avgbat = battery_millivolts * 1000 * BATT_AVE_SAMPLES;
         level  = battery_percent;
     }
     else if (charger_input_state == CHARGER_PLUGGED) {
         /* just plugged in. adjust battery values */
-        battery_centivolts += percent_to_volt_charge[battery_percent/10] -
+        battery_millivolts += percent_to_volt_charge[battery_percent/10] -
                               percent_to_volt_discharge[0][battery_percent/10];
-        avgbat = battery_centivolts * 10000 * BATT_AVE_SAMPLES;
+        avgbat = battery_millivolts * 1000 * BATT_AVE_SAMPLES;
         level  = MIN(12 * battery_percent / 10, 99);
     }
     else { /* charging. calculate new battery level */
-        level = voltage_to_percent(battery_centivolts,
+        level = voltage_to_percent(battery_millivolts,
                 percent_to_volt_charge);
     }
 #elif CONFIG_CHARGING >= CHARGING_MONITOR
     if (charge_state == DISCHARGING) {
-        level = voltage_to_percent(battery_centivolts,
+        level = voltage_to_percent(battery_millivolts,
                     percent_to_volt_discharge[battery_type]);
     }
     else if (charge_state == CHARGING) {
         /* battery level is defined to be < 100% until charging is finished */
-        level = MIN(voltage_to_percent(battery_centivolts,
+        level = MIN(voltage_to_percent(battery_millivolts,
                     percent_to_volt_charge), 99);
     }
     else { /* in topoff/trickle charge, battery is by definition 100% full */
@@ -535,7 +528,7 @@
     }
 #else
     /* always use the discharge table */
-    level = voltage_to_percent(battery_centivolts,
+    level = voltage_to_percent(battery_millivolts,
                 percent_to_volt_discharge[battery_type]);
 #endif
 
@@ -544,7 +537,7 @@
 
 static void battery_status_update(void)
 {
-    int level = voltage_to_battery_level(battery_centivolts);
+    int level = voltage_to_battery_level(battery_millivolts);
 
 
     /* calculate estimated remaining running time */
@@ -595,11 +588,11 @@
     else
 #endif /* BATT_LIPOL1300 */
     {
-        if ((battery_centivolts + 2) > percent_to_volt_discharge[0][0])
+        if ((battery_millivolts + 20) > percent_to_volt_discharge[0][0])
             powermgmt_est_runningtime_min = (level + battery_percent) * 60 *
                                          battery_capacity / 200 / runcurrent();
         else
-            powermgmt_est_runningtime_min = (battery_centivolts -
+            powermgmt_est_runningtime_min = (battery_millivolts -
                                              battery_level_shutoff[0]) / 2;
     }
 
@@ -636,7 +629,7 @@
     /* switch off unit if battery level is too low for reliable operation */
 #if (CONFIG_BATTERY!=BATT_4AA_NIMH) && (CONFIG_BATTERY!=BATT_3AAA)&& \
     (CONFIG_BATTERY!=BATT_1AA)
-    if(battery_centivolts < battery_level_shutoff[battery_type]) {
+    if(battery_millivolts < battery_level_shutoff[battery_type]) {
         if(!shutdown_timeout) {
             backlight_on();
             sys_poweroff();
@@ -847,9 +840,9 @@
             avgbat += adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR
                       - (avgbat / BATT_AVE_SAMPLES);
             /*
-             * battery_centivolts is the centivolt-scaled filtered battery value.
+             * battery_millivolts is the millivolt-scaled filtered battery value.
              */
-            battery_centivolts = (avgbat / BATT_AVE_SAMPLES + 5000) / 10000;
+            battery_millivolts = (avgbat / BATT_AVE_SAMPLES + 500) / 1000;
 
             /* update battery status every time an update is available */
             battery_status_update();
@@ -859,8 +852,8 @@
              * Shut down if voltage drops below shutoff level and we are not
              * using NiMH or Alkaline batteries.
              */
-            battery_centivolts = (battery_adc_voltage() +
-                                  battery_centivolts + 1) / 2;
+            battery_millivolts = (battery_adc_voltage() +
+                                  battery_millivolts + 1) / 2;
 
             /* update battery status every time an update is available */
             battery_status_update();
@@ -868,11 +861,11 @@
 #if (CONFIG_BATTERY!=BATT_4AA_NIMH) && (CONFIG_BATTERY!=BATT_3AAA)&& \
     (CONFIG_BATTERY!=BATT_1AA)
             if (!shutdown_timeout &&
-                (battery_centivolts < battery_level_shutoff[battery_type]))
+                (battery_millivolts < battery_level_shutoff[battery_type]))
                 sys_poweroff();
             else
 #endif
-                avgbat += battery_centivolts * 10000
+                avgbat += battery_millivolts * 1000
                           - (avgbat / BATT_AVE_SAMPLES);
         }
 
@@ -905,9 +898,8 @@
 
 static void power_thread(void)
 {
-    int i;
-    short *phps, *phpd;         /* power history rotation pointers */
 #if CONFIG_CHARGING == CHARGING_CONTROL
+    int i;
     unsigned int target_voltage = TRICKLE_VOLTAGE;    /* desired topoff/trickle
                                        * voltage level */
     int charge_max_time_idle = 0;     /* max. charging duration, calculated at
@@ -929,22 +921,22 @@
     if(!charger_inserted()) /* only if charger not connected */
 #endif
         avgbat += (percent_to_volt_discharge[battery_type][6] -
-                   percent_to_volt_discharge[battery_type][5]) * 5000;
+                   percent_to_volt_discharge[battery_type][5]) * 500;
 #endif /* not HAVE_MMC */
 
     avgbat = avgbat * BATT_AVE_SAMPLES;
-    battery_centivolts = avgbat / BATT_AVE_SAMPLES / 10000;
+    battery_millivolts = avgbat / BATT_AVE_SAMPLES / 1000;
 
 #if CONFIG_CHARGING
     if(charger_inserted()) {
-        battery_percent  = voltage_to_percent(battery_centivolts,
+        battery_percent  = voltage_to_percent(battery_millivolts,
                            percent_to_volt_charge);
 #if CONFIG_BATTERY == BATT_LIPOL1300
         charger_input_state = CHARGER;
 #endif
     } else
 #endif
-    {   battery_percent  = voltage_to_percent(battery_centivolts,
+    {   battery_percent  = voltage_to_percent(battery_millivolts,
                            percent_to_volt_discharge[battery_type]);
         battery_percent += (battery_percent < 100);
     }
@@ -957,13 +949,11 @@
     while (1)
     {
         /* rotate the power history */
-        phpd = &power_history[POWER_HISTORY_LEN - 1];
-        phps = phpd - 1;
-        for (i = 0; i < POWER_HISTORY_LEN-1; i++)
-            *phpd-- = *phps--;
+        memmove(power_history + 1, power_history,
+                sizeof(power_history) - sizeof(power_history[0]));
 
-        /* insert new value at the start, in centivolts 8-) */
-        power_history[0] = battery_centivolts;
+        /* insert new value at the start, in millivolts 8-) */
+        power_history[0] = battery_millivolts;
 
 #if CONFIG_CHARGING == CHARGING_CONTROL
         if (charger_input_state == CHARGER_PLUGGED) {
@@ -1046,15 +1036,15 @@
                              power_history[CHARGE_END_LONGD - 1];
 
                 for(i = CHARGE_END_SHORTD; i < CHARGE_END_SHORTD + 10; i++) {
-                    if(((power_history[i] - power_history[i+1]) >  5) ||
-                       ((power_history[i] - power_history[i+1]) < -5)) {
+                    if(((power_history[i] - power_history[i+1]) >  50) ||
+                       ((power_history[i] - power_history[i+1]) < -50)) {
                         long_delta = 777777;
                         break;
                     }
                 }
                  for(i = CHARGE_END_LONGD - 11; i < CHARGE_END_LONGD - 1 ; i++) {
-                    if(((power_history[i] - power_history[i+1]) >  5) ||
-                       ((power_history[i] - power_history[i+1]) < -5)) {
+                    if(((power_history[i] - power_history[i+1]) >  50) ||
+                       ((power_history[i] - power_history[i+1]) < -50)) {
                         long_delta = 888888;
                         break;
                     }
@@ -1069,10 +1059,10 @@
              * 1) Charged a long time
              * 2) DeltaV went negative for a short time ( & long delta static)
              * 3) DeltaV was negative over a longer period (no disk use only)
-             * Note: short_delta and long_delta are centivolts
+             * Note: short_delta and long_delta are millivolts
              */
             if ((powermgmt_last_cycle_startstop_min >= charge_max_time_now) ||
-                (short_delta <= -5 && long_delta < 5 ) || (long_delta  < -2 &&
+                (short_delta <= -50 && long_delta < 50 ) || (long_delta  < -20 &&
                 last_disk_activity > CHARGE_END_LONGD)) {
                 if (powermgmt_last_cycle_startstop_min > charge_max_time_now) {
                     DEBUGF("power: powermgmt_last_cycle_startstop_min > charge_max_time_now, "
@@ -1100,7 +1090,7 @@
                      * trickle target is -0.15v from full voltage acheived
                      * topup target is -0.05v from full voltage
                      */
-                    target_voltage = power_history[0] - 15;
+                    target_voltage = power_history[0] - 150;
 
                 } else {
                     if(short_delta <= -5) {
@@ -1110,7 +1100,7 @@
                                  "end negd %d %dmin", short_delta,
                                  powermgmt_last_cycle_startstop_min);
                         target_voltage = power_history[CHARGE_END_SHORTD - 1]
-                                         - 5;
+                                         - 50;
                     } else {
                         DEBUGF("power: long-term small "
                                "positive delta, enough!\n");
@@ -1118,7 +1108,7 @@
                                  "end lowd %d %dmin", long_delta,
                                  powermgmt_last_cycle_startstop_min);
                         target_voltage = power_history[CHARGE_END_LONGD - 1]
-                                         - 5;
+                                         - 50;
                     }
                     /*
                      * Switch to top-off charging.
@@ -1140,7 +1130,7 @@
                 powermgmt_last_cycle_level = battery_percent;
                 powermgmt_last_cycle_startstop_min = 0;
                 charge_state = TRICKLE;
-                target_voltage = target_voltage - 10;
+                target_voltage = target_voltage - 100;
             }
             /*
              * Adjust trickle charge time (proportional and integral terms).
@@ -1149,12 +1139,11 @@
              * generate more heat [gvb].
              */
 
-            pid_p = target_voltage - battery_centivolts;
-            if((pid_p > PID_DEADZONE) || (pid_p < -PID_DEADZONE))
-                pid_p = pid_p * PID_PCONST;
-            else
+            pid_p = (target_voltage - battery_millivolts) / 5;
+            if((pid_p <= PID_DEADZONE) && (pid_p >= -PID_DEADZONE))
                 pid_p = 0;
-            if((unsigned) battery_centivolts < target_voltage) {
+
+            if((unsigned) battery_millivolts < target_voltage) {
                 if(pid_i < 60) {
                     pid_i++;        /* limit so it doesn't "wind up" */
                 }
@@ -1227,7 +1216,7 @@
                 fd = open(DEBUG_FILE_NAME, O_WRONLY | O_APPEND | O_CREAT);
                 if(fd >= 0) {
                     snprintf(debug_message, DEBUG_MESSAGE_LEN,
-                    "cycle_min, bat_centivolts, bat_percent, chgr_state, charge_state, pid_p, pid_i, trickle_sec\n");
+                    "cycle_min, bat_millivolts, bat_percent, chgr_state, charge_state, pid_p, pid_i, trickle_sec\n");
                     write(fd, debug_message, strlen(debug_message));
                     wrcount = 99;   /* force a flush */
                 }
@@ -1235,7 +1224,7 @@
             if(fd >= 0) {
                 snprintf(debug_message, DEBUG_MESSAGE_LEN,
                         "%d, %d, %d, %d, %d, %d, %d, %d\n",
-                    powermgmt_last_cycle_startstop_min, battery_centivolts,
+                    powermgmt_last_cycle_startstop_min, battery_millivolts,
                     battery_percent, charger_input_state, charge_state,
                     pid_p, pid_i, trickle_sec);
                 write(fd, debug_message, strlen(debug_message));
diff --git a/flash/bootbox/main.c b/flash/bootbox/main.c
index 698a7e0..5cc4bb6 100644
--- a/flash/bootbox/main.c
+++ b/flash/bootbox/main.c
@@ -99,7 +99,7 @@
             char buf[32];
             int battv = battery_voltage();
             snprintf(buf, sizeof(buf), "%d.%02dV %d%%",
-                battv / 100, battv % 100, battery_level());
+                battv / 1000, (battv % 1000) / 10, battery_level());
             lcd_puts(0, 1, buf);
         }
         lcd_update();