30#include "../../../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_PMIC_BQ25896
42 uint32_t closest = SYS_VOFF_VOL_MIN + ((mv - SYS_VOFF_VOL_MIN + SYS_VOL_STEPS / 2) / SYS_VOL_STEPS) * SYS_VOL_STEPS;
43 if (closest < SYS_VOFF_VOL_MIN) {
44 closest = SYS_VOFF_VOL_MIN;
46 if (closest > SYS_VOFF_VOL_MAX) {
47 closest = SYS_VOFF_VOL_MAX;
49 uint8_t val = ((closest - SYS_VOFF_VOL_MIN) / SYS_VOL_STEPS) << SHIFT_SYS_MIN;
50 return _core.
updateBits(REG_CHG_CTRL, MASK_SYS_MIN, val) >= 0;
55 int val = _core.
readReg(REG_CHG_CTRL);
56 if (val < 0)
return 0;
57 val = (val >> SHIFT_SYS_MIN) & 0x07;
58 return SYS_VOFF_VOL_MIN + (val * SYS_VOL_STEPS);
63 uint32_t closest = VINDPM_VOL_BASE + ((mv - VINDPM_VOL_BASE + VINDPM_VOL_STEPS / 2) / VINDPM_VOL_STEPS) * VINDPM_VOL_STEPS;
64 if (closest < VINDPM_VOL_MIN) {
65 closest = VINDPM_VOL_MIN;
67 if (closest > VINDPM_VOL_MAX) {
68 closest = VINDPM_VOL_MAX;
70 uint8_t val = ((closest - VINDPM_VOL_BASE) / VINDPM_VOL_STEPS) & MASK_VINDPM;
71 return _core.
updateBits(REG_VINDPM, MASK_VINDPM, val) >= 0;
76 int val = _core.
readReg(REG_VINDPM);
77 if (val < 0)
return 0;
78 val = val & MASK_VINDPM;
79 uint32_t result = VINDPM_VOL_BASE + (val * VINDPM_VOL_STEPS);
80 return (result < VINDPM_VOL_MIN) ? VINDPM_VOL_MIN : result;
85 uint32_t closest = IN_CURRENT_MIN_VAL + ((mA - IN_CURRENT_MIN_VAL + IN_CURRENT_STEP / 2) / IN_CURRENT_STEP) * IN_CURRENT_STEP;
86 if (closest < IN_CURRENT_MIN_VAL) {
87 closest = IN_CURRENT_MIN_VAL;
89 if (closest > IN_CURRENT_MAX_VAL) {
90 closest = IN_CURRENT_MAX_VAL;
92 uint8_t val = ((closest - IN_CURRENT_MIN_VAL) / IN_CURRENT_STEP) & MASK_IINLIM;
93 return _core.
updateBits(REG_PWR_INPUT, MASK_IINLIM, val) >= 0;
98 int val = _core.
readReg(REG_PWR_INPUT);
99 if (val < 0)
return 0;
100 return ((val & MASK_IINLIM) * IN_CURRENT_STEP) + IN_CURRENT_MIN_VAL;
109 return _core.
updateBits(REG_CHG_CTRL, MASK_OTG_CONFIG, MASK_OTG_CONFIG) >= 0;
111 return _core.
updateBits(REG_CHG_CTRL, MASK_OTG_CONFIG, 0) >= 0;
117 int val = _core.
readReg(REG_CHG_CTRL);
118 return (val >= 0) && (val & MASK_OTG_CONFIG);
123 uint16_t closest = BOOST_VOL_BASE + ((mv - BOOST_VOL_BASE + BOOST_VOL_STEP / 2) / BOOST_VOL_STEP) * BOOST_VOL_STEP;
124 if (closest < BOOST_VOL_MIN_VAL) {
125 closest = BOOST_VOL_MIN_VAL;
127 if (closest > BOOST_VOL_MAX_VAL) {
128 closest = BOOST_VOL_MAX_VAL;
130 uint8_t val = (((closest - BOOST_VOL_BASE) / BOOST_VOL_STEP) << SHIFT_BOOSTV) & MASK_BOOSTV;
131 return _core.
updateBits(REG_BOOST_CTRL, MASK_BOOSTV, val) >= 0;
136 int val = _core.
readReg(REG_BOOST_CTRL);
137 if (val < 0)
return 0;
138 val = (val >> SHIFT_BOOSTV) & 0x0F;
139 return BOOST_VOL_BASE + (val * BOOST_VOL_STEP);
144 uint8_t val = enable ? MASK_BATFET_DIS : 0;
145 return _core.
updateBits(REG_MISC_CTRL, MASK_BATFET_DIS, val) >= 0;
150 int val = _core.
readReg(REG_MISC_CTRL);
151 return (val >= 0) && (val & MASK_BATFET_DIS);
157 return _core.
updateBits(REG_CHG_TIMER, MASK_WATCHDOG, (1 << SHIFT_WATCHDOG)) >= 0;
159 return _core.
updateBits(REG_CHG_TIMER, MASK_WATCHDOG, 0) >= 0;
165 int val = _core.
readReg(REG_CHG_TIMER);
166 if (val < 0)
return false;
167 return ((val >> SHIFT_WATCHDOG) & 0x03) != 0;
173 if (timeout_s == 0) {
175 }
else if (timeout_s <= 40) {
176 val = 1 << SHIFT_WATCHDOG;
177 }
else if (timeout_s <= 80) {
178 val = 2 << SHIFT_WATCHDOG;
180 val = 3 << SHIFT_WATCHDOG;
182 return _core.
updateBits(REG_CHG_TIMER, MASK_WATCHDOG, val) >= 0;
187 int val = _core.
readReg(REG_CHG_TIMER);
188 if (val < 0)
return 0;
189 uint8_t wd = (val >> SHIFT_WATCHDOG) & 0x03;
190 if (wd == 0)
return 0;
196 return _core.
updateBits(REG_CHG_CTRL, MASK_WD_RST, MASK_WD_RST) >= 0;
bool isVbusPresent()
Check if VBUS (USB power) is present.
BQ25896Power(BQ25896Core &core)
Construct power management interface.
bool isBoostEnabled() const override
Check if boost mode is enabled.
bool setBoostVoltage(uint16_t mv) override
Set boost output voltage.
bool enableWatchdog(bool enable) override
Enable or disable the I2C watchdog timer.
bool isWatchdogEnabled() const override
Check if watchdog is enabled.
bool enableShipMode(bool enable) override
Enable or disable ship mode.
bool setMinimumSystemVoltage(uint32_t mv) override
Set minimum system voltage.
bool setInputVoltageLimit(uint32_t mv) override
Set input voltage limit (VINDPM)
bool setInputCurrentLimit(uint32_t mA) override
Set input current limit.
bool enableBoost(bool enable) override
Enable or disable OTG (boost) mode.
uint32_t getInputVoltageLimit() const override
Get input voltage limit.
uint16_t getWatchdogTimeout() const override
Get the current watchdog timeout setting.
uint16_t getBoostVoltage() const override
Get boost output voltage.
uint32_t getInputCurrentLimit() const override
Get input current limit.
uint32_t getMinimumSystemVoltage() const override
Get minimum system voltage.
bool isShipModeEnabled() const override
Check if ship mode is enabled.
bool resetWatchdog() override
Reset the watchdog timer (feed the watchdog)
bool setWatchdogTimeout(uint16_t timeout_s) override
Set the watchdog timeout duration.
int readReg(uint8_t reg) const
int updateBits(uint8_t reg, uint8_t mask, uint8_t value_shifted)