summaryrefslogtreecommitdiff
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
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>
-rw-r--r--board/peppy/board.c1
-rw-r--r--board/peppy/board.h2
-rw-r--r--common/battery_peppy.c9
-rw-r--r--common/charge_state.c25
-rw-r--r--include/battery_pack.h13
-rw-r--r--include/charge_state.h7
6 files changed, 47 insertions, 10 deletions
diff --git a/board/peppy/board.c b/board/peppy/board.c
index 86ee193ab0..61bf94d7b1 100644
--- a/board/peppy/board.c
+++ b/board/peppy/board.c
@@ -70,6 +70,7 @@ const struct gpio_info gpio_list[GPIO_COUNT] = {
{"BOARD_VERSION2", LM4_GPIO_Q, (1<<6), GPIO_INPUT, NULL},
{"BOARD_VERSION3", LM4_GPIO_Q, (1<<7), GPIO_INPUT, NULL},
{"CPU_PGOOD", LM4_GPIO_C, (1<<4), GPIO_INPUT, NULL},
+ {"BAT_DETECT_L", LM4_GPIO_B, (1<<4), GPIO_INPUT, NULL},
/* Outputs; all unasserted by default except for reset signals */
{"CPU_PROCHOT", LM4_GPIO_B, (1<<1), GPIO_OUT_LOW, NULL},
diff --git a/board/peppy/board.h b/board/peppy/board.h
index 6b2be7703b..52517bedb6 100644
--- a/board/peppy/board.h
+++ b/board/peppy/board.h
@@ -17,6 +17,7 @@
/* Optional features */
#define CONFIG_SMART_BATTERY
#define CONFIG_BACKLIGHT_X86
+#define CONFIG_BATTERY_CHECK_CONNECTED
#define CONFIG_BATTERY_PEPPY
#define CONFIG_BOARD_VERSION
#define CONFIG_CHARGER
@@ -98,6 +99,7 @@ enum gpio_signal {
GPIO_BOARD_VERSION2, /* Board version stuffing resistor 2 */
GPIO_BOARD_VERSION3, /* Board version stuffing resistor 3 */
GPIO_CPU_PGOOD, /* Power good to the CPU */
+ GPIO_BAT_DETECT_L, /* Battery detect. Repurposed BAT_TEMP */
/* Outputs */
GPIO_CPU_PROCHOT, /* Force CPU to think it's overheated */
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 =
diff --git a/include/battery_pack.h b/include/battery_pack.h
index 620b99e374..0367ee8406 100644
--- a/include/battery_pack.h
+++ b/include/battery_pack.h
@@ -7,6 +7,8 @@
#ifndef __CROS_EC_BATTERY_PACK_H
#define __CROS_EC_BATTERY_PACK_H
+#include "common.h"
+
#define CELSIUS_TO_DECI_KELVIN(temp_c) ((temp_c) * 10 + 2731)
/* Battery parameters */
@@ -46,4 +48,13 @@ const struct battery_info *battery_get_info(void);
*/
void battery_vendor_params(struct batt_params *batt);
-#endif
+#ifdef CONFIG_BATTERY_CHECK_CONNECTED
+/**
+ * Attempt communication with the battery.
+ *
+ * @return non-zero if the battery responds.
+ */
+int battery_is_connected(void);
+#endif /* CONFIG_BATTERY_CHECK_CONNECTED */
+
+#endif /* __CROS_EC_BATTERY_PACK_H */
diff --git a/include/charge_state.h b/include/charge_state.h
index d9816a7a9d..bd8f576b55 100644
--- a/include/charge_state.h
+++ b/include/charge_state.h
@@ -32,11 +32,14 @@
#define F_BATTERY_MODE (1 << 8) /* Battery mode */
#define F_BATTERY_CAPACITY (1 << 9) /* Battery capacity */
#define F_BATTERY_STATE_OF_CHARGE (1 << 10) /* State of charge, percentage */
+#define F_BATTERY_UNRESPONSIVE (1 << 11) /* Battery not responding */
+#define F_BATTERY_NOT_CONNECTED (1 << 12) /* Battery not connected */
#define F_BATTERY_MASK (F_BATTERY_VOLTAGE | F_BATTERY_CURRENT | \
F_DESIRED_VOLTAGE | F_DESIRED_CURRENT | \
F_BATTERY_TEMPERATURE | F_BATTERY_MODE | \
- F_BATTERY_CAPACITY | F_BATTERY_STATE_OF_CHARGE)
+ F_BATTERY_CAPACITY | F_BATTERY_STATE_OF_CHARGE | \
+ F_BATTERY_UNRESPONSIVE | F_BATTERY_NOT_CONNECTED)
#define F_CHARGER_MASK (F_CHARGER_VOLTAGE | F_CHARGER_CURRENT | \
F_CHARGER_INIT)
@@ -118,7 +121,7 @@ struct power_state_context {
timestamp_t trickle_charging_time;
timestamp_t voltage_debounce_time;
timestamp_t shutdown_warning_time;
- int battery_present;
+ int battery_responsive;
};
/* Trickle charging state handler.