SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
SY6970Power.cpp
Go to the documentation of this file.
1
30#include "../../../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_PMIC_SY6970
32
33#include "SY6970Power.hpp"
34#include "SY6970Regs.hpp"
35
36using namespace SY6970Regs;
37
38SY6970Power::SY6970Power(SY6970Core &core) : _core(core) {}
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 SY6970Power::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.
bool setBoostVoltage(uint16_t mv) override
Set boost output voltage.
bool setInputCurrentLimit(uint32_t mA) override
Set input current limit.
bool isBoostEnabled() const override
Check if boost mode is enabled.
bool resetWatchdog() override
Reset the watchdog timer (feed the watchdog)
uint32_t getInputVoltageLimit() const override
Get input voltage limit.
uint32_t getInputCurrentLimit() const override
Get input current limit.
bool enableBoost(bool enable) override
Enable/disable OTG (boost) mode.
SY6970Power(SY6970Core &core)
Construct power management interface.
bool isWatchdogEnabled() const override
Check if watchdog is enabled.
bool setInputVoltageLimit(uint32_t mv) override
Set input voltage limit (VINDPM)
bool setMinimumSystemVoltage(uint32_t mv) override
Set minimum system voltage.
uint16_t getBoostVoltage() const override
Get boost output voltage.
uint32_t getMinimumSystemVoltage() const override
Get minimum system voltage.
bool setWatchdogTimeout(uint16_t timeout_s) override
Set the watchdog timeout duration.
uint16_t getWatchdogTimeout() const override
Get the current watchdog timeout setting.
bool enableShipMode(bool enable) override
Enable or disable ship mode.
bool enableWatchdog(bool enable) override
Enable or disable the I2C watchdog timer.
bool isShipModeEnabled() const override
Check if ship mode is enabled.
int readReg(uint8_t reg) const
int updateBits(uint8_t reg, uint8_t mask, uint8_t value_shifted)