summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael5 <michael5_chen@pegatroncorp.com>2015-12-29 19:32:58 +0800
committerChromeOS bot <3su6n15k.default@developer.gserviceaccount.com>2016-01-06 00:00:45 +0000
commit0be3bc3d96320fa4812ca584f1c7f57a920cc4d0 (patch)
tree3517f734e21abb87ca8a9a7832d21ef2cfcfc6a9
parentfec6f23d6014de573d50a27030dfe58ab0bbeb1d (diff)
downloadchrome-ec-0be3bc3d96320fa4812ca584f1c7f57a920cc4d0.tar.gz
edgar: Add abnormal battery detect condition
Add abnormal battery detect condition for battery charge current and charge voltage return zero. And blink battery LED 1 sec on, 1 sec off. BUG=none BRANCH=firmware-strago-7287.B TEST=Verify Change-Id: Ic282c06548b9ff6adbd47d2d594e63888d2d82f9 Signed-off-by: michael5 <michael5_chen@pegatroncorp.com> Reviewed-on: https://chromium-review.googlesource.com/319986 Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/edgar/led.c20
-rw-r--r--driver/battery/smart.c3
-rw-r--r--include/battery.h4
3 files changed, 19 insertions, 8 deletions
diff --git a/board/edgar/led.c b/board/edgar/led.c
index a43ebefd4e..17e63a3932 100644
--- a/board/edgar/led.c
+++ b/board/edgar/led.c
@@ -5,6 +5,7 @@
* Power/Battery LED control for Edgar
*/
+#include "battery.h"
#include "charge_state.h"
#include "chipset.h"
#include "console.h"
@@ -140,13 +141,15 @@ static void edgar_led_set_battery(void)
int remaining_capacity;
int full_charge_capacity;
int permillage;
-
+ int full_charge_flag;
+ const struct batt_params *batt = charger_current_battery_params();
battery_secs++;
remaining_capacity = *(int *)host_get_memmap(EC_MEMMAP_BATT_CAP);
full_charge_capacity = *(int *)host_get_memmap(EC_MEMMAP_BATT_LFCC);
permillage = !full_charge_capacity ? 0 :
(1000 * remaining_capacity) / full_charge_capacity;
+ full_charge_flag = ((batt->status & 0x0020) == 0) ? 0 : 1;
/* BAT LED behavior:
* Fully charged / idle: Blue
@@ -157,11 +160,16 @@ static void edgar_led_set_battery(void)
* situation: Orange in blinking mode (1 sec on, 1 sec off)
* Using battery or not connected to AC power: OFF
*/
+ if (!full_charge_flag && (batt->desired_voltage == 0)
+ && (batt->desired_current == 0)) {
+ bat_led_set_color(
+ (battery_secs % 2) < LED_ON_SECS
+ ? LED_ORANGE : LED_OFF);
+ return;
+ }
switch (charge_get_state()) {
case PWR_STATE_CHARGE:
- bat_led_set_color(
- charge_get_percent() == 100
- ? LED_BLUE : LED_ORANGE);
+ bat_led_set_color(full_charge_flag ? LED_BLUE : LED_ORANGE);
break;
case PWR_STATE_DISCHARGE:
/* Less than 0%[UI], blink one second every two seconds */
@@ -185,9 +193,7 @@ static void edgar_led_set_battery(void)
? LED_ORANGE : LED_OFF);
break;
case PWR_STATE_CHARGE_NEAR_FULL:
- bat_led_set_color(
- charge_get_percent() == 100
- ? LED_BLUE : LED_ORANGE);
+ bat_led_set_color(full_charge_flag ? LED_BLUE : LED_ORANGE);
break;
case PWR_STATE_IDLE: /* External power connected in IDLE. */
if (charge_get_flags() & CHARGE_FLAG_FORCE_IDLE)
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 0c63e0fec1..abaab2dd24 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -290,6 +290,9 @@ void battery_get_params(struct batt_params *batt)
if (sb_read(SB_CHARGING_CURRENT, &batt_new.desired_current))
batt_new.flags |= BATT_FLAG_BAD_DESIRED_CURRENT;
+ if (sb_read(SB_BATTERY_STATUS, &batt_new.status))
+ batt_new.flags |= BATT_FLAG_BAD_STATUS;
+
if (battery_remaining_capacity(&batt_new.remaining_capacity))
batt_new.flags |= BATT_FLAG_BAD_REMAINING_CAPACITY;
diff --git a/include/battery.h b/include/battery.h
index 18c84a37d3..14c7f57ad4 100644
--- a/include/battery.h
+++ b/include/battery.h
@@ -67,6 +67,7 @@ struct batt_params {
int full_capacity; /* Capacity in mAh (might change occasionally) */
enum battery_present is_present; /* Is the battery physically present */
int flags; /* Flags */
+ int status; /* Battery Status */
};
/* Flags for batt_params */
@@ -86,8 +87,9 @@ struct batt_params {
#define BATT_FLAG_BAD_DESIRED_CURRENT 0x00000080
#define BATT_FLAG_BAD_REMAINING_CAPACITY 0x00000100
#define BATT_FLAG_BAD_FULL_CAPACITY 0x00000200
+#define BATT_FLAG_BAD_STATUS 0x00000400
/* All of the above BATT_FLAG_BAD_* bits */
-#define BATT_FLAG_BAD_ANY 0x000003fc
+#define BATT_FLAG_BAD_ANY 0x000007fc
/* Battery constants */
struct battery_info {