forked from len0rd/rockbox
erosqnative: hw4 units prefer egauge battery percentage
Use AXP2101's egauge battery percent level if available (hw4 units). If not available (_battery_level() will return -1 on hw1-hw3 units), fall back to voltage battery level. Also fix logic in axp2101_battery_status() Change-Id: Ic300418532dae6f7772fff8bf5e2b32516f3b973
This commit is contained in:
parent
f566f63b63
commit
96463d855f
6 changed files with 43 additions and 8 deletions
|
@ -394,13 +394,12 @@ int axp2101_supply_get_voltage(int supply)
|
|||
return val;
|
||||
}
|
||||
|
||||
/* TODO: can we trust the battery current direction? */
|
||||
int axp2101_battery_status(void)
|
||||
{
|
||||
int r = i2c_reg_read1(AXP_PMU_BUS, AXP_PMU_ADDR, AXP2101_REG_PMU_STATUS2);
|
||||
if((r >> 5) & 0x03 == 0) {
|
||||
if(((r >> 5) & 0x03) == 0) {
|
||||
return AXP2101_BATT_FULL;
|
||||
} else if((r >> 5) & 0x03 == 01) {
|
||||
} else if(((r >> 5) & 0x03) == 1) {
|
||||
return AXP2101_BATT_CHARGING;
|
||||
} else {
|
||||
return AXP2101_BATT_DISCHARGING;
|
||||
|
|
|
@ -196,6 +196,8 @@ extern int axp2101_adc_conv_raw(int adc, int value);
|
|||
extern void axp2101_adc_set_enabled(int adc_bits);
|
||||
extern int axp2101_adc_get_rate(void);
|
||||
|
||||
extern int axp2101_egauge_read(void);
|
||||
|
||||
/* Set/get maximum charging current in milliamps */
|
||||
extern void axp2101_set_charge_current(int current_mA);
|
||||
extern int axp2101_get_charge_current(void);
|
||||
|
|
|
@ -204,6 +204,9 @@
|
|||
* use the charging hardware. */
|
||||
|
||||
/* CONFIG_BATTERY_MEASURE bits */
|
||||
/* If both VOLTAGE_MEASURE and PERCENTAGE_MEASURE are defined,
|
||||
* _battery_level() (percentage) will be preferred, unless _battery_level()
|
||||
* returns -1, then voltage will be used from _voltage_level(). */
|
||||
#define VOLTAGE_MEASURE 1 /* Target can report battery voltage
|
||||
* Usually native ports */
|
||||
#define PERCENTAGE_MEASURE 2 /* Target can report remaining capacity in %
|
||||
|
|
|
@ -97,7 +97,7 @@
|
|||
#define STORAGE_NEEDS_BOUNCE_BUFFER
|
||||
|
||||
/* Power management */
|
||||
#define CONFIG_BATTERY_MEASURE (VOLTAGE_MEASURE/*|CURRENT_MEASURE*/)
|
||||
#define CONFIG_BATTERY_MEASURE (VOLTAGE_MEASURE | PERCENTAGE_MEASURE/*|CURRENT_MEASURE*/)
|
||||
#define CONFIG_CHARGING CHARGING_MONITOR
|
||||
#define HAVE_SW_POWEROFF
|
||||
|
||||
|
|
|
@ -302,8 +302,9 @@ static void send_battery_level_event(int percent)
|
|||
}
|
||||
}
|
||||
|
||||
#if !(CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) && \
|
||||
(CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
|
||||
#if (!(CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) && \
|
||||
(CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)) || \
|
||||
(CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE))
|
||||
/* Look into the percent_to_volt_* table and estimate the battery level. */
|
||||
static int voltage_to_percent(int voltage, const short* table)
|
||||
{
|
||||
|
@ -360,7 +361,12 @@ static int voltage_to_battery_level(int millivolts)
|
|||
*/
|
||||
static void battery_status_update(void)
|
||||
{
|
||||
#if CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
||||
#if CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE)
|
||||
int level = _battery_level();
|
||||
if (level == -1) {
|
||||
level = voltage_to_battery_level(voltage_now);
|
||||
}
|
||||
#elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
||||
int level = _battery_level();
|
||||
#elif CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE
|
||||
int level = voltage_to_battery_level(voltage_now);
|
||||
|
@ -429,7 +435,12 @@ void battery_read_info(int *voltage, int *level)
|
|||
*voltage = millivolts;
|
||||
|
||||
if (level) {
|
||||
#if (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE)
|
||||
#if (CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE))
|
||||
*level = _battery_level();
|
||||
if (*level == -1) {
|
||||
*level = voltage_to_battery_level(millivolts);
|
||||
}
|
||||
#elif (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE)
|
||||
*level = _battery_level();
|
||||
#elif (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
|
||||
*level = voltage_to_battery_level(millivolts);
|
||||
|
@ -477,6 +488,9 @@ bool battery_level_safe(void)
|
|||
{
|
||||
#if defined(NO_LOW_BATTERY_SHUTDOWN)
|
||||
return true;
|
||||
#elif CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE)
|
||||
/* if we have both, prefer voltage? */
|
||||
return voltage_now > battery_level_dangerous[battery_type];
|
||||
#elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
||||
return percent_now > 0;
|
||||
#elif defined(HAVE_BATTERY_SWITCH)
|
||||
|
@ -508,6 +522,8 @@ bool query_force_shutdown(void)
|
|||
|
||||
#if defined(NO_LOW_BATTERY_SHUTDOWN)
|
||||
return false;
|
||||
#elif CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE)
|
||||
return voltage_now < battery_level_shutoff[battery_type];
|
||||
#elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
||||
return percent_now == 0;
|
||||
#elif defined(HAVE_BATTERY_SWITCH)
|
||||
|
|
|
@ -212,6 +212,21 @@ bool charging_state(void)
|
|||
}
|
||||
}
|
||||
|
||||
int _battery_level(void)
|
||||
{
|
||||
int devicever;
|
||||
#if defined(BOOTLOADER)
|
||||
devicever = EROSQN_VER;
|
||||
#else
|
||||
devicever = device_data.hw_rev;
|
||||
#endif
|
||||
if (devicever >= 4){
|
||||
return axp2101_egauge_read();
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int _battery_voltage(void)
|
||||
{
|
||||
int devicever;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue