From 0dcdeaa105a0dac63914446f709f71ca1cec72e1 Mon Sep 17 00:00:00 2001 From: mikeller Date: Sun, 8 Dec 2019 12:53:34 +1300 Subject: [PATCH] Unified the handling of the EXTI pin for SPI RX. --- src/main/drivers/rx/rx_a7105.c | 42 ++++----------- src/main/drivers/rx/rx_a7105.h | 2 +- src/main/drivers/rx/rx_cyrf6936.c | 41 ++++---------- src/main/drivers/rx/rx_cyrf6936.h | 4 +- src/main/drivers/rx/rx_spi.c | 65 +++++++++++++++++++++++ src/main/drivers/rx/rx_spi.h | 10 ++++ src/main/rx/a7105_flysky.c | 13 +++-- src/main/rx/a7105_flysky.h | 2 +- src/main/rx/cc2500_common.c | 14 +---- src/main/rx/cc2500_common.h | 1 - src/main/rx/cc2500_frsky_common.h | 2 +- src/main/rx/cc2500_frsky_d.c | 5 +- src/main/rx/cc2500_frsky_shared.c | 13 +++-- src/main/rx/cc2500_frsky_x.c | 5 +- src/main/rx/cc2500_sfhss.c | 9 ++-- src/main/rx/cc2500_sfhss.h | 2 +- src/main/rx/cyrf6936_spektrum.c | 15 ++++-- src/main/rx/cyrf6936_spektrum.h | 4 +- src/main/rx/nrf24_cx10.c | 4 +- src/main/rx/nrf24_cx10.h | 2 +- src/main/rx/nrf24_h8_3d.c | 4 +- src/main/rx/nrf24_h8_3d.h | 2 +- src/main/rx/nrf24_inav.c | 4 +- src/main/rx/nrf24_inav.h | 2 +- src/main/rx/nrf24_kn.c | 4 +- src/main/rx/nrf24_kn.h | 2 +- src/main/rx/nrf24_syma.c | 4 +- src/main/rx/nrf24_syma.h | 2 +- src/main/rx/nrf24_v202.c | 4 +- src/main/rx/nrf24_v202.h | 2 +- src/main/rx/rx_spi.c | 22 ++++++-- src/main/rx/rx_spi.h | 10 +++- src/test/unit/rx_spi_spektrum_unittest.cc | 10 ++-- 33 files changed, 203 insertions(+), 124 deletions(-) diff --git a/src/main/drivers/rx/rx_a7105.c b/src/main/drivers/rx/rx_a7105.c index 899edb3f42..9f062c22af 100644 --- a/src/main/drivers/rx/rx_a7105.c +++ b/src/main/drivers/rx/rx_a7105.c @@ -27,39 +27,17 @@ #ifdef USE_RX_FLYSKY #include "drivers/bus_spi.h" -#include "drivers/exti.h" #include "drivers/io.h" #include "drivers/io_impl.h" -#include "drivers/nvic.h" #include "drivers/rx/rx_a7105.h" #include "drivers/rx/rx_spi.h" -#include "drivers/time.h" static IO_t txEnIO = IO_NONE; -static IO_t rxIntIO = IO_NONE; -static extiCallbackRec_t a7105extiCallbackRec; -static volatile uint32_t timeEvent = 0; -static volatile bool occurEvent = false; +static bool consumeExti = true; -void a7105extiHandler(extiCallbackRec_t* cb) +void A7105Init(uint32_t id, IO_t txEnPin) { - UNUSED(cb); - - if (IORead(rxIntIO) != 0) { - timeEvent = micros(); - occurEvent = true; - } -} - -void A7105Init(uint32_t id, IO_t extiPin, IO_t txEnPin) -{ - rxIntIO = extiPin; /* config receiver IRQ pin */ - IOInit(rxIntIO, OWNER_RX_SPI_EXTI, 0); - EXTIHandlerInit(&a7105extiCallbackRec, a7105extiHandler); - EXTIConfig(rxIntIO, &a7105extiCallbackRec, NVIC_PRIO_MPU_INT_EXTI, IOCFG_IPD, EXTI_TRIGGER_RISING); - EXTIEnable(rxIntIO, false); - if (txEnPin) { txEnIO = txEnPin; //TODO: Create resource for this if it ever gets used @@ -98,15 +76,16 @@ void A7105Config(const uint8_t *regsTable, uint8_t size) } } -bool A7105RxTxFinished(uint32_t *timeStamp) { +bool A7105RxTxFinished(timeUs_t *timeStamp) { bool result = false; - if (occurEvent) { - if (timeStamp) { - *timeStamp = timeEvent; + if (consumeExti && rxSpiPollExti()) { + if (rxSpiGetLastExtiTimeUs()) { + *timeStamp = rxSpiGetLastExtiTimeUs(); } - occurEvent = false; + rxSpiResetExti(); + result = true; } return result; @@ -130,9 +109,10 @@ void A7105WriteReg(A7105Reg_t reg, uint8_t data) void A7105Strobe(A7105State_t state) { if (A7105_TX == state || A7105_RX == state) { - EXTIEnable(rxIntIO, true); + consumeExti = true; + rxSpiResetExti(); } else { - EXTIEnable(rxIntIO, false); + consumeExti = false; } if (txEnIO) { diff --git a/src/main/drivers/rx/rx_a7105.h b/src/main/drivers/rx/rx_a7105.h index 88f89b8d1b..13bc7d832c 100644 --- a/src/main/drivers/rx/rx_a7105.h +++ b/src/main/drivers/rx/rx_a7105.h @@ -97,7 +97,7 @@ typedef enum { #define A7105_MODE_TRSR 0x02 // [0]: RX state. [1]: TX state. Serviceable if TRER=1 (TRX is enable). #define A7105_MODE_TRER 0x01 // [0]: TRX is disabled. [1]: TRX is enabled. -void A7105Init(uint32_t id, IO_t extiPin, IO_t txEnPin); +void A7105Init(uint32_t id, IO_t txEnPin); void A7105SoftReset(void); void A7105Config(const uint8_t *regsTable, uint8_t size); diff --git a/src/main/drivers/rx/rx_cyrf6936.c b/src/main/drivers/rx/rx_cyrf6936.c index 06abe318a4..ce496ecb8a 100644 --- a/src/main/drivers/rx/rx_cyrf6936.c +++ b/src/main/drivers/rx/rx_cyrf6936.c @@ -27,35 +27,18 @@ #ifdef USE_RX_SPEKTRUM #include "drivers/bus_spi.h" -#include "drivers/exti.h" #include "drivers/io.h" #include "drivers/io_impl.h" -#include "drivers/nvic.h" #include "drivers/rx/rx_cyrf6936.h" #include "drivers/rx/rx_spi.h" -#include "drivers/time.h" -static IO_t rxIntIO = IO_NONE; -static extiCallbackRec_t cyrf6936extiCallbackRec; -static volatile uint32_t timeEvent = 0; -static volatile bool occurEvent = false; -volatile bool isError = false; +bool isError = false; -void cyrf6936ExtiHandler(extiCallbackRec_t *cb) +bool cyrf6936RxFinished(timeUs_t *timeStamp) { - UNUSED(cb); - - if (IORead(rxIntIO) == 0) { - timeEvent = micros(); - occurEvent = true; - } -} - -bool cyrf6936RxFinished(uint32_t *timeStamp) -{ - if (occurEvent) { - if (timeStamp) { - *timeStamp = timeEvent; + if (rxSpiPollExti()) { + if (rxSpiGetLastExtiTimeUs()) { + *timeStamp = rxSpiGetLastExtiTimeUs(); } uint8_t rxIrqStatus = cyrf6936ReadRegister(CYRF6936_RX_IRQ_STATUS); @@ -63,19 +46,18 @@ bool cyrf6936RxFinished(uint32_t *timeStamp) isError = (rxIrqStatus & CYRF6936_RXE_IRQ) > 0x0; } - occurEvent = false; + rxSpiResetExti(); + return true; } return false; } -bool cyrf6936Init(IO_t extiPin) +bool cyrf6936Init(void) { - rxIntIO = extiPin; - IOInit(rxIntIO, OWNER_RX_SPI_EXTI, 0); - EXTIHandlerInit(&cyrf6936extiCallbackRec, cyrf6936ExtiHandler); - EXTIConfig(rxIntIO, &cyrf6936extiCallbackRec, NVIC_PRIO_MPU_INT_EXTI, IOCFG_IPD, EXTI_TRIGGER_FALLING); - EXTIEnable(rxIntIO, false); + if (!rxSpiExtiConfigured()) { + return false; + } uint16_t timeout = 1000; do { // Check if chip has waken up @@ -168,7 +150,6 @@ void cyrf6936StartRecv(void) { cyrf6936WriteRegister(CYRF6936_RX_IRQ_STATUS, CYRF6936_RXOW_IRQ); cyrf6936WriteRegister(CYRF6936_RX_CTRL, CYRF6936_RX_GO | CYRF6936_RXC_IRQEN | CYRF6936_RXE_IRQEN); - EXTIEnable(rxIntIO, true); } void cyrf6936RecvLen(uint8_t *data, const uint8_t length) diff --git a/src/main/drivers/rx/rx_cyrf6936.h b/src/main/drivers/rx/rx_cyrf6936.h index b8b8d54862..60efaee8e9 100644 --- a/src/main/drivers/rx/rx_cyrf6936.h +++ b/src/main/drivers/rx/rx_cyrf6936.h @@ -201,9 +201,9 @@ enum { }; #define CYRF6936_DATA_CODE_LENGTH (1<<5) -extern volatile bool isError; +extern bool isError; -bool cyrf6936Init(IO_t extiPin); +bool cyrf6936Init(void); bool cyrf6936RxFinished(uint32_t *timeStamp); diff --git a/src/main/drivers/rx/rx_spi.c b/src/main/drivers/rx/rx_spi.c index c82751c7b6..f73ad605a8 100644 --- a/src/main/drivers/rx/rx_spi.c +++ b/src/main/drivers/rx/rx_spi.c @@ -34,8 +34,10 @@ #include "drivers/bus_spi.h" #include "drivers/io.h" #include "drivers/io_impl.h" +#include "drivers/nvic.h" #include "drivers/rcc.h" #include "drivers/system.h" +#include "drivers/time.h" #include "pg/rx_spi.h" @@ -47,11 +49,30 @@ static busDevice_t rxSpiDevice; static busDevice_t *busdev = &rxSpiDevice; +static IO_t extiPin = IO_NONE; +static extiCallbackRec_t rxSpiExtiCallbackRec; +static bool extiLevel = true; + +static volatile bool extiHasOccurred = false; +static volatile timeUs_t lastExtiTimeUs = 0; + void rxSpiDevicePreInit(const rxSpiConfig_t *rxSpiConfig) { spiPreinitRegister(rxSpiConfig->csnTag, IOCFG_IPU, 1); } +void rxSpiExtiHandler(extiCallbackRec_t* callback) +{ + UNUSED(callback); + + const timeUs_t extiTimeUs = microsISR(); + + if (IORead(extiPin) == extiLevel) { + lastExtiTimeUs = extiTimeUs; + extiHasOccurred = true; + } +} + bool rxSpiDeviceInit(const rxSpiConfig_t *rxSpiConfig) { SPI_TypeDef *instance = spiInstanceByDevice(SPI_CFG_TO_DEV(rxSpiConfig->spibus)); @@ -74,9 +95,28 @@ bool rxSpiDeviceInit(const rxSpiConfig_t *rxSpiConfig) spiBusSetDivisor(busdev, SPI_CLOCK_STANDARD); #endif + extiPin = IOGetByTag(rxSpiConfig->extiIoTag); + + if (extiPin) { + IOInit(extiPin, OWNER_RX_SPI_EXTI, 0); + } + return true; } +void rxSpiExtiInit(ioConfig_t rxSpiExtiPinConfig, extiTrigger_t rxSpiExtiPinTrigger) +{ + if (extiPin) { + if (rxSpiExtiPinTrigger == EXTI_TRIGGER_FALLING) { + extiLevel = false; + } + EXTIHandlerInit(&rxSpiExtiCallbackRec, rxSpiExtiHandler); + EXTIConfig(extiPin, &rxSpiExtiCallbackRec, NVIC_PRIO_MPU_INT_EXTI, rxSpiExtiPinConfig, rxSpiExtiPinTrigger); + EXTIEnable(extiPin, true); + } +} + + uint8_t rxSpiTransferByte(uint8_t data) { return spiBusTransferByte(busdev, data); @@ -108,4 +148,29 @@ void rxSpiReadCommandMulti(uint8_t command, uint8_t commandData, uint8_t *retDat UNUSED(commandData); spiBusRawReadRegisterBuffer(busdev, command, retData, length); } + +bool rxSpiExtiConfigured(void) +{ + return extiPin != IO_NONE; +} + +bool rxSpiGetExtiState(void) +{ + return IORead(extiPin); +} + +bool rxSpiPollExti(void) +{ + return extiHasOccurred; +} + +void rxSpiResetExti(void) +{ + extiHasOccurred = false; +} + +timeUs_t rxSpiGetLastExtiTimeUs(void) +{ + return lastExtiTimeUs; +} #endif diff --git a/src/main/drivers/rx/rx_spi.h b/src/main/drivers/rx/rx_spi.h index a151546597..0312835d1e 100644 --- a/src/main/drivers/rx/rx_spi.h +++ b/src/main/drivers/rx/rx_spi.h @@ -22,6 +22,10 @@ #include +#include "common/time.h" + +#include "drivers/exti.h" + #define RX_SPI_MAX_PAYLOAD_SIZE 35 struct rxSpiConfig_s; @@ -34,3 +38,9 @@ void rxSpiWriteCommand(uint8_t command, uint8_t data); void rxSpiWriteCommandMulti(uint8_t command, const uint8_t *data, uint8_t length); uint8_t rxSpiReadCommand(uint8_t command, uint8_t commandData); void rxSpiReadCommandMulti(uint8_t command, uint8_t commandData, uint8_t *retData, uint8_t length); +void rxSpiExtiInit(ioConfig_t rxSpiExtiPinConfig, extiTrigger_t rxSpiExtiPinTrigger); +bool rxSpiExtiConfigured(void); +bool rxSpiGetExtiState(void); +bool rxSpiPollExti(void); +void rxSpiResetExti(void); +timeUs_t rxSpiGetLastExtiTimeUs(void); diff --git a/src/main/rx/a7105_flysky.c b/src/main/rx/a7105_flysky.c index 16b61c2fc4..a424b298c7 100644 --- a/src/main/rx/a7105_flysky.c +++ b/src/main/rx/a7105_flysky.c @@ -32,6 +32,7 @@ #include "drivers/io.h" #include "drivers/rx/rx_a7105.h" +#include "drivers/rx/rx_spi.h" #include "drivers/system.h" #include "drivers/time.h" @@ -354,10 +355,9 @@ static rx_spi_received_e flySkyReadAndProcess(uint8_t *payload, const uint32_t t return result; } -bool flySkyInit(const rxSpiConfig_t *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState) +bool flySkyInit(const rxSpiConfig_t *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { - IO_t extiPin = IOGetByTag(rxSpiConfig->extiIoTag); - if (!extiPin) { + if (!rxSpiExtiConfigured()) { return false; } @@ -365,6 +365,9 @@ bool flySkyInit(const rxSpiConfig_t *rxSpiConfig, struct rxRuntimeState_s *rxRun rxSpiCommonIOInit(rxSpiConfig); + extiConfig->ioConfig = IOCFG_IPD; + extiConfig->trigger = EXTI_TRIGGER_RISING; + uint8_t startRxChannel; if (protocol == RX_SPI_A7105_FLYSKY_2A) { @@ -372,13 +375,13 @@ bool flySkyInit(const rxSpiConfig_t *rxSpiConfig, struct rxRuntimeState_s *rxRun timings = &flySky2ATimings; rxId = U_ID_0 ^ U_ID_1 ^ U_ID_2; startRxChannel = flySky2ABindChannels[0]; - A7105Init(0x5475c52A, extiPin, IO_NONE); + A7105Init(0x5475c52A, IO_NONE); A7105Config(flySky2ARegs, sizeof(flySky2ARegs)); } else { rxRuntimeState->channelCount = FLYSKY_CHANNEL_COUNT; timings = &flySkyTimings; startRxChannel = 0; - A7105Init(0x5475c52A, extiPin, IO_NONE); + A7105Init(0x5475c52A, IO_NONE); A7105Config(flySkyRegs, sizeof(flySkyRegs)); } diff --git a/src/main/rx/a7105_flysky.h b/src/main/rx/a7105_flysky.h index fe36b5b376..7e154e6422 100644 --- a/src/main/rx/a7105_flysky.h +++ b/src/main/rx/a7105_flysky.h @@ -32,6 +32,6 @@ PG_DECLARE(flySkyConfig_t, flySkyConfig); struct rxSpiConfig_s; struct rxRuntimeState_s; -bool flySkyInit(const struct rxSpiConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState); +bool flySkyInit(const struct rxSpiConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void flySkySetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e flySkyDataReceived(uint8_t *payload); diff --git a/src/main/rx/cc2500_common.c b/src/main/rx/cc2500_common.c index 510dc7b42a..4dc268f404 100644 --- a/src/main/rx/cc2500_common.c +++ b/src/main/rx/cc2500_common.c @@ -28,6 +28,7 @@ #include "drivers/io.h" #include "drivers/rx/rx_cc2500.h" +#include "drivers/rx/rx_spi.h" #include "drivers/time.h" #include "config/config.h" @@ -43,7 +44,6 @@ #include "cc2500_common.h" -static IO_t gdoPin; #if defined(USE_RX_CC2500_SPI_PA_LNA) static IO_t txEnPin; static IO_t rxLnaEnPin; @@ -69,11 +69,6 @@ void cc2500setRssiDbm(uint8_t value) setRssi(rssiDbm << 3, RSSI_SOURCE_RX_PROTOCOL); } -bool cc2500getGdo(void) -{ - return IORead(gdoPin); -} - #if defined(USE_RX_CC2500_SPI_PA_LNA) && defined(USE_RX_CC2500_SPI_DIVERSITY) void cc2500switchAntennae(void) { @@ -122,15 +117,10 @@ bool cc2500SpiInit(void) return false; } - // gpio init here - gdoPin = IOGetByTag(rxSpiConfig()->extiIoTag); - - if (!gdoPin) { + if (!rxSpiExtiConfigured()) { return false; } - IOInit(gdoPin, OWNER_RX_SPI_EXTI, 0); - IOConfigGPIO(gdoPin, IOCFG_IN_FLOATING); #if defined(USE_RX_CC2500_SPI_PA_LNA) if (rxCc2500SpiConfig()->lnaEnIoTag) { rxLnaEnPin = IOGetByTag(rxCc2500SpiConfig()->lnaEnIoTag); diff --git a/src/main/rx/cc2500_common.h b/src/main/rx/cc2500_common.h index 7fdfe528c9..1c28388fe3 100644 --- a/src/main/rx/cc2500_common.h +++ b/src/main/rx/cc2500_common.h @@ -24,7 +24,6 @@ uint16_t cc2500getRssiDbm(void); void cc2500setRssiDbm(uint8_t value); -bool cc2500getGdo(void); #if defined(USE_RX_CC2500_SPI_PA_LNA) && defined(USE_RX_CC2500_SPI_DIVERSITY) void cc2500switchAntennae(void); #endif diff --git a/src/main/rx/cc2500_frsky_common.h b/src/main/rx/cc2500_frsky_common.h index 9d2df5eeb0..787390f949 100644 --- a/src/main/rx/cc2500_frsky_common.h +++ b/src/main/rx/cc2500_frsky_common.h @@ -22,7 +22,7 @@ #include "rx/rx_spi.h" -bool frSkySpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState); +bool frSkySpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); rx_spi_received_e frSkySpiDataReceived(uint8_t *packet); rx_spi_received_e frSkySpiProcessFrame(uint8_t *packet); void frSkySpiSetRcData(uint16_t *rcData, const uint8_t *payload); diff --git a/src/main/rx/cc2500_frsky_d.c b/src/main/rx/cc2500_frsky_d.c index b375ee146c..f32a6ac02a 100644 --- a/src/main/rx/cc2500_frsky_d.c +++ b/src/main/rx/cc2500_frsky_d.c @@ -36,8 +36,9 @@ #include "config/feature.h" #include "drivers/adc.h" -#include "drivers/rx/rx_cc2500.h" #include "drivers/io.h" +#include "drivers/rx/rx_cc2500.h" +#include "drivers/rx/rx_spi.h" #include "drivers/system.h" #include "drivers/time.h" @@ -216,7 +217,7 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro FALLTHROUGH; //!!TODO -check this fall through is correct // here FS code could be case STATE_DATA: - if (cc2500getGdo()) { + if (rxSpiGetExtiState()) { uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; bool packetOk = false; if (ccLen >= 20) { diff --git a/src/main/rx/cc2500_frsky_shared.c b/src/main/rx/cc2500_frsky_shared.c index 1aae54c1ad..faa94b85fd 100644 --- a/src/main/rx/cc2500_frsky_shared.c +++ b/src/main/rx/cc2500_frsky_shared.c @@ -26,8 +26,9 @@ #include "common/maths.h" -#include "drivers/rx/rx_cc2500.h" #include "drivers/io.h" +#include "drivers/rx/rx_cc2500.h" +#include "drivers/rx/rx_spi.h" #include "drivers/time.h" #include "config/config.h" @@ -195,7 +196,7 @@ static bool tuneRx(uint8_t *packet) bindOffset += 5; cc2500WriteReg(CC2500_0C_FSCTRL0, (uint8_t)bindOffset); } - if (cc2500getGdo()) { + if (rxSpiGetExtiState()) { uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen) { cc2500ReadFifo(packet, ccLen); @@ -235,7 +236,7 @@ static bool getBind1(uint8_t *packet) // len|bind |tx // id|03|01|idx|h0|h1|h2|h3|h4|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|CHK1|CHK2|RSSI|LQI/CRC| // Start by getting bind packet 0 and the txid - if (cc2500getGdo()) { + if (rxSpiGetExtiState()) { uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen) { cc2500ReadFifo(packet, ccLen); @@ -264,7 +265,7 @@ static bool getBind1(uint8_t *packet) static bool getBind2(uint8_t *packet) { if (bindIdx <= 120) { - if (cc2500getGdo()) { + if (rxSpiGetExtiState()) { uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen) { cc2500ReadFifo(packet, ccLen); @@ -418,8 +419,10 @@ void nextChannel(uint8_t skip) } } -bool frSkySpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool frSkySpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxSpiCommonIOInit(rxSpiConfig); if (!cc2500SpiInit()) { return false; diff --git a/src/main/rx/cc2500_frsky_x.c b/src/main/rx/cc2500_frsky_x.c index 53d1a7b64f..6582d87ca8 100644 --- a/src/main/rx/cc2500_frsky_x.c +++ b/src/main/rx/cc2500_frsky_x.c @@ -33,11 +33,12 @@ #include "config/feature.h" #include "drivers/adc.h" -#include "drivers/rx/rx_cc2500.h" #include "drivers/io.h" #include "drivers/io_def.h" #include "drivers/io_types.h" #include "drivers/resource.h" +#include "drivers/rx/rx_cc2500.h" +#include "drivers/rx/rx_spi.h" #include "drivers/system.h" #include "drivers/time.h" @@ -368,7 +369,7 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro FALLTHROUGH; // here FS code could be case STATE_DATA: - if (cc2500getGdo() && (frameReceived == false)){ + if (rxSpiGetExtiState() && (frameReceived == false)){ uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen >= packetLength) { cc2500ReadFifo(packet, packetLength); diff --git a/src/main/rx/cc2500_sfhss.c b/src/main/rx/cc2500_sfhss.c index fcb97e46de..4c974cbe6e 100644 --- a/src/main/rx/cc2500_sfhss.c +++ b/src/main/rx/cc2500_sfhss.c @@ -29,8 +29,9 @@ #include "common/maths.h" -#include "drivers/rx/rx_cc2500.h" #include "drivers/io.h" +#include "drivers/rx/rx_cc2500.h" +#include "drivers/rx/rx_spi.h" #include "drivers/time.h" #include "config/config.h" @@ -138,7 +139,7 @@ static bool sfhssRecv(uint8_t *packet) { uint8_t ccLen; - if (!(cc2500getGdo())) { + if (!(rxSpiGetExtiState())) { return false; } ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; @@ -423,8 +424,10 @@ rx_spi_received_e sfhssSpiDataReceived(uint8_t *packet) return ret; } -bool sfhssSpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool sfhssSpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxSpiCommonIOInit(rxSpiConfig); cc2500SpiInit(); diff --git a/src/main/rx/cc2500_sfhss.h b/src/main/rx/cc2500_sfhss.h index e4ff4a19f0..b78155a10b 100644 --- a/src/main/rx/cc2500_sfhss.h +++ b/src/main/rx/cc2500_sfhss.h @@ -48,7 +48,7 @@ typedef struct rxSfhssSpiConfig_s { PG_DECLARE(rxSfhssSpiConfig_t, rxSfhssSpiConfig); -bool sfhssSpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState); +bool sfhssSpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); rx_spi_received_e sfhssSpiDataReceived(uint8_t *packet); void sfhssSpiSetRcData(uint16_t *rcData, const uint8_t *payload); diff --git a/src/main/rx/cyrf6936_spektrum.c b/src/main/rx/cyrf6936_spektrum.c index 6246ee1347..123a0d33a5 100644 --- a/src/main/rx/cyrf6936_spektrum.c +++ b/src/main/rx/cyrf6936_spektrum.c @@ -27,6 +27,7 @@ #include "drivers/io.h" #include "drivers/rx/rx_cyrf6936.h" +#include "drivers/rx/rx_spi.h" #include "drivers/system.h" #include "drivers/time.h" @@ -372,18 +373,23 @@ static void dsmReceiverStartTransfer(void) cyrf6936StartRecv(); } -bool spektrumSpiInit(const struct rxSpiConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState) +bool spektrumSpiInit(const struct rxSpiConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { - IO_t extiPin = IOGetByTag(rxConfig->extiIoTag); - if (!extiPin) { + UNUSED(extiConfig); + + if (!rxSpiExtiConfigured()) { return false; } rxSpiCommonIOInit(rxConfig); + rxRuntimeState->channelCount = DSM_MAX_CHANNEL_COUNT; - if (!cyrf6936Init(extiPin)) { + extiConfig->ioConfig = IOCFG_IPD; + extiConfig->trigger = EXTI_TRIGGER_FALLING; + + if (!cyrf6936Init()) { return false; } @@ -453,6 +459,7 @@ void spektrumSpiSetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload) static bool isValidPacket(const uint8_t *packet) { DEBUG_SET(DEBUG_RX_SPEKTRUM_SPI, 1, isError); + if (isError) { if (dsmReceiver.status != DSM_RECEIVER_RECV && (cyrf6936GetRxStatus() & CYRF6936_BAD_CRC)) { dsmReceiver.crcSeed = ~dsmReceiver.crcSeed; diff --git a/src/main/rx/cyrf6936_spektrum.h b/src/main/rx/cyrf6936_spektrum.h index b070ca6469..f1b7651a5c 100644 --- a/src/main/rx/cyrf6936_spektrum.h +++ b/src/main/rx/cyrf6936_spektrum.h @@ -48,6 +48,6 @@ typedef struct spektrumConfig_s { PG_DECLARE(spektrumConfig_t, spektrumConfig); -bool spektrumSpiInit(const struct rxSpiConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState); +bool spektrumSpiInit(const struct rxSpiConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void spektrumSpiSetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); -rx_spi_received_e spektrumSpiDataReceived(uint8_t *payload); \ No newline at end of file +rx_spi_received_e spektrumSpiDataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_cx10.c b/src/main/rx/nrf24_cx10.c index 4b84b04bef..f4d99b4d86 100644 --- a/src/main/rx/nrf24_cx10.c +++ b/src/main/rx/nrf24_cx10.c @@ -299,8 +299,10 @@ static void cx10Nrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -bool cx10Nrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool cx10Nrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxRuntimeState->channelCount = RC_CHANNEL_COUNT; cx10Nrf24Setup((rx_spi_protocol_e)rxSpiConfig->rx_spi_protocol); diff --git a/src/main/rx/nrf24_cx10.h b/src/main/rx/nrf24_cx10.h index 8cfb21dbc7..5183109ca7 100644 --- a/src/main/rx/nrf24_cx10.h +++ b/src/main/rx/nrf24_cx10.h @@ -25,6 +25,6 @@ struct rxSpiConfig_s; struct rxRuntimeState_s; -bool cx10Nrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState); +bool cx10Nrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void cx10Nrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e cx10Nrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_h8_3d.c b/src/main/rx/nrf24_h8_3d.c index ea9e0ebbf5..31c1ff0c55 100644 --- a/src/main/rx/nrf24_h8_3d.c +++ b/src/main/rx/nrf24_h8_3d.c @@ -283,8 +283,10 @@ static void h8_3dNrf24Setup(rx_spi_protocol_e protocol, const uint32_t *rxSpiId) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -bool h8_3dNrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool h8_3dNrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxRuntimeState->channelCount = RC_CHANNEL_COUNT; h8_3dNrf24Setup((rx_spi_protocol_e)rxSpiConfig->rx_spi_protocol, &rxSpiConfig->rx_spi_id); diff --git a/src/main/rx/nrf24_h8_3d.h b/src/main/rx/nrf24_h8_3d.h index 6bfe17a396..1c0a4440a6 100644 --- a/src/main/rx/nrf24_h8_3d.h +++ b/src/main/rx/nrf24_h8_3d.h @@ -25,6 +25,6 @@ struct rxSpiConfig_s; struct rxRuntimeState_s; -bool h8_3dNrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState); +bool h8_3dNrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void h8_3dNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e h8_3dNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_inav.c b/src/main/rx/nrf24_inav.c index fb83c0934a..cfa1a57342 100644 --- a/src/main/rx/nrf24_inav.c +++ b/src/main/rx/nrf24_inav.c @@ -424,8 +424,10 @@ static void inavNrf24Setup(rx_spi_protocol_e protocol, const uint32_t *rxSpiId, writeAckPayload(ackPayload, payloadSize); } -bool inavNrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool inavNrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxRuntimeState->channelCount = RC_CHANNEL_COUNT_MAX; inavNrf24Setup((rx_spi_protocol_e)rxSpiConfig->rx_spi_protocol, &rxSpiConfig->rx_spi_id, rxSpiConfig->rx_spi_rf_channel_count); diff --git a/src/main/rx/nrf24_inav.h b/src/main/rx/nrf24_inav.h index e5d49d1818..1a870936d6 100644 --- a/src/main/rx/nrf24_inav.h +++ b/src/main/rx/nrf24_inav.h @@ -25,7 +25,7 @@ struct rxSpiConfig_s; struct rxRuntimeState_s; -bool inavNrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState); +bool inavNrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void inavNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e inavNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_kn.c b/src/main/rx/nrf24_kn.c index 985a57068f..c79d36b505 100644 --- a/src/main/rx/nrf24_kn.c +++ b/src/main/rx/nrf24_kn.c @@ -204,8 +204,10 @@ static void knNrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -bool knNrf24Init(const rxConfig_t *rxConfig, rxRuntimeState_t *rxRuntimeState) +bool knNrf24Init(const rxConfig_t *rxConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxRuntimeState->channelCount = KN_RC_CHANNEL_COUNT; knNrf24Setup((rx_spi_protocol_e)rxConfig->rx_spi_protocol); diff --git a/src/main/rx/nrf24_kn.h b/src/main/rx/nrf24_kn.h index fe672c841c..4965f9b604 100644 --- a/src/main/rx/nrf24_kn.h +++ b/src/main/rx/nrf24_kn.h @@ -25,6 +25,6 @@ struct rxConfig_s; struct rxRuntimeState_s; -bool knNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState); +bool knNrf24Init(const struct rxConfig_s *rxConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void knNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e knNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_syma.c b/src/main/rx/nrf24_syma.c index b9c3e58af3..dbb3c7f5ff 100644 --- a/src/main/rx/nrf24_syma.c +++ b/src/main/rx/nrf24_syma.c @@ -299,8 +299,10 @@ static void symaNrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -bool symaNrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool symaNrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxRuntimeState->channelCount = RC_CHANNEL_COUNT; symaNrf24Setup((rx_spi_protocol_e)rxSpiConfig->rx_spi_protocol); diff --git a/src/main/rx/nrf24_syma.h b/src/main/rx/nrf24_syma.h index b57a195e38..7bab2f716c 100644 --- a/src/main/rx/nrf24_syma.h +++ b/src/main/rx/nrf24_syma.h @@ -25,7 +25,7 @@ struct rxSpiConfig_s; struct rxRuntimeState_s; -bool symaNrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState); +bool symaNrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void symaNrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e symaNrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/nrf24_v202.c b/src/main/rx/nrf24_v202.c index 953040805d..c34052f8ab 100644 --- a/src/main/rx/nrf24_v202.c +++ b/src/main/rx/nrf24_v202.c @@ -259,8 +259,10 @@ static void v202Nrf24Setup(rx_spi_protocol_e protocol) NRF24L01_SetRxMode(); // enter receive mode to start listening for packets } -bool v202Nrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState) +bool v202Nrf24Init(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig) { + UNUSED(extiConfig); + rxRuntimeState->channelCount = V2X2_RC_CHANNEL_COUNT; v202Nrf24Setup((rx_spi_protocol_e)rxSpiConfig->rx_spi_protocol); diff --git a/src/main/rx/nrf24_v202.h b/src/main/rx/nrf24_v202.h index 5ad860a71f..e84bd664b5 100644 --- a/src/main/rx/nrf24_v202.h +++ b/src/main/rx/nrf24_v202.h @@ -25,6 +25,6 @@ struct rxSpiConfig_s; struct rxRuntimeState_s; -bool v202Nrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState); +bool v202Nrf24Init(const struct rxSpiConfig_s *rxSpiConfig, struct rxRuntimeState_s *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); void v202Nrf24SetRcDataFromPayload(uint16_t *rcData, const uint8_t *payload); rx_spi_received_e v202Nrf24DataReceived(uint8_t *payload); diff --git a/src/main/rx/rx_spi.c b/src/main/rx/rx_spi.c index 4095496a56..158156a695 100644 --- a/src/main/rx/rx_spi.c +++ b/src/main/rx/rx_spi.c @@ -31,6 +31,7 @@ #include "config/feature.h" +#include "drivers/io.h" #include "drivers/rx/rx_spi.h" #include "drivers/rx/rx_nrf24l01.h" @@ -55,7 +56,7 @@ uint16_t rxSpiRcData[MAX_SUPPORTED_RC_CHANNEL_COUNT]; STATIC_UNIT_TESTED uint8_t rxSpiPayload[RX_SPI_MAX_PAYLOAD_SIZE]; STATIC_UNIT_TESTED uint8_t rxSpiNewPacketAvailable; // set true when a new packet is received -typedef bool (*protocolInitFnPtr)(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState); +typedef bool (*protocolInitFnPtr)(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeState, rxSpiExtiConfig_t *extiConfig); typedef rx_spi_received_e (*protocolDataReceivedFnPtr)(uint8_t *payload); typedef rx_spi_received_e (*protocolProcessFrameFnPtr)(uint8_t *payload); typedef void (*protocolSetRcDataFromPayloadFnPtr)(uint16_t *rcData, const uint8_t *payload); @@ -82,7 +83,6 @@ STATIC_UNIT_TESTED uint16_t rxSpiReadRawRC(const rxRuntimeState_t *rxRuntimeStat STATIC_UNIT_TESTED bool rxSpiSetProtocol(rx_spi_protocol_e protocol) { switch (protocol) { - default: #ifdef USE_RX_V202 case RX_SPI_NRF24_V202_250K: case RX_SPI_NRF24_V202_1M: @@ -165,7 +165,10 @@ STATIC_UNIT_TESTED bool rxSpiSetProtocol(rx_spi_protocol_e protocol) protocolSetRcDataFromPayload = spektrumSpiSetRcDataFromPayload; break; #endif + default: + return false; } + return true; } @@ -224,8 +227,19 @@ bool rxSpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeStat return false; } - if (rxSpiSetProtocol(rxSpiConfig->rx_spi_protocol)) { - ret = protocolInit(rxSpiConfig, rxRuntimeState); + if (!rxSpiSetProtocol(rxSpiConfig->rx_spi_protocol)) { + return false; + } + + rxSpiExtiConfig_t extiConfig = { + .ioConfig = IOCFG_IN_FLOATING, + .trigger = EXTI_TRIGGER_RISING, + }; + + ret = protocolInit(rxSpiConfig, rxRuntimeState, &extiConfig); + + if (rxSpiExtiConfigured()) { + rxSpiExtiInit(extiConfig.ioConfig, extiConfig.trigger); } rxSpiNewPacketAvailable = false; rxRuntimeState->rxRefreshRate = 20000; diff --git a/src/main/rx/rx_spi.h b/src/main/rx/rx_spi.h index c1fc94d93e..1a5e80f023 100644 --- a/src/main/rx/rx_spi.h +++ b/src/main/rx/rx_spi.h @@ -20,10 +20,13 @@ #pragma once +#include "drivers/exti.h" + #include "pg/rx.h" -#include "rx/rx.h" #include "pg/rx_spi.h" +#include "rx/rx.h" + // Used in MSP. Append at end. typedef enum { RX_SPI_NRF24_V202_250K = 0, @@ -74,6 +77,11 @@ typedef enum { RC_SPI_AUX14 } rc_spi_aetr_e; +typedef struct { + ioConfig_t ioConfig; + extiTrigger_t trigger; +} rxSpiExtiConfig_t; + // RC channels as used by deviation #define RC_CHANNEL_RATE RC_SPI_AUX1 #define RC_CHANNEL_FLIP RC_SPI_AUX2 diff --git a/src/test/unit/rx_spi_spektrum_unittest.cc b/src/test/unit/rx_spi_spektrum_unittest.cc index 8ab80ca422..a2b4ac43ea 100644 --- a/src/test/unit/rx_spi_spektrum_unittest.cc +++ b/src/test/unit/rx_spi_spektrum_unittest.cc @@ -86,6 +86,7 @@ extern "C" { static const dsmReceiver_t empty = dsmReceiver_t(); static rxRuntimeState_t config = rxRuntimeState_t(); + static rxSpiExtiConfig_t extiConfig; static uint8_t packetLen; static uint8_t packet[16]; static uint16_t rssi = 0; @@ -142,7 +143,7 @@ extern "C" { TEST(RxSpiSpektrumUnitTest, TestInitUnbound) { dsmReceiver = empty; - spektrumSpiInit(&injectedConfig, &config); + spektrumSpiInit(&injectedConfig, &config, &extiConfig); EXPECT_FALSE(dsmReceiver.bound); EXPECT_EQ(DSM_RECEIVER_BIND, dsmReceiver.status); EXPECT_EQ(DSM_INITIAL_BIND_CHANNEL, dsmReceiver.rfChannel); @@ -160,7 +161,7 @@ TEST(RxSpiSpektrumUnitTest, TestInitBound) spektrumConfigMutable()->protocol = DSMX_11; - bool result = spektrumSpiInit(&injectedConfig, &config); + bool result = spektrumSpiInit(&injectedConfig, &config, &extiConfig); EXPECT_TRUE(result); EXPECT_TRUE(dsmReceiver.bound); @@ -180,7 +181,7 @@ TEST(RxSpiSpektrumUnitTest, TestInitBound) dsmReceiver = empty; spektrumConfigMutable()->protocol = DSM2_11; - spektrumSpiInit(&injectedConfig, &config); + spektrumSpiInit(&injectedConfig, &config, &extiConfig); EXPECT_TRUE(dsmReceiver.bound); EXPECT_EQ(DSM2_11, dsmReceiver.protocol); @@ -388,8 +389,9 @@ extern "C" { void rxSpiCommonIOInit(const rxSpiConfig_t *) {} void rxSpiLedBlinkRxLoss(rx_spi_received_e ) {} void rxSpiLedBlinkBind(void) {}; - bool rxSpiCheckBindRequested(bool ) + bool rxSpiCheckBindRequested(bool) { return false; } + bool rxSpiExtiConfigured(void) { return true; } }