SensorLib 0.5.1
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
AXP517Charger.cpp
Go to the documentation of this file.
1
30#include "../../../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_PMIC_AXP517
32
33#include "AXP517Charger.hpp"
34#include "AXP517Regs.hpp"
35
36
38{
39
40}
41
43{
44 return _core.updateBits(axp517_regs::ctrl::MODULE_EN1, 0x02, enable ? 0x02 : 0x00) >= 0;
45}
46
48{
49 return getStatus().charging;
50}
51
53{
54 // REG50[4]=1 disconnects TS from the charger; REG50[3:2]=00 turns its
55 // current source off. When enabled, use the ADC-gated current-source mode.
56 return _core.updateBits(axp517_regs::ts::PIN_CFG, 0x1C,
57 enable ? 0x04 : 0x10) >= 0;
58}
59
61{
62 int regValue = _core.readReg(axp517_regs::ts::PIN_CFG);
63 return regValue >= 0 && (regValue & 0x10) == 0;
64}
65
67{
68 return setCurrentWithStep(axp517_regs::chg::IPRECHG_ITRICHG, mA, 960, 64, 0x0F);
69}
70
72{
73 return getCurrentWithStep(axp517_regs::chg::IPRECHG_ITRICHG, 64, 0x0F);
74}
75
77{
78 return setCurrentWithStep(axp517_regs::chg::ICC_SETTING, mA, 5120, 64, 0x7F);
79}
80
82{
83 return getCurrentWithStep(axp517_regs::chg::ICC_SETTING, 64, 0x7F);
84}
85
87{
88 return setCurrentWithStep(axp517_regs::chg::ITERM_CTRL, mA, 960, 64, 0x0F);
89}
90
92{
93 return getCurrentWithStep(axp517_regs::chg::ITERM_CTRL, 64, 0x0F);
94}
95
97{
98 uint8_t voltCode = 0;
99 int regValue = 0;
100 switch (mV) {
101 case 4000: voltCode = 0x00; break;
102 case 4100: voltCode = 0x01; break;
103 case 4200: voltCode = 0x02; break;
104 case 4350: voltCode = 0x03; break;
105 case 4400: voltCode = 0x04; break;
106 case 3800: voltCode = 0x05; break;
107 case 3600: voltCode = 0x06; break;
108 case 5000: voltCode = 0x07; break;
109 default: return false;
110 }
112 if (regValue < 0) {
113 return false;
114 }
115 regValue = (regValue & 0xF8) | voltCode;
116 if (_core.writeReg(axp517_regs::chg::CV_CHG_VOLTAGE, regValue) < 0) {
117 return false;
118 }
119 return true;
120}
121
123{
124 int regValue = _core.readReg(axp517_regs::chg::CV_CHG_VOLTAGE);
125 if (regValue < 0) {
126 return 0;
127 }
128 uint8_t voltCode = regValue & 0x07;
129 switch (voltCode) {
130 case 0x00: return 4000;
131 case 0x01: return 4100;
132 case 0x02: return 4200;
133 case 0x03: return 4350;
134 case 0x04: return 4400;
135 case 0x05: return 3800;
136 case 0x06: return 3600;
137 case 0x07: return 5000;
138 default: break;
139 }
140 return 0;
141}
142
144{
145 Status status {};
146 int status0 = _core.readReg(axp517_regs::bmu::STATUS0);
147 int status1 = _core.readReg(axp517_regs::bmu::STATUS1);
148 if (status0 < 0 || status1 < 0) {
149 return status;
150 }
151 status.online = true;
152 status.vbusPresent = (status0 >> 5) & 0x01;
153 status.batteryPresent = (status0 >> 3) & 0x01;
161 if (!status.batteryPresent || !status.vbusPresent) {
162 return status;
163 }
164
165 const uint8_t chargingStatus = static_cast<uint8_t>(status1) & 0x07;
166 switch (chargingStatus) {
167 case 0: // Trickle charge
168 case 1: // Pre-charge
169 status.charging = true;
170 status.chargingStatus = ChargingStatus::PRE_CHARGE;
171 break;
172 case 2: // Constant-current charge
173 case 3: // Constant-voltage charge
174 status.charging = true;
175 status.chargingStatus = ChargingStatus::FAST_CHARGE;
176 break;
177 case 4: // Charge done
178 status.chargeDone = true;
179 status.chargingStatus = ChargingStatus::TERMINATION;
180 break;
181 case 5: // Not charging
182 status.chargingStatus = ChargingStatus::NO_CHARGING;
183 break;
184 default:
185 status.chargingStatus = ChargingStatus::UNKNOWN;
186 break;
187 }
188 status.fault = false; //TODO: Implement fault detection
189 return status;
190}
191
192bool AXP517Charger::setCurrentWithStep(uint8_t reg, uint16_t milliamps,
193 uint16_t max, uint16_t step, uint8_t mask)
194{
195 if (milliamps > max) milliamps = max;
196 uint8_t code = milliamps / step;
197 milliamps = code * step;
198 int regValue = _core.readReg(reg);
199 if (regValue < 0) {
200 return false;
201 }
202 regValue = (regValue & ~mask) | code;
203 if (_core.writeReg(reg, regValue) < 0) {
204 return false;
205 }
206 return true;
207}
208
209uint16_t AXP517Charger::getCurrentWithStep(uint8_t reg, uint16_t step, uint8_t mask)
210{
211 int regValue = _core.readReg(reg);
212 if (regValue < 0) {
213 return 0;
214 }
215 return (regValue & mask) * step;
216}
217
218#endif
@license MIT License
@license MIT License
uint16_t getChargeVoltage() override
Get charge voltage (CV).
uint16_t getPreChargeCurrent() override
Get pre-charge current.
bool setChargeVoltage(uint16_t mV) override
Set charge voltage (CV).
bool enableBatteryTemperatureProtection(bool enable)
Enable or disable TS-pin battery temperature protection.
uint16_t getFastChargeCurrent() override
Get fast charge (constant-current) current.
bool enableCharging(bool enable) override
Enable or disable charging.
Status getStatus() override
Get current charger status (best-effort).
bool setFastChargeCurrent(uint16_t mA) override
Set fast charge (constant-current) current.
bool isCharging() override
Check whether charger is currently charging (best-effort).
bool setTerminationCurrent(uint16_t mA) override
Set termination current.
uint16_t getTerminationCurrent() override
Get termination current.
bool isBatteryTemperatureProtectionEnabled()
Return true when the TS pin can affect charging.
bool setPreChargeCurrent(uint16_t mA) override
Set pre-charge current.
AXP517Charger(AXP517Core &core)
Construct an AXP517 charger driver.
AXP517 low-level core driver.
@ NO_CHARGING
Not charging, battery idle or disconnected.
@ PRE_CHARGE
Pre-charge phase (low current for weak battery)
@ UNKNOWN
Unable to determine status.
@ TERMINATION
Charging terminated (battery full)
@ FAST_CHARGE
Fast charge phase (constant current)
int readReg(uint8_t reg) const
int writeReg(uint8_t reg, uint8_t val)
int updateBits(uint8_t reg, uint8_t mask, uint8_t value_shifted)
Charger status structure.
bool charging
Charging state (coarse: true if in precharge/fastcharge)
static constexpr uint8_t STATUS1
BMU status1.
static constexpr uint8_t STATUS0
BMU status0.
static constexpr uint8_t ICC_SETTING
ICC setting.
static constexpr uint8_t IPRECHG_ITRICHG
Iprechg/Itrichg setting.
static constexpr uint8_t ITERM_CTRL
Iterm setting and control.
static constexpr uint8_t CV_CHG_VOLTAGE
CV charger voltage setting.
static constexpr uint8_t MODULE_EN1
Module enable control1.
static constexpr uint8_t PIN_CFG
TS pin configure.