[SX128x] Added generalized IRQ handling via PHY

This commit is contained in:
jgromes 2024-08-20 20:37:23 +02:00
parent 7067c67304
commit 8c24a5fcf5
2 changed files with 41 additions and 31 deletions

View file

@ -4,6 +4,16 @@
SX128x::SX128x(Module* mod) : PhysicalLayer(RADIOLIB_SX128X_FREQUENCY_STEP_SIZE, RADIOLIB_SX128X_MAX_PACKET_LENGTH) { SX128x::SX128x(Module* mod) : PhysicalLayer(RADIOLIB_SX128X_FREQUENCY_STEP_SIZE, RADIOLIB_SX128X_MAX_PACKET_LENGTH) {
this->mod = mod; 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) { 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 = { ChannelScanConfig_t config = {
.cad = { .cad = {
.symNum = RADIOLIB_SX128X_CAD_PARAM_DEFAULT, .symNum = RADIOLIB_SX128X_CAD_PARAM_DEFAULT,
.irqFlags = RADIOLIB_IRQ_NOT_SUPPORTED,
}, },
}; };
return(this->scanChannel(config)); return(this->scanChannel(config));
@ -647,39 +658,23 @@ int16_t SX128x::readData(uint8_t* data, size_t len) {
return(state); return(state);
} }
int16_t SX128x::checkIrq(uint8_t irq) { uint32_t SX128x::getIrqFlags() {
uint16_t flags = getIrqStatus(); return((uint32_t)this->getIrqStatus());
switch(irq) { }
case RADIOLIB_IRQ_TX_DONE:
return(flags & RADIOLIB_SX128X_IRQ_TX_DONE); int16_t SX128x::setIrqFlags(uint32_t irq) {
case RADIOLIB_IRQ_RX_DONE: return(this->setDioIrqParams(irq, irq));
return(flags & RADIOLIB_SX128X_IRQ_RX_DONE); }
case RADIOLIB_IRQ_PREAMBLE_DETECTED:
return(flags & RADIOLIB_SX128X_IRQ_PREAMBLE_DETECTED); int16_t SX128x::clearIrqFlags(uint32_t irq) {
case RADIOLIB_IRQ_SYNC_WORD_VALID: return(this->clearIrqStatus(irq));
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);
} }
int16_t SX128x::startChannelScan() { int16_t SX128x::startChannelScan() {
ChannelScanConfig_t config = { ChannelScanConfig_t config = {
.cad = { .cad = {
.symNum = RADIOLIB_SX128X_CAD_PARAM_DEFAULT, .symNum = RADIOLIB_SX128X_CAD_PARAM_DEFAULT,
.irqFlags = RADIOLIB_IRQ_NOT_SUPPORTED,
}, },
}; };
return(this->startChannelScan(config)); return(this->startChannelScan(config));
@ -696,7 +691,8 @@ int16_t SX128x::startChannelScan(ChannelScanConfig_t config) {
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
// set DIO pin mapping // 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); RADIOLIB_ASSERT(state);
// clear interrupt flags // clear interrupt flags

View file

@ -585,10 +585,24 @@ class SX128x: public PhysicalLayer {
int16_t readData(uint8_t* data, size_t len) override; int16_t readData(uint8_t* data, size_t len) override;
/*! /*!
\brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). \brief Read currently active IRQ flags.
\returns Whether requested IRQ is set. \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 \brief Interrupt-driven channel activity detection method. DIO1 will be activated