54#include "../../PmicIrqBase.hpp"
55#include "../../../platform/SensorCommWrapper.hpp"
57template<
typename Regs>
177 static bool isIrqSet(uint64_t irqMask, uint64_t status) {
return (status & irqMask) != 0; }
392 bool readEnableRegs(uint8_t
buf[5]);
401 bool writeEnableRegsIfChanged(
const uint8_t before[5],
const uint8_t after[5]);
409 bool clearStatusByMask(
const uint8_t maskBytes[5]);
415 bool clearAllStatusRegs();
422 static uint64_t pack5(
const uint8_t
buf[5]);
429 static void unpack5(uint64_t val, uint8_t
buf[5]);
434template<
typename Regs>
437 if (_core.readRegBuff(Regs::irq::ENABLE1,
buf, 4) < 0) {
441 int en5 = _core.readReg(Regs::irq::ENABLE5);
445 buf[4] =
static_cast<uint8_t
>(en5);
449template<
typename Regs>
453 for (
int i = 0;
i < 4; ++
i) {
454 if (before[
i] != after[
i]) {
455 if (_core.writeReg(Regs::irq::ENABLE1 +
i, after[
i]) < 0) {
461 if (before[4] != after[4]) {
462 if (_core.writeReg(Regs::irq::ENABLE5, after[4]) < 0) {
469template<
typename Regs>
473 for (
int i = 0;
i < 4; ++
i) {
474 if (maskBytes[
i] != 0) {
475 if (_core.writeReg(Regs::irq::STATUS1 +
i, maskBytes[
i]) < 0) {
481 if (maskBytes[4] != 0) {
482 if (_core.writeReg(Regs::irq::STATUS5, maskBytes[4]) < 0) {
489template<
typename Regs>
492 const uint8_t all[5] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
493 return clearStatusByMask(all);
496template<
typename Regs>
499 return (
static_cast<uint64_t
>(
buf[0])) |
500 (
static_cast<uint64_t
>(
buf[1]) << 8) |
501 (
static_cast<uint64_t
>(
buf[2]) << 16) |
502 (
static_cast<uint64_t
>(
buf[3]) << 24) |
503 (
static_cast<uint64_t
>(
buf[4]) << 32);
506template<
typename Regs>
509 buf[0] =
static_cast<uint8_t
>(val & 0xFF);
510 buf[1] =
static_cast<uint8_t
>((val >> 8) & 0xFF);
511 buf[2] =
static_cast<uint8_t
>((val >> 16) & 0xFF);
512 buf[3] =
static_cast<uint8_t
>((val >> 24) & 0xFF);
513 buf[4] =
static_cast<uint8_t
>((val >> 32) & 0xFF);
516template<
typename Regs>
519 uint8_t before[5], after[5];
520 if (!readEnableRegs(before)) {
524 uint64_t current = pack5(before);
526 unpack5(current, after);
528 return writeEnableRegsIfChanged(before, after);
531template<
typename Regs>
534 uint8_t before[5], after[5];
535 if (!readEnableRegs(before)) {
539 uint64_t current = pack5(before);
541 unpack5(current, after);
543 return writeEnableRegsIfChanged(before, after);
546template<
typename Regs>
550 if (_core.readRegBuff(Regs::irq::STATUS1,
buf, 4) < 0) {
553 int st5 = _core.readReg(Regs::irq::STATUS5);
554 if (st5 < 0)
return 0;
555 buf[4] =
static_cast<uint8_t
>(st5);
557 uint64_t mask = pack5(
buf);
558 if (clear && mask != 0) {
561 if (!clearStatusByMask(
buf)) {
568template<
typename Regs>
571 return clearAllStatusRegs();
static bool isGpio1EdgeTrigger(uint64_t m)
Check GPIO1 edge trigger interrupt.
static bool isBattExitActivate(uint64_t m)
AXP192 alias for isBatExitActivate().
static bool isDc2VoltLess(uint64_t m)
Check DC-DC2 voltage low interrupt.
static bool isVbusSessionEnd(uint64_t m)
Check VBUS session end interrupt.
static constexpr uint64_t IRQ_VBUS_LOW_VHOLD
VBUS low VHOLD interrupt mask.
static constexpr uint64_t IRQ_VBUS_SESSION_END
VBUS session end interrupt mask.
static bool isGpio3Irq(uint64_t m)
AXP202 alias for isGpio3EdgeTrigger().
static bool isApsLowVolLevel1(uint64_t m)
AXP202 alias for isLowVoltLevel1().
static constexpr uint64_t IRQ_VBUS_EFFECTIVE
VBUS effective interrupt mask.
static constexpr uint64_t IRQ_GPIO0_EDGE
GPIO0 edge trigger interrupt mask.
static constexpr uint64_t IRQ_BAT_CHG_START
Charging started interrupt mask.
static bool isAcinInsert(uint64_t m)
Check ACIN insertion interrupt.
static constexpr uint64_t IRQ_VBUS_INSERT
VBUS insertion interrupt mask.
static bool isBatChgStart(uint64_t m)
Check charging started interrupt.
static bool isDc1LowVol(uint64_t m)
AXP192 alias for isDc1VoltLess().
static constexpr uint64_t IRQ_LOW_VOLT_LEVEL2
Low voltage level 2 interrupt mask.
static constexpr uint64_t IRQ_ACIN_INSERT
ACIN insertion interrupt mask.
static bool isNoeOff(uint64_t m)
AXP192 alias for isNoePowerdown().
static bool isBattActivate(uint64_t m)
AXP192 alias for isBatEnterActivate().
static constexpr uint64_t IRQ_DC2_VOLT_LESS
DC-DC2 voltage less than target interrupt mask.
static bool isNoePowerdown(uint64_t m)
Check N-oe power-down interrupt.
static bool isVbusOv(uint64_t m)
Check VBUS overvoltage interrupt.
static bool isAcinConnect(uint64_t m)
AXP192 alias for isAcinInsert().
bool clearStatus() override
Clear all pending interrupt status registers.
static bool isTimerIrq(uint64_t m)
AXP192 alias for isTimerTimeout().
static bool isBatChgDone(uint64_t m)
Check charging completed interrupt.
static bool isIrqSet(uint64_t irqMask, uint64_t status)
Check if a specific interrupt is set in a status mask.
static bool isBatTempLow(uint64_t m)
Check battery temperature low interrupt.
static bool isPekeyShortPress(uint64_t m)
Check PEK short press interrupt.
static constexpr uint64_t IRQ_PKEY_NEGATIVE
PEK press falling edge interrupt mask.
static constexpr uint64_t IRQ_BAT_ENTER_ACTIVATE
Battery entered active mode interrupt mask.
static constexpr uint64_t IRQ_GPIO3_EDGE
GPIO3 edge trigger interrupt mask.
static constexpr uint64_t IRQ_CHIP_OV_TEMP
Chip overtemperature interrupt mask.
static bool isVbusSessionAB(uint64_t m)
AXP192 alias for isVbusSession().
static constexpr uint64_t IRQ_GPIO1_EDGE
GPIO1 edge trigger interrupt mask.
static bool isLowVoltLevel2(uint64_t m)
Check low voltage level 2 interrupt.
static bool isDc1VoltLess(uint64_t m)
Check DC-DC1 voltage low interrupt.
static bool isBatRemove(uint64_t m)
Check battery removal interrupt.
static bool isGpio0EdgeTrigger(uint64_t m)
Check GPIO0 edge trigger interrupt.
static constexpr uint64_t IRQ_DC3_VOLT_LESS
DC-DC3 voltage less than target interrupt mask.
static bool isPkeyNegative(uint64_t m)
Check PEK press falling edge interrupt.
static constexpr uint64_t IRQ_DC1_VOLT_LESS
DC-DC1 voltage less than target interrupt mask.
static bool isBattOverTemp(uint64_t m)
AXP192 alias for isBatTempHigh().
static bool isDc3VoltLess(uint64_t m)
Check DC-DC3 voltage low interrupt.
static bool isVbusValid(uint64_t m)
AXP192 alias for isVbusEffective().
static bool isChipTempHigh(uint64_t m)
AXP192 alias for isChipOvTemp().
static bool isGpio2Irq(uint64_t m)
AXP192 alias for isGpio2EdgeTrigger().
static bool isVbusInvalid(uint64_t m)
Check VBUS invalid interrupt.
static bool isApsLowVolLevel(uint64_t m)
AXP192 alias for isLowVoltLevel2().
static bool isBatExitActivate(uint64_t m)
Check battery exited active mode interrupt.
static constexpr uint64_t IRQ_NOE_POWERON
N-oe power-on interrupt mask.
static constexpr uint64_t IRQ_PEKEY_SHORT_PRESS
PEK short press interrupt mask.
static constexpr uint64_t IRQ_CHG_CURR_LESS
Charge current less than target interrupt mask.
bool disable(uint64_t mask) override
Disable one or more interrupt sources.
static bool isBatTempHigh(uint64_t m)
Check battery temperature high interrupt.
static bool isVbusRemove(uint64_t m)
Check VBUS removal interrupt.
static constexpr uint64_t IRQ_BAT_REMOVE
Battery removal interrupt mask.
static bool isGpio3EdgeTrigger(uint64_t m)
Check GPIO3 edge trigger interrupt.
static bool isPekeyLongPress(uint64_t m)
Check PEK long press interrupt.
static bool isGpio0Irq(uint64_t m)
AXP192 alias for isGpio0EdgeTrigger().
static constexpr uint64_t IRQ_NOE_POWERDOWN
N-oe power-down interrupt mask.
static bool isVbusInsert(uint64_t m)
Check VBUS insertion interrupt.
static bool isVbusOverVol(uint64_t m)
AXP192 alias for isVbusOv().
static bool isDc3LowVol(uint64_t m)
AXP192 alias for isDc3VoltLess().
static bool isAcinOv(uint64_t m)
Check ACIN overvoltage interrupt.
static constexpr uint64_t IRQ_GPIO2_EDGE
GPIO2 edge trigger interrupt mask.
static constexpr uint64_t IRQ_BAT_CHG_DONE
Charging completed interrupt mask.
static bool isVbusVholdLow(uint64_t m)
AXP192 alias for isVbusLowVhold().
static constexpr uint64_t IRQ_VBUS_OV
VBUS overvoltage interrupt mask.
static bool isVbusSession(uint64_t m)
Check VBUS session request interrupt.
static constexpr uint64_t IRQ_VBUS_INVALID
VBUS invalid interrupt mask.
static bool isGpio2EdgeTrigger(uint64_t m)
Check GPIO2 edge trigger interrupt.
static constexpr uint64_t IRQ_BAT_INSERT
Battery insertion interrupt mask.
static bool isAcinOverVol(uint64_t m)
AXP192 alias for isAcinOv().
static bool isChargeLowCur(uint64_t m)
AXP192 alias for isChgCurrLess().
static bool isPkeyPositive(uint64_t m)
Check PEK press rising edge interrupt.
static bool isGpio1Irq(uint64_t m)
AXP192 alias for isGpio1EdgeTrigger().
static bool isBatInsert(uint64_t m)
Check battery insertion interrupt.
static bool isChipOvTemp(uint64_t m)
Check chip overtemperature interrupt.
bool enable(uint64_t mask) override
Enable one or more interrupt sources.
static constexpr uint64_t IRQ_VBUS_REMOVE
VBUS removal interrupt mask.
static constexpr uint64_t IRQ_VBUS_SESSION
VBUS session request interrupt mask.
static constexpr uint64_t IRQ_ACIN_REMOVE
ACIN removal interrupt mask.
static bool isVbusEffective(uint64_t m)
Check VBUS effective interrupt.
static constexpr uint64_t IRQ_LOW_VOLT_LEVEL1
Low voltage level 1 interrupt mask.
static bool isBattLowTemp(uint64_t m)
AXP192 alias for isBatTempLow().
static constexpr uint64_t IRQ_ALL_MASK
Mask covering all defined interrupt sources (bits 1-39).
AXP1xxIrq(SensorCommWrapper &core)
Construct interrupt controller interface.
static constexpr uint64_t IRQ_BAT_TEMP_LOW
Battery temperature low interrupt mask.
static constexpr uint64_t IRQ_BAT_EXIT_ACTIVATE
Battery exited active mode interrupt mask.
static constexpr uint64_t IRQ_ACIN_OV
ACIN overvoltage interrupt mask.
static bool isAcinRemove(uint64_t m)
Check ACIN removal interrupt.
static constexpr uint64_t IRQ_TIMER_TIMEOUT
Timer timeout interrupt mask.
static constexpr uint64_t IRQ_PKEY_POSITIVE
PEK press rising edge interrupt mask.
static constexpr uint64_t IRQ_BAT_TEMP_HIGH
Battery temperature high interrupt mask.
static bool isLowVoltLevel1(uint64_t m)
Check low voltage level 1 interrupt.
static bool isNoeOn(uint64_t m)
AXP192 alias for isPekeyShortPress().
static bool isTimerTimeout(uint64_t m)
Check timer timeout interrupt.
static bool isNoePoweron(uint64_t m)
Check N-oe power-on interrupt.
static bool isVbusLowVhold(uint64_t m)
Check VBUS low VHOLD interrupt.
static bool isBatEnterActivate(uint64_t m)
Check battery entered active mode interrupt.
uint64_t readStatus(bool clear=true) override
Read and optionally clear interrupt status.
static bool isDc2LowVol(uint64_t m)
AXP192 alias for isDc2VoltLess().
static constexpr uint64_t IRQ_PEKEY_LONG_PRESS
PEK long press interrupt mask.
static bool isChgCurrLess(uint64_t m)
Check charge current less than target interrupt.