mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-10 09:31:51 +00:00
This commit enables support for reviving a battery from disconnect while also providing the code to detect if the batteries are disconnected or not. The disconnection code behaves similarly to some other battery packs used in Chromebooks. BUG=b:71515229 BRANCH=None TEST=Flash zoombini; cut off battery; apply AC and verify that we do not leave safe mode until the battery is no longer "disconnected". TEST=Repeat above test for meowth. TEST=Cutoff the battery and apply AC and verify that board wakes up from cutoff. Change-Id: I52fe91bd6522901671ad5a302bfa0ca27e5f5aa0 Signed-off-by: Aseda Aboagye <aaboagye@google.com> Reviewed-on: https://chromium-review.googlesource.com/864830 Commit-Ready: Aseda Aboagye <aaboagye@chromium.org> Tested-by: Aseda Aboagye <aaboagye@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
119 lines
3.2 KiB
C
119 lines
3.2 KiB
C
/* Copyright 2017 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.
|
|
*
|
|
* Battery pack vendor provided charging profile
|
|
*/
|
|
|
|
#include "battery.h"
|
|
#include "battery_smart.h"
|
|
#include "common.h"
|
|
#include "ec_commands.h"
|
|
#include "extpower.h"
|
|
|
|
/* Shutdown mode parameter to write to manufacturer access register */
|
|
#define SB_SHUTDOWN_DATA 0x0010
|
|
|
|
/* Battery info for proto */
|
|
static const struct battery_info info = {
|
|
#ifdef BOARD_ZOOMBINI
|
|
.voltage_max = 13200,
|
|
.voltage_normal = 11250,
|
|
.voltage_min = 9000,
|
|
.precharge_current = 189,
|
|
.start_charging_min_c = 0,
|
|
.start_charging_max_c = 60,
|
|
.charging_min_c = 0,
|
|
.charging_max_c = 60,
|
|
.discharging_min_c = -20,
|
|
.discharging_max_c = 60,
|
|
#else /* !defined(BOARD_ZOOMBINI) */
|
|
/* Meowth battery info. */
|
|
#if 0 /* planned pack settings */
|
|
.voltage_max = 8780,
|
|
.voltage_normal = 7700,
|
|
.voltage_min = 6000,
|
|
.precharge_current = 160,
|
|
.start_charging_min_c = 0,
|
|
.start_charging_max_c = 45,
|
|
.charging_min_c = 0,
|
|
.charging_max_c = 45,
|
|
.discharging_min_c = -20,
|
|
.discharging_max_c = 60,
|
|
#endif /* 0 */
|
|
/* Borrowed eve batteries for the time being. */
|
|
.voltage_max = TARGET_WITH_MARGIN(8800, 5), /* mV */
|
|
.voltage_normal = 7700,
|
|
.voltage_min = 6100, /* Add 100mV for charger accuracy */
|
|
.precharge_current = 256, /* mA */
|
|
.start_charging_min_c = 0,
|
|
.start_charging_max_c = 46,
|
|
.charging_min_c = 10,
|
|
.charging_max_c = 50,
|
|
.discharging_min_c = 0,
|
|
.discharging_max_c = 60,
|
|
#endif /* defined(BOARD_ZOOMBINI) */
|
|
};
|
|
|
|
int board_cut_off_battery(void)
|
|
{
|
|
int rv;
|
|
|
|
/* Ship mode command must be sent twice to take effect */
|
|
rv = sb_write(SB_MANUFACTURER_ACCESS, SB_SHUTDOWN_DATA);
|
|
if (rv != EC_SUCCESS)
|
|
return EC_RES_ERROR;
|
|
|
|
rv = sb_write(SB_MANUFACTURER_ACCESS, SB_SHUTDOWN_DATA);
|
|
return rv ? EC_RES_ERROR : EC_RES_SUCCESS;
|
|
}
|
|
|
|
const struct battery_info *battery_get_info(void)
|
|
{
|
|
return &info;
|
|
}
|
|
|
|
enum battery_disconnect_state battery_get_disconnect_state(void)
|
|
{
|
|
uint8_t data[6];
|
|
int rv;
|
|
|
|
/*
|
|
* Take note if we find that the battery isn't in disconnect state,
|
|
* and always return NOT_DISCONNECTED without probing the battery.
|
|
* This assumes the battery will not go to disconnect state during
|
|
* runtime.
|
|
*/
|
|
static int not_disconnected;
|
|
|
|
if (not_disconnected)
|
|
return BATTERY_NOT_DISCONNECTED;
|
|
|
|
if (extpower_is_present()) {
|
|
/* Check if battery charging + discharging is disabled. */
|
|
rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
|
|
SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
|
|
if (rv)
|
|
return BATTERY_DISCONNECT_ERROR;
|
|
if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
|
|
BATTERY_CHARGING_DISABLED)) {
|
|
not_disconnected = 1;
|
|
return BATTERY_NOT_DISCONNECTED;
|
|
}
|
|
|
|
/*
|
|
* Battery is neither charging nor discharging. Verify that
|
|
* we didn't enter this state due to a safety fault.
|
|
*/
|
|
rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
|
|
SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
|
|
if (rv || data[2] || data[3] || data[4] || data[5])
|
|
return BATTERY_DISCONNECT_ERROR;
|
|
|
|
/* No safety fault, battery is disconnected */
|
|
return BATTERY_DISCONNECTED;
|
|
}
|
|
not_disconnected = 1;
|
|
return BATTERY_NOT_DISCONNECTED;
|
|
}
|