blob: a8317366b9230e3b5eb47b4d01afcbc8d1f35599 [file] [log] [blame]
/* Copyright 2012 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Smart battery v1.0
* Smart battery charger v1.1
*/
#ifndef __CROS_EC_BATTERY_SMART_H
#define __CROS_EC_BATTERY_SMART_H
#include "common.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Smart battery and charger I2C address */
#define BATTERY_ADDR_FLAGS 0x0B
#define CHARGER_ADDR_FLAGS 0x09
/* Charger functions */
#define SB_CHARGER_SPEC_INFO 0x11
#define SB_CHARGE_MODE 0x12
#define SB_CHARGER_STATUS 0x13
#define SB_CHARGING_CURRENT 0x14
#define SB_CHARGING_VOLTAGE 0x15
#define SB_ALARM_WARNING 0x16
/* Battery functions */
#define SB_MANUFACTURER_ACCESS 0x00
#define SB_REMAINING_CAPACITY_ALARM 0x01
#define SB_REMAINING_TIME_ALARM 0x02
#define SB_BATTERY_MODE 0x03
#define SB_AT_RATE 0x04
#define SB_AT_RATE_TIME_TO_FULL 0x05
#define SB_AT_RATE_TIME_TO_EMPTY 0x06
#define SB_AT_RATE_OK 0x07
#define SB_TEMPERATURE 0x08
#define SB_VOLTAGE 0x09
#define SB_CURRENT 0x0a
#define SB_AVERAGE_CURRENT 0x0b
#define SB_MAX_ERROR 0x0c
#define SB_RELATIVE_STATE_OF_CHARGE 0x0d
#define SB_ABSOLUTE_STATE_OF_CHARGE 0x0e
#define SB_REMAINING_CAPACITY 0x0f
#define SB_FULL_CHARGE_CAPACITY 0x10
#define SB_RUN_TIME_TO_EMPTY 0x11
#define SB_AVERAGE_TIME_TO_EMPTY 0x12
#define SB_AVERAGE_TIME_TO_FULL 0x13
#define SB_CHARGING_CURRENT 0x14
#define SB_CHARGING_VOLTAGE 0x15
#define SB_BATTERY_STATUS 0x16
#define SB_CYCLE_COUNT 0x17
#define SB_DESIGN_CAPACITY 0x18
#define SB_DESIGN_VOLTAGE 0x19
#define SB_SPECIFICATION_INFO 0x1a
#define SB_MANUFACTURE_DATE 0x1b
#define SB_SERIAL_NUMBER 0x1c
#define SB_MANUFACTURER_NAME 0x20
#define SB_DEVICE_NAME 0x21
#define SB_DEVICE_CHEMISTRY 0x22
#define SB_MANUFACTURER_DATA 0x23
#define SB_OPTIONAL_MFG_FUNC1 0x3C
#define SB_OPTIONAL_MFG_FUNC2 0x3D
#define SB_OPTIONAL_MFG_FUNC3 0x3E
#define SB_OPTIONAL_MFG_FUNC4 0x3F
/* Extension of smart battery spec, may not be supported on all platforms */
#define SB_PACK_STATUS 0x43
#define SB_ALT_MANUFACTURER_ACCESS 0x44
#define SB_MANUFACTURE_INFO 0x70
/* Battery mode */
#define MODE_INTERNAL_CHARGE_CONTROLLER BIT(0)
#define MODE_PRIMARY_BATTERY_SUPPORT BIT(1)
#define MODE_CONDITION_CYCLE BIT(7)
#define MODE_CHARGE_CONTROLLER_ENABLED BIT(8)
#define MODE_PRIMARY_BATTERY BIT(9)
#define MODE_ALARM BIT(13)
#define MODE_CHARGER BIT(14)
#define MODE_CAPACITY BIT(15)
/* Battery status */
#define STATUS_ERR_CODE_MASK 0xf
#define STATUS_CODE_OK 0
#define STATUS_CODE_BUSY 1
#define STATUS_CODE_RESERVED 2
#define STATUS_CODE_UNSUPPORTED 3
#define STATUS_CODE_ACCESS_DENIED 4
#define STATUS_CODE_OVERUNDERFLOW 5
#define STATUS_CODE_BADSIZE 6
#define STATUS_CODE_UNKNOWN_ERROR 7
#define STATUS_FULLY_DISCHARGED BIT(4)
#define STATUS_FULLY_CHARGED BIT(5)
#define STATUS_DISCHARGING BIT(6)
#define STATUS_INITIALIZED BIT(7)
#define STATUS_REMAINING_TIME_ALARM BIT(8)
#define STATUS_REMAINING_CAPACITY_ALARM BIT(9)
#define STATUS_TERMINATE_DISCHARGE_ALARM BIT(11)
#define STATUS_OVERTEMP_ALARM BIT(12)
#define STATUS_TERMINATE_CHARGE_ALARM BIT(14)
#define STATUS_OVERCHARGED_ALARM BIT(15)
/* Battery Spec Info */
#define BATTERY_SPEC_REVISION_MASK 0x000F
#define BATTERY_SPEC_REVISION_SHIFT 0
#define BATTERY_SPEC_VERSION_MASK 0x00F0
#define BATTERY_SPEC_VERSION_SHIFT 4
#define BATTERY_SPEC_VSCALE_MASK 0x0F00
#define BATTERY_SPEC_VSCALE_SHIFT 8
#define BATTERY_SPEC_IPSCALE_MASK 0xF000
#define BATTERY_SPEC_IPSCALE_SHIFT 12
#define BATTERY_SPEC_VERSION(INFO) \
((INFO & BATTERY_SPEC_VERSION_MASK) >> BATTERY_SPEC_VERSION_SHIFT)
/* Smart battery version info */
#define BATTERY_SPEC_VER_1_0 1
#define BATTERY_SPEC_VER_1_1 2
#define BATTERY_SPEC_VER_1_1_WITH_PEC 3
/* Smart battery revision info */
#define BATTERY_SPEC_REVISION_1 1
/* Charge mode */
#define CHARGE_FLAG_INHIBIT_CHARGE BIT(0)
#define CHARGE_FLAG_ENABLE_POLLING BIT(1)
#define CHARGE_FLAG_POR_RESET BIT(2)
#define CHARGE_FLAG_RESET_TO_ZERO BIT(3)
/* Charger status */
#define CHARGER_CHARGE_INHIBITED BIT(0)
#define CHARGER_POLLING_ENABLED BIT(1)
#define CHARGER_VOLTAGE_NOTREG BIT(2)
#define CHARGER_CURRENT_NOTREG BIT(3)
#define CHARGER_LEVEL_2 BIT(4)
#define CHARGER_LEVEL_3 BIT(5)
#define CHARGER_CURRENT_OR BIT(6)
#define CHARGER_VOLTAGE_OR BIT(7)
#define CHARGER_RES_OR BIT(8)
#define CHARGER_RES_COLD BIT(9)
#define CHARGER_RES_HOT BIT(10)
#define CHARGER_RES_UR BIT(11)
#define CHARGER_ALARM_INHIBITED BIT(12)
#define CHARGER_POWER_FAIL BIT(13)
#define CHARGER_BATTERY_PRESENT BIT(14)
#define CHARGER_AC_PRESENT BIT(15)
#define CHARGER_BYPASS_MODE BIT(16)
/* Charger specification info */
#define INFO_CHARGER_SPEC(INFO) ((INFO) & 0xf)
#define INFO_SELECTOR_SUPPORT(INFO) (((INFO) >> 4) & 1)
/* Manufacturer Access parameters */
#define PARAM_SAFETY_STATUS 0x51
#define PARAM_OPERATION_STATUS 0x54
#define PARAM_FIRMWARE_RUNTIME 0x62
/* Operation status masks -- 6 byte reply */
/* reply[3] */
#define BATTERY_DISCHARGING_DISABLED 0x20
#define BATTERY_CHARGING_DISABLED 0x40
/* Battery manufacture date */
#define MANUFACTURE_DATE_DAY_MASK 0x001F
#define MANUFACTURE_DATE_DAY_SHIFT 0
#define MANUFACTURE_DATE_MONTH_MASK 0x01E0
#define MANUFACTURE_DATE_MONTH_SHIFT 5
#define MANUFACTURE_DATE_YEAR_MASK 0xFE00
#define MANUFACTURE_DATE_YEAR_SHIFT 9
#define MANUFACTURE_DATE_YEAR_OFFSET 1980
#define MANUFACTURE_RUNTIME_SIZE 4
/* Read from battery */
int sb_read(int cmd, int *param);
/**
* Read null-terminated string from battery
* @param offset Battery register to read from
* @param data Buffer to hold the string
* @param len Length of data buffer
*/
int sb_read_string(int offset, uint8_t *data, int len);
/**
* Read sized block of data from battery
* @param offset Battery register to read from
* @param data Buffer to hold read data
* @param len Length of data buffer
*/
int sb_read_sized_block(int offset, uint8_t *data, int len);
/* Write to battery */
int sb_write(int cmd, int param);
/**
* Write block to do battery cutoff
*
* @param reg Battery cutoff register
* @param val Battery cutoff data value
* @param len Param val data length
* @return non-zero if error
*/
int sb_write_block(int reg, const uint8_t *val, int len);
/* Read manufactures access data from the battery */
int sb_read_mfgacc(int cmd, int block, uint8_t *data, int len);
/* Read manufactures access data from the battery */
int sb_read_mfgacc_block(int cmd, int block, uint8_t *data, int len);
#ifdef __cplusplus
}
#endif
#endif /* __CROS_EC_BATTERY_SMART_H */
OSZAR »