SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
AXP517Core.cpp
Go to the documentation of this file.
1
30#include "../../../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_PMIC_AXP517
32
33#include "AXP517Core.hpp"
34#include "AXP517Regs.hpp"
35#include "AXP517TcpcRegs.hpp"
36
37namespace
38{
39static constexpr uint16_t AXP517_VENDOR_ID_ALT = 0xE0C5;
40static constexpr uint8_t TCPC_POWER_STATUS_UNINIT = 0x40;
41} // namespace
42
43
44bool AXP517Core::enableModule(Module module, bool enable)
45{
46 uint8_t reg = 0, bit = 0;
47 switch (module) {
48 case Module::BC12: reg = axp517_regs::bmu::MODULE_EN0; bit = 4; break;
49 case Module::TYPEC: reg = axp517_regs::bmu::MODULE_EN0; bit = 3; break;
50 case Module::GAUGE: reg = axp517_regs::bmu::MODULE_EN0; bit = 2; break;
51 case Module::WATCHDOG: {
52 bit = 0;
54 enable ? setRegBit(reg, bit) : clrRegBit(reg, bit);
56 enable ? setRegBit(reg, bit) : clrRegBit(reg, bit);
57 }
58 break;
60 case Module::BOOST: reg = axp517_regs::ctrl::MODULE_EN1; bit = 4; break;
61 case Module::BUCK: reg = axp517_regs::ctrl::MODULE_EN1; bit = 3; break;
62 case Module::CHGLED: reg = axp517_regs::ctrl::MODULE_EN1; bit = 2; break;
63 case Module::CHARGE: reg = axp517_regs::ctrl::MODULE_EN1; bit = 1; break;
64 case Module::MPPT: reg = axp517_regs::ctrl::MPPT_CFG; bit = 0; break;
65 default:
66 return false;
67 }
68 return enable ? setRegBit(reg, bit) : clrRegBit(reg, bit);
69}
70
72{
73 uint8_t reg = 0, bit = 0;
74 switch (module) {
75 case Module::BC12: reg = axp517_regs::bmu::MODULE_EN0; bit = 4; break;
76 case Module::TYPEC: reg = axp517_regs::bmu::MODULE_EN0; bit = 3; break;
77 case Module::GAUGE: reg = axp517_regs::bmu::MODULE_EN0; bit = 2; break;
78 case Module::WATCHDOG: {
80 }
81 break;
83 case Module::BOOST: reg = axp517_regs::ctrl::MODULE_EN1; bit = 4; break;
84 case Module::BUCK: reg = axp517_regs::ctrl::MODULE_EN1; bit = 3; break;
85 case Module::CHGLED: reg = axp517_regs::ctrl::MODULE_EN1; bit = 2; break;
86 case Module::CHARGE: reg = axp517_regs::ctrl::MODULE_EN1; bit = 1; break;
87 case Module::MPPT: {
89 if (val < 0)return false;
90 return (val & 0x03) == 0x03;
91 }
92 default:
93 return false;
94 }
95 return getRegBit(reg, bit);
96}
97
98bool AXP517Core::initImpl(uint8_t param)
99{
100 uint8_t buffer[2] = {0};
101 uint16_t vendorId = 0;
102
103 // Enable CC module clock (REG 0BH bit3 = Type-C CC detect enable)
104 // SENSORLIB_LOG_D("AXP517: Enabling CC module clock...");
105 if (!enableModule(Module::TYPEC, true)) {
106 SENSORLIB_LOG_E("Failed to enable CC clock");
107 // Continue anyway - may not be fatal
108 }
109 // Wait for CC module ready
110 hal->delay(20);
111
112 if (writeReg(axp517::tcpc::CC_GENERAL_CONTROL, axp517::tcpc::SW_RESET) < 0) {
113 SENSORLIB_LOG_E("Failed to assert TCPC software reset");
114 return false;
115 }
116 hal->delay(50);
117 if (writeReg(axp517::tcpc::CC_GENERAL_CONTROL, 0x00) < 0) {
118 SENSORLIB_LOG_E("Failed to release TCPC software reset");
119 return false;
120 }
121 hal->delay(300);
122
123 int powerStatus = 0;
124 bool tcpc_initial = false;
125 for (uint8_t i = 0; i < 40; ++i) {
126 powerStatus = readReg(axp517::tcpc::POWER_STATUS);
127 if (powerStatus < 0) {
128 SENSORLIB_LOG_E("Failed to read TCPC power status");
129 return false;
130 }
131 tcpc_initial = (powerStatus & TCPC_POWER_STATUS_UNINIT) == 0;
132 if (tcpc_initial) {
133 break;
134 }
135 hal->delay(50);
136 }
137
138 if (!tcpc_initial) {
139 SENSORLIB_LOG_E("TCPC initialization failed, POWER_STATUS: 0x%" PRIx32,
140 static_cast<uint32_t>(powerStatus));
141 return false;
142 }
143
144 if (readRegBuff(axp517::tcpc::TCPC_VENDOR_ID, buffer, sizeof(buffer)) < 0) {
145 SENSORLIB_LOG_E("Failed to read TCPC vendor ID");
146 return false;
147 }
148 vendorId = (buffer[1] << 8) | buffer[0];
149 if (vendorId != axp517::tcpc::VENDOR_ID && vendorId != AXP517_VENDOR_ID_ALT) {
150 SENSORLIB_LOG_E("AXP517 not found, vendor ID: 0x%" PRIx32,
151 static_cast<uint32_t>(vendorId));
152 return false;
153 }
154
155 SENSORLIB_LOG_D("AXP517: Init complete, initializing... Vendor ID: 0x%" PRIx32,
156 static_cast<uint32_t>(vendorId));
157
158 return true;
159}
160
161#endif
@license MIT License
@license MIT License
@license MIT License
#define SENSORLIB_LOG_E(...)
#define SENSORLIB_LOG_D(...)
bool isModuleEnabled(Module module)
Check if a module is enabled.
bool enableModule(Module module, bool enable)
Enable or disable a module.
Module
Functional module switches exposed by AXP517.
@ CHARGE
REG 19H bit 1 Charger.
@ BC12
Module enable control 0 (REG 0BH).
@ BUCK
REG 19H bit 3 Buck converter.
@ GAUGE
REG 0BH bit 2 Fuel gauge.
@ CHGLED
REG 19H bit 2 Charge LED.
@ TYPEC
REG 0BH bit 3 Type-C.
@ BOOST
REG 19H bit 4 Boost converter.
@ MPPT
REG 22H bit 0 MPPT configure.
@ WATCHDOG
REG 0BH bit 0 Watchdog CLK and REG 19H bit 0 Watchdog Module enable.
@ GAUGE_LOW_POWER
Module enable control 1 (REG 19H).
std::unique_ptr< SensorHal > hal
bool clrRegBit(uint8_t reg, uint8_t bit)
bool getRegBit(uint8_t reg, uint8_t bit)
int readReg(uint8_t reg) const
int writeReg(uint8_t reg, uint8_t val)
int readRegBuff(uint8_t reg, uint8_t *buf, size_t len) const
bool setRegBit(uint8_t reg, uint8_t bit)
uint8_t i
static constexpr uint8_t MODULE_EN0
Module enable control0.
static constexpr uint8_t MODULE_EN1
Module enable control1.
static constexpr uint8_t MPPT_CFG
MPPT configure.