summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDave Parker <dparker@chromium.org>2013-07-13 04:34:38 -0700
committerChromeBot <chrome-bot@google.com>2013-07-19 17:02:18 -0700
commit50ebe0565285562d080f7194f9f93f6b961c323f (patch)
tree59b5ccac58ddc1ba13acd86da9a2ac518b85fc5d /common
parent7f1c49ab4be3c662a488d2c4e9acceef2c904465 (diff)
downloadchrome-ec-50ebe0565285562d080f7194f9f93f6b961c323f.tar.gz
Peppy: Detect physical presence of battery before waking it
BUG=chrome-os-partner:20889 BRANCH=peppy TEST=Power device without battery. It should boot with no 30 second delay. The battery LED blinks orange indicating a battery error. Change-Id: Iea4f5644ae223b60dc8058dc52e06405e275c001 Signed-off-by: Dave Parker <dparker@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/61820 Reviewed-by: Randall Spangler <rspangler@chromium.org> Tested-by: Marc Jones <marc.jones@se-eng.com>
Diffstat (limited to 'common')
-rw-r--r--common/battery_peppy.c9
-rw-r--r--common/charge_state.c25
2 files changed, 27 insertions, 7 deletions
diff --git a/common/battery_peppy.c b/common/battery_peppy.c
index 9672eeef87..086469c9a3 100644
--- a/common/battery_peppy.c
+++ b/common/battery_peppy.c
@@ -6,6 +6,7 @@
*/
#include "battery_pack.h"
+#include "gpio.h"
#include "host_command.h"
#include "smart_battery.h"
@@ -62,3 +63,11 @@ int battery_command_cut_off(struct host_cmd_handler_args *args)
}
DECLARE_HOST_COMMAND(EC_CMD_BATTERY_CUT_OFF, battery_command_cut_off,
EC_VER_MASK(0));
+
+/**
+ * Physical detection of battery connection.
+ */
+int battery_is_connected(void)
+{
+ return (gpio_get_level(GPIO_BAT_DETECT_L) == 0);
+}
diff --git a/common/charge_state.c b/common/charge_state.c
index 61b17a2193..e0646c80c5 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -175,12 +175,20 @@ static int state_common(struct power_state_context *ctx)
state_machine_force_idle = 0;
}
+#ifdef CONFIG_BATTERY_CHECK_CONNECTED
+ if (!battery_is_connected()) {
+ curr->error |= F_BATTERY_NOT_CONNECTED;
+ return curr->error;
+ }
+#endif /* CONFIG_BATTERY_CHECK_CONNECTED */
+
+ /* Read temperature and see if battery is responsive */
rv = battery_temperature(&batt->temperature);
if (rv) {
/* Check low battery condition and retry */
- if (curr->ac && ctx->battery_present == 1 &&
+ if (curr->ac && ctx->battery_responsive &&
!(curr->error & F_CHARGER_MASK)) {
- ctx->battery_present = 0;
+ ctx->battery_responsive = 0;
/*
* Try to revive ultra low voltage pack. Charge
* battery pack with minimum current and maximum
@@ -192,17 +200,19 @@ static int state_common(struct power_state_context *ctx)
sleep(1);
rv = battery_temperature(&batt->temperature);
if (rv == 0) {
- ctx->battery_present = 1;
+ ctx->battery_responsive = 1;
break;
}
}
}
/* Set error if battery is still unresponsive */
- if (rv)
- curr->error |= F_BATTERY_TEMPERATURE;
+ if (rv) {
+ curr->error |= F_BATTERY_UNRESPONSIVE;
+ return curr->error;
+ }
} else {
- ctx->battery_present = 1;
+ ctx->battery_responsive = 1;
}
if (battery_voltage(&batt->voltage))
@@ -785,7 +795,8 @@ static void charge_init(void)
ctx->trickle_charging_time.val = 0;
ctx->battery = battery_get_info();
ctx->charger = charger_get_info();
- ctx->battery_present = 1;
+ /* Assume the battery is responsive until proven otherwise */
+ ctx->battery_responsive = 1;
/* Set up LPC direct memmap */
ctx->memmap_batt_volt =