summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2013-02-28 11:05:30 -0800
committerChromeBot <chrome-bot@google.com>2013-02-28 16:12:05 -0800
commitd86df6c38883435c9df5de3bd7ba1c2b35b67316 (patch)
tree4ac71ca05ff1963af5b7ffee6e0890af8aa70e0f
parent9a1fc51fafbf862c26a32750ef333cf485902cea (diff)
downloadchrome-ec-d86df6c38883435c9df5de3bd7ba1c2b35b67316.tar.gz
Add reinit state to charge_state module to distinguish it from at-ec-boot init
This is a precursor to changing the switch state machine to delay powering on the AP until the charge_state module knows if there's enough power to do so (which it will know when it leaves the INIT state). BUG=chrome-os-partner:17124 BRANCH=link TEST=manual 1. Reboot EC on battery power. See charge state init->discharging 2. Plug in AC. See charge state discharging->reinit (charge state will then transition to some other charging or idle state based on battery level) Change-Id: Ia02cc8b37e9b5e8d6dd8c2fbfdf14e385694b1bf Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/44291 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--common/battery_precharge.c10
-rw-r--r--common/charge_state.c56
-rw-r--r--include/charge_state.h9
3 files changed, 43 insertions, 32 deletions
diff --git a/common/battery_precharge.c b/common/battery_precharge.c
index 10cae97269..663002cfc8 100644
--- a/common/battery_precharge.c
+++ b/common/battery_precharge.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
@@ -115,7 +115,7 @@ enum power_state trickle_charge(struct power_state_context *ctx)
if (curr->ac != ctx->prev.ac) {
ctx->trickle_charging_time.val = 0;
if (!curr->ac)
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
}
/* Start timer */
@@ -127,7 +127,7 @@ enum power_state trickle_charge(struct power_state_context *ctx)
/* Check charger reset */
if (curr->charging_voltage == 0 || curr->charging_current == 0) {
ctx->trickle_charging_time.val = 0;
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
}
/*
@@ -147,7 +147,7 @@ enum power_state trickle_charge(struct power_state_context *ctx)
if (batt->desired_current > cinfo->current_min) {
trickle_charging_init();
ctx->trickle_charging_time.val = 0;
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
}
/*
@@ -172,7 +172,7 @@ enum power_state trickle_charge(struct power_state_context *ctx)
/* Exit trickle charging state */
trickle_charging_init();
ctx->trickle_charging_time.val = 0;
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
}
charger_set_voltage(curr->charging_voltage);
ctx->charger_update_time = get_time();
diff --git a/common/charge_state.c b/common/charge_state.c
index c15fc0e7d1..2ab00a68f2 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -348,7 +348,7 @@ static enum power_state state_idle(struct power_state_context *ctx)
return PWR_STATE_UNCHANGE;
if (!ctx->curr.ac)
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
if (ctx->curr.error)
return PWR_STATE_ERROR;
@@ -356,7 +356,7 @@ static enum power_state state_idle(struct power_state_context *ctx)
/* Prevent charging in idle mode */
if (ctx->curr.charging_voltage ||
ctx->curr.charging_current)
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
if (batt->state_of_charge >= BATTERY_LEVEL_FULL)
return PWR_STATE_UNCHANGE;
@@ -420,10 +420,10 @@ static enum power_state state_charge(struct power_state_context *ctx)
/* Check charger reset */
if (curr->charging_voltage == 0 ||
curr->charging_current == 0)
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
if (!curr->ac)
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
if (batt->state_of_charge >= BATTERY_LEVEL_FULL) {
if (charger_set_voltage(0) || charger_set_current(0))
@@ -484,7 +484,7 @@ static enum power_state state_discharge(struct power_state_context *ctx)
{
struct batt_params *batt = &ctx->curr.batt;
if (ctx->curr.ac)
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
if (ctx->curr.error)
return PWR_STATE_ERROR;
@@ -510,7 +510,7 @@ static enum power_state state_error(struct power_state_context *ctx)
if (!ctx->curr.error) {
logged_error = 0;
- return PWR_STATE_INIT;
+ return PWR_STATE_REINIT;
}
/* Debug output */
@@ -620,27 +620,12 @@ void charge_state_machine_task(void)
int rv_setled = 0;
uint64_t last_setled_time = 0;
- ctx->prev.state = PWR_STATE_INIT;
- ctx->curr.state = PWR_STATE_INIT;
- ctx->trickle_charging_time.val = 0;
- ctx->battery = battery_get_info();
- ctx->charger = charger_get_info();
- ctx->battery_present = 1;
-
- /* Set up LPC direct memmap */
- ctx->memmap_batt_volt =
- (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_VOLT);
- ctx->memmap_batt_rate =
- (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_RATE);
- ctx->memmap_batt_cap =
- (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_CAP);
- ctx->memmap_batt_flags = host_get_memmap(EC_MEMMAP_BATT_FLAG);
-
while (1) {
state_common(ctx);
switch (ctx->prev.state) {
case PWR_STATE_INIT:
+ case PWR_STATE_REINIT:
new_state = state_init(ctx);
break;
case PWR_STATE_IDLE0:
@@ -687,8 +672,9 @@ void charge_state_machine_task(void)
if (state_machine_force_idle &&
ctx->prev.state != PWR_STATE_IDLE0 &&
ctx->prev.state != PWR_STATE_IDLE &&
- ctx->prev.state != PWR_STATE_INIT)
- new_state = PWR_STATE_INIT;
+ ctx->prev.state != PWR_STATE_INIT &&
+ ctx->prev.state != PWR_STATE_REINIT)
+ new_state = PWR_STATE_REINIT;
if (new_state) {
ctx->curr.state = new_state;
@@ -821,6 +807,28 @@ static void charge_hook(void)
DECLARE_HOOK(HOOK_CHIPSET_RESUME, charge_hook, HOOK_PRIO_DEFAULT);
DECLARE_HOOK(HOOK_AC_CHANGE, charge_hook, HOOK_PRIO_DEFAULT);
+static void charge_init(void)
+{
+ struct power_state_context *ctx = &task_ctx;
+
+ ctx->prev.state = PWR_STATE_INIT;
+ ctx->curr.state = PWR_STATE_INIT;
+ ctx->trickle_charging_time.val = 0;
+ ctx->battery = battery_get_info();
+ ctx->charger = charger_get_info();
+ ctx->battery_present = 1;
+
+ /* Set up LPC direct memmap */
+ ctx->memmap_batt_volt =
+ (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_VOLT);
+ ctx->memmap_batt_rate =
+ (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_RATE);
+ ctx->memmap_batt_cap =
+ (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_CAP);
+ ctx->memmap_batt_flags = host_get_memmap(EC_MEMMAP_BATT_FLAG);
+}
+DECLARE_HOOK(HOOK_INIT, charge_init, HOOK_PRIO_DEFAULT);
+
/*****************************************************************************/
/* Host commands */
diff --git a/include/charge_state.h b/include/charge_state.h
index 182a99f703..5f90de36fd 100644
--- a/include/charge_state.h
+++ b/include/charge_state.h
@@ -1,9 +1,9 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
- *
*/
+#include "battery_pack.h"
#include "timer.h"
#ifndef __CROS_EC_CHARGE_STATE_H
@@ -44,8 +44,10 @@
enum power_state {
/* Meta-state; unchanged from previous time through task loop */
PWR_STATE_UNCHANGE = 0,
- /* (Re-)initalizing charge state machine */
+ /* Initializing charge state machine at boot */
PWR_STATE_INIT,
+ /* Re-initializing charge state machine */
+ PWR_STATE_REINIT,
/* Just transitioned from init to idle */
PWR_STATE_IDLE0,
/* Idle; AC present */
@@ -67,6 +69,7 @@ enum power_state {
{ \
"unchange", \
"init", \
+ "reinit", \
"idle0", \
"idle", \
"discharge", \