blob: 6d4b27cb830c9c4f1279dc71e08e60c3f57e4b5b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* resarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef __BQ27Z561_H__
#define __BQ27Z561_H__
#include "os/mynewt.h"
#include "battery/battery_drv.h"
#ifdef __cplusplus
#extern "C" {
#endif
/* The i2c address of the device */
#define BQ27Z561_I2C_ADDR (0x55)
/*
* The maximum length of data allowed to write to any AltMfrgAccess command
* XXX: no idea what the real size is yet.
*/
#define BQ27Z561_MAX_ALT_MFG_CMD_LEN (32)
/* Maximum amount of bytes we will allow to read/write from flash in one call */
#define BQ27Z561_MAX_FLASH_RW_LEN (64)
/* Flash address start/end */
#define BQ27Z561_FLASH_BEG_ADDR (0x4000)
#define BQ27Z561_FLASH_END_ADDR (0x4600)
/* Standard Data Commands */
#define BQ27Z561_REG_CNTL (0x00)
#define BQ27Z561_REG_AR (0x02)
#define BQ27Z561_REG_ARTTE (0x04)
#define BQ27Z561_REG_TEMP (0x06)
#define BQ27Z561_REG_VOLT (0x08)
#define BQ27Z561_REG_FLAGS (0x0A)
#define BQ27Z561_REG_INSTCURR (0x0C)
#define BQ27Z561_REG_IMAX (0x0E)
#define BQ27Z561_REG_RM (0x10)
#define BQ27Z561_REG_FCC (0x12)
#define BQ27Z561_REG_AI (0x14)
#define BQ27Z561_REG_TTE (0x16)
#define BQ27Z561_REG_TTF (0x18)
#define BQ27Z561_REG_MLI (0x1E)
#define BQ27Z561_REG_MLTTE (0x20)
#define BQ27Z561_REG_AP (0x22)
#define BQ27Z561_REG_INT_TEMP (0x28)
#define BQ27Z561_REG_CC (0x2A)
#define BQ27Z561_REG_RSOC (0x2C)
#define BQ27Z561_REG_SOH (0x2E)
#define BQ27Z561_REG_CV (0x30)
#define BQ27Z561_REG_CHGC (0x32)
#define BQ27Z561_REG_DCAP (0x3C)
#define BQ27Z561_REG_MFRG_ACC (0x3E)
#define BQ27Z561_REG_CHKSUM (0x60)
#define BQ27Z561_REG_VOLT_HI_SET_TH (0x62)
#define BQ27Z561_REG_VOLT_HI_CLR_TH (0x64)
#define BQ27Z561_REG_VOLT_LO_SET_TH (0x66)
#define BQ27Z561_REG_VOLT_LO_CLR_TH (0x68)
#define BQ27Z561_REG_TEMP_HI_SET_TH (0x6A)
#define BQ27Z561_REG_TEMP_HI_CLR_TH (0x6B)
#define BQ27Z561_REG_TEMP_LO_SET_TH (0x6C)
#define BQ27Z561_REG_TEMP_LO_CLR_TH (0x6D)
/* Alt Manufacturer Command List */
#define BQ27Z561_CMD_DEV_TYPE (0x0001)
#define BQ27Z561_CMD_FW_VER (0x0002)
#define BQ27Z561_CMD_HW_VER (0x0003)
#define BQ27Z561_CMD_IF_CHKSUM (0x0004)
#define BQ27Z561_CMD_DF_SIG (0x0005)
#define BQ27Z561_CMD_CHEM_ID (0x0006)
#define BQ27Z561_CMD_PREV_WR (0x0007)
#define BQ27Z561_CMD_CHEM_DF_SIG (0x0008)
#define BQ27Z561_CMD_ALL_DF_SIG (0x0009)
#define BQ27Z561_CMD_RESET (0x0012)
#define BQ27Z561_CMD_GAUGING (0x0021)
#define BQ27Z561_CMD_LIFETIME_DATA_COLLECT (0x0023)
#define BQ27Z561_CMD_LIFETIME_DATA_RESET (0x0028)
#define BQ27Z561_CMD_CALIBRATION_MODE (0x002D)
#define BQ27Z561_CMD_LIFETIME_DATA_FLUSH (0x002E)
#define BQ27Z561_CMD_SEAL_DEVICE (0x0030)
#define BQ27Z561_CMD_SEC_KEYS (0x0035)
#define BQ27Z561_CMD_RESET_DEV (0x0041)
#define BQ27Z561_CMD_SET_DEEP_SLEEP (0x0044)
#define BQ27Z561_CMD_CLR_DEEP_SLEEP (0x0045)
#define BQ27Z561_CMD_PULSE_GPIO (0x0046)
#define BQ27Z561_CMD_TAMBIENT_SYNC (0x0047)
#define BQ27Z561_CMD_DEV_NAME (0x004A)
#define BQ27Z561_CMD_DEV_CHEM (0x004B)
#define BQ27Z561_CMD_MFG_NAME (0x004C)
#define BQ27Z561_CMD_MFG_DATE (0x004D)
#define BQ27Z561_CMD_SERIAL_NUM (0x004E)
#define BQ27Z561_CMD_OP_STATUS (0x0054)
#define BQ27Z561_CMD_CHG_STATUS (0x0055)
#define BQ27Z561_CMD_GAUGING_STATUS (0x0056)
#define BQ27Z561_CMD_MFG_STATUS (0x0057)
#define BQ27Z561_CMD_LIFETIME_DATA_BLOCK1 (0x0060)
#define BQ27Z561_CMD_MFRG_DATA (0x0070)
#define BQ27Z561_CMD_DA_STATUS1 (0x0071)
#define BQ27Z561_CMD_DA_STATUS2 (0x0072)
#define BQ27Z561_CMD_IT_STATUS1 (0x0073)
#define BQ27Z561_CMD_IT_STATUS2 (0x0074)
#define BQ27Z561_CMD_IT_STATUS3 (0x0075)
#define BQ27Z561_CMD_FCC_SOH (0x0077)
#define BQ27Z561_CMD_FILT_CAP (0x0078)
#define BQ27Z561_CMD_ROM_MODE (0x0F00)
#define BQ27Z561_CMD_EXIT_CAL_MODE (0xF080)
#define BQ27Z561_CMD_OUT_CC_ADC_CAL (0xF081)
#define BQ27Z561_CMD_OUT_SHORT_CC_ADC_CAL (0xF082)
#define BQ27Z561_BATTERY_STATUS_TCA (1 << 14)
#define BQ27Z561_BATTERY_STATUS_TDA (1 << 11)
#define BQ27Z561_BATTERY_STATUS_RCA (1 << 9)
#define BQ27Z561_BATTERY_STATUS_INIT (1 << 7)
#define BQ27Z561_BATTERY_STATUS_DSG (1 << 6)
#define BQ27Z561_BATTERY_STATUS_FC (1 << 5)
#define BQ27Z561_BATTERY_STATUS_FD (1 << 4)
/* Errors returned from some commands */
typedef enum
{
BQ27Z561_OK = 0,
BQ27Z561_ERR_CHKSUM_FAIL = 1,
BQ27Z561_ERR_CMD_MISMATCH = 2,
BQ27Z561_ERR_I2C_ERR = 3,
BQ27Z561_ERR_CMD_LEN = 4,
BQ27Z561_ERR_INV_PARAMS = 5,
BQ27Z561_ERR_ALT_MFG_LEN = 6,
BQ27Z561_ERR_INV_FLASH_ADDR = 7,
BQ27Z561_ERR_FLASH_ADDR_MISMATCH = 8,
} bq27z561_err_t;
/* Config strucutre */
struct bq27z561_cfg
{
/* XXX: not sure what config is as of yet */
int foo;
};
/* Peripheral interface structure */
struct bq27z561_itf
{
uint8_t itf_num;
uint8_t itf_addr;
struct os_mutex *itf_lock;
};
struct bq27z561_init_arg
{
struct bq27z561_itf itf;
struct os_dev *battery;
};
/* BQ27Z561 device */
struct bq27z561
{
/* Underlying OS device */
struct battery_driver dev;
/* Configuration values */
struct bq27z561_cfg bq27_cfg;
/* Interface */
struct bq27z561_itf bq27_itf;
/* Device initialization complete flag */
uint8_t bq27_initialized;
};
/**
* bq27z561 set at rate
*
* Sets the value used in calculating the "at rate time to empty".
*
* @param dev pointer to device
* @param current current rate, in mA
*
* @return int 0: success, -1 error
*/
int bq27z561_set_at_rate(struct bq27z561 *dev, int16_t current);
/**
* bq27z561 get at rate
*
* Gets the value used in calculating the "at rate time to empty".
*
* @param dev pointer to device
* @param current current rate, in mA
*
* @return int 0: success, -1 error
*/
int bq27z561_get_at_rate(struct bq27z561 *dev, int16_t *current);
/**
* bq27z561 get time to empty
*
* Gets amount of time until the battery is fully discharged based on at rate.
*
* @param dev pointer to device
* @param tte time until empty, in minutes
*
* @return int 0: success, -1 error
*/
int bq27z561_get_time_to_empty(struct bq27z561 *dev, uint16_t *tte);
/**
* bq27z561 get temp
*
* Gets the temperature.
*
* @param dev pointer to device
* @param temp_c temperature in deg C
*
* @return int 0: success, -1 error
*/
int bq27z561_get_temp(struct bq27z561 *dev, float *temp_c);
/**
* bq27z561 set low temperature set threshold
*
* Sets low temperature value that triggers interrupt
*
* @param dev pointer to device
* @param temp_c temperature, in C
*
* @return int 0: success, -1 error
*/
int bq27z561_set_temp_lo_set_threshold(struct bq27z561 *dev,
int8_t temp_c);
/**
* bq27z561 set low temperature clear threshold
*
* When interrupt is active and temperature goes above this threshold interrupt
* is cleared.
*
* @param dev pointer to device
* @param temp_c temperature, in C
*
* @return int 0: success, -1 error
*/
int bq27z561_set_temp_lo_clear_threshold(struct bq27z561 *dev,
int16_t temp_c);
/**
* bq27z561 set high temperature set threshold
*
* Sets high temperature value that triggers interrupt
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_set_temp_hi_set_threshold(struct bq27z561 *dev,
int8_t temp_c);
/**
* bq27z561 set high temperature clear threshold
*
* When interrupt is active and temperature goes below this threshold interrupt
* is cleared.
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_set_temp_hi_clear_threshold(struct bq27z561 *dev,
int16_t temp_c);
/**
* bq27z561 get voltage
*
* Gets the measured cell voltage
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_get_voltage(struct bq27z561 *dev, uint16_t *voltage);
/**
* bq27z561 set low voltage set threshold
*
* Sets low voltage value that triggers interrupt
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_set_voltage_lo_set_threshold(struct bq27z561 *dev,
uint16_t voltage);
/**
* bq27z561 set low voltage clear threshold
*
* When interrupt is active and voltage goes above this threshold interrupt
* is cleared.
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_set_voltage_lo_clr_threshold(struct bq27z561 *dev,
uint16_t voltage);
/**
* bq27z561 set high voltage set threshold
*
* Sets high voltage value that triggers interrupt
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_set_voltage_hi_set_threshold(struct bq27z561 *dev,
uint16_t voltage);
/**
* bq27z561 set high voltage clear threshold
*
* When interrupt is active and voltage goes below this threshold interrupt
* is cleared.
*
* @param dev pointer to device
* @param voltage voltage, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_set_voltage_hi_clr_threshold(struct bq27z561 *dev,
uint16_t voltage);
/**
* Check if bq27z561 is initialized and sets bq27z561 initialized flag
* @param dev pointer to device
* @param initialized device initialized flag
* @return int 0: success, -1 error
*/
int
bq27z561_get_init_status(struct bq27z561 *dev, uint8_t *initialized);
/**
* bq27z561 get batt status
*
* Gets the battery status
*
* @param dev pointer to device
* @param status battery status flags
* 0x0010 FD Fully dischargd (0 no 1 yes)
* 0x0020 FC Fully charged (0 no 1 yes)
* 0x0040 DSG Discharging (0 charging 1 discharging)
* 0x0080 INIT Initialization (0 complete 1 active)
* 0x0200 RCA Remaining capacity alarm (0 inactive 1 active)
* 0x0800 TDA Terminate discharge alarm (0 inactive 1 active)
* 0x4000 TCA Terminate charge alarm (0 inactive 1 active)
*
* @return int 0: success, -1 error
*/
int bq27z561_get_batt_status(struct bq27z561 *dev, uint16_t *status);
/**
* bq27z561 get current
*
* Gets the measured current from the coulomb counter
*
* @param dev pointer to device
* @param current current, in mA
*
* @return int 0: success, -1 error
*/
int bq27z561_get_current(struct bq27z561 *dev, int16_t *current);
/**
* bq27z561 get rem capacity
*
* Gets the predicted remaining capacity
*
* @param dev pointer to device
* @param capacity, in mAH
*
* @return int 0: success, -1 error
*/
int bq27z561_get_rem_capacity(struct bq27z561 *dev, uint16_t *capacity);
/**
* bq27z561 get full chg capacity
*
* Gets predicted full charge capacity
*
* @param dev pointer to device
* @param capacity, in mAH
*
* @return int 0: success, -1 error
*/
int bq27z561_get_full_chg_capacity(struct bq27z561 *dev, uint16_t *capacity);
/**
* bq27z561 get average current
*
* Gets average/filtered current
*
* @param dev pointer to device
* @param current, in mA
*
* @return int 0: success, -1 error
*/
int bq27z561_get_avg_current(struct bq27z561 *dev, int16_t *current);
/**
* bq27z561 get average time to empty
*
* Gets the predicted remaining battery capacity based on average current.
*
* @param dev pointer to device
* @param tte average time to empty in minutes
*
* @return int 0: success, -1 error
*/
int bq27z561_get_avg_time_to_empty(struct bq27z561 *dev, uint16_t *tte);
/**
* bq27z561 get average time to full
*
* Gets the predicted remaining time to full charge.
*
* @param dev pointer to device
* @param ttf average time to full in minutes
*
* @return int 0: success, -1 error
*/
int bq27z561_get_avg_time_to_full(struct bq27z561 *dev, uint16_t *ttf);
/**
* bq27z561 get average power
*
* Gets the average power (voltage * avg current). It is negative due to
* discharge and positive due to charge. A zero value indicates battery not
* being discharged.
*
* @param dev pointer to device
* @param pwr average power in mW
*
* @return int 0: success, -1 error
*/
int bq27z561_get_avg_power(struct bq27z561 *dev, int16_t *pwr);
/**
* bq27z561 get internal temp
*
* Gets the internal die temperature
*
* @param dev pointer to device
* @param temp_c temperature, in degrees C.
*
* @return int 0: success, -1 error
*/
int bq27z561_get_internal_temp(struct bq27z561 *dev, float *temp_c);
/**
* bq27z561 get cycle count
*
* Gets the number of discharge cycles
*
* @param dev pointer to device
* @param cycles number of discharge cycles
*
* @return int 0: success, -1 error
*/
int bq27z561_get_discharge_cycles(struct bq27z561 *dev, uint16_t *cycles);
/**
* bq27z561 get relatives state of charge
*
* Gets predicted remaining capacity as a percentage of full charge capacity
*
* @param dev pointer to device
* @param pcnt
*
* @return int 0: success, -1 error
*/
int bq27z561_get_relative_state_of_charge(struct bq27z561 *dev, uint8_t *pcnt);
/**
* bq27z561 get state of health
*
* Returns the state of health as a percentage of the design capacity
*
* @param dev pointer to device
* @param pcnt % of design capacity
*
* @return int 0: success, -1 error
*/
int bq27z561_get_state_of_health(struct bq27z561 *dev, uint8_t *pcnt);
/**
* bq27z561 get charging voltage
*
* Returns the desired charging voltage
*
* @param dev pointer to device
* @param voltage desired charging current, in mV
*
* @return int 0: success, -1 error
*/
int bq27z561_get_charging_voltage(struct bq27z561 *dev, uint16_t *voltage);
/**
* bq27z561 get charging current
*
* Returns the desired charging current
*
* @param dev pointer to device
* @param current desired charging current, in mA
*
* @return int 0: success, -1 error
*/
int bq27z561_get_charging_current(struct bq27z561 *dev, uint16_t *current);
/**
* bq27z561 read flash
*
* Reads 'buflen' bytes from flash at address 'addr'
*
* @param dev
* @param addr Flash address to read from.
* @param buf pointer to buffer where flash data will be stored. Cannot be NULL
* @param buflen Number of bytes to read. Cannot be 0 and it must be less than
* or equal to BQ27Z561_MAX_FLASH_READ
*
* @return bq27z561_err_t
*/
bq27z561_err_t bq27x561_rd_flash(struct bq27z561 *dev, uint16_t addr,
uint8_t *buf, int buflen);
bq27z561_err_t bq27x561_rd_alt_mfg_cmd(struct bq27z561 *dev, uint16_t cmd,
uint8_t *val, int val_len);
bq27z561_err_t bq27x561_wr_alt_mfg_cmd(struct bq27z561 *dev, uint16_t cmd,
uint8_t *buf, int len);
/**
* bq27z561 rd std reg word
*
* Allows reading of a standard "command" (register).
*
* NOTE: it is not expected that this api will be used by drivers or
* applications. Its use is intended to be internal but is provided for
* use by the shell.
*
* @param dev pointer to device
* @param reg register to read
* @param val returned value.
*
* @return int
*/
int bq27z561_rd_std_reg_word(struct bq27z561 *dev, uint8_t reg, uint16_t *val);
/**
* Configure the bq27z561.
*
* @param ptr to bq27z561 device
* @param ptr to bq27z561 config
*
* @return 0 on success, non-zero on failure.
*/
int bq27z561_config(struct bq27z561 * bq27z561, struct bq27z561_cfg * cfg);
/**
* Expects to be called back through os_dev_create().
*
* @param ptr to the device object associated with this accelerometer
* @param argument passed to OS device init
*
* @return 0 on success, non-zero on failure.
*/
int bq27z561_init(struct os_dev * dev, void * arg);
#if MYNEWT_VAL(BQ27Z561_CLI)
/**
* Initialize the BQ27Z561 shell extensions.
*
* @return 0 on success, non-zero on failure.
*/
int bq27z561_shell_init(void);
#endif
#ifdef __cplusplus
}
#endif
#endif