SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
AXP2101Irq.cpp
Go to the documentation of this file.
1
31#include "../../../SensorBuildOpt.h"
32#if !SENSORLIB_EXCLUDE_PMIC_AXP2101
33
34#include "AXP2101Irq.hpp"
35#include "AXP2101Regs.hpp"
36
37
39{
40}
41
42bool AXP2101Irq::enable(uint64_t mask)
43{
44 for (uint8_t i = 0; i < 3; ++i) {
45 const uint8_t byte_mask = static_cast<uint8_t>((mask >> (i * 8)) & 0xFF);
46 if (byte_mask == 0) continue;
47
48 const int current = _core.readReg(axp2101_regs::irq::ENABLE1 + i);
49 if (current < 0) return false;
50
51 const uint8_t next = static_cast<uint8_t>(current) | byte_mask;
52 if (next != static_cast<uint8_t>(current) &&
53 _core.writeReg(axp2101_regs::irq::ENABLE1 + i, next) < 0) {
54 return false;
55 }
56 }
57 return true;
58}
59
60bool AXP2101Irq::disable(uint64_t mask)
61{
62 for (uint8_t i = 0; i < 3; ++i) {
63 const uint8_t byte_mask = static_cast<uint8_t>((mask >> (i * 8)) & 0xFF);
64 if (byte_mask == 0) continue;
65
66 const int current = _core.readReg(axp2101_regs::irq::ENABLE1 + i);
67 if (current < 0) return false;
68
69 const uint8_t next = static_cast<uint8_t>(current) & ~byte_mask;
70 if (next != static_cast<uint8_t>(current) &&
71 _core.writeReg(axp2101_regs::irq::ENABLE1 + i, next) < 0) {
72 return false;
73 }
74 }
75 return true;
76}
77
78uint64_t AXP2101Irq::readStatus(bool clear)
79{
80 uint8_t buffer[3];
81 for (uint8_t i = 0; i < 3; ++i) {
82 const int value = _core.readReg(axp2101_regs::irq::STATUS1 + i);
83 if (value < 0) return 0;
84 buffer[i] = static_cast<uint8_t>(value);
85 }
86 uint64_t mask = (static_cast<uint64_t>(buffer[2]) << 16) |
87 (static_cast<uint64_t>(buffer[1]) << 8) |
88 (static_cast<uint64_t>(buffer[0]));
89 if (clear && mask != 0) {
90 // Only clear the bits that were actually read to avoid losing
91 // IRQs that arrived between the read and the clear (W1C race).
92 for (uint8_t i = 0; i < 3; ++i) {
93 if (buffer[i] != 0) {
94 _core.writeReg(axp2101_regs::irq::STATUS1 + i, buffer[i]);
95 }
96 }
97 }
98 return mask;
99}
100
102{
103 for (uint8_t i = 0; i < 3; ++i) {
104 if (_core.writeReg(axp2101_regs::irq::STATUS1 + i, 0xFF) < 0) {
105 return false;
106 }
107 }
108 return true;
109}
110
111#endif
@license MIT License
Core I2C communication layer for the AXP2101 PMIC.
bool enable(uint64_t mask) override
Enable one or more interrupt sources.
uint64_t readStatus(bool clear=true) override
Read the current interrupt status.
bool disable(uint64_t mask) override
Disable one or more interrupt sources.
bool clearStatus() override
Clear all pending interrupt status registers.
AXP2101Irq(AXP2101Core &core)
int readReg(uint8_t reg) const
int writeReg(uint8_t reg, uint8_t val)
uint8_t i
static constexpr uint8_t ENABLE1
static constexpr uint8_t STATUS1