battery: Implement charging thresholds
Battery Charging Start Threshold: - Valid values are [0, 100] - A value of 0 disables the feature, leaving the charger enabled on AC Battery Charging End Threshold: - Valid values are [0,100] - A value of 100 disabled the feature, leaving the charger enabled on AC The stop threshold must be configured for the start threshold to work.
This commit is contained in:
parent
4f0aa600d7
commit
fd6f9a0a05
@ -1,7 +1,6 @@
|
|||||||
#include <board/battery.h>
|
#include <board/battery.h>
|
||||||
#include <board/smbus.h>
|
#include <board/smbus.h>
|
||||||
#include <common/debug.h>
|
#include <common/debug.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define BATTERY_ADDRESS 0x0B
|
#define BATTERY_ADDRESS 0x0B
|
||||||
#define CHARGER_ADDRESS 0x09
|
#define CHARGER_ADDRESS 0x09
|
||||||
@ -16,6 +15,52 @@
|
|||||||
// IDCHG Amplifier Gain
|
// IDCHG Amplifier Gain
|
||||||
#define SBC_IDCHC_GAIN ((uint16_t)(1 << 3))
|
#define SBC_IDCHC_GAIN ((uint16_t)(1 << 3))
|
||||||
|
|
||||||
|
// TODO: Make thresholds configurable
|
||||||
|
#define BATTERY_START_THRESHOLD 0
|
||||||
|
#define BATTERY_END_THRESHOLD 100
|
||||||
|
|
||||||
|
// Default values to disable battery charging thresholds
|
||||||
|
#define BATTERY_START_DEFAULT 0
|
||||||
|
#define BATTERY_END_DEFAULT 100
|
||||||
|
|
||||||
|
// Represents a battery percentage level, below which charging will begin.
|
||||||
|
// Valid values are [0, 100]
|
||||||
|
// A value of 0 turns off the start threshold control.
|
||||||
|
static uint8_t battery_start_threshold = BATTERY_START_DEFAULT;
|
||||||
|
|
||||||
|
// Represents a battery percentage level, above which charging will stop.
|
||||||
|
// Valid values are [0, 100]
|
||||||
|
// A value of 100 turns off the stop threshold control.
|
||||||
|
static uint8_t battery_end_threshold = BATTERY_END_DEFAULT;
|
||||||
|
|
||||||
|
uint8_t battery_get_start_threshold(void) {
|
||||||
|
if (battery_start_threshold > 100)
|
||||||
|
return BATTERY_START_DEFAULT;
|
||||||
|
return battery_start_threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool battery_set_start_threshold(uint8_t value) {
|
||||||
|
if (value > 100 || value >= battery_end_threshold)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
battery_start_threshold = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t battery_get_end_threshold(void) {
|
||||||
|
if (battery_end_threshold > 100)
|
||||||
|
return BATTERY_END_DEFAULT;
|
||||||
|
return battery_end_threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool battery_set_end_threshold(uint8_t value) {
|
||||||
|
if (value > 100 || value <= battery_start_threshold)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
battery_end_threshold = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// XXX: Assumption: ac_last is initialized high.
|
// XXX: Assumption: ac_last is initialized high.
|
||||||
static bool charger_enabled = false;
|
static bool charger_enabled = false;
|
||||||
|
|
||||||
@ -85,6 +130,34 @@ int battery_charger_enable(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the charger based on charging threshold values.
|
||||||
|
*/
|
||||||
|
int battery_charger_configure(void) {
|
||||||
|
static bool should_charge = true;
|
||||||
|
|
||||||
|
if (battery_get_end_threshold() == BATTERY_END_DEFAULT) {
|
||||||
|
// Stop threshold not configured: Always charge on AC.
|
||||||
|
should_charge = true;
|
||||||
|
}
|
||||||
|
else if (battery_charge >= battery_get_end_threshold()) {
|
||||||
|
// Stop threshold configured: Stop charging at threshold.
|
||||||
|
should_charge = false;
|
||||||
|
}
|
||||||
|
else if (battery_get_start_threshold() == BATTERY_START_DEFAULT) {
|
||||||
|
// Start threshold not configured: Always charge up to stop threshold.
|
||||||
|
should_charge = true;
|
||||||
|
}
|
||||||
|
else if (battery_charge <= battery_get_start_threshold()) {
|
||||||
|
// Start threshold configured: Start charging at threshold.
|
||||||
|
should_charge = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (should_charge)
|
||||||
|
return battery_charger_enable();
|
||||||
|
return battery_charger_disable();
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t battery_temp = 0;
|
uint16_t battery_temp = 0;
|
||||||
uint16_t battery_voltage = 0;
|
uint16_t battery_voltage = 0;
|
||||||
uint16_t battery_current = 0;
|
uint16_t battery_current = 0;
|
||||||
@ -123,7 +196,7 @@ void battery_debug(void) {
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
#define command(N, A, V) { \
|
#define command(N, A, V) { \
|
||||||
DEBUG(#N ": "); \
|
DEBUG(" " #N ": "); \
|
||||||
res = smbus_read(A, V, &data); \
|
res = smbus_read(A, V, &data); \
|
||||||
if (res < 0) { \
|
if (res < 0) { \
|
||||||
DEBUG("ERROR %04X\n", -res); \
|
DEBUG("ERROR %04X\n", -res); \
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef _BOARD_BATTERY_H
|
#ifndef _BOARD_BATTERY_H
|
||||||
#define _BOARD_BATTERY_H
|
#define _BOARD_BATTERY_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define BATTERY_INITIALIZED (1U << 7)
|
#define BATTERY_INITIALIZED (1U << 7)
|
||||||
@ -15,8 +16,15 @@ extern uint16_t battery_status;
|
|||||||
extern uint16_t battery_design_capacity;
|
extern uint16_t battery_design_capacity;
|
||||||
extern uint16_t battery_design_voltage;
|
extern uint16_t battery_design_voltage;
|
||||||
|
|
||||||
|
uint8_t battery_get_start_threshold(void);
|
||||||
|
bool battery_set_start_threshold(uint8_t value);
|
||||||
|
|
||||||
|
uint8_t battery_get_end_threshold(void);
|
||||||
|
bool battery_set_end_threshold(uint8_t value);
|
||||||
|
|
||||||
int battery_charger_disable(void);
|
int battery_charger_disable(void);
|
||||||
int battery_charger_enable(void);
|
int battery_charger_enable(void);
|
||||||
|
int battery_charger_configure(void);
|
||||||
void battery_event(void);
|
void battery_event(void);
|
||||||
void battery_debug(void);
|
void battery_debug(void);
|
||||||
|
|
||||||
|
@ -357,7 +357,7 @@ void power_event(void) {
|
|||||||
battery_charger_disable();
|
battery_charger_disable();
|
||||||
} else {
|
} else {
|
||||||
DEBUG("plugged in\n");
|
DEBUG("plugged in\n");
|
||||||
battery_charger_enable();
|
battery_charger_configure();
|
||||||
}
|
}
|
||||||
battery_debug();
|
battery_debug();
|
||||||
|
|
||||||
@ -377,6 +377,11 @@ void power_event(void) {
|
|||||||
|
|
||||||
gpio_set(&AC_PRESENT, !ac_new);
|
gpio_set(&AC_PRESENT, !ac_new);
|
||||||
|
|
||||||
|
// Configure charger based on charging thresholds when plugged in
|
||||||
|
if (!ac_new) {
|
||||||
|
battery_charger_configure();
|
||||||
|
}
|
||||||
|
|
||||||
// Read power switch state
|
// Read power switch state
|
||||||
static bool ps_last = true;
|
static bool ps_last = true;
|
||||||
bool ps_new = gpio_get(&PWR_SW_N);
|
bool ps_new = gpio_get(&PWR_SW_N);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user