SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
BQ25896Power.cpp
Go to the documentation of this file.
1
30#include "../../../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_PMIC_BQ25896
32
33#include "BQ25896Power.hpp"
34#include "BQ25896Regs.hpp"
35
36using namespace BQ25896Regs;
37
39
41{
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;
45 }
46 if (closest > SYS_VOFF_VOL_MAX) {
47 closest = SYS_VOFF_VOL_MAX;
48 }
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;
51}
52
54{
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);
59}
60
62{
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;
66 }
67 if (closest > VINDPM_VOL_MAX) {
68 closest = VINDPM_VOL_MAX;
69 }
70 uint8_t val = ((closest - VINDPM_VOL_BASE) / VINDPM_VOL_STEPS) & MASK_VINDPM;
71 return _core.updateBits(REG_VINDPM, MASK_VINDPM, val) >= 0;
72}
73
75{
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;
81}
82
84{
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;
88 }
89 if (closest > IN_CURRENT_MAX_VAL) {
90 closest = IN_CURRENT_MAX_VAL;
91 }
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;
94}
95
97{
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;
101}
102
104{
105 if (enable) {
106 if (_core.isVbusPresent()) {
107 return false;
108 }
109 return _core.updateBits(REG_CHG_CTRL, MASK_OTG_CONFIG, MASK_OTG_CONFIG) >= 0;
110 } else {
111 return _core.updateBits(REG_CHG_CTRL, MASK_OTG_CONFIG, 0) >= 0;
112 }
113}
114
116{
117 int val = _core.readReg(REG_CHG_CTRL);
118 return (val >= 0) && (val & MASK_OTG_CONFIG);
119}
120
122{
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;
126 }
127 if (closest > BOOST_VOL_MAX_VAL) {
128 closest = BOOST_VOL_MAX_VAL;
129 }
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;
132}
133
135{
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);
140}
141
143{
144 uint8_t val = enable ? MASK_BATFET_DIS : 0;
145 return _core.updateBits(REG_MISC_CTRL, MASK_BATFET_DIS, val) >= 0;
146}
147
149{
150 int val = _core.readReg(REG_MISC_CTRL);
151 return (val >= 0) && (val & MASK_BATFET_DIS);
152}
153
155{
156 if (enable) {
157 return _core.updateBits(REG_CHG_TIMER, MASK_WATCHDOG, (1 << SHIFT_WATCHDOG)) >= 0;
158 } else {
159 return _core.updateBits(REG_CHG_TIMER, MASK_WATCHDOG, 0) >= 0;
160 }
161}
162
164{
165 int val = _core.readReg(REG_CHG_TIMER);
166 if (val < 0) return false;
167 return ((val >> SHIFT_WATCHDOG) & 0x03) != 0;
168}
169
170bool BQ25896Power::setWatchdogTimeout(uint16_t timeout_s)
171{
172 uint8_t val = 0;
173 if (timeout_s == 0) {
174 val = 0;
175 } else if (timeout_s <= 40) {
176 val = 1 << SHIFT_WATCHDOG;
177 } else if (timeout_s <= 80) {
178 val = 2 << SHIFT_WATCHDOG;
179 } else {
180 val = 3 << SHIFT_WATCHDOG;
181 }
182 return _core.updateBits(REG_CHG_TIMER, MASK_WATCHDOG, val) >= 0;
183}
184
186{
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;
191 return wd * 40;
192}
193
195{
196 return _core.updateBits(REG_CHG_CTRL, MASK_WD_RST, MASK_WD_RST) >= 0;
197}
198
199#endif
@license MIT License
@license MIT License
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)