mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-18 17:42:36 -05:00
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
This commit is contained in:
parent
8125f16f1d
commit
f3d010a057
2 changed files with 53 additions and 39 deletions
|
|
@ -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
|
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
|
#ifdef HAVE_CHARGE_CTRL
|
||||||
|
|
||||||
char power_message[POWER_MESSAGE_LEN] = "";
|
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;
|
bool trickle_charge_enabled = true;
|
||||||
int trickle_sec = 0; /* how many seconds should the charger be enabled per minute for trickle charging? */
|
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 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 */
|
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
|
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)
|
void enable_trickle_charge(bool on)
|
||||||
{
|
{
|
||||||
trickle_charge_enabled = on;
|
trickle_charge_enabled = on;
|
||||||
|
|
@ -375,7 +378,7 @@ static void power_thread(void)
|
||||||
charge_pause--;
|
charge_pause--;
|
||||||
|
|
||||||
if (charger_inserted()) {
|
if (charger_inserted()) {
|
||||||
if (charger_enabled) {
|
if (charge_state == 1) {
|
||||||
/* charger inserted and enabled */
|
/* charger inserted and enabled */
|
||||||
charged_time++;
|
charged_time++;
|
||||||
snprintf(power_message, POWER_MESSAGE_LEN, "Chg %dm max %dm", charged_time, charge_max_time_now);
|
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 */
|
} else if (charge_state > 1) { /* top off or trickle? */
|
||||||
|
/* adjust trickle charge time */
|
||||||
/* trickle charging */
|
if ( ((charge_state == 2) && (power_history[POWER_HISTORY_LEN-1] > TOPOFF_VOLTAGE))
|
||||||
if (charge_state > 1) { /* top off or trickle? */
|
|| ((charge_state == 3) && (power_history[POWER_HISTORY_LEN-1] > TRICKLE_VOLTAGE)) ) { /* charging too much */
|
||||||
/* adjust trickle charge time */
|
trickle_sec--;
|
||||||
if ( ((charge_state == 2) && (power_history[POWER_HISTORY_LEN-1] > TOPOFF_VOLTAGE))
|
} else { /* charging too less */
|
||||||
|| ((charge_state == 3) && (power_history[POWER_HISTORY_LEN-1] > TRICKLE_VOLTAGE)) ) { /* charging too much */
|
trickle_sec++;
|
||||||
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? */
|
|
||||||
|
|
||||||
if (trickle_time++ > TRICKLE_MAX_TIME + TOPOFF_MAX_TIME) {
|
if (trickle_sec > 24) trickle_sec = 24;
|
||||||
trickle_sec = 0; /* show in debug menu that trickle is off */
|
if (trickle_sec < 1) trickle_sec = 1;
|
||||||
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 the calculated amount of seconds */
|
||||||
charge_state = 3; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
|
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 */
|
||||||
|
|
||||||
|
} 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 is not full, enable charging */
|
||||||
if (battery_level() < charge_restart_level) {
|
if (battery_level() < charge_restart_level) {
|
||||||
|
|
@ -511,12 +517,16 @@ static void power_thread(void)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* charger not inserted */
|
/* charger not inserted */
|
||||||
if (charger_enabled) {
|
if (charge_state > 0) {
|
||||||
/* charger not inserted but was enabled */
|
/* charger not inserted but was enabled */
|
||||||
DEBUGF("power: charger disconnected, disabling\n");
|
DEBUGF("power: charger disconnected, disabling\n");
|
||||||
powermgmt_last_cycle_level = battery_level();
|
powermgmt_last_cycle_level = battery_level();
|
||||||
powermgmt_last_cycle_startstop_min = 0;
|
/* if the user only charged some minutes, we don't really have */
|
||||||
trickle_sec = 0; /* show in debug menu that trickle is off */
|
/* 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);
|
charger_enable(false);
|
||||||
charge_state = 0; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
|
charge_state = 0; /* 0: decharging/charger off, 1: charge, 2: top-off, 3: trickle */
|
||||||
snprintf(power_message, POWER_MESSAGE_LEN, "Charger disc");
|
snprintf(power_message, POWER_MESSAGE_LEN, "Charger disc");
|
||||||
|
|
@ -552,6 +562,10 @@ void power_init(void)
|
||||||
|
|
||||||
#ifdef HAVE_CHARGE_CTRL
|
#ifdef HAVE_CHARGE_CTRL
|
||||||
snprintf(power_message, POWER_MESSAGE_LEN, "Powermgmt started");
|
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
|
#endif
|
||||||
create_thread(power_thread, power_stack, sizeof(power_stack), power_thread_name);
|
create_thread(power_thread, power_stack, sizeof(power_stack), power_thread_name);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
extern int battery_lazyness[20]; /* how does the battery react when plugging in/out the charger */
|
||||||
void enable_trickle_charge(bool on);
|
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 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 */
|
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 */
|
#define CURRENT_CHARGING 300 /* charging current */
|
||||||
|
|
||||||
extern unsigned short power_history[POWER_HISTORY_LEN];
|
extern unsigned short power_history[POWER_HISTORY_LEN];
|
||||||
|
void set_battery_capacity(int capacity); /* set local battery capacity value */
|
||||||
|
|
||||||
/* Start up power management thread */
|
/* Start up power management thread */
|
||||||
void power_init(void);
|
void power_init(void);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue