diff options
author | Randall Spangler <rspangler@chromium.org> | 2013-02-28 11:05:30 -0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-02-28 16:12:05 -0800 |
commit | d86df6c38883435c9df5de3bd7ba1c2b35b67316 (patch) | |
tree | 4ac71ca05ff1963af5b7ffee6e0890af8aa70e0f | |
parent | 9a1fc51fafbf862c26a32750ef333cf485902cea (diff) | |
download | chrome-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.c | 10 | ||||
-rw-r--r-- | common/charge_state.c | 56 | ||||
-rw-r--r-- | include/charge_state.h | 9 |
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", \ |