mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 10:37:38 -04:00
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;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: can we trust the battery current direction? */
|
|
||||||
int axp2101_battery_status(void)
|
int axp2101_battery_status(void)
|
||||||
{
|
{
|
||||||
int r = i2c_reg_read1(AXP_PMU_BUS, AXP_PMU_ADDR, AXP2101_REG_PMU_STATUS2);
|
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;
|
return AXP2101_BATT_FULL;
|
||||||
} else if((r >> 5) & 0x03 == 01) {
|
} else if(((r >> 5) & 0x03) == 1) {
|
||||||
return AXP2101_BATT_CHARGING;
|
return AXP2101_BATT_CHARGING;
|
||||||
} else {
|
} else {
|
||||||
return AXP2101_BATT_DISCHARGING;
|
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 void axp2101_adc_set_enabled(int adc_bits);
|
||||||
extern int axp2101_adc_get_rate(void);
|
extern int axp2101_adc_get_rate(void);
|
||||||
|
|
||||||
|
extern int axp2101_egauge_read(void);
|
||||||
|
|
||||||
/* Set/get maximum charging current in milliamps */
|
/* Set/get maximum charging current in milliamps */
|
||||||
extern void axp2101_set_charge_current(int current_mA);
|
extern void axp2101_set_charge_current(int current_mA);
|
||||||
extern int axp2101_get_charge_current(void);
|
extern int axp2101_get_charge_current(void);
|
||||||
|
|
|
@ -204,6 +204,9 @@
|
||||||
* use the charging hardware. */
|
* use the charging hardware. */
|
||||||
|
|
||||||
/* CONFIG_BATTERY_MEASURE bits */
|
/* 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
|
#define VOLTAGE_MEASURE 1 /* Target can report battery voltage
|
||||||
* Usually native ports */
|
* Usually native ports */
|
||||||
#define PERCENTAGE_MEASURE 2 /* Target can report remaining capacity in %
|
#define PERCENTAGE_MEASURE 2 /* Target can report remaining capacity in %
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
#define STORAGE_NEEDS_BOUNCE_BUFFER
|
#define STORAGE_NEEDS_BOUNCE_BUFFER
|
||||||
|
|
||||||
/* Power management */
|
/* 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 CONFIG_CHARGING CHARGING_MONITOR
|
||||||
#define HAVE_SW_POWEROFF
|
#define HAVE_SW_POWEROFF
|
||||||
|
|
||||||
|
|
|
@ -302,8 +302,9 @@ static void send_battery_level_event(int percent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !(CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) && \
|
#if (!(CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) && \
|
||||||
(CONFIG_BATTERY_MEASURE & VOLTAGE_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. */
|
/* Look into the percent_to_volt_* table and estimate the battery level. */
|
||||||
static int voltage_to_percent(int voltage, const short* table)
|
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)
|
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();
|
int level = _battery_level();
|
||||||
#elif CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE
|
#elif CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE
|
||||||
int level = voltage_to_battery_level(voltage_now);
|
int level = voltage_to_battery_level(voltage_now);
|
||||||
|
@ -429,7 +435,12 @@ void battery_read_info(int *voltage, int *level)
|
||||||
*voltage = millivolts;
|
*voltage = millivolts;
|
||||||
|
|
||||||
if (level) {
|
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();
|
*level = _battery_level();
|
||||||
#elif (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
|
#elif (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
|
||||||
*level = voltage_to_battery_level(millivolts);
|
*level = voltage_to_battery_level(millivolts);
|
||||||
|
@ -477,6 +488,9 @@ bool battery_level_safe(void)
|
||||||
{
|
{
|
||||||
#if defined(NO_LOW_BATTERY_SHUTDOWN)
|
#if defined(NO_LOW_BATTERY_SHUTDOWN)
|
||||||
return true;
|
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
|
#elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
||||||
return percent_now > 0;
|
return percent_now > 0;
|
||||||
#elif defined(HAVE_BATTERY_SWITCH)
|
#elif defined(HAVE_BATTERY_SWITCH)
|
||||||
|
@ -508,6 +522,8 @@ bool query_force_shutdown(void)
|
||||||
|
|
||||||
#if defined(NO_LOW_BATTERY_SHUTDOWN)
|
#if defined(NO_LOW_BATTERY_SHUTDOWN)
|
||||||
return false;
|
return false;
|
||||||
|
#elif CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE)
|
||||||
|
return voltage_now < battery_level_shutoff[battery_type];
|
||||||
#elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
#elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE
|
||||||
return percent_now == 0;
|
return percent_now == 0;
|
||||||
#elif defined(HAVE_BATTERY_SWITCH)
|
#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 _battery_voltage(void)
|
||||||
{
|
{
|
||||||
int devicever;
|
int devicever;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue