OpenRTX/subprojects/packagefiles/XPowersLib/src/XPowersAXP2101.tpp

3070 lines
96 KiB
C++

/**
*
* @license MIT License
*
* Copyright (c) 2022 lewis he
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @file XPowersAXP2101.tpp
* @author Lewis He (lewishe@outlook.com)
* @date 2022-05-07
*
*/
#if defined(ARDUINO)
#include <Arduino.h>
#endif /*ARDUINO*/
#include "XPowersCommon.tpp"
#include "REG/AXP2101Constants.h"
#include "XPowersLibInterface.hpp"
typedef enum {
XPOWERS_AXP2101_IRQ_TIME_1S,
XPOWERS_AXP2101_IRQ_TIME_1S5,
XPOWERS_AXP2101_IRQ_TIME_2S,
XPOWERS_AXP2101_PRESSOFF_2S5,
} xpowers_irq_time_t;
typedef enum {
XPOWERS_AXP2101_PRECHARGE_0MA,
XPOWERS_AXP2101_PRECHARGE_25MA,
XPOWERS_AXP2101_PRECHARGE_50MA,
XPOWERS_AXP2101_PRECHARGE_75MA,
XPOWERS_AXP2101_PRECHARGE_100MA,
XPOWERS_AXP2101_PRECHARGE_125MA,
XPOWERS_AXP2101_PRECHARGE_150MA,
XPOWERS_AXP2101_PRECHARGE_175MA,
XPOWERS_AXP2101_PRECHARGE_200MA,
} xpowers_prechg_t;
typedef enum {
XPOWERS_AXP2101_CHG_ITERM_0MA,
XPOWERS_AXP2101_CHG_ITERM_25MA,
XPOWERS_AXP2101_CHG_ITERM_50MA,
XPOWERS_AXP2101_CHG_ITERM_75MA,
XPOWERS_AXP2101_CHG_ITERM_100MA,
XPOWERS_AXP2101_CHG_ITERM_125MA,
XPOWERS_AXP2101_CHG_ITERM_150MA,
XPOWERS_AXP2101_CHG_ITERM_175MA,
XPOWERS_AXP2101_CHG_ITERM_200MA,
} xpowers_axp2101_chg_iterm_t;
typedef enum {
XPOWERS_AXP2101_THREMAL_60DEG,
XPOWERS_AXP2101_THREMAL_80DEG,
XPOWERS_AXP2101_THREMAL_100DEG,
XPOWERS_AXP2101_THREMAL_120DEG,
} xpowers_thermal_t;
typedef enum {
XPOWERS_AXP2101_CHG_TRI_STATE, //tri_charge
XPOWERS_AXP2101_CHG_PRE_STATE, //pre_charge
XPOWERS_AXP2101_CHG_CC_STATE, //constant charge
XPOWERS_AXP2101_CHG_CV_STATE, //constant voltage
XPOWERS_AXP2101_CHG_DONE_STATE, //charge done
XPOWERS_AXP2101_CHG_STOP_STATE, //not chargin
} xpowers_chg_status_t;
typedef enum {
XPOWERS_AXP2101_WAKEUP_IRQ_PIN_TO_LOW = _BV(4),
XPOWERS_AXP2101_WAKEUP_PWROK_TO_LOW = _BV(3),
XPOWERS_AXP2101_WAKEUP_DC_DLO_SELECT = _BV(2),
} xpowers_wakeup_t;
typedef enum {
XPOWERS_AXP2101_FAST_DCDC1,
XPOWERS_AXP2101_FAST_DCDC2,
XPOWERS_AXP2101_FAST_DCDC3,
XPOWERS_AXP2101_FAST_DCDC4,
XPOWERS_AXP2101_FAST_DCDC5,
XPOWERS_AXP2101_FAST_ALDO1,
XPOWERS_AXP2101_FAST_ALDO2,
XPOWERS_AXP2101_FAST_ALDO3,
XPOWERS_AXP2101_FAST_ALDO4,
XPOWERS_AXP2101_FAST_BLDO1,
XPOWERS_AXP2101_FAST_BLDO2,
XPOWERS_AXP2101_FAST_CPUSLDO,
XPOWERS_AXP2101_FAST_DLDO1,
XPOWERS_AXP2101_FAST_DLDO2,
} xpowers_fast_on_opt_t;
typedef enum {
XPOWERS_AXP2101_SEQUENCE_LEVEL_0,
XPOWERS_AXP2101_SEQUENCE_LEVEL_1,
XPOWERS_AXP2101_SEQUENCE_LEVEL_2,
XPOWERS_AXP2101_SEQUENCE_DISABLE,
} xpower_start_sequence_t;
typedef enum {
XPOWERS_AXP2101_WDT_IRQ_TO_PIN, //Just interrupt to pin
XPOWERS_AXP2101_WDT_IRQ_AND_RSET, //IRQ to pin and reset pmu system
XPOWERS_AXP2101_WDT_IRQ_AND_RSET_PD_PWROK, //IRQ to pin and reset pmu system,pull down pwrok
XPOWERS_AXP2101_WDT_IRQ_AND_RSET_ALL_OFF, //IRQ to pin and reset pmu system,turn off dcdc & ldo ,pull down pwrok
} xpowers_wdt_config_t;
typedef enum {
XPOWERS_AXP2101_WDT_TIMEOUT_1S,
XPOWERS_AXP2101_WDT_TIMEOUT_2S,
XPOWERS_AXP2101_WDT_TIMEOUT_4S,
XPOWERS_AXP2101_WDT_TIMEOUT_8S,
XPOWERS_AXP2101_WDT_TIMEOUT_16S,
XPOWERS_AXP2101_WDT_TIMEOUT_32S,
XPOWERS_AXP2101_WDT_TIMEOUT_64S,
XPOWERS_AXP2101_WDT_TIMEOUT_128S,
} xpowers_wdt_timeout_t;
typedef enum {
XPOWERS_AXP2101_VBUS_VOL_LIM_3V88,
XPOWERS_AXP2101_VBUS_VOL_LIM_3V96,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V04,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V12,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V20,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V28,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V36,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V44,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V52,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V60,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V68,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V76,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V84,
XPOWERS_AXP2101_VBUS_VOL_LIM_4V92,
XPOWERS_AXP2101_VBUS_VOL_LIM_5V,
XPOWERS_AXP2101_VBUS_VOL_LIM_5V08,
} xpower_vbus_vol_limit_t;
typedef enum {
XPOWERS_AXP2101_VSYS_VOL_4V1,
XPOWERS_AXP2101_VSYS_VOL_4V2,
XPOWERS_AXP2101_VSYS_VOL_4V3,
XPOWERS_AXP2101_VSYS_VOL_4V4,
XPOWERS_AXP2101_VSYS_VOL_4V5,
XPOWERS_AXP2101_VSYS_VOL_4V6,
XPOWERS_AXP2101_VSYS_VOL_4V7,
XPOWERS_AXP2101_VSYS_VOL_4V8,
} xpower_chg_dpm_t;
typedef enum {
XPOWER_POWERON_SRC_POWERON_LOW, //POWERON low for on level when POWERON Mode as POWERON Source
XPOWER_POWERON_SRC_IRQ_LOW, //IRQ PIN Pull-down as POWERON Source
XPOWER_POWERON_SRC_VBUS_INSERT, //Vbus Insert and Good as POWERON Source
XPOWER_POWERON_SRC_BAT_CHARGE, //Vbus Insert and Good as POWERON Source
XPOWER_POWERON_SRC_BAT_INSERT, //Battery Insert and Good as POWERON Source
XPOWER_POWERON_SRC_ENMODE, //POWERON always high when EN Mode as POWERON Source
XPOWER_POWERON_SRC_UNKONW, //Unkonw
} xpower_power_on_source_t;
typedef enum {
XPOWER_POWEROFF_SRC_PWEKEY_PULLDOWN, //POWERON Pull down for off level when POWERON Mode as POWEROFF Source
XPOWER_POWEROFF_SRC_SOFT_OFF, //Software configuration as POWEROFF Source
XPOWER_POWEROFF_SRC_PWEKEY_LOW, //POWERON always low when EN Mode as POWEROFF Source
XPOWER_POWEROFF_SRC_UNDER_VSYS, //Vsys Under Voltage as POWEROFF Source
XPOWER_POWEROFF_SRC_OVER_VBUS, //VBUS Over Voltage as POWEROFF Source
XPOWER_POWEROFF_SRC_UNDER_VOL, //DCDC Under Voltage as POWEROFF Source
XPOWER_POWEROFF_SRC_OVER_VOL, //DCDC Over Voltage as POWEROFF Source
XPOWER_POWEROFF_SRC_OVER_TEMP, //Die Over Temperature as POWEROFF Source
XPOWER_POWEROFF_SRC_UNKONW, //Unkonw
} xpower_power_off_source_t;
typedef enum {
XPOWER_PWROK_DELAY_8MS,
XPOWER_PWROK_DELAY_16MS,
XPOWER_PWROK_DELAY_32MS,
XPOWER_PWROK_DELAY_64MS,
} xpower_pwrok_delay_t;
class XPowersAXP2101 :
public XPowersCommon<XPowersAXP2101>, public XPowersLibInterface
{
friend class XPowersCommon<XPowersAXP2101>;
public:
#if defined(ARDUINO)
XPowersAXP2101(TwoWire &w, int sda = SDA, int scl = SCL, uint8_t addr = AXP2101_SLAVE_ADDRESS)
{
__wire = &w;
__sda = sda;
__scl = scl;
__addr = addr;
}
#endif
XPowersAXP2101()
{
#if defined(ARDUINO)
__wire = &Wire;
__sda = SDA;
__scl = SCL;
#endif
__addr = AXP2101_SLAVE_ADDRESS;
}
~XPowersAXP2101()
{
log_i("~XPowersAXP2101");
deinit();
}
#if defined(ARDUINO)
bool init(TwoWire &w, int sda = SDA, int scl = SCL, uint8_t addr = AXP2101_SLAVE_ADDRESS)
{
__wire = &w;
__sda = sda;
__scl = scl;
__addr = addr;
return begin();
}
#endif
bool init()
{
return begin();
}
void deinit()
{
end();
}
/*
* PMU status functions
*/
uint16_t status()
{
uint16_t status1 = readRegister(XPOWERS_AXP2101_STATUS1) & 0x1F;
uint16_t status2 = readRegister(XPOWERS_AXP2101_STATUS2) & 0x1F;;
return (status1 << 8) | (status2);
}
bool isVbusGood(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS1, 5);
}
bool getBatfetState(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS1, 4);
}
// getBatPresentState
bool isBatteryConnect(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS1, 3);
}
bool isBatInActiveModeState(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS1, 3);
}
bool getThermalRegulationStatus(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS1, 2);
}
bool getCurrnetLimitStatus(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS1, 1);
}
bool isCharging(void)
{
return (readRegister(XPOWERS_AXP2101_STATUS2) >> 5) == 0x01;
}
bool isDischarge(void)
{
return (readRegister(XPOWERS_AXP2101_STATUS2) >> 5) == 0x02;
}
bool isStandby(void)
{
return (readRegister(XPOWERS_AXP2101_STATUS2) >> 5) == 0x00;
}
bool isPowerOn(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS2, 4);
}
bool isPowerOff(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS2, 4);
}
bool isVbusIn(void)
{
return getRegisterBit(XPOWERS_AXP2101_STATUS2, 3) == 0 && isVbusGood();
}
xpowers_chg_status_t getChargerStatus(void)
{
int val = readRegister(XPOWERS_AXP2101_STATUS2);
if (val == -1)return XPOWERS_AXP2101_CHG_STOP_STATE;
val &= 0x07;
return (xpowers_chg_status_t)val;
}
/*
* Data Buffer
*/
bool writeDataBuffer(uint8_t *data, uint8_t size)
{
if (size > XPOWERS_AXP2101_DATA_BUFFER_SIZE)return false;
return writeRegister(XPOWERS_AXP2101_DATA_BUFFER1, data, size);
}
bool readDataBuffer(uint8_t *data, uint8_t size)
{
if (size > XPOWERS_AXP2101_DATA_BUFFER_SIZE)return false;
return readRegister(XPOWERS_AXP2101_DATA_BUFFER1, data, size);
}
/*
* PMU common configuration
*/
/**
* @brief Internal off-discharge enable for DCDC & LDO & SWITCH
*/
void enableInternalDischarge(void)
{
setRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 5);
}
void disableInternalDischarge(void)
{
clrRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 5);
}
/**
* @brief PWROK PIN pull low to Restart
*/
void enablePwrOkPinPullLow(void)
{
setRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 3);
}
void disablePwrOkPinPullLow(void)
{
clrRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 3);
}
void enablePwronShutPMIC(void)
{
setRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 2);
}
void disablePwronShutPMIC(void)
{
clrRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 2);
}
/**
* @brief Restart the SoC System, POWOFF/POWON and reset the related registers
* @retval None
*/
void reset(void)
{
setRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 1);
}
/**
* @brief Set shutdown, calling shutdown will turn off all power channels,
* only VRTC belongs to normal power supply
* @retval None
*/
void shutdown(void)
{
setRegisterBit(XPOWERS_AXP2101_COMMON_CONFIG, 0);
}
/**
* @brief BATFET control / REG 12H
* @note DIE Over Temperature Protection Level1 Configuration
* @param opt: 0:115 , 1:125 , 2:135
* @retval None
*/
void setBatfetDieOverTempLevel1(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_BATFET_CTRL);
if (val == -1)return;
val &= 0xF9;
writeRegister(XPOWERS_AXP2101_BATFET_CTRL, val | (opt << 1));
}
uint8_t getBatfetDieOverTempLevel1(void)
{
return (readRegister(XPOWERS_AXP2101_BATFET_CTRL) & 0x06);
}
void enableBatfetDieOverTempDetect(void)
{
setRegisterBit(XPOWERS_AXP2101_BATFET_CTRL, 0);
}
void disableBatfetDieOverTempDetect(void)
{
clrRegisterBit(XPOWERS_AXP2101_BATFET_CTRL, 0);
}
/**
* @param opt: 0:115 , 1:125 , 2:135
*/
void setDieOverTempLevel1(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_DIE_TEMP_CTRL);
if (val == -1)return;
val &= 0xF9;
writeRegister(XPOWERS_AXP2101_DIE_TEMP_CTRL, val | (opt << 1));
}
uint8_t getDieOverTempLevel1(void)
{
return (readRegister(XPOWERS_AXP2101_DIE_TEMP_CTRL) & 0x06);
}
void enableDieOverTempDetect(void)
{
setRegisterBit(XPOWERS_AXP2101_DIE_TEMP_CTRL, 0);
}
void disableDieOverTempDetect(void)
{
clrRegisterBit(XPOWERS_AXP2101_DIE_TEMP_CTRL, 0);
}
// Linear Charger Vsys voltage dpm
void setLinearChargerVsysDpm(xpower_chg_dpm_t opt)
{
int val = readRegister(XPOWERS_AXP2101_MIN_SYS_VOL_CTRL);
if (val == -1)return;
val &= 0x8F;
writeRegister(XPOWERS_AXP2101_MIN_SYS_VOL_CTRL, val | (opt << 4));
}
uint8_t getLinearChargerVsysDpm(void)
{
int val = readRegister(XPOWERS_AXP2101_MIN_SYS_VOL_CTRL);
if (val == -1)return 0;
val &= 0x70;
return (val & 0x70) >> 4;
}
// Set the minimum common working voltage of the PMU VBUS input,
// below this value will turn off the PMU
void setVbusVoltageLimit(xpower_vbus_vol_limit_t opt)
{
int val = readRegister(XPOWERS_AXP2101_INPUT_VOL_LIMIT_CTRL);
if (val == -1)return;
val &= 0xF0;
writeRegister(XPOWERS_AXP2101_INPUT_VOL_LIMIT_CTRL, val | (opt & 0x0F));
}
uint8_t getVbusVoltageLimit(void)
{
return (readRegister(XPOWERS_AXP2101_INPUT_VOL_LIMIT_CTRL) & 0x0F);
}
/**
* @brief Set VBUS Current Input Limit.
* @param opt: View the related chip type xpowers_axp2101_vbus_cur_limit_t enumeration
* parameters in "XPowersParams.hpp"
* @retval true valid false invalid
*/
bool setVbusCurrentLimit(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_INPUT_CUR_LIMIT_CTRL);
if (val == -1)return false;
val &= 0xF8;
return 0 == writeRegister(XPOWERS_AXP2101_INPUT_CUR_LIMIT_CTRL, val | (opt & 0x07));
}
/**
* @brief Get VBUS Current Input Limit.
* @retval View the related chip type xpowers_axp2101_vbus_cur_limit_t enumeration
* parameters in "XPowersParams.hpp"
*/
uint8_t getVbusCurrentLimit(void)
{
return (readRegister(XPOWERS_AXP2101_INPUT_CUR_LIMIT_CTRL) & 0x07);
}
/**
* @brief Reset the fuel gauge
*/
void resetGauge(void)
{
setRegisterBit(XPOWERS_AXP2101_RESET_FUEL_GAUGE, 3);
}
/**
* @brief reset the gauge besides reset
*/
void resetGaugeBesides(void)
{
setRegisterBit(XPOWERS_AXP2101_RESET_FUEL_GAUGE, 2);
}
/**
* @brief Gauge Module
*/
void enableGauge(void)
{
setRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 3);
}
void disableGauge(void)
{
clrRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 3);
}
/**
* @brief Button Battery charge
*/
bool enableButtonBatteryCharge(void)
{
return setRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 2);
}
bool disableButtonBatteryCharge(void)
{
return clrRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 2);
}
bool isEanbleButtonBatteryCharge()
{
return getRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 2);
}
//Button battery charge termination voltage setting
bool setButtonBatteryChargeVoltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_BTN_VOL_STEPS) {
log_e("Mistake ! Button battery charging step voltage is %u mV", XPOWERS_AXP2101_BTN_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_BTN_VOL_MIN) {
log_e("Mistake ! The minimum charge termination voltage of the coin cell battery is %u mV", XPOWERS_AXP2101_BTN_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_BTN_VOL_MAX) {
log_e("Mistake ! The minimum charge termination voltage of the coin cell battery is %u mV", XPOWERS_AXP2101_BTN_VOL_MAX);
return false;
}
int val = readRegister(XPOWERS_AXP2101_BTN_BAT_CHG_VOL_SET);
if (val == -1)return 0;
val &= 0xF8;
val |= (millivolt - XPOWERS_AXP2101_BTN_VOL_MIN) / XPOWERS_AXP2101_BTN_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_BTN_BAT_CHG_VOL_SET, val);
}
uint16_t getButtonBatteryVoltage(void)
{
int val = readRegister(XPOWERS_AXP2101_BTN_BAT_CHG_VOL_SET);
if (val == -1)return 0;
return (val & 0x07) * XPOWERS_AXP2101_BTN_VOL_STEPS + XPOWERS_AXP2101_BTN_VOL_MIN;
}
/**
* @brief Cell Battery charge
*/
void enableCellbatteryCharge(void)
{
setRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 1);
}
void disableCellbatteryCharge(void)
{
clrRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 1);
}
/**
* @brief Watchdog Module
*/
void enableWatchdog(void)
{
setRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 0);
enableIRQ(XPOWERS_AXP2101_WDT_EXPIRE_IRQ);
}
void disableWatchdog(void)
{
disableIRQ(XPOWERS_AXP2101_WDT_EXPIRE_IRQ);
clrRegisterBit(XPOWERS_AXP2101_CHARGE_GAUGE_WDT_CTRL, 0);
}
/**
* @brief Watchdog Config
* @note
* @param opt: 0: IRQ Only 1: IRQ and System reset 2: IRQ, System Reset and Pull down PWROK 1s 3: IRQ, System Reset, DCDC/LDO PWROFF & PWRON
* @retval None
*/
void setWatchdogConfig(xpowers_wdt_config_t opt)
{
int val = readRegister(XPOWERS_AXP2101_WDT_CTRL);
if (val == -1)return;
val &= 0xCF;
writeRegister(XPOWERS_AXP2101_WDT_CTRL, val | (opt << 4));
}
uint8_t getWatchConfig(void)
{
return (readRegister(XPOWERS_AXP2101_WDT_CTRL) & 0x30) >> 4;
}
void clrWatchdog(void)
{
setRegisterBit(XPOWERS_AXP2101_WDT_CTRL, 3);
}
void setWatchdogTimeout(xpowers_wdt_timeout_t opt)
{
int val = readRegister(XPOWERS_AXP2101_WDT_CTRL);
if (val == -1)return;
val &= 0xF8;
writeRegister(XPOWERS_AXP2101_WDT_CTRL, val | opt);
}
uint8_t getWatchdogTimerout(void)
{
return readRegister(XPOWERS_AXP2101_WDT_CTRL) & 0x07;
}
/**
* @brief Low battery warning threshold 5-20%, 1% per step
* @param opt: 5 ~ 20
* @retval None
*/
void setLowBatWarnThreshold(uint8_t opt)
{
if (opt < 5 || opt > 20)return;
int val = readRegister(XPOWERS_AXP2101_LOW_BAT_WARN_SET);
if (val == -1)return;
val &= 0x0F;
writeRegister(XPOWERS_AXP2101_LOW_BAT_WARN_SET, val | (opt << 4));
}
uint8_t getLowBatWarnThreshold(void)
{
return (readRegister(XPOWERS_AXP2101_LOW_BAT_WARN_SET) & 0xF0) >> 4;
}
/**
* @brief Low battery shutdown threshold 5-20%, 1% per step
* @param opt: 5 ~ 20
* @retval None
*/
void setLowBatShutdownThreshold(uint8_t opt)
{
if (opt < 5 || opt > 20)return;
int val = readRegister(XPOWERS_AXP2101_LOW_BAT_WARN_SET);
if (val == -1)return;
val &= 0xF0;
writeRegister(XPOWERS_AXP2101_LOW_BAT_WARN_SET, val | opt);
}
uint8_t getLowBatShutdownThreshold(void)
{
return (readRegister(XPOWERS_AXP2101_LOW_BAT_WARN_SET) & 0x0F);
}
//! PWRON statu 20
// POWERON always high when EN Mode as POWERON Source
bool isPoweronAlwaysHighSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWRON_STATUS, 5);
}
// Battery Insert and Good as POWERON Source
bool isBattInsertOnSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWRON_STATUS, 4);
}
// Battery Voltage > 3.3V when Charged as Source
bool isBattNormalOnSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWRON_STATUS, 3);
}
// Vbus Insert and Good as POWERON Source
bool isVbusInsertOnSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWRON_STATUS, 2);
}
// IRQ PIN Pull-down as POWERON Source
bool isIrqLowOnSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWRON_STATUS, 1);
}
// POWERON low for on level when POWERON Mode as POWERON Source
bool isPwronLowOnSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWRON_STATUS, 0);
}
xpower_power_on_source_t getPowerOnSource()
{
int val = readRegister(XPOWERS_AXP2101_PWRON_STATUS);
if (val == -1) return XPOWER_POWERON_SRC_UNKONW;
return (xpower_power_on_source_t)val;
}
//! PWROFF status 21
// Die Over Temperature as POWEROFF Source
bool isOverTemperatureOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 7);
}
// DCDC Over Voltage as POWEROFF Source
bool isDcOverVoltageOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 6);
}
// DCDC Under Voltage as POWEROFF Source
bool isDcUnderVoltageOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 5);
}
// VBUS Over Voltage as POWEROFF Source
bool isVbusOverVoltageOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 4);
}
// Vsys Under Voltage as POWEROFF Source
bool isVsysUnderVoltageOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 3);
}
// POWERON always low when EN Mode as POWEROFF Source
bool isPwronAlwaysLowOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 2);
}
// Software configuration as POWEROFF Source
bool isSwConfigOffSource()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 1);
}
// POWERON Pull down for off level when POWERON Mode as POWEROFF Source
bool isPwrSourcePullDown()
{
return getRegisterBit(XPOWERS_AXP2101_PWROFF_STATUS, 0);
}
xpower_power_off_source_t getPowerOffSource()
{
int val = readRegister(XPOWERS_AXP2101_PWROFF_STATUS);
if (val == -1) return XPOWER_POWEROFF_SRC_UNKONW;
return (xpower_power_off_source_t)val;
}
//!REG 22H
void enableOverTemperatureLevel2PowerOff()
{
setRegisterBit(XPOWERS_AXP2101_PWROFF_EN, 2);
}
void disableOverTemperaturePowerOff()
{
clrRegisterBit(XPOWERS_AXP2101_PWROFF_EN, 2);
}
// CHANGE: void enablePwrOnOverVolOffLevelPowerOff()
void enableLongPressShutdown()
{
setRegisterBit(XPOWERS_AXP2101_PWROFF_EN, 1);
}
// CHANGE: void disablePwrOnOverVolOffLevelPowerOff()
void disableLongPressShutdown()
{
clrRegisterBit(XPOWERS_AXP2101_PWROFF_EN, 1);
}
//CHANGE: void enablePwrOffSelectFunction()
void setLongPressRestart()
{
setRegisterBit(XPOWERS_AXP2101_PWROFF_EN, 0);
}
//CHANGE: void disablePwrOffSelectFunction()
void setLongPressPowerOFF()
{
clrRegisterBit(XPOWERS_AXP2101_PWROFF_EN, 0);
}
//!REG 23H
// DCDC 120%(130%) high voltage turn off PMIC function
void enableDCHighVoltageTurnOff()
{
setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 5);
}
void disableDCHighVoltageTurnOff()
{
clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 5);
}
// DCDC5 85% low voltage turn Off PMIC function
void enableDC5LowVoltageTurnOff()
{
setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 4);
}
void disableDC5LowVoltageTurnOff()
{
clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 4);
}
// DCDC4 85% low voltage turn Off PMIC function
void enableDC4LowVoltageTurnOff()
{
setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 3);
}
void disableDC4LowVoltageTurnOff()
{
clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 3);
}
// DCDC3 85% low voltage turn Off PMIC function
void enableDC3LowVoltageTurnOff()
{
setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 2);
}
void disableDC3LowVoltageTurnOff()
{
clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 2);
}
// DCDC2 85% low voltage turn Off PMIC function
void enableDC2LowVoltageTurnOff()
{
setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 1);
}
void disableDC2LowVoltageTurnOff()
{
clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 1);
}
// DCDC1 85% low voltage turn Off PMIC function
void enableDC1LowVoltageTurnOff()
{
setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 0);
}
void disableDC1LowVoltageTurnOff()
{
clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 0);
}
// Set the minimum system operating voltage inside the PMU,
// below this value will shut down the PMU,Adjustment range 2600mV~3300mV
bool setSysPowerDownVoltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_MIN) {
log_e("Mistake ! The minimum settable voltage of VSYS is %u mV", XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_MAX) {
log_e("Mistake ! The maximum settable voltage of VSYS is %u mV", XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_MAX);
return false;
}
int val = readRegister(XPOWERS_AXP2101_VOFF_SET);
if (val == -1)return false;
val &= 0xF8;
return 0 == writeRegister(XPOWERS_AXP2101_VOFF_SET, val | ((millivolt - XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_MIN) / XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_STEPS));
}
uint16_t getSysPowerDownVoltage(void)
{
int val = readRegister(XPOWERS_AXP2101_VOFF_SET);
if (val == -1)return false;
return (val & 0x07) * XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_STEPS + XPOWERS_AXP2101_VSYS_VOL_THRESHOLD_MIN;
}
// PWROK setting and PWROFF sequence control 25.
// Check the PWROK Pin enable after all dcdc/ldo output valid 128ms
void enablePwrOk()
{
setRegisterBit(XPOWERS_AXP2101_PWROK_SEQU_CTRL, 4);
}
void disablePwrOk()
{
clrRegisterBit(XPOWERS_AXP2101_PWROK_SEQU_CTRL, 4);
}
// POWEROFF Delay 4ms after PWROK enable
void eanblePowerOffDelay()
{
setRegisterBit(XPOWERS_AXP2101_PWROK_SEQU_CTRL, 3);
}
// POWEROFF Delay 4ms after PWROK disable
void disablePowerOffDelay()
{
clrRegisterBit(XPOWERS_AXP2101_PWROK_SEQU_CTRL, 3);
}
// POWEROFF Sequence Control the reverse of the Startup
void eanblePowerSequence()
{
setRegisterBit(XPOWERS_AXP2101_PWROK_SEQU_CTRL, 2);
}
// POWEROFF Sequence Control at the same time
void disablePowerSequence()
{
clrRegisterBit(XPOWERS_AXP2101_PWROK_SEQU_CTRL, 2);
}
// Delay of PWROK after all power output good
bool setPwrOkDelay(xpower_pwrok_delay_t opt)
{
int val = readRegister(XPOWERS_AXP2101_PWROK_SEQU_CTRL);
if (val == -1)return false;
val &= 0xFC;
return 0 == writeRegister(XPOWERS_AXP2101_PWROK_SEQU_CTRL, val | opt);
}
xpower_pwrok_delay_t getPwrOkDelay()
{
int val = readRegister(XPOWERS_AXP2101_PWROK_SEQU_CTRL);
if (val == -1)return XPOWER_PWROK_DELAY_8MS;
return (xpower_pwrok_delay_t)(val & 0x03);
}
// Sleep and 26
void wakeupControl(xpowers_wakeup_t opt, bool enable)
{
int val = readRegister(XPOWERS_AXP2101_SLEEP_WAKEUP_CTRL);
if (val == -1)return;
enable ? (val |= opt) : (val &= (~opt));
writeRegister(XPOWERS_AXP2101_SLEEP_WAKEUP_CTRL, val);
}
bool enableWakeup(void)
{
return setRegisterBit(XPOWERS_AXP2101_SLEEP_WAKEUP_CTRL, 1);
}
bool disableWakeup(void)
{
return clrRegisterBit(XPOWERS_AXP2101_SLEEP_WAKEUP_CTRL, 1);
}
bool enableSleep(void)
{
return setRegisterBit(XPOWERS_AXP2101_SLEEP_WAKEUP_CTRL, 0);
}
bool disableSleep(void)
{
return clrRegisterBit(XPOWERS_AXP2101_SLEEP_WAKEUP_CTRL, 0);
}
// RQLEVEL/OFFLEVEL/ONLEVEL setting 27
/**
* @brief IRQLEVEL configur
* @param opt: 0:1s 1:1.5s 2:2s 3:2.5s
*/
void setIrqLevel(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return;
val &= 0xFC;
writeRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 4));
}
/**
* @brief OFFLEVEL configuration
* @param opt: 0:4s 1:6s 2:8s 3:10s
*/
void setOffLevel(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 2));
}
/**
* @brief ONLEVEL configuration
* @param opt: 0:128ms 1:512ms 2:1s 3:2s
*/
void setOnLevel(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | opt);
}
// Fast pwron setting 0 28
// Fast Power On Start Sequence
void setDc4FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | ((opt & 0x3) << 6));
}
void setDc3FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | ((opt & 0x3) << 4));
}
void setDc2FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | ((opt & 0x3) << 2));
}
void setDc1FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | (opt & 0x3));
}
// Fast pwron setting 1 29
void setAldo3FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | ((opt & 0x3) << 6));
}
void setAldo2FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | ((opt & 0x3) << 4));
}
void setAldo1FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | ((opt & 0x3) << 2));
}
void setDc5FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | (opt & 0x3));
}
// Fast pwron setting 2 2A
void setCpuldoFastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | ((opt & 0x3) << 6));
}
void setBldo2FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | ((opt & 0x3) << 4));
}
void setBldo1FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | ((opt & 0x3) << 2));
}
void setAldo4FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | (opt & 0x3));
}
// Fast pwron setting 3 2B
void setDldo2FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL, val | ((opt & 0x3) << 2));
}
void setDldo1FastStartSequence(xpower_start_sequence_t opt)
{
int val = readRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL, val | (opt & 0x3));
}
/**
* @brief Setting Fast Power On Start Sequence
*/
void setFastPowerOnLevel(xpowers_fast_on_opt_t opt, xpower_start_sequence_t seq_level)
{
uint8_t val = 0;
switch (opt) {
case XPOWERS_AXP2101_FAST_DCDC1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | seq_level);
break;
case XPOWERS_AXP2101_FAST_DCDC2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | (seq_level << 2));
break;
case XPOWERS_AXP2101_FAST_DCDC3:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | (seq_level << 4));
break;
case XPOWERS_AXP2101_FAST_DCDC4:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val | (seq_level << 6));
break;
case XPOWERS_AXP2101_FAST_DCDC5:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | seq_level);
break;
case XPOWERS_AXP2101_FAST_ALDO1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | (seq_level << 2));
break;
case XPOWERS_AXP2101_FAST_ALDO2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | (seq_level << 4));
break;
case XPOWERS_AXP2101_FAST_ALDO3:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val | (seq_level << 6));
break;
case XPOWERS_AXP2101_FAST_ALDO4:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | seq_level);
break;
case XPOWERS_AXP2101_FAST_BLDO1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | (seq_level << 2));
break;
case XPOWERS_AXP2101_FAST_BLDO2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | (seq_level << 4));
break;
case XPOWERS_AXP2101_FAST_CPUSLDO:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val | (seq_level << 6));
break;
case XPOWERS_AXP2101_FAST_DLDO1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL, val | seq_level);
break;
case XPOWERS_AXP2101_FAST_DLDO2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL, val | (seq_level << 2));
break;
default:
break;
}
}
void disableFastPowerOn(xpowers_fast_on_opt_t opt)
{
uint8_t val = 0;
switch (opt) {
case XPOWERS_AXP2101_FAST_DCDC1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val & 0xFC);
break;
case XPOWERS_AXP2101_FAST_DCDC2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val & 0xF3);
break;
case XPOWERS_AXP2101_FAST_DCDC3:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val & 0xCF);
break;
case XPOWERS_AXP2101_FAST_DCDC4:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET0);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET0, val & 0x3F);
break;
case XPOWERS_AXP2101_FAST_DCDC5:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val & 0xFC);
break;
case XPOWERS_AXP2101_FAST_ALDO1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val & 0xF3);
break;
case XPOWERS_AXP2101_FAST_ALDO2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val & 0xCF);
break;
case XPOWERS_AXP2101_FAST_ALDO3:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET1);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET1, val & 0x3F);
break;
case XPOWERS_AXP2101_FAST_ALDO4:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val & 0xFC);
break;
case XPOWERS_AXP2101_FAST_BLDO1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val & 0xF3);
break;
case XPOWERS_AXP2101_FAST_BLDO2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val & 0xCF);
break;
case XPOWERS_AXP2101_FAST_CPUSLDO:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_SET2);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_SET2, val & 0x3F);
break;
case XPOWERS_AXP2101_FAST_DLDO1:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL, val & 0xFC);
break;
case XPOWERS_AXP2101_FAST_DLDO2:
val = readRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL);
writeRegister(XPOWERS_AXP2101_FAST_PWRON_CTRL, val & 0xF3);
break;
default:
break;
}
}
void enableFastPowerOn(void)
{
setRegisterBit(XPOWERS_AXP2101_FAST_PWRON_CTRL, 7);
}
void disableFastPowerOn(void)
{
clrRegisterBit(XPOWERS_AXP2101_FAST_PWRON_CTRL, 7);
}
void enableFastWakeup(void)
{
setRegisterBit(XPOWERS_AXP2101_FAST_PWRON_CTRL, 6);
}
void disableFastWakeup(void)
{
clrRegisterBit(XPOWERS_AXP2101_FAST_PWRON_CTRL, 6);
}
// DCDC 120%(130%) high voltage turn off PMIC function
void setDCHighVoltagePowerDowm(bool en)
{
en ? setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 5) : clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 5);
}
bool getDCHighVoltagePowerDowmEn()
{
return getRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 5);
}
// DCDCS force PWM control
void setDcUVPDebounceTime(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL);
val &= 0xFC;
writeRegister(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, val | opt);
}
void settDC1WorkModeToPwm(uint8_t enable)
{
enable ?
setRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 2)
: clrRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 2);
}
void settDC2WorkModeToPwm(uint8_t enable)
{
enable ? setRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 3)
: clrRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 3);
}
void settDC3WorkModeToPwm(uint8_t enable)
{
enable ?
setRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 4)
: clrRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 4);
}
void settDC4WorkModeToPwm( uint8_t enable)
{
enable ?
setRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 5)
: clrRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 5);
}
//1 = 100khz 0=50khz
void setDCFreqSpreadRange(uint8_t opt)
{
opt ?
setRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 6)
: clrRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 6);
}
void setDCFreqSpreadRangeEn(bool en)
{
en ?
setRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 7)
: clrRegisterBit(XPOWERS_AXP2101_DC_FORCE_PWM_CTRL, 7);
}
void enableCCM()
{
setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 6);
}
void disableCCM()
{
clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 6);
}
bool isEanbleCCM()
{
return getRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 6);
}
enum DVMRamp {
XPOWERS_AXP2101_DVM_RAMP_15_625US,
XPOWERS_AXP2101_DVM_RAMP_31_250US,
};
//args:enum DVMRamp
void setDVMRamp(uint8_t opt)
{
if (opt > 2)return;
opt == 0 ? clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 5) : setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 5);
}
/*
* Power control DCDC1 functions
*/
bool isEnableDC1(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 0);
}
bool enableDC1(void)
{
return setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 0);
}
bool disableDC1(void)
{
return clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 0);
}
bool setDC1Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_DCDC1_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_DCDC1_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_DCDC1_VOL_MIN) {
log_e("Mistake ! DC1 minimum voltage is %u mV", XPOWERS_AXP2101_DCDC1_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_DCDC1_VOL_MAX) {
log_e("Mistake ! DC1 maximum voltage is %u mV", XPOWERS_AXP2101_DCDC1_VOL_MAX);
return false;
}
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL0_CTRL, (millivolt - XPOWERS_AXP2101_DCDC1_VOL_MIN) / XPOWERS_AXP2101_DCDC1_VOL_STEPS);
}
uint16_t getDC1Voltage(void)
{
return (readRegister(XPOWERS_AXP2101_DC_VOL0_CTRL) & 0x1F) * XPOWERS_AXP2101_DCDC1_VOL_STEPS + XPOWERS_AXP2101_DCDC1_VOL_MIN;
}
// DCDC1 85% low voltage turn off PMIC function
void setDC1LowVoltagePowerDowm(bool en)
{
en ? setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 0) : clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 0);
}
bool getDC1LowVoltagePowerDowmEn()
{
return getRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 0);
}
/*
* Power control DCDC2 functions
*/
bool isEnableDC2(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 1);
}
bool enableDC2(void)
{
return setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 1);
}
bool disableDC2(void)
{
return clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 1);
}
bool setDC2Voltage(uint16_t millivolt)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL1_CTRL);
if (val == -1)return 0;
val &= 0x80;
if (millivolt >= XPOWERS_AXP2101_DCDC2_VOL1_MIN && millivolt <= XPOWERS_AXP2101_DCDC2_VOL1_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC2_VOL_STEPS1) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC2_VOL_STEPS1);
return false;
}
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL1_CTRL, val | (millivolt - XPOWERS_AXP2101_DCDC2_VOL1_MIN) / XPOWERS_AXP2101_DCDC2_VOL_STEPS1);
} else if (millivolt >= XPOWERS_AXP2101_DCDC2_VOL2_MIN && millivolt <= XPOWERS_AXP2101_DCDC2_VOL2_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC2_VOL_STEPS2) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC2_VOL_STEPS2);
return false;
}
val |= (((millivolt - XPOWERS_AXP2101_DCDC2_VOL2_MIN) / XPOWERS_AXP2101_DCDC2_VOL_STEPS2) + XPOWERS_AXP2101_DCDC2_VOL_STEPS2_BASE);
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL1_CTRL, val);
}
return false;
}
uint16_t getDC2Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL1_CTRL);
if (val == -1)return 0;
val &= 0x7F;
if (val < XPOWERS_AXP2101_DCDC2_VOL_STEPS2_BASE) {
return (val * XPOWERS_AXP2101_DCDC2_VOL_STEPS1) + XPOWERS_AXP2101_DCDC2_VOL1_MIN;
} else {
return (val * XPOWERS_AXP2101_DCDC2_VOL_STEPS2) - 200;
}
return 0;
}
uint8_t getDC2WorkMode(void)
{
return getRegisterBit(XPOWERS_AXP2101_DCDC2_VOL_STEPS2, 7);
}
void setDC2LowVoltagePowerDowm(bool en)
{
en ? setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 1) : clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 1);
}
bool getDC2LowVoltagePowerDowmEn()
{
return getRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 1);
}
/*
* Power control DCDC3 functions
*/
bool isEnableDC3(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 2);
}
bool enableDC3(void)
{
return setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 2);
}
bool disableDC3(void)
{
return clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 2);
}
/**
0.5~1.2V,10mV/step,71steps
1.22~1.54V,20mV/step,17steps
1.6~3.4V,100mV/step,19steps
*/
bool setDC3Voltage(uint16_t millivolt)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL2_CTRL);
if (val == -1)return false;
val &= 0x80;
if (millivolt >= XPOWERS_AXP2101_DCDC3_VOL1_MIN && millivolt <= XPOWERS_AXP2101_DCDC3_VOL1_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC3_VOL_STEPS1) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC3_VOL_STEPS1);
return false;
}
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL2_CTRL, val | (millivolt - XPOWERS_AXP2101_DCDC3_VOL_MIN) / XPOWERS_AXP2101_DCDC3_VOL_STEPS1);
} else if (millivolt >= XPOWERS_AXP2101_DCDC3_VOL2_MIN && millivolt <= XPOWERS_AXP2101_DCDC3_VOL2_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC3_VOL_STEPS2) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC3_VOL_STEPS2);
return false;
}
val |= (((millivolt - XPOWERS_AXP2101_DCDC3_VOL2_MIN) / XPOWERS_AXP2101_DCDC3_VOL_STEPS2) + XPOWERS_AXP2101_DCDC3_VOL_STEPS2_BASE);
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL2_CTRL, val);
} else if (millivolt >= XPOWERS_AXP2101_DCDC3_VOL3_MIN && millivolt <= XPOWERS_AXP2101_DCDC3_VOL3_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC3_VOL_STEPS3) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC3_VOL_STEPS3);
return false;
}
val |= (((millivolt - XPOWERS_AXP2101_DCDC3_VOL3_MIN) / XPOWERS_AXP2101_DCDC3_VOL_STEPS3) + XPOWERS_AXP2101_DCDC3_VOL_STEPS3_BASE);
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL2_CTRL, val);
}
return false;
}
uint16_t getDC3Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL2_CTRL) & 0x7F;
if (val < XPOWERS_AXP2101_DCDC3_VOL_STEPS2_BASE) {
return (val * XPOWERS_AXP2101_DCDC3_VOL_STEPS1) + XPOWERS_AXP2101_DCDC3_VOL_MIN;
} else if (val >= XPOWERS_AXP2101_DCDC3_VOL_STEPS2_BASE && val < XPOWERS_AXP2101_DCDC3_VOL_STEPS3_BASE) {
return (val * XPOWERS_AXP2101_DCDC3_VOL_STEPS2) - 200;
} else {
return (val * XPOWERS_AXP2101_DCDC3_VOL_STEPS3) - 7200;
}
return 0;
}
uint8_t getDC3WorkMode(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_VOL2_CTRL, 7);
}
// DCDC3 85% low voltage turn off PMIC function
void setDC3LowVoltagePowerDowm(bool en)
{
en ? setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 2) : clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 2);
}
bool getDC3LowVoltagePowerDowmEn()
{
return getRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 2);
}
/*
* Power control DCDC4 functions
*/
/**
0.5~1.2V,10mV/step,71steps
1.22~1.84V,20mV/step,32steps
*/
bool isEnableDC4(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 3);
}
bool enableDC4(void)
{
return setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 3);
}
bool disableDC4(void)
{
return clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 3);
}
bool setDC4Voltage(uint16_t millivolt)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL3_CTRL);
if (val == -1)return false;
val &= 0x80;
if (millivolt >= XPOWERS_AXP2101_DCDC4_VOL1_MIN && millivolt <= XPOWERS_AXP2101_DCDC4_VOL1_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC4_VOL_STEPS1) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC4_VOL_STEPS1);
return false;
}
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL3_CTRL, val | (millivolt - XPOWERS_AXP2101_DCDC4_VOL1_MIN) / XPOWERS_AXP2101_DCDC4_VOL_STEPS1);
} else if (millivolt >= XPOWERS_AXP2101_DCDC4_VOL2_MIN && millivolt <= XPOWERS_AXP2101_DCDC4_VOL2_MAX) {
if (millivolt % XPOWERS_AXP2101_DCDC4_VOL_STEPS2) {
log_e("Mistake ! The steps is must %umV", XPOWERS_AXP2101_DCDC4_VOL_STEPS2);
return false;
}
val |= (((millivolt - XPOWERS_AXP2101_DCDC4_VOL2_MIN) / XPOWERS_AXP2101_DCDC4_VOL_STEPS2) + XPOWERS_AXP2101_DCDC4_VOL_STEPS2_BASE);
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL3_CTRL, val);
}
return false;
}
uint16_t getDC4Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL3_CTRL);
if (val == -1)return 0;
val &= 0x7F;
if (val < XPOWERS_AXP2101_DCDC4_VOL_STEPS2_BASE) {
return (val * XPOWERS_AXP2101_DCDC4_VOL_STEPS1) + XPOWERS_AXP2101_DCDC4_VOL1_MIN;
} else {
return (val * XPOWERS_AXP2101_DCDC4_VOL_STEPS2) - 200;
}
return 0;
}
// DCDC4 85% low voltage turn off PMIC function
void setDC4LowVoltagePowerDowm(bool en)
{
en ? setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 3) : clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 3);
}
bool getDC4LowVoltagePowerDowmEn()
{
return getRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 3);
}
/*
* Power control DCDC5 functions,Output to gpio pin
*/
bool isEnableDC5(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 4);
}
bool enableDC5(void)
{
return setRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 4);
}
bool disableDC5(void)
{
return clrRegisterBit(XPOWERS_AXP2101_DC_ONOFF_DVM_CTRL, 4);
}
bool setDC5Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_DCDC5_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_DCDC5_VOL_STEPS);
return false;
}
if (millivolt != XPOWERS_AXP2101_DCDC5_VOL_1200MV && millivolt < XPOWERS_AXP2101_DCDC5_VOL_MIN) {
log_e("Mistake ! DC5 minimum voltage is %umV ,%umV", XPOWERS_AXP2101_DCDC5_VOL_1200MV, XPOWERS_AXP2101_DCDC5_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_DCDC5_VOL_MAX) {
log_e("Mistake ! DC5 maximum voltage is %umV", XPOWERS_AXP2101_DCDC5_VOL_MAX);
return false;
}
int val = readRegister(XPOWERS_AXP2101_DC_VOL4_CTRL);
if (val == -1)return false;
val &= 0xE0;
if (millivolt == XPOWERS_AXP2101_DCDC5_VOL_1200MV) {
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL4_CTRL, val | XPOWERS_AXP2101_DCDC5_VOL_VAL);
}
val |= (millivolt - XPOWERS_AXP2101_DCDC5_VOL_MIN) / XPOWERS_AXP2101_DCDC5_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_DC_VOL4_CTRL, val);
}
uint16_t getDC5Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_DC_VOL4_CTRL) ;
if (val == -1)return 0;
val &= 0x1F;
if (val == XPOWERS_AXP2101_DCDC5_VOL_VAL)return XPOWERS_AXP2101_DCDC5_VOL_1200MV;
return (val * XPOWERS_AXP2101_DCDC5_VOL_STEPS) + XPOWERS_AXP2101_DCDC5_VOL_MIN;
}
bool isDC5FreqCompensationEn(void)
{
return getRegisterBit(XPOWERS_AXP2101_DC_VOL4_CTRL, 5);
}
void enableDC5FreqCompensation()
{
setRegisterBit(XPOWERS_AXP2101_DC_VOL4_CTRL, 5);
}
void disableFreqCompensation()
{
clrRegisterBit(XPOWERS_AXP2101_DC_VOL4_CTRL, 5);
}
// DCDC4 85% low voltage turn off PMIC function
void setDC5LowVoltagePowerDowm(bool en)
{
en ? setRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 4) : clrRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 4);
}
bool getDC5LowVoltagePowerDowmEn()
{
return getRegisterBit(XPOWERS_AXP2101_DC_OVP_UVP_CTRL, 4);
}
/*
* Power control ALDO1 functions
*/
bool isEnableALDO1(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 0);
}
bool enableALDO1(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 0);
}
bool disableALDO1(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 0);
}
bool setALDO1Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_ALDO1_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_ALDO1_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_ALDO1_VOL_MIN) {
log_e("Mistake ! ALDO1 minimum output voltage is %umV", XPOWERS_AXP2101_ALDO1_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_ALDO1_VOL_MAX) {
log_e("Mistake ! ALDO1 maximum output voltage is %umV", XPOWERS_AXP2101_ALDO1_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL0_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_ALDO1_VOL_MIN) / XPOWERS_AXP2101_ALDO1_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL0_CTRL, val);
}
uint16_t getALDO1Voltage(void)
{
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL0_CTRL) & 0x1F;
return val * XPOWERS_AXP2101_ALDO1_VOL_STEPS + XPOWERS_AXP2101_ALDO1_VOL_MIN;
}
/*
* Power control ALDO2 functions
*/
bool isEnableALDO2(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 1);
}
bool enableALDO2(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 1);
}
bool disableALDO2(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 1);
}
bool setALDO2Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_ALDO2_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_ALDO2_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_ALDO2_VOL_MIN) {
log_e("Mistake ! ALDO2 minimum output voltage is %umV", XPOWERS_AXP2101_ALDO2_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_ALDO2_VOL_MAX) {
log_e("Mistake ! ALDO2 maximum output voltage is %umV", XPOWERS_AXP2101_ALDO2_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL1_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_ALDO2_VOL_MIN) / XPOWERS_AXP2101_ALDO2_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL1_CTRL, val);
}
uint16_t getALDO2Voltage(void)
{
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL1_CTRL) & 0x1F;
return val * XPOWERS_AXP2101_ALDO2_VOL_STEPS + XPOWERS_AXP2101_ALDO2_VOL_MIN;
}
/*
* Power control ALDO3 functions
*/
bool isEnableALDO3(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 2);
}
bool enableALDO3(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 2);
}
bool disableALDO3(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 2);
}
bool setALDO3Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_ALDO3_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_ALDO3_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_ALDO3_VOL_MIN) {
log_e("Mistake ! ALDO3 minimum output voltage is %umV", XPOWERS_AXP2101_ALDO3_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_ALDO3_VOL_MAX) {
log_e("Mistake ! ALDO3 maximum output voltage is %umV", XPOWERS_AXP2101_ALDO3_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL2_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_ALDO3_VOL_MIN) / XPOWERS_AXP2101_ALDO3_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL2_CTRL, val);
}
uint16_t getALDO3Voltage(void)
{
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL2_CTRL) & 0x1F;
return val * XPOWERS_AXP2101_ALDO3_VOL_STEPS + XPOWERS_AXP2101_ALDO3_VOL_MIN;
}
/*
* Power control ALDO4 functions
*/
bool isEnableALDO4(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 3);
}
bool enableALDO4(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 3);
}
bool disableALDO4(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 3);
}
bool setALDO4Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_ALDO4_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_ALDO4_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_ALDO4_VOL_MIN) {
log_e("Mistake ! ALDO4 minimum output voltage is %umV", XPOWERS_AXP2101_ALDO4_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_ALDO4_VOL_MAX) {
log_e("Mistake ! ALDO4 maximum output voltage is %umV", XPOWERS_AXP2101_ALDO4_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL3_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_ALDO4_VOL_MIN) / XPOWERS_AXP2101_ALDO4_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL3_CTRL, val);
}
uint16_t getALDO4Voltage(void)
{
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL3_CTRL) & 0x1F;
return val * XPOWERS_AXP2101_ALDO4_VOL_STEPS + XPOWERS_AXP2101_ALDO4_VOL_MIN;
}
/*
* Power control BLDO1 functions
*/
bool isEnableBLDO1(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 4);
}
bool enableBLDO1(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 4);
}
bool disableBLDO1(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 4);
}
bool setBLDO1Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_BLDO1_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_BLDO1_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_BLDO1_VOL_MIN) {
log_e("Mistake ! BLDO1 minimum output voltage is %umV", XPOWERS_AXP2101_BLDO1_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_BLDO1_VOL_MAX) {
log_e("Mistake ! BLDO1 maximum output voltage is %umV", XPOWERS_AXP2101_BLDO1_VOL_MAX);
return false;
}
int val = readRegister(XPOWERS_AXP2101_LDO_VOL4_CTRL);
if (val == -1)return false;
val &= 0xE0;
val |= (millivolt - XPOWERS_AXP2101_BLDO1_VOL_MIN) / XPOWERS_AXP2101_BLDO1_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL4_CTRL, val);
}
uint16_t getBLDO1Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_LDO_VOL4_CTRL);
if (val == -1)return 0;
val &= 0x1F;
return val * XPOWERS_AXP2101_BLDO1_VOL_STEPS + XPOWERS_AXP2101_BLDO1_VOL_MIN;
}
/*
* Power control BLDO2 functions
*/
bool isEnableBLDO2(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 5);
}
bool enableBLDO2(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 5);
}
bool disableBLDO2(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 5);
}
bool setBLDO2Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_BLDO2_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_BLDO2_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_BLDO2_VOL_MIN) {
log_e("Mistake ! BLDO2 minimum output voltage is %umV", XPOWERS_AXP2101_BLDO2_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_BLDO2_VOL_MAX) {
log_e("Mistake ! BLDO2 maximum output voltage is %umV", XPOWERS_AXP2101_BLDO2_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL5_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_BLDO2_VOL_MIN) / XPOWERS_AXP2101_BLDO2_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL5_CTRL, val);
}
uint16_t getBLDO2Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_LDO_VOL5_CTRL);
if (val == -1)return 0;
val &= 0x1F;
return val * XPOWERS_AXP2101_BLDO2_VOL_STEPS + XPOWERS_AXP2101_BLDO2_VOL_MIN;
}
/*
* Power control CPUSLDO functions
*/
bool isEnableCPUSLDO(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 6);
}
bool enableCPUSLDO(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 6);
}
bool disableCPUSLDO(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 6);
}
bool setCPUSLDOVoltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_CPUSLDO_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_CPUSLDO_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_CPUSLDO_VOL_MIN) {
log_e("Mistake ! CPULDO minimum output voltage is %umV", XPOWERS_AXP2101_CPUSLDO_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_CPUSLDO_VOL_MAX) {
log_e("Mistake ! CPULDO maximum output voltage is %umV", XPOWERS_AXP2101_CPUSLDO_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL6_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_CPUSLDO_VOL_MIN) / XPOWERS_AXP2101_CPUSLDO_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL6_CTRL, val);
}
uint16_t getCPUSLDOVoltage(void)
{
int val = readRegister(XPOWERS_AXP2101_LDO_VOL6_CTRL);
if (val == -1)return 0;
val &= 0x1F;
return val * XPOWERS_AXP2101_CPUSLDO_VOL_STEPS + XPOWERS_AXP2101_CPUSLDO_VOL_MIN;
}
/*
* Power control DLDO1 functions
*/
bool isEnableDLDO1(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 7);
}
bool enableDLDO1(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 7);
}
bool disableDLDO1(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL0, 7);
}
bool setDLDO1Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_DLDO1_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_DLDO1_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_DLDO1_VOL_MIN) {
log_e("Mistake ! DLDO1 minimum output voltage is %umV", XPOWERS_AXP2101_DLDO1_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_DLDO1_VOL_MAX) {
log_e("Mistake ! DLDO1 maximum output voltage is %umV", XPOWERS_AXP2101_DLDO1_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL7_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_DLDO1_VOL_MIN) / XPOWERS_AXP2101_DLDO1_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL7_CTRL, val);
}
uint16_t getDLDO1Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_LDO_VOL7_CTRL);
if (val == -1)return 0;
val &= 0x1F;
return val * XPOWERS_AXP2101_DLDO1_VOL_STEPS + XPOWERS_AXP2101_DLDO1_VOL_MIN;
}
/*
* Power control DLDO2 functions
*/
bool isEnableDLDO2(void)
{
return getRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL1, 0);
}
bool enableDLDO2(void)
{
return setRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL1, 0);
}
bool disableDLDO2(void)
{
return clrRegisterBit(XPOWERS_AXP2101_LDO_ONOFF_CTRL1, 0);
}
bool setDLDO2Voltage(uint16_t millivolt)
{
if (millivolt % XPOWERS_AXP2101_DLDO2_VOL_STEPS) {
log_e("Mistake ! The steps is must %u mV", XPOWERS_AXP2101_DLDO2_VOL_STEPS);
return false;
}
if (millivolt < XPOWERS_AXP2101_DLDO2_VOL_MIN) {
log_e("Mistake ! DLDO2 minimum output voltage is %umV", XPOWERS_AXP2101_DLDO2_VOL_MIN);
return false;
} else if (millivolt > XPOWERS_AXP2101_DLDO2_VOL_MAX) {
log_e("Mistake ! DLDO2 maximum output voltage is %umV", XPOWERS_AXP2101_DLDO2_VOL_MAX);
return false;
}
uint16_t val = readRegister(XPOWERS_AXP2101_LDO_VOL8_CTRL) & 0xE0;
val |= (millivolt - XPOWERS_AXP2101_DLDO2_VOL_MIN) / XPOWERS_AXP2101_DLDO2_VOL_STEPS;
return 0 == writeRegister(XPOWERS_AXP2101_LDO_VOL8_CTRL, val);
}
uint16_t getDLDO2Voltage(void)
{
int val = readRegister(XPOWERS_AXP2101_LDO_VOL8_CTRL);
if (val == -1)return 0;
val &= 0x1F;
return val * XPOWERS_AXP2101_DLDO2_VOL_STEPS + XPOWERS_AXP2101_DLDO2_VOL_MIN;
}
/*
* Power ON OFF IRQ TIMMING Control method
*/
void setIrqLevelTime(xpowers_irq_time_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return;
val &= 0xCF;
writeRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 4));
}
xpowers_irq_time_t getIrqLevelTime(void)
{
return (xpowers_irq_time_t)((readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL) & 0x30) >> 4);
}
/**
* @brief Set the PEKEY power-on long press time.
* @param opt: See xpowers_press_on_time_t enum for details.
* @retval
*/
bool setPowerKeyPressOnTime(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return false;
val &= 0xFC;
return 0 == writeRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | opt);
}
/**
* @brief Get the PEKEY power-on long press time.
* @retval See xpowers_press_on_time_t enum for details.
*/
uint8_t getPowerKeyPressOnTime(void)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return 0;
return (val & 0x03) ;
}
/**
* @brief Set the PEKEY power-off long press time.
* @param opt: See xpowers_press_off_time_t enum for details.
* @retval
*/
bool setPowerKeyPressOffTime(uint8_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL);
if (val == -1)return false;
val &= 0xF3;
return 0 == writeRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 2));
}
/**
* @brief Get the PEKEY power-off long press time.
* @retval See xpowers_press_off_time_t enum for details.
*/
uint8_t getPowerKeyPressOffTime(void)
{
return ((readRegister(XPOWERS_AXP2101_IRQ_OFF_ON_LEVEL_CTRL) & 0x0C) >> 2);
}
/*
* ADC Control method
*/
bool enableGeneralAdcChannel(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 5);
}
bool disableGeneralAdcChannel(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 5);
}
bool enableTemperatureMeasure(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 4);
}
bool disableTemperatureMeasure(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 4);
}
uint16_t getTemperature(void)
{
//!FIXME
return readRegisterH6L8(XPOWERS_AXP2101_ADC_DATA_RELUST8, XPOWERS_AXP2101_ADC_DATA_RELUST9);
}
bool enableSystemVoltageMeasure(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 3);
}
bool disableSystemVoltageMeasure(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 3);
}
uint16_t getSystemVoltage(void)
{
return readRegisterH6L8(XPOWERS_AXP2101_ADC_DATA_RELUST6, XPOWERS_AXP2101_ADC_DATA_RELUST7);
}
bool enableVbusVoltageMeasure(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 2);
}
bool disableVbusVoltageMeasure(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 2);
}
uint16_t getVbusVoltage(void)
{
if (!isVbusIn()) {
return 0;
}
return readRegisterH6L8(XPOWERS_AXP2101_ADC_DATA_RELUST4, XPOWERS_AXP2101_ADC_DATA_RELUST5);
}
bool enableTSPinMeasure(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 1);
}
bool disableTSPinMeasure(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 1);
}
bool enableTSPinLowFreqSample(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 7);
}
bool disableTSPinLowFreqSample(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_DATA_RELUST2, 7);
}
uint16_t getTsTemperature(void)
{
return readRegisterH6L8(XPOWERS_AXP2101_ADC_DATA_RELUST2, XPOWERS_AXP2101_ADC_DATA_RELUST3);
}
bool enableBattVoltageMeasure(void)
{
return setRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 0);
}
bool disableBattVoltageMeasure(void)
{
return clrRegisterBit(XPOWERS_AXP2101_ADC_CHANNEL_CTRL, 0);
}
bool enableBattDetection(void)
{
return setRegisterBit(XPOWERS_AXP2101_BAT_DET_CTRL, 0);
}
bool disableBattDetection(void)
{
return clrRegisterBit(XPOWERS_AXP2101_BAT_DET_CTRL, 0);
}
uint16_t getBattVoltage(void)
{
if (!isBatteryConnect()) {
return 0;
}
return readRegisterH5L8(XPOWERS_AXP2101_ADC_DATA_RELUST0, XPOWERS_AXP2101_ADC_DATA_RELUST1);
}
int getBatteryPercent(void)
{
if (!isBatteryConnect()) {
return -1;
}
return readRegister(XPOWERS_AXP2101_BAT_PERCENT_DATA);
}
/*
* CHG LED setting and control
*/
// void enableChargingLed(void)
// {
// setRegisterBit(XPOWERS_AXP2101_CHGLED_SET_CTRL, 0);
// }
// void disableChargingLed(void)
// {
// clrRegisterBit(XPOWERS_AXP2101_CHGLED_SET_CTRL, 0);
// }
/**
* @brief Set charging led mode.
* @retval See xpowers_chg_led_mode_t enum for details.
*/
void setChargingLedMode(uint8_t mode)
{
int val;
switch (mode) {
case XPOWERS_CHG_LED_OFF:
// clrRegisterBit(XPOWERS_AXP2101_CHGLED_SET_CTRL, 0);
// break;
case XPOWERS_CHG_LED_BLINK_1HZ:
case XPOWERS_CHG_LED_BLINK_4HZ:
case XPOWERS_CHG_LED_ON:
val = readRegister(XPOWERS_AXP2101_CHGLED_SET_CTRL);
if (val == -1)return;
val &= 0xC8;
val |= 0x05; //use manual ctrl
val |= (mode << 4);
writeRegister(XPOWERS_AXP2101_CHGLED_SET_CTRL, val);
break;
case XPOWERS_CHG_LED_CTRL_CHG:
val = readRegister(XPOWERS_AXP2101_CHGLED_SET_CTRL);
if (val == -1)return;
val &= 0xF9;
writeRegister(XPOWERS_AXP2101_CHGLED_SET_CTRL, val | 0x01); // use type A mode
// writeRegister(XPOWERS_AXP2101_CHGLED_SET_CTRL, val | 0x02); // use type B mode
break;
default:
break;
}
}
uint8_t getChargingLedMode()
{
int val = readRegister(XPOWERS_AXP2101_CHGLED_SET_CTRL);
if (val == -1)return XPOWERS_CHG_LED_OFF;
val >>= 1;
if ((val & 0x02) == 0x02) {
val >>= 4;
return val & 0x03;
}
return XPOWERS_CHG_LED_CTRL_CHG;
}
/**
* @brief 预充电充电电流限制
* @note Precharge current limit 25*N mA
* @param opt: 25 * opt
* @retval None
*/
void setPrechargeCurr(xpowers_prechg_t opt)
{
int val = readRegister(XPOWERS_AXP2101_IPRECHG_SET);
if (val == -1)return;
val &= 0xFC;
writeRegister(XPOWERS_AXP2101_IPRECHG_SET, val | opt);
}
xpowers_prechg_t getPrechargeCurr(void)
{
return (xpowers_prechg_t)(readRegister(XPOWERS_AXP2101_IPRECHG_SET) & 0x03);
}
/**
* @brief Set charge current.
* @param opt: See xpowers_axp2101_chg_curr_t enum for details.
* @retval
*/
bool setChargerConstantCurr(uint8_t opt)
{
if (opt > XPOWERS_AXP2101_CHG_CUR_1000MA)return false;
int val = readRegister(XPOWERS_AXP2101_ICC_CHG_SET);
if (val == -1)return false;
val &= 0xE0;
return 0 == writeRegister(XPOWERS_AXP2101_ICC_CHG_SET, val | opt);
}
/**
* @brief Get charge current settings.
* @retval See xpowers_axp2101_chg_curr_t enum for details.
*/
uint8_t getChargerConstantCurr(void)
{
int val = readRegister(XPOWERS_AXP2101_ICC_CHG_SET);
if (val == -1)return 0;
return val & 0x1F;
}
/**
* @brief 充电终止电流限制
* @note Charging termination of current limit
* @retval
*/
void setChargerTerminationCurr(xpowers_axp2101_chg_iterm_t opt)
{
int val = readRegister(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL);
if (val == -1)return;
val &= 0xF0;
writeRegister(XPOWERS_AXP2101_ICC_CHG_SET, val | opt);
}
xpowers_axp2101_chg_iterm_t getChargerTerminationCurr(void)
{
return (xpowers_axp2101_chg_iterm_t)(readRegister(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL) & 0x0F);
}
void enableChargerTerminationLimit(void)
{
int val = readRegister(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL, val | 0x10);
}
void disableChargerTerminationLimit(void)
{
int val = readRegister(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL);
if (val == -1)return;
writeRegister(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL, val & 0xEF);
}
bool isChargerTerminationLimit(void)
{
return getRegisterBit(XPOWERS_AXP2101_ITERM_CHG_SET_CTRL, 4);
}
/**
* @brief Set charge target voltage.
* @param opt: See xpowers_axp2101_chg_vol_t enum for details.
* @retval
*/
bool setChargeTargetVoltage(uint8_t opt)
{
if (opt >= XPOWERS_AXP2101_CHG_VOL_MAX)return false;
int val = readRegister(XPOWERS_AXP2101_CV_CHG_VOL_SET);
if (val == -1)return false;
val &= 0xFC;
return 0 == writeRegister(XPOWERS_AXP2101_CV_CHG_VOL_SET, val | opt);
}
/**
* @brief Get charge target voltage settings.
* @retval See xpowers_axp2101_chg_vol_t enum for details.
*/
uint8_t getChargeTargetVoltage(void)
{
return (readRegister(XPOWERS_AXP2101_CV_CHG_VOL_SET) & 0x03);
}
/**
* @brief 设定热阈值
* @note Thermal regulation threshold setting
*/
void setThermaThreshold(xpowers_thermal_t opt)
{
int val = readRegister(XPOWERS_AXP2101_THE_REGU_THRES_SET);
if (val == -1)return;
val &= 0xFC;
writeRegister(XPOWERS_AXP2101_THE_REGU_THRES_SET, val | opt);
}
xpowers_thermal_t getThermaThreshold(void)
{
return (xpowers_thermal_t)(readRegister(XPOWERS_AXP2101_THE_REGU_THRES_SET) & 0x03);
}
uint8_t getBatteryParameter()
{
return readRegister(XPOWERS_AXP2101_BAT_PARAME);
}
void fuelGaugeControl(bool writeROM, bool enable)
{
if (writeROM) {
clrRegisterBit(XPOWERS_AXP2101_FUEL_GAUGE_CTRL, 4);
} else {
setRegisterBit(XPOWERS_AXP2101_FUEL_GAUGE_CTRL, 4);
}
if (enable) {
setRegisterBit(XPOWERS_AXP2101_FUEL_GAUGE_CTRL, 0);
} else {
clrRegisterBit(XPOWERS_AXP2101_FUEL_GAUGE_CTRL, 0);
}
}
/*
* Interrupt status/control functions
*/
/**
* @brief Get the interrupt controller mask value.
* @retval Mask value corresponds to xpowers_axp2101_irq_t ,
*/
uint64_t getIrqStatus(void)
{
statusRegister[0] = readRegister(XPOWERS_AXP2101_INTSTS1);
statusRegister[1] = readRegister(XPOWERS_AXP2101_INTSTS2);
statusRegister[2] = readRegister(XPOWERS_AXP2101_INTSTS3);
return (uint32_t)(statusRegister[0] << 16) | (uint32_t)(statusRegister[1] << 8) | (uint32_t)(statusRegister[2]);
}
/**
* @brief Clear interrupt controller state.
*/
void clearIrqStatus(void)
{
for (int i = 0; i < XPOWERS_AXP2101_INTSTS_CNT; i++) {
writeRegister(XPOWERS_AXP2101_INTSTS1 + i, 0xFF);
statusRegister[i] = 0;
}
}
/*
* @brief Debug interrupt setting register
* */
#ifdef ARDUINO
void printIntRegister(Stream *stream)
{
for (int i = 0; i < XPOWERS_AXP2101_INTSTS_CNT; i++) {
uint8_t val = readRegister(XPOWERS_AXP2101_INTEN1 + i);
stream->print("INT["); stream->print(i);
stream->print(']');
stream->print(" HEX: "); stream->print(val, HEX);
stream->print(" BIN:0b"); stream->println(val, BIN);
}
}
#else
void printIntRegister()
{
for (int i = 0; i < XPOWERS_AXP2101_INTSTS_CNT; i++) {
uint8_t val = readRegister(XPOWERS_AXP2101_INTEN1 + i);
//printf("INT[%d] HEX:0x%X\n", i, val);
}
}
#endif
/**
* @brief Eanble PMU interrupt control mask .
* @param opt: View the related chip type xpowers_axp2101_irq_t enumeration
* parameters in "XPowersParams.hpp"
* @retval
*/
bool enableIRQ(uint64_t opt)
{
return setInterruptImpl(opt, true);
}
/**
* @brief Disable PMU interrupt control mask .
* @param opt: View the related chip type xpowers_axp2101_irq_t enumeration
* parameters in "XPowersParams.hpp"
* @retval
*/
bool disableIRQ(uint64_t opt)
{
return setInterruptImpl(opt, false);
}
//IRQ STATUS 0
bool isDropWarningLevel2Irq(void)
{
uint8_t mask = XPOWERS_AXP2101_WARNING_LEVEL2_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
bool isDropWarningLevel1Irq(void)
{
uint8_t mask = XPOWERS_AXP2101_WARNING_LEVEL1_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
bool isGaugeWdtTimeoutIrq()
{
uint8_t mask = XPOWERS_AXP2101_WDT_TIMEOUT_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
bool isBatChargerOverTemperatureIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_CHG_OVER_TEMP_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
bool isBatChargerUnderTemperatureIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_CHG_UNDER_TEMP_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
bool isBatWorkOverTemperatureIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_NOR_OVER_TEMP_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
bool isBatWorkUnderTemperatureIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_NOR_UNDER_TEMP_IRQ;
if (intRegister[0] & mask) {
return IS_BIT_SET(statusRegister[0], mask);
}
return false;
}
//IRQ STATUS 1
bool isVbusInsertIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_VBUS_INSERT_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isVbusRemoveIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_VBUS_REMOVE_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isBatInsertIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_INSERT_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isBatRemoveIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_REMOVE_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isPekeyShortPressIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_PKEY_SHORT_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isPekeyLongPressIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_PKEY_LONG_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isPekeyNegativeIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
bool isPekeyPositiveIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_PKEY_POSITIVE_IRQ >> 8;
if (intRegister[1] & mask) {
return IS_BIT_SET(statusRegister[1], mask);
}
return false;
}
//IRQ STATUS 2
bool isWdtExpireIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_WDT_EXPIRE_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isLdoOverCurrentIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_LDO_OVER_CURR_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isBatfetOverCurrentIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BATFET_OVER_CURR_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isBatChagerDoneIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_CHG_DONE_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isBatChagerStartIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_CHG_START_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isBatDieOverTemperatureIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_DIE_OVER_TEMP_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isChagerOverTimeoutIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_CHAGER_TIMER_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
bool isBatOverVoltageIrq(void)
{
uint8_t mask = XPOWERS_AXP2101_BAT_OVER_VOL_IRQ >> 16;
if (intRegister[2] & mask) {
return IS_BIT_SET(statusRegister[2], mask);
}
return false;
}
uint8_t getChipID(void)
{
return readRegister(XPOWERS_AXP2101_IC_TYPE);
}
protected:
uint16_t getPowerChannelVoltage(uint8_t channel)
{
switch (channel) {
case XPOWERS_DCDC1:
return getDC1Voltage();
case XPOWERS_DCDC2:
return getDC2Voltage();
case XPOWERS_DCDC3:
return getDC3Voltage();
case XPOWERS_DCDC4:
return getDC4Voltage();
case XPOWERS_DCDC5:
return getDC5Voltage();
case XPOWERS_ALDO1:
return getALDO1Voltage();
case XPOWERS_ALDO2:
return getALDO2Voltage();
case XPOWERS_ALDO3:
return getALDO3Voltage();
case XPOWERS_ALDO4:
return getALDO4Voltage();
case XPOWERS_BLDO1:
return getBLDO1Voltage();
case XPOWERS_BLDO2:
return getBLDO2Voltage();
case XPOWERS_DLDO1:
return getDLDO1Voltage();
case XPOWERS_DLDO2:
return getDLDO2Voltage();
case XPOWERS_VBACKUP:
return getButtonBatteryVoltage();
default:
break;
}
return 0;
}
bool inline enablePowerOutput(uint8_t channel)
{
switch (channel) {
case XPOWERS_DCDC1:
return enableDC1();
case XPOWERS_DCDC2:
return enableDC2();
case XPOWERS_DCDC3:
return enableDC3();
case XPOWERS_DCDC4:
return enableDC4();
case XPOWERS_DCDC5:
return enableDC5();
case XPOWERS_ALDO1:
return enableALDO1();
case XPOWERS_ALDO2:
return enableALDO2();
case XPOWERS_ALDO3:
return enableALDO3();
case XPOWERS_ALDO4:
return enableALDO4();
case XPOWERS_BLDO1:
return enableBLDO1();
case XPOWERS_BLDO2:
return enableBLDO2();
case XPOWERS_DLDO1:
return enableDLDO1();
case XPOWERS_DLDO2:
return enableDLDO2();
case XPOWERS_VBACKUP:
return enableButtonBatteryCharge();
default:
break;
}
return false;
}
bool inline disablePowerOutput(uint8_t channel)
{
if (getProtectedChannel(channel)) {
log_e("Failed to disable the power channel, the power channel has been protected");
return false;
}
switch (channel) {
case XPOWERS_DCDC1:
return disableDC1();
case XPOWERS_DCDC2:
return disableDC2();
case XPOWERS_DCDC3:
return disableDC3();
case XPOWERS_DCDC4:
return disableDC4();
case XPOWERS_DCDC5:
return disableDC5();
case XPOWERS_ALDO1:
return disableALDO1();
case XPOWERS_ALDO2:
return disableALDO2();
case XPOWERS_ALDO3:
return disableALDO3();
case XPOWERS_ALDO4:
return disableALDO4();
case XPOWERS_BLDO1:
return disableBLDO1();
case XPOWERS_BLDO2:
return disableBLDO2();
case XPOWERS_DLDO1:
return disableDLDO1();
case XPOWERS_DLDO2:
return disableDLDO2();
case XPOWERS_VBACKUP:
return disableButtonBatteryCharge();
case XPOWERS_CPULDO:
return disableCPUSLDO();
default:
break;
}
return false;
}
bool inline isPowerChannelEnable(uint8_t channel)
{
switch (channel) {
case XPOWERS_DCDC1:
return isEnableDC1();
case XPOWERS_DCDC2:
return isEnableDC2();
case XPOWERS_DCDC3:
return isEnableDC3();
case XPOWERS_DCDC4:
return isEnableDC4();
case XPOWERS_DCDC5:
return isEnableDC5();
case XPOWERS_ALDO1:
return isEnableALDO1();
case XPOWERS_ALDO2:
return isEnableALDO2();
case XPOWERS_ALDO3:
return isEnableALDO3();
case XPOWERS_ALDO4:
return isEnableALDO4();
case XPOWERS_BLDO1:
return isEnableBLDO1();
case XPOWERS_BLDO2:
return isEnableBLDO2();
case XPOWERS_DLDO1:
return isEnableDLDO1();
case XPOWERS_DLDO2:
return isEnableDLDO2();
case XPOWERS_VBACKUP:
return isEanbleButtonBatteryCharge();
case XPOWERS_CPULDO:
return isEnableCPUSLDO();
default:
break;
}
return false;
}
bool inline setPowerChannelVoltage(uint8_t channel, uint16_t millivolt)
{
if (getProtectedChannel(channel)) {
log_e("Failed to set the power channel, the power channel has been protected");
return false;
}
switch (channel) {
case XPOWERS_DCDC1:
return setDC1Voltage(millivolt);
case XPOWERS_DCDC2:
return setDC2Voltage(millivolt);
case XPOWERS_DCDC3:
return setDC3Voltage(millivolt);
case XPOWERS_DCDC4:
return setDC4Voltage(millivolt);
case XPOWERS_DCDC5:
return setDC5Voltage(millivolt);
case XPOWERS_ALDO1:
return setALDO1Voltage(millivolt);
case XPOWERS_ALDO2:
return setALDO2Voltage(millivolt);
case XPOWERS_ALDO3:
return setALDO3Voltage(millivolt);
case XPOWERS_ALDO4:
return setALDO4Voltage(millivolt);
case XPOWERS_BLDO1:
return setBLDO1Voltage(millivolt);
case XPOWERS_BLDO2:
return setBLDO1Voltage(millivolt);
case XPOWERS_DLDO1:
return setDLDO1Voltage(millivolt);
case XPOWERS_DLDO2:
return setDLDO1Voltage(millivolt);
case XPOWERS_VBACKUP:
return setButtonBatteryChargeVoltage(millivolt);
case XPOWERS_CPULDO:
return setCPUSLDOVoltage(millivolt);
default:
break;
}
return false;
}
bool initImpl()
{
if (getChipID() == XPOWERS_AXP2101_CHIP_ID) {
setChipModel(XPOWERS_AXP2101);
disableTSPinMeasure(); //Disable NTC temperature detection by default
return true;
}
return false;
}
/*
* Interrupt control functions
*/
bool setInterruptImpl(uint32_t opts, bool enable)
{
int res = 0;
uint8_t data = 0, value = 0;
log_d("%s - HEX:0x%lx \n", enable ? "ENABLE" : "DISABLE", opts);
if (opts & 0x0000FF) {
value = opts & 0xFF;
// log_d("Write INT0: %x\n", value);
data = readRegister(XPOWERS_AXP2101_INTEN1);
intRegister[0] = enable ? (data | value) : (data & (~value));
res |= writeRegister(XPOWERS_AXP2101_INTEN1, intRegister[0]);
}
if (opts & 0x00FF00) {
value = opts >> 8;
// log_d("Write INT1: %x\n", value);
data = readRegister(XPOWERS_AXP2101_INTEN2);
intRegister[1] = enable ? (data | value) : (data & (~value));
res |= writeRegister(XPOWERS_AXP2101_INTEN2, intRegister[1]);
}
if (opts & 0xFF0000) {
value = opts >> 16;
// log_d("Write INT2: %x\n", value);
data = readRegister(XPOWERS_AXP2101_INTEN3);
intRegister[2] = enable ? (data | value) : (data & (~value));
res |= writeRegister(XPOWERS_AXP2101_INTEN3, intRegister[2]);
}
return res == 0;
}
const char *getChipNameImpl(void)
{
return "AXP2101";
}
private:
uint8_t statusRegister[XPOWERS_AXP2101_INTSTS_CNT];
uint8_t intRegister[XPOWERS_AXP2101_INTSTS_CNT];
};