summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUwe Freese <thebreaker@rockbox.org>2002-12-15 18:08:06 +0000
committerUwe Freese <thebreaker@rockbox.org>2002-12-15 18:08:06 +0000
commitf3d010a0571cfc35fa02b023080f36cf55a6a3e8 (patch)
treef6b51a9bd5bb3d8f2d52c7a0e36e3e3a186ca929
parent8125f16f1d46baa9c11426e7f33b83b28a8c8700 (diff)
downloadrockbox-f3d010a0571cfc35fa02b023080f36cf55a6a3e8.zip
rockbox-f3d010a0571cfc35fa02b023080f36cf55a6a3e8.tar.gz
rockbox-f3d010a0571cfc35fa02b023080f36cf55a6a3e8.tar.bz2
rockbox-f3d010a0571cfc35fa02b023080f36cf55a6a3e8.tar.xz
charger on if battery low at boot time, battery capacity settings
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3000 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/powermgmt.c90
-rw-r--r--firmware/powermgmt.h2
2 files changed, 53 insertions, 39 deletions
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c
index a05c54f..49c27d9 100644
--- a/firmware/powermgmt.c
+++ b/firmware/powermgmt.c
@@ -69,6 +69,15 @@ static int percent_to_volt_nocharge[11] = /* voltages (centivolt) of 0%, 10%, ..
450, 481, 491, 497, 503, 507, 512, 514, 517, 528, 560
};
+int battery_capacity = 1500; /* only a default value */
+
+void set_battery_capacity(int capacity)
+{
+ int values[8] = {1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200};
+
+ battery_capacity = values[capacity];
+}
+
#ifdef HAVE_CHARGE_CTRL
char power_message[POWER_MESSAGE_LEN] = "";
@@ -79,18 +88,12 @@ int powermgmt_last_cycle_level = 0; /* which level had the batteries at
bool trickle_charge_enabled = true;
int trickle_sec = 0; /* how many seconds should the charger be enabled per minute for trickle charging? */
int charge_state = 0; /* at the beginning, the charger does nothing */
-int battery_capacity = 1800; /* only a default value */
static int percent_to_volt_charge[11] = /* voltages (centivolt) of 0%, 10%, ... 100% when charging enabled */
{
476, 544, 551, 556, 561, 564, 566, 576, 582, 584, 585
};
-void set_battery_capacity(int capacity)
-{
- battery_capacity = capacity;
-}
-
void enable_trickle_charge(bool on)
{
trickle_charge_enabled = on;
@@ -375,7 +378,7 @@ static void power_thread(void)
charge_pause--;
if (charger_inserted()) {
- if (charger_enabled) {
+ if (charge_state == 1) {
/* charger inserted and enabled */
charged_time++;
snprintf(power_message, POWER_MESSAGE_LEN, "Chg %dm max %dm", charged_time, charge_max_time_now);
@@ -446,36 +449,39 @@ static void power_thread(void)
}
}
}
- } else { /* charged inserted but not enabled */
-
- /* trickle charging */
- if (charge_state > 1) { /* top off or trickle? */
- /* adjust trickle charge time */
- if ( ((charge_state == 2) && (power_history[POWER_HISTORY_LEN-1] > TOPOFF_VOLTAGE))
- || ((charge_state == 3) && (power_history[POWER_HISTORY_LEN-1] > TRICKLE_VOLTAGE)) ) { /* charging too much */
- trickle_sec--;
- } else { /* charging too less */
- trickle_sec++;
- }
-
- if (trickle_sec > 24) trickle_sec = 24;
- if (trickle_sec < 1) trickle_sec = 1;
-
- /* charge the calculated amount of seconds */
- charger_enable(true);
- sleep(HZ * trickle_sec);
- charger_enable(false);
-
- /* trickle charging long enough? */
+ } else if (charge_state > 1) { /* top off or trickle? */
+ /* adjust trickle charge time */
+ if ( ((charge_state == 2) && (power_history[POWER_HISTORY_LEN-1] > TOPOFF_VOLTAGE))
+ || ((charge_state == 3) && (power_history[POWER_HISTORY_LEN-1] > TRICKLE_VOLTAGE)) ) { /* charging too much */
+ trickle_sec--;
+ } else { /* charging too less */
+ trickle_sec++;
+ }
- if (trickle_time++ > TRICKLE_MAX_TIME + TOPOFF_MAX_TIME) {
- trickle_sec = 0; /* show in debug menu that trickle is off */
- charge_state = 0; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
- }
+ if (trickle_sec > 24) trickle_sec = 24;
+ if (trickle_sec < 1) trickle_sec = 1;
+
+ /* charge the calculated amount of seconds */
+ charger_enable(true);
+ sleep(HZ * trickle_sec);
+ charger_enable(false);
+
+ /* trickle charging long enough? */
+
+ if (trickle_time++ > TRICKLE_MAX_TIME + TOPOFF_MAX_TIME) {
+ trickle_sec = 0; /* show in debug menu that trickle is off */
+ charge_state = 0; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
+ }
- if ((charge_state == 2) && (trickle_time > TOPOFF_MAX_TIME)) /* change state? */
- charge_state = 3; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
- }
+ if ((charge_state == 2) && (trickle_time > TOPOFF_MAX_TIME)) /* change state? */
+ charge_state = 3; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
+
+ } else { /* charge_state == 0 */
+
+ /* the charger is enabled here only in one case: if it was turned on at boot time (power_init) */
+ /* turn it off now */
+ if (charger_enabled)
+ charger_enable(false);
/* if battery is not full, enable charging */
if (battery_level() < charge_restart_level) {
@@ -511,12 +517,16 @@ static void power_thread(void)
}
} else {
/* charger not inserted */
- if (charger_enabled) {
+ if (charge_state > 0) {
/* charger not inserted but was enabled */
DEBUGF("power: charger disconnected, disabling\n");
powermgmt_last_cycle_level = battery_level();
- powermgmt_last_cycle_startstop_min = 0;
- trickle_sec = 0; /* show in debug menu that trickle is off */
+ /* if the user only charged some minutes, we don't really have */
+ /* a battery level that's usual for charging */
+ /* the next line prevents the battery level being too low when the charger is connected for only some minutes */
+ powermgmt_last_cycle_startstop_min = (powermgmt_last_cycle_startstop_min > 10) ? 0 : 20;
+ /* show in debug menu that trickle is off */
+ trickle_sec = 0;
charger_enable(false);
charge_state = 0; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
snprintf(power_message, POWER_MESSAGE_LEN, "Charger disc");
@@ -552,6 +562,10 @@ void power_init(void)
#ifdef HAVE_CHARGE_CTRL
snprintf(power_message, POWER_MESSAGE_LEN, "Powermgmt started");
+
+ /* if the battery is nearly empty, start charging immediately */
+ if (power_history[POWER_HISTORY_LEN-1] < BATTERY_LEVEL_DANGEROUS)
+ charger_enable(true);
#endif
create_thread(power_thread, power_stack, sizeof(power_stack), power_thread_name);
}
diff --git a/firmware/powermgmt.h b/firmware/powermgmt.h
index ee2c513..b7f8b01 100644
--- a/firmware/powermgmt.h
+++ b/firmware/powermgmt.h
@@ -59,7 +59,6 @@ extern int powermgmt_last_cycle_level; /* which level had the batteries
extern int battery_lazyness[20]; /* how does the battery react when plugging in/out the charger */
void enable_trickle_charge(bool on);
-void set_battery_capacity(int capacity); /* set local battery capacity value */
extern int trickle_sec; /* trickle charge: How many seconds per minute are we charging actually? */
extern int charge_state; /* tells what the charger is doing (for info display): 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
@@ -70,6 +69,7 @@ extern int charge_state; /* tells what the charger is doing (for info di
#define CURRENT_CHARGING 300 /* charging current */
extern unsigned short power_history[POWER_HISTORY_LEN];
+void set_battery_capacity(int capacity); /* set local battery capacity value */
/* Start up power management thread */
void power_init(void);