diff --git a/apps/main.c b/apps/main.c index 5715057ee2..9846f116be 100644 --- a/apps/main.c +++ b/apps/main.c @@ -506,7 +506,12 @@ static void init(void) button_init(); + /* Don't initialize power management here if it could incorrectly + * measure battery voltage, and it's not needed for charging. */ +#if !defined(NEED_ATA_POWER_BATT_MEASURE) || \ + (CONFIG_CHARGING > CHARGING_MONITOR) powermgmt_init(); +#endif #if CONFIG_TUNER radio_init(); @@ -567,6 +572,12 @@ static void init(void) panicf("ata: %d", rc); } +#if defined(NEED_ATA_POWER_BATT_MEASURE) && \ + (CONFIG_CHARGING <= CHARGING_MONITOR) + /* After storage_init(), ATA power must be on, so battery voltage + * can be measured. Initialize power management if it was delayed. */ + powermgmt_init(); +#endif #ifdef HAVE_EEPROM_SETTINGS CHART(">eeprom_settings_init"); eeprom_settings_init(); diff --git a/apps/screens.c b/apps/screens.c index b261a2d3dc..8d4585f7b3 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -59,6 +59,10 @@ #include "dsp.h" #endif +#if defined(ARCHOS_FMRECORDER) || defined(ARCHOS_RECORDERV2) +#include "adc.h" +#endif + #if (CONFIG_STORAGE & STORAGE_MMC) && (defined(ARCHOS_ONDIOSP) || defined(ARCHOS_ONDIOFM)) int mmc_remove_request(void) { @@ -94,14 +98,17 @@ static void charging_display_info(bool animate) static unsigned phase = 3; unsigned i; -#ifdef NEED_ATA_POWER_BATT_MEASURE - if (ide_powered()) /* FM and V2 can only measure when ATA power is on */ -#endif +#if !defined(NEED_ATA_POWER_BATT_MEASURE) { int battv = battery_voltage(); lcd_putsf(0, 7, " Batt: %d.%02dV %d%% ", battv / 1000, (battv % 1000) / 10, battery_level()); } +#elif defined(ARCHOS_FMRECORDER) || defined(ARCHOS_RECORDERV2) + /* IDE power is normally off here, so display input current instead */ + lcd_putsf(7, 7, "%dmA ", + (adc_read(ADC_EXT_POWER) * EXT_SCALE_FACTOR) / 10000); +#endif #ifdef ARCHOS_RECORDER lcd_puts(0, 2, "Charge mode:"); @@ -263,7 +270,8 @@ int charging_screen(void) rc = 2; else if (usb_detect() == USB_INSERTED) rc = 3; - else if (!charger_inserted()) + /* do not depend on power management thread here */ + else if (!(power_input_status() & POWER_INPUT_MAIN_CHARGER)) rc = 1; } while (!rc);