251 lines
9.5 KiB
C
251 lines
9.5 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 driver for MAX17055.
|
||
*/
|
||
|
||
#ifndef __CROS_EC_MAX17055_H
|
||
#define __CROS_EC_MAX17055_H
|
||
|
||
#define MAX17055_ADDR_FLAGS 0x36
|
||
#define MAX17055_DEVICE_ID 0x4010
|
||
#define MAX17055_OCV_TABLE_SIZE 48
|
||
|
||
#define REG_STATUS 0x00
|
||
#define REG_VALRTTH 0x01
|
||
#define REG_TALRTTH 0x02
|
||
#define REG_SALRTTH 0x03
|
||
#define REG_AT_RATE 0x04
|
||
#define REG_REMAINING_CAPACITY 0x05
|
||
#define REG_STATE_OF_CHARGE 0x06
|
||
#define REG_TEMPERATURE 0x08
|
||
#define REG_VOLTAGE 0x09
|
||
#define REG_CURRENT 0x0a
|
||
#define REG_AVERAGE_CURRENT 0x0b
|
||
#define REG_MIXCAP 0x0f
|
||
#define REG_FULL_CHARGE_CAPACITY 0x10
|
||
#define REG_TIME_TO_EMPTY 0x11
|
||
#define REG_QR_TABLE00 0x12
|
||
#define REG_CONFIG 0x1D
|
||
#define REG_AVERAGE_TEMPERATURE 0x16
|
||
#define REG_CYCLE_COUNT 0x17
|
||
#define REG_DESIGN_CAPACITY 0x18
|
||
#define REG_AVERAGE_VOLTAGE 0x19
|
||
#define REG_MAX_MIN_TEMP 0x1a
|
||
#define REG_MAX_MIN_VOLT 0x1b
|
||
#define REG_MAX_MIN_CURR 0x1c
|
||
#define REG_CHARGE_TERM_CURRENT 0x1e
|
||
#define REG_TIME_TO_FULL 0x20
|
||
#define REG_DEVICE_NAME 0x21
|
||
#define REG_QR_TABLE10 0x22
|
||
#define REG_FULLCAPNOM 0x23
|
||
#define REG_LEARNCFG 0x28
|
||
#define REG_QR_TABLE20 0x32
|
||
#define REG_RCOMP0 0x38
|
||
#define REG_TEMPCO 0x39
|
||
#define REG_EMPTY_VOLTAGE 0x3a
|
||
#define REG_FSTAT 0x3d
|
||
#define REG_TIMER 0x3e
|
||
#define REG_QR_TABLE30 0x42
|
||
#define REG_DQACC 0x45
|
||
#define REG_DPACC 0x46
|
||
#define REG_VFSOC0 0x48
|
||
#define REG_COMMAND 0x60
|
||
#define REG_LOCK1 0x62
|
||
#define REG_LOCK2 0x63
|
||
#define REG_OCV_TABLE_START 0x80
|
||
#define REG_STATUS2 0xb0
|
||
#define REG_IALRTTH 0xb4
|
||
#define REG_HIBCFG 0xba
|
||
#define REG_CONFIG2 0xbb
|
||
#define REG_TIMERH 0xbe
|
||
#define REG_MODELCFG 0xdb
|
||
#define REG_VFSOC 0xff
|
||
|
||
/* Status reg (0x00) flags */
|
||
#define STATUS_POR BIT(1)
|
||
#define STATUS_IMN BIT(2)
|
||
#define STATUS_BST BIT(3)
|
||
#define STATUS_IMX BIT(6)
|
||
#define STATUS_VMN BIT(8)
|
||
#define STATUS_TMN BIT(9)
|
||
#define STATUS_SMN BIT(10)
|
||
#define STATUS_VMX BIT(12)
|
||
#define STATUS_TMX BIT(13)
|
||
#define STATUS_SMX BIT(14)
|
||
#define STATUS_ALL_ALRT \
|
||
(STATUS_IMN | STATUS_IMX | STATUS_VMN | STATUS_VMX | STATUS_TMN | \
|
||
STATUS_TMX | STATUS_SMN | STATUS_SMX)
|
||
|
||
/* Alert disable values (0x01, 0x02, 0x03, 0xb4) */
|
||
#define VALRT_DISABLE 0xff00
|
||
#define TALRT_DISABLE 0x7f80
|
||
#define SALRT_DISABLE 0xff00
|
||
#define IALRT_DISABLE 0x7f80
|
||
|
||
/* Config reg (0x1d) flags */
|
||
#define CONF_AEN BIT(2)
|
||
#define CONF_IS BIT(11)
|
||
#define CONF_VS BIT(12)
|
||
#define CONF_TS BIT(13)
|
||
#define CONF_SS BIT(14)
|
||
#define CONF_TSEL BIT(15)
|
||
#define CONF_ALL_STICKY (CONF_IS | CONF_VS | CONF_TS | CONF_SS)
|
||
|
||
/* FStat reg (0x3d) flags */
|
||
#define FSTAT_DNR 0x0001
|
||
#define FSTAT_FQ 0x0080
|
||
|
||
/* Config2 reg (0xbb) flags */
|
||
#define CONFIG2_LDMDL BIT(5)
|
||
|
||
/* ModelCfg reg (0xdb) flags */
|
||
#define MODELCFG_REFRESH BIT(15)
|
||
#define MODELCFG_VCHG BIT(10)
|
||
|
||
/* Smart battery status bits (sbs reg 0x16) */
|
||
#define BATTERY_DISCHARGING 0x40
|
||
#define BATTERY_FULLY_CHARGED 0x20
|
||
|
||
/*
|
||
* Before we have the battery fully characterized, we use these macros to
|
||
* convert basic battery parameters to max17055 reg values for ez config.
|
||
*/
|
||
|
||
/* Convert design capacity in mAh to max17055 0x18 reg value */
|
||
#define MAX17055_DESIGNCAP_REG(bat_cap_mah) \
|
||
(bat_cap_mah * BATTERY_MAX17055_RSENSE / 5)
|
||
/* Convert charge termination current in mA to max17055 0x1e reg value */
|
||
#define MAX17055_ICHGTERM_REG(term_cur_ma) \
|
||
(((term_cur_ma * BATTERY_MAX17055_RSENSE) << 4) / 25)
|
||
/*
|
||
* This macro converts empty voltage target (VE) and recovery voltage (VR)
|
||
* in mV to max17055 0x3a reg value. max17055 declares 0% (empty battery) at
|
||
* VE. max17055 reenables empty detection when the cell voltage rises above VR.
|
||
* VE ranges from 0 to 5110mV, and VR ranges from 0 to 5080mV.
|
||
*/
|
||
#define MAX17055_VEMPTY_REG(ve_mv, vr_mv) \
|
||
(((ve_mv / 10) << 7) | (vr_mv / 40))
|
||
|
||
#define MAX17055_MAX_MIN_REG(mx, mn) ((((int16_t)(mx)) << 8) | ((mn)))
|
||
/* Converts voltages alert range for VALRTTH_REG */
|
||
#define MAX17055_VALRTTH_RESOLUTION 20
|
||
#define MAX17055_VALRTTH_REG(mx, mn) \
|
||
MAX17055_MAX_MIN_REG((uint8_t)(mx / MAX17055_VALRTTH_RESOLUTION), \
|
||
(uint8_t)(mn / MAX17055_VALRTTH_RESOLUTION))
|
||
/* Converts temperature alert range for TALRTTH_REG */
|
||
#define MAX17055_TALRTTH_REG(mx, mn) \
|
||
MAX17055_MAX_MIN_REG((int8_t)(mx), (int8_t)(mn))
|
||
/* Converts state-of-charge alert range for SALRTTH_REG */
|
||
#define MAX17055_SALRTTH_REG(mx, mn) \
|
||
MAX17055_MAX_MIN_REG((uint8_t)(mx), (uint8_t)(mn))
|
||
/* Converts current alert range for IALRTTH_REG */
|
||
/* Current resolution: 0.4mV/RSENSE */
|
||
#define MAX17055_IALRTTH_MUL (10 * BATTERY_MAX17055_RSENSE)
|
||
#define MAX17055_IALRTTH_DIV 4
|
||
#define MAX17055_IALRTTH_REG(mx, mn) \
|
||
MAX17055_MAX_MIN_REG( \
|
||
(int8_t)(mx * MAX17055_IALRTTH_MUL / MAX17055_IALRTTH_DIV), \
|
||
(int8_t)(mn * MAX17055_IALRTTH_MUL / MAX17055_IALRTTH_DIV))
|
||
|
||
/*
|
||
* max17055 needs some special battery parameters for fuel gauge
|
||
* learning algorithm. Maxim can help characterize the battery pack
|
||
* to get a full parameter list. We create a data structure to store
|
||
* the battery parameters in the format of max17055 register values.
|
||
*/
|
||
struct max17055_batt_profile {
|
||
/* Design capacity of the cell (LSB = 5uVH / Rsense) */
|
||
uint16_t design_cap;
|
||
/* Charge termination current (LSB = 1.5625uV / Rsense) */
|
||
uint16_t ichg_term;
|
||
/* The combination of empty voltage target and recovery voltage */
|
||
uint16_t v_empty_detect;
|
||
|
||
/*
|
||
* The parameters below are used for advanced (non-EZ) config
|
||
* (dpacc, learn_cfg, tempco, qr_table00, qr_table10,
|
||
* qr_table20, and qr_table30)
|
||
*/
|
||
|
||
/* Change in battery SOC between relaxation points (LSB = pct / 16) */
|
||
uint16_t dpacc;
|
||
/* Magic cell tuning parameters */
|
||
uint16_t learn_cfg;
|
||
uint16_t rcomp0;
|
||
uint16_t tempco;
|
||
uint16_t qr_table00;
|
||
uint16_t qr_table10;
|
||
uint16_t qr_table20;
|
||
uint16_t qr_table30;
|
||
|
||
/*
|
||
* If is_ez_config is nonzero, we only use design_cap, ichg_term,
|
||
* and v_empty_detect to config max17055 (a.k.a. EZ-config).
|
||
*/
|
||
uint8_t is_ez_config;
|
||
|
||
/* Used only for full model */
|
||
const uint16_t *ocv_table;
|
||
};
|
||
|
||
/* Return the special battery parameters max17055 needs. */
|
||
const struct max17055_batt_profile *max17055_get_batt_profile(void);
|
||
|
||
#ifdef CONFIG_BATTERY_MAX17055_ALERT
|
||
/*
|
||
* max17055 supports alert on voltage, current, state-of-charge, and
|
||
* temperature. To enable this feature, the information of the limit range is
|
||
* needed.
|
||
*/
|
||
struct max17055_alert_profile {
|
||
/*
|
||
* Sets voltage upper and lower limits that generate an alert if
|
||
* voltage is outside of the v_alert_mxmn range.
|
||
* The upper 8 bits set the maximum value and the lower 8 bits set the
|
||
* minimum value. Interrupt threshold limits are selectable with 20mV
|
||
* resolution.
|
||
* Use MAX17055_VALRTTH_REG(max, min) to setup the desired range,
|
||
* VALRT_DISABLE to disable the alert.
|
||
*/
|
||
const uint16_t v_alert_mxmn;
|
||
/*
|
||
* Sets temperature upper and lower limits that generate an alert if
|
||
* temperature is outside of the t_alert_mxmn range.
|
||
* The upper 8 bits set the maximum value and the lower 8 bits set the
|
||
* minimum value. Interrupt threshold limits are stored in
|
||
* 2’s-complement format with 1°C resolution.
|
||
* Use MAX17055_TALRTTH_REG(max, min) to setup the desired range,
|
||
* TALRT_DISABLE to disable the alert.
|
||
*/
|
||
const uint16_t t_alert_mxmn;
|
||
/*
|
||
* Sets reported state-of-charge upper and lower limits that generate
|
||
* an alert if SOC is outside of the s_alert_mxmn range.
|
||
* The upper 8 bits set the maximum value and the lower 8 bits set the
|
||
* minimum value. Interrupt threshold limits are configurable with 1%
|
||
* resolution.
|
||
* Use MAX17055_SALRTTH_REG(max, min) to setup the desired range,
|
||
* SALRT_DISABLE to disable the alert.
|
||
*/
|
||
const uint16_t s_alert_mxmn;
|
||
/*
|
||
* Sets current upper and lower limits that generate an alert if
|
||
* current is outside of the i_alert_mxmn range.
|
||
* The upper 8 bits set the maximum value and the lower 8 bits set the
|
||
* minimum value. Interrupt threshold limits are selectable with
|
||
* 0.4mV/R SENSE resolution.
|
||
* Use MAX17055_IALRTTH_REG(max, min) to setup the desired range,
|
||
* IALRT_DISABLE to disable the alert.
|
||
*/
|
||
const uint16_t i_alert_mxmn;
|
||
};
|
||
|
||
/*
|
||
* Return the battery/system's alert threshoulds that max17055 needs.
|
||
*/
|
||
const struct max17055_alert_profile *max17055_get_alert_profile(void);
|
||
#endif /* CONFIG_BATTERY_MAX17055_ALERT */
|
||
#endif /* __CROS_EC_MAX17055_H */
|