| /* |
| * 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 |