From 8c24a5fcf57677700e31a5b167e155038e1790ff Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 20 Aug 2024 20:37:23 +0200 Subject: [PATCH] [SX128x] Added generalized IRQ handling via PHY --- src/modules/SX128x/SX128x.cpp | 52 ++++++++++++++++------------------- src/modules/SX128x/SX128x.h | 20 ++++++++++++-- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/modules/SX128x/SX128x.cpp b/src/modules/SX128x/SX128x.cpp index d2c7229c..45db25f9 100644 --- a/src/modules/SX128x/SX128x.cpp +++ b/src/modules/SX128x/SX128x.cpp @@ -4,6 +4,16 @@ SX128x::SX128x(Module* mod) : PhysicalLayer(RADIOLIB_SX128X_FREQUENCY_STEP_SIZE, RADIOLIB_SX128X_MAX_PACKET_LENGTH) { this->mod = mod; + this->irqMap[RADIOLIB_IRQ_TX_DONE] = RADIOLIB_SX128X_IRQ_TX_DONE; + this->irqMap[RADIOLIB_IRQ_RX_DONE] = RADIOLIB_SX128X_IRQ_RX_DONE; + this->irqMap[RADIOLIB_IRQ_PREAMBLE_DETECTED] = RADIOLIB_SX128X_IRQ_PREAMBLE_DETECTED; + this->irqMap[RADIOLIB_IRQ_SYNC_WORD_VALID] = RADIOLIB_SX128X_IRQ_SYNC_WORD_VALID; + this->irqMap[RADIOLIB_IRQ_HEADER_VALID] = RADIOLIB_SX128X_IRQ_HEADER_VALID; + this->irqMap[RADIOLIB_IRQ_HEADER_ERR] = RADIOLIB_SX128X_IRQ_HEADER_ERROR; + this->irqMap[RADIOLIB_IRQ_CRC_ERR] = RADIOLIB_SX128X_IRQ_CRC_ERROR; + this->irqMap[RADIOLIB_IRQ_CAD_DONE] = RADIOLIB_SX128X_IRQ_CAD_DONE; + this->irqMap[RADIOLIB_IRQ_CAD_DETECTED] = RADIOLIB_SX128X_IRQ_CAD_DETECTED; + this->irqMap[RADIOLIB_IRQ_TIMEOUT] = RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT; } int16_t SX128x::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t pwr, uint16_t preambleLength) { @@ -414,6 +424,7 @@ int16_t SX128x::scanChannel() { ChannelScanConfig_t config = { .cad = { .symNum = RADIOLIB_SX128X_CAD_PARAM_DEFAULT, + .irqFlags = RADIOLIB_IRQ_NOT_SUPPORTED, }, }; return(this->scanChannel(config)); @@ -647,39 +658,23 @@ int16_t SX128x::readData(uint8_t* data, size_t len) { return(state); } -int16_t SX128x::checkIrq(uint8_t irq) { - uint16_t flags = getIrqStatus(); - switch(irq) { - case RADIOLIB_IRQ_TX_DONE: - return(flags & RADIOLIB_SX128X_IRQ_TX_DONE); - case RADIOLIB_IRQ_RX_DONE: - return(flags & RADIOLIB_SX128X_IRQ_RX_DONE); - case RADIOLIB_IRQ_PREAMBLE_DETECTED: - return(flags & RADIOLIB_SX128X_IRQ_PREAMBLE_DETECTED); - case RADIOLIB_IRQ_SYNC_WORD_VALID: - return(flags & RADIOLIB_SX128X_IRQ_SYNC_WORD_VALID); - case RADIOLIB_IRQ_HEADER_VALID: - return(flags & RADIOLIB_SX128X_IRQ_HEADER_VALID); - case RADIOLIB_IRQ_HEADER_ERR: - return(flags & RADIOLIB_SX128X_IRQ_HEADER_ERROR); - case RADIOLIB_IRQ_CRC_ERR: - return(flags & RADIOLIB_SX128X_IRQ_CRC_ERROR); - case RADIOLIB_IRQ_CAD_DONE: - return(flags & RADIOLIB_SX128X_IRQ_CAD_DONE); - case RADIOLIB_IRQ_CAD_DETECTED: - return(flags & RADIOLIB_SX128X_IRQ_CAD_DETECTED); - case RADIOLIB_IRQ_TIMEOUT: - return(flags & RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT); - default: - return(RADIOLIB_ERR_UNSUPPORTED); - } - return(RADIOLIB_ERR_UNSUPPORTED); +uint32_t SX128x::getIrqFlags() { + return((uint32_t)this->getIrqStatus()); +} + +int16_t SX128x::setIrqFlags(uint32_t irq) { + return(this->setDioIrqParams(irq, irq)); +} + +int16_t SX128x::clearIrqFlags(uint32_t irq) { + return(this->clearIrqStatus(irq)); } int16_t SX128x::startChannelScan() { ChannelScanConfig_t config = { .cad = { .symNum = RADIOLIB_SX128X_CAD_PARAM_DEFAULT, + .irqFlags = RADIOLIB_IRQ_NOT_SUPPORTED, }, }; return(this->startChannelScan(config)); @@ -696,7 +691,8 @@ int16_t SX128x::startChannelScan(ChannelScanConfig_t config) { RADIOLIB_ASSERT(state); // set DIO pin mapping - state = setDioIrqParams(RADIOLIB_SX128X_IRQ_CAD_DETECTED | RADIOLIB_SX128X_IRQ_CAD_DONE, RADIOLIB_SX128X_IRQ_CAD_DETECTED | RADIOLIB_SX128X_IRQ_CAD_DONE); + uint16_t irqFlags = (config.cad.irqFlags == RADIOLIB_IRQ_NOT_SUPPORTED) ? RADIOLIB_SX128X_IRQ_CAD_DETECTED | RADIOLIB_SX128X_IRQ_CAD_DONE : config.cad.irqFlags; + state = setDioIrqParams(irqFlags, irqFlags); RADIOLIB_ASSERT(state); // clear interrupt flags diff --git a/src/modules/SX128x/SX128x.h b/src/modules/SX128x/SX128x.h index f9b590a2..05755297 100644 --- a/src/modules/SX128x/SX128x.h +++ b/src/modules/SX128x/SX128x.h @@ -585,10 +585,24 @@ class SX128x: public PhysicalLayer { int16_t readData(uint8_t* data, size_t len) 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 Interrupt-driven channel activity detection method. DIO1 will be activated