Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

authored by

Dana Conrad and committed by
Solomon Peachy
96463d85 f566f63b

+43 -8
+2 -3
firmware/drivers/axp-2101.c
··· 394 394 return val; 395 395 } 396 396 397 - /* TODO: can we trust the battery current direction? */ 398 397 int axp2101_battery_status(void) 399 398 { 400 399 int r = i2c_reg_read1(AXP_PMU_BUS, AXP_PMU_ADDR, AXP2101_REG_PMU_STATUS2); 401 - if((r >> 5) & 0x03 == 0) { 400 + if(((r >> 5) & 0x03) == 0) { 402 401 return AXP2101_BATT_FULL; 403 - } else if((r >> 5) & 0x03 == 01) { 402 + } else if(((r >> 5) & 0x03) == 1) { 404 403 return AXP2101_BATT_CHARGING; 405 404 } else { 406 405 return AXP2101_BATT_DISCHARGING;
+2
firmware/export/axp-2101.h
··· 196 196 extern void axp2101_adc_set_enabled(int adc_bits); 197 197 extern int axp2101_adc_get_rate(void); 198 198 199 + extern int axp2101_egauge_read(void); 200 + 199 201 /* Set/get maximum charging current in milliamps */ 200 202 extern void axp2101_set_charge_current(int current_mA); 201 203 extern int axp2101_get_charge_current(void);
+3
firmware/export/config.h
··· 204 204 * use the charging hardware. */ 205 205 206 206 /* CONFIG_BATTERY_MEASURE bits */ 207 + /* If both VOLTAGE_MEASURE and PERCENTAGE_MEASURE are defined, 208 + * _battery_level() (percentage) will be preferred, unless _battery_level() 209 + * returns -1, then voltage will be used from _voltage_level(). */ 207 210 #define VOLTAGE_MEASURE 1 /* Target can report battery voltage 208 211 * Usually native ports */ 209 212 #define PERCENTAGE_MEASURE 2 /* Target can report remaining capacity in %
+1 -1
firmware/export/config/erosqnative.h
··· 97 97 #define STORAGE_NEEDS_BOUNCE_BUFFER 98 98 99 99 /* Power management */ 100 - #define CONFIG_BATTERY_MEASURE (VOLTAGE_MEASURE/*|CURRENT_MEASURE*/) 100 + #define CONFIG_BATTERY_MEASURE (VOLTAGE_MEASURE | PERCENTAGE_MEASURE/*|CURRENT_MEASURE*/) 101 101 #define CONFIG_CHARGING CHARGING_MONITOR 102 102 #define HAVE_SW_POWEROFF 103 103
+20 -4
firmware/powermgmt.c
··· 302 302 } 303 303 } 304 304 305 - #if !(CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) && \ 306 - (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE) 305 + #if (!(CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) && \ 306 + (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)) || \ 307 + (CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE)) 307 308 /* Look into the percent_to_volt_* table and estimate the battery level. */ 308 309 static int voltage_to_percent(int voltage, const short* table) 309 310 { ··· 360 361 */ 361 362 static void battery_status_update(void) 362 363 { 363 - #if CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE 364 + #if CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE) 365 + int level = _battery_level(); 366 + if (level == -1) { 367 + level = voltage_to_battery_level(voltage_now); 368 + } 369 + #elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE 364 370 int level = _battery_level(); 365 371 #elif CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE 366 372 int level = voltage_to_battery_level(voltage_now); ··· 429 435 *voltage = millivolts; 430 436 431 437 if (level) { 432 - #if (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) 438 + #if (CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE)) 439 + *level = _battery_level(); 440 + if (*level == -1) { 441 + *level = voltage_to_battery_level(millivolts); 442 + } 443 + #elif (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) 433 444 *level = _battery_level(); 434 445 #elif (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE) 435 446 *level = voltage_to_battery_level(millivolts); ··· 477 488 { 478 489 #if defined(NO_LOW_BATTERY_SHUTDOWN) 479 490 return true; 491 + #elif CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE) 492 + /* if we have both, prefer voltage? */ 493 + return voltage_now > battery_level_dangerous[battery_type]; 480 494 #elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE 481 495 return percent_now > 0; 482 496 #elif defined(HAVE_BATTERY_SWITCH) ··· 508 522 509 523 #if defined(NO_LOW_BATTERY_SHUTDOWN) 510 524 return false; 525 + #elif CONFIG_BATTERY_MEASURE & (PERCENTAGE_MEASURE | VOLTAGE_MEASURE) 526 + return voltage_now < battery_level_shutoff[battery_type]; 511 527 #elif CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE 512 528 return percent_now == 0; 513 529 #elif defined(HAVE_BATTERY_SWITCH)
+15
firmware/target/mips/ingenic_x1000/erosqnative/power-erosqnative.c
··· 212 212 } 213 213 } 214 214 215 + int _battery_level(void) 216 + { 217 + int devicever; 218 + #if defined(BOOTLOADER) 219 + devicever = EROSQN_VER; 220 + #else 221 + devicever = device_data.hw_rev; 222 + #endif 223 + if (devicever >= 4){ 224 + return axp2101_egauge_read(); 225 + } else { 226 + return -1; 227 + } 228 + } 229 + 215 230 int _battery_voltage(void) 216 231 { 217 232 int devicever;