summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/export/config/samsungypr0.h8
-rw-r--r--firmware/target/hosted/samsungypr/ypr0/powermgmt-ypr0.c54
2 files changed, 44 insertions, 18 deletions
diff --git a/firmware/export/config/samsungypr0.h b/firmware/export/config/samsungypr0.h
index b27a1fa..212eaa8 100644
--- a/firmware/export/config/samsungypr0.h
+++ b/firmware/export/config/samsungypr0.h
@@ -122,11 +122,6 @@
#endif /* SIMULATOR */
-/* FIXME
- * Lot of people reports bad battery life and funny charging times.
- * Check what's going on...
- */
-
#define BATTERY_CAPACITY_DEFAULT 600 /* default battery capacity */
#define BATTERY_CAPACITY_MIN 600 /* min. capacity selectable */
#define BATTERY_CAPACITY_MAX 600 /* max. capacity selectable */
@@ -138,6 +133,9 @@
/* Linux controlls charging, we can monitor */
#define CONFIG_CHARGING CHARGING_MONITOR
+/* We want to be able to reset the averaging filter */
+#define HAVE_RESET_BATTERY_FILTER
+
/* same dimensions as gigabeats */
#define CONFIG_LCD LCD_YPR0
diff --git a/firmware/target/hosted/samsungypr/ypr0/powermgmt-ypr0.c b/firmware/target/hosted/samsungypr/ypr0/powermgmt-ypr0.c
index 6e04d25..014a88d 100644
--- a/firmware/target/hosted/samsungypr/ypr0/powermgmt-ypr0.c
+++ b/firmware/target/hosted/samsungypr/ypr0/powermgmt-ypr0.c
@@ -16,14 +16,26 @@
*
****************************************************************************/
#include "config.h"
-#include <sys/ioctl.h>
#include "kernel.h"
#include "powermgmt.h"
#include "power.h"
#include "file.h"
#include "adc.h"
-#include "sc900776.h"
#include "radio-ypr.h"
+#include "ascodec.h"
+#include "stdbool.h"
+
+enum
+{
+ BATT_CHARGING,
+ BATT_NOT_CHARGING,
+ CHARGER_CONNECTED,
+ CHARGER_NOT_CONNECTED,
+};
+
+static bool first_readout = true;
+static int power_status = CHARGER_NOT_CONNECTED;
+static int charging_status = BATT_NOT_CHARGING;
const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
{
@@ -49,17 +61,36 @@ const unsigned short const percent_to_volt_charge[11] =
3450, 3670, 3721, 3751, 3782, 3821, 3876, 3941, 4034, 4125, 4200
};
+static void read_charger(void)
+{
+ charging_status = ascodec_endofch() ? BATT_NOT_CHARGING : BATT_CHARGING;
+ power_status = ascodec_chg_status() ? CHARGER_CONNECTED : CHARGER_NOT_CONNECTED;
+ /* Sync the filter due to new charging state */
+ reset_battery_filter(_battery_voltage());
+}
+
unsigned int power_input_status(void)
{
- unsigned status = POWER_INPUT_NONE;
- int fd = open("/dev/minivet", O_RDONLY);
- if (fd >= 0)
+ if (first_readout)
{
- if (ioctl(fd, IOCTL_MINIVET_DET_VBUS, NULL) > 0)
- status = POWER_INPUT_MAIN_CHARGER;
- close(fd);
+ /* 350mA, 4.20V */
+ ascodec_write_pmu(AS3543_CHARGER, 0x1, 0x5C);
+ /* Enable interrupt for charging detection */
+ ascodec_write(AS3514_IRQ_ENRD0, CHG_CHANGED);
+ read_charger();
+ first_readout = false;
}
- return status;
+
+ if (ascodec_read(AS3514_IRQ_ENRD0) & CHG_CHANGED)
+ {
+ /* Something has changed... */
+ read_charger();
+ }
+
+ if (power_status == CHARGER_CONNECTED)
+ return POWER_INPUT_MAIN_CHARGER;
+ else
+ return POWER_INPUT_NONE;
}
#endif /* CONFIG_CHARGING */
@@ -74,10 +105,7 @@ int _battery_voltage(void)
bool charging_state(void)
{
- const unsigned short charged_thres = 4170;
- bool ret = (power_input_status() == POWER_INPUT_MAIN_CHARGER);
- /* dont indicate for > ~95% */
- return ret && (_battery_voltage() <= charged_thres);
+ return (power_status == CHARGER_CONNECTED && charging_status == BATT_CHARGING);
}
#if CONFIG_TUNER