SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
AXP202Gpio.cpp
Go to the documentation of this file.
1#include "../../../SensorBuildOpt.h"
2#if !SENSORLIB_EXCLUDE_PMIC_AXP202
3
4#include "AXP202Gpio.hpp"
5#include "AXP202Regs.hpp"
6
7
9{
10}
11
13{
14 return 4;
15}
16
17uint8_t AXP202Gpio::getCtrlReg(uint8_t pin) const
18{
19 switch (pin) {
20 case 0: return axp202_regs::gpio::GPIO0_CTL;
21 case 1: return axp202_regs::gpio::GPIO1_CTL;
22 case 2: return axp202_regs::gpio::GPIO2_CTL;
23 case 3: return axp202_regs::gpio::GPIO3_CTL;
24 default: return 0;
25 }
26}
27
29{
30 uint8_t reg = getCtrlReg(pin);
31 if (reg == 0) return Status::InvalidPin;
32
33 if (pin <= 2) {
34 uint8_t val;
35 switch (dir) {
37 val = 0x02;
38 break;
40 val = 0x00;
41 break;
42 default:
43 return Status::Failed;
44 }
45 return _core.updateBits(reg, 0x07, val) >= 0 ? Status::Ok : Status::Failed;
46 }
47 // GPIO3
48 if (dir == Direction::Output) {
49 int v = _core.readReg(reg);
50 if (v < 0) return Status::Failed;
51 v = (v & 0xF8) | 0x00;
52 return _core.writeReg(reg, static_cast<uint8_t>(v)) >= 0 ? Status::Ok : Status::Failed;
53 }
54 int v = _core.readReg(reg);
55 if (v < 0) return Status::Failed;
56 v = (v & 0xF8) | 0x04;
57 return _core.writeReg(reg, static_cast<uint8_t>(v)) >= 0 ? Status::Ok : Status::Failed;
58}
59
61{
62 uint8_t reg = getCtrlReg(pin);
63 if (reg == 0) return Direction::Input;
64 int val = _core.readReg(reg);
65 if (val < 0) return Direction::Input;
66 uint8_t func = val & 0x07;
67 if (pin <= 2) {
68 return (func == 0x02) ? Direction::Input : Direction::Output;
69 }
70 return ((func & 0x04) == 0) ? Direction::Output : Direction::Input;
71}
72
74{
75 if (pin >= getPinCount()) return Status::InvalidPin;
76 (void)drive;
77 // AXP202 GPIO0-2 are push-pull (no open-drain mode in function select).
78 // GPIO3 is NMOS open-drain (fixed, not configurable).
79 // Drive type cannot be independently configured on any pin.
80 return Status::Failed;
81}
82
84{
85 // GPIO0-2: push-pull (function 0x00=Low, 0x01=High)
86 // GPIO3: NMOS open-drain
87 return (pin == 3) ? DriveType::OpenDrain : DriveType::PushPull;
88}
89
90PmicGpioBase::Status AXP202Gpio::read(uint8_t pin, bool &high)
91{
92 uint8_t reg = getCtrlReg(pin);
93 if (reg == 0) return Status::InvalidPin;
94
95 if (pin <= 2) {
97 if (val < 0) return Status::Failed;
98 high = (val >> (pin + 4)) & 0x01;
99 return Status::Ok;
100 }
101 // GPIO3: REG 95H bit0 is input status, active-low per datasheet:
102 // bit0 = 0 means pin is electrically HIGH, bit0 = 1 means LOW
103 int val = _core.readReg(reg);
104 if (val < 0) return Status::Failed;
105 high = !(val & 0x01);
106 return Status::Ok;
107}
108
110{
111 uint8_t reg = getCtrlReg(pin);
112 if (reg == 0) return Status::InvalidPin;
113
114 int val = _core.readReg(reg);
115 if (val < 0) return Status::Failed;
116
117 if (pin <= 2) {
118 // GPIO0-2 function select: 0x00=Low, 0x01=High, 0x07=Floating(HiZ)
119 switch (level) {
120 case Level::Low: val = (val & 0xF8) | 0x00; break;
121 case Level::High: val = (val & 0xF8) | 0x01; break;
122 case Level::HiZ: val = (val & 0xF8) | 0x07; break;
123 default: return Status::Failed;
124 }
125 } else {
126 // GPIO3: REG 95H bit1 controls output (NMOS open-drain)
127 // bit1=0: low (NMOS on), bit1=1: floating (NMOS off)
128 // Level::High is not supported — GPIO3 cannot actively drive high
129 if (level == Level::High) return Status::Failed;
130 val = (val & 0xFD);
131 switch (level) {
132 case Level::Low: val |= (0x00 << 1); break;
133 case Level::HiZ: val |= (0x01 << 1); break;
134 default: return Status::Failed;
135 }
136 }
137 return _core.writeReg(reg, static_cast<uint8_t>(val)) >= 0 ? Status::Ok : Status::Failed;
138}
139
141{
142 uint8_t reg = getCtrlReg(pin);
143 if (reg == 0) return Status::InvalidPin;
144 // GPIO3 has no function multiplexing (only open-drain or input)
145 if (pin == 3) return Status::Failed;
146
147 // GPIO0-2: REG 90H/92H/93H [2:0] function select
148 return _core.updateBits(reg, 0x07, func & 0x07) >= 0 ? Status::Ok : Status::Failed;
149}
150
151uint8_t AXP202Gpio::getFunction(uint8_t pin)
152{
153 uint8_t reg = getCtrlReg(pin);
154 if (reg == 0) return 0xFF;
155 int v = _core.readReg(reg);
156 if (v < 0) return 0xFF;
157 if (pin <= 2) {
158 return v & 0x07;
159 }
160 // GPIO3: return bit2 (0=NMOS open-drain, 1=input) as function value
161 return (v & 0x04) ? 0x01 : 0x00;
162}
163
164#endif
@license MIT License
@license MIT License
uint8_t level
AXP202Gpio(AXP202Core &core)
Construct AXP202 GPIO interface.
Definition AXP202Gpio.cpp:8
DriveType getDrive(uint8_t pin) override
Get GPIO pin drive type.
Status setDrive(uint8_t pin, DriveType drive) override
Set GPIO pin drive type.
uint8_t getFunction(uint8_t pin) override
Get current GPIO pin function mode.
Direction getDirection(uint8_t pin) override
Get GPIO pin direction.
uint8_t getPinCount() const override
Get number of GPIO pins (4: GPIO0-GPIO3)
Status setDirection(uint8_t pin, Direction dir) override
Set GPIO pin direction.
Status read(uint8_t pin, bool &high) override
Read digital level from a GPIO pin.
Status setFunction(uint8_t pin, uint8_t func) override
Set GPIO pin function mode.
Status write(uint8_t pin, Level level) override
Write digital level to a GPIO pin.
DriveType
GPIO drive type.
@ OpenDrain
Open-drain output: only pulls low, high-impedance for high.
@ PushPull
Push-pull output: actively drives high or low.
Level
Output level control.
@ Low
Logic low (active drive low or open-drain pulled low)
@ High
Logic high (active drive high)
@ HiZ
High-impedance (input mode or open-drain not pulling low)
Direction
GPIO pin direction.
@ Output
Configure pin as output (drive external circuits)
@ Input
Configure pin as input (read external signals)
Status
GPIO operation status code.
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)
static constexpr uint8_t GPIO0_CTL
static constexpr uint8_t GPIO1_CTL
static constexpr uint8_t GPIO2_CTL
static constexpr uint8_t GPIO3_CTL
static constexpr uint8_t GPIO012_SIGNAL