diff options
-rw-r--r-- | board/peppy/board.c | 1 | ||||
-rw-r--r-- | board/peppy/board.h | 2 | ||||
-rw-r--r-- | common/battery_peppy.c | 9 | ||||
-rw-r--r-- | common/charge_state.c | 25 | ||||
-rw-r--r-- | include/battery_pack.h | 13 | ||||
-rw-r--r-- | include/charge_state.h | 7 |
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. |