From d75e286aa553d51485f803ba8ff3fe59a07466d8 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 20 Aug 2024 20:34:05 +0200 Subject: [PATCH] [LR11x0] Added generalized IRQ handling via PHY --- src/modules/LR11x0/LR11x0.cpp | 52 ++++++++++++++++------------------- src/modules/LR11x0/LR11x0.h | 20 ++++++++++++-- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/modules/LR11x0/LR11x0.cpp b/src/modules/LR11x0/LR11x0.cpp index 3b52fd9b..f4b2e3d7 100644 --- a/src/modules/LR11x0/LR11x0.cpp +++ b/src/modules/LR11x0/LR11x0.cpp @@ -11,6 +11,16 @@ LR11x0::LR11x0(Module* mod) : PhysicalLayer(RADIOLIB_LR11X0_FREQUENCY_STEP_SIZE, RADIOLIB_LR11X0_MAX_PACKET_LENGTH) { this->mod = mod; this->XTAL = false; + this->irqMap[RADIOLIB_IRQ_TX_DONE] = RADIOLIB_LR11X0_IRQ_TX_DONE; + this->irqMap[RADIOLIB_IRQ_RX_DONE] = RADIOLIB_LR11X0_IRQ_RX_DONE; + this->irqMap[RADIOLIB_IRQ_PREAMBLE_DETECTED] = RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED; + this->irqMap[RADIOLIB_IRQ_SYNC_WORD_VALID] = RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID; + this->irqMap[RADIOLIB_IRQ_HEADER_VALID] = RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID; + this->irqMap[RADIOLIB_IRQ_HEADER_ERR] = RADIOLIB_LR11X0_IRQ_HEADER_ERR; + this->irqMap[RADIOLIB_IRQ_CRC_ERR] = RADIOLIB_LR11X0_IRQ_CRC_ERR; + this->irqMap[RADIOLIB_IRQ_CAD_DONE] = RADIOLIB_LR11X0_IRQ_CAD_DONE; + this->irqMap[RADIOLIB_IRQ_CAD_DETECTED] = RADIOLIB_LR11X0_IRQ_CAD_DETECTED; + this->irqMap[RADIOLIB_IRQ_TIMEOUT] = RADIOLIB_LR11X0_IRQ_TIMEOUT; } int16_t LR11x0::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, uint16_t preambleLength, float tcxoVoltage) { @@ -285,6 +295,7 @@ int16_t LR11x0::scanChannel() { .detMin = RADIOLIB_LR11X0_CAD_PARAM_DEFAULT, .exitMode = RADIOLIB_LR11X0_CAD_PARAM_DEFAULT, .timeout = 0, + .irqFlags = RADIOLIB_IRQ_NOT_SUPPORTED, }, }; return(this->scanChannel(config)); @@ -557,6 +568,7 @@ int16_t LR11x0::startChannelScan() { .detMin = RADIOLIB_LR11X0_CAD_PARAM_DEFAULT, .exitMode = RADIOLIB_LR11X0_CAD_PARAM_DEFAULT, .timeout = 0, + .irqFlags = RADIOLIB_IRQ_NOT_SUPPORTED, }, }; return(this->startChannelScan(config)); @@ -580,7 +592,8 @@ int16_t LR11x0::startChannelScan(ChannelScanConfig_t config) { this->mod->setRfSwitchState(Module::MODE_RX); // set DIO pin mapping - state = setDioIrqParams(RADIOLIB_LR11X0_IRQ_CAD_DETECTED | RADIOLIB_LR11X0_IRQ_CAD_DONE); + uint16_t irqFlags = (config.cad.irqFlags == RADIOLIB_IRQ_NOT_SUPPORTED) ? RADIOLIB_LR11X0_IRQ_CAD_DETECTED | RADIOLIB_LR11X0_IRQ_CAD_DONE : config.cad.irqFlags; + state = setDioIrqParams(irqFlags, irqFlags); RADIOLIB_ASSERT(state); // clear interrupt flags @@ -1346,33 +1359,16 @@ int16_t LR11x0::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -int16_t LR11x0::checkIrq(uint8_t irq) { - uint16_t flags = getIrqStatus(); - switch(irq) { - case RADIOLIB_IRQ_TX_DONE: - return(flags & RADIOLIB_LR11X0_IRQ_TX_DONE); - case RADIOLIB_IRQ_RX_DONE: - return(flags & RADIOLIB_LR11X0_IRQ_RX_DONE); - case RADIOLIB_IRQ_PREAMBLE_DETECTED: - return(flags & RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED); - case RADIOLIB_IRQ_SYNC_WORD_VALID: - return(flags & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID); - case RADIOLIB_IRQ_HEADER_VALID: - return(flags & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID); - case RADIOLIB_IRQ_HEADER_ERR: - return(flags & RADIOLIB_LR11X0_IRQ_HEADER_ERR); - case RADIOLIB_IRQ_CRC_ERR: - return(flags & RADIOLIB_LR11X0_IRQ_CRC_ERR); - case RADIOLIB_IRQ_CAD_DONE: - return(flags & RADIOLIB_LR11X0_IRQ_CAD_DONE); - case RADIOLIB_IRQ_CAD_DETECTED: - return(flags & RADIOLIB_LR11X0_IRQ_CAD_DETECTED); - case RADIOLIB_IRQ_TIMEOUT: - return(flags & RADIOLIB_LR11X0_IRQ_TIMEOUT); - default: - return(RADIOLIB_ERR_UNSUPPORTED); - } - return(RADIOLIB_ERR_UNSUPPORTED); +uint32_t LR11x0::getIrqFlags() { + return((uint32_t)this->getIrqStatus()); +} + +int16_t LR11x0::setIrqFlags(uint32_t irq) { + return(this->setDioIrqParams(irq, irq)); +} + +int16_t LR11x0::clearIrqFlags(uint32_t irq) { + return(this->clearIrq(irq)); } uint8_t LR11x0::randomByte() { diff --git a/src/modules/LR11x0/LR11x0.h b/src/modules/LR11x0/LR11x0.h index 7c05efe5..93aeb65d 100644 --- a/src/modules/LR11x0/LR11x0.h +++ b/src/modules/LR11x0/LR11x0.h @@ -1225,10 +1225,24 @@ class LR11x0: public PhysicalLayer { int16_t irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) override; /*! - \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). - \returns Whether requested IRQ is set. + \brief Read currently active IRQ flags. + \returns IRQ flags. */ - int16_t checkIrq(uint8_t irq) override; + uint32_t getIrqFlags(); + + /*! + \brief Set interrupt on DIO1 to be sent on a specific IRQ bit (e.g. RxTimeout, CadDone). + \param irq Module-specific IRQ flags. + \returns \ref status_codes + */ + int16_t setIrqFlags(uint32_t irq); + + /*! + \brief Clear interrupt on a specific IRQ bit (e.g. RxTimeout, CadDone). + \param irq Module-specific IRQ flags. + \returns \ref status_codes + */ + int16_t clearIrqFlags(uint32_t irq); /*! \brief Get one truly random byte from RSSI noise.