diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index a9c4aaea2..48b4150e0 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -141,6 +141,24 @@ static void* auxSerialInit(const etx_serial_init* params) return aux_serial_init(&auxSerialState, params); } +void (*aux1RxCb)(uint8_t*, uint32_t); + +static void aux1_on_rx_byte(uint8_t data) +{ + if (aux1RxCb) aux1RxCb(&data, 1); +} + +void aux1SetRxCb(void*, void (*cb)(uint8_t*, uint32_t)) +{ + aux1RxCb = cb; + if (aux1RxCb) { + auxSerialCb.on_receive = aux1_on_rx_byte; + stm32_usart_deinit_rx_dma(&auxUSART); + } else { + auxSerialCb.on_receive = nullptr; + } +} + const etx_serial_driver_t AuxSerialDriver = { .init = auxSerialInit, .deinit = aux_serial_deinit, @@ -149,7 +167,7 @@ const etx_serial_driver_t AuxSerialDriver = { .waitForTxCompleted = aux_wait_tx_completed, .getByte = aux_get_byte, .getBaudrate = nullptr, - .setReceiveCb = nullptr, + .setReceiveCb = aux1SetRxCb, .setBaudrateCb = nullptr, }; @@ -202,15 +220,33 @@ static uint8_t aux2SerialOnSend(uint8_t* data) static etx_serial_callbacks_t aux2SerialCb = { .on_send = aux2SerialOnSend, - .on_receive = nullptr, + .on_receive = nullptr, // TODO: clear on DeInit .on_error = nullptr, }; -void* aux2SerialInit(const etx_serial_init* params) +static void* aux2SerialInit(const etx_serial_init* params) { return aux_serial_init(&aux2SerialState, params); } +void (*aux2RxCb)(uint8_t*, uint32_t); + +static void aux2_on_rx_byte(uint8_t data) +{ + if (aux2RxCb) aux2RxCb(&data, 1); +} + +void aux2SetRxCb(void*, void (*cb)(uint8_t*, uint32_t)) +{ + aux2RxCb = cb; + if (aux2RxCb) { + aux2SerialCb.on_receive = aux2_on_rx_byte; + stm32_usart_deinit_rx_dma(&aux2USART); + } else { + aux2SerialCb.on_receive = nullptr; + } +} + extern "C" void AUX2_SERIAL_USART_IRQHandler(void) { DEBUG_INTERRUPT(INT_SER2); @@ -225,7 +261,7 @@ const etx_serial_driver_t Aux2SerialDriver = { .waitForTxCompleted = aux_wait_tx_completed, .getByte = aux_get_byte, .getBaudrate = nullptr, - .setReceiveCb = nullptr, + .setReceiveCb = aux2SetRxCb, .setBaudrateCb = nullptr, }; diff --git a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp index 5ac82b0b8..e31819c54 100644 --- a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp @@ -24,6 +24,8 @@ void stm32_usart_init_rx_dma(const stm32_usart_t* usart, void* buffer, uint32_t length) { + if (!usart->rxDMA) return; + // Disable IRQ based RX LL_USART_DisableIT_RXNE(usart->USARTx); @@ -49,6 +51,18 @@ void stm32_usart_init_rx_dma(const stm32_usart_t* usart, void* buffer, uint32_t LL_DMA_EnableStream(usart->rxDMA, usart->rxDMA_Stream); } +void stm32_usart_deinit_rx_dma(const stm32_usart_t* usart) +{ + if (!usart->rxDMA) return; + + LL_DMA_DeInit(usart->rxDMA, usart->rxDMA_Stream); + + // Enable IRQ based RX + LL_USART_EnableIT_RXNE(usart->USARTx); + NVIC_SetPriority(usart->IRQn, usart->IRQ_Prio); + NVIC_EnableIRQ(usart->IRQn); +} + void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params) { LL_USART_DeInit(usart->USARTx); @@ -118,6 +132,9 @@ void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params) void stm32_usart_deinit(const stm32_usart_t* usart) { + if (usart->rxDMA) { + LL_DMA_DeInit(usart->rxDMA, usart->rxDMA_Stream); + } if (usart->txDMA) { LL_DMA_DeInit(usart->txDMA, usart->txDMA_Stream); } diff --git a/radio/src/targets/common/arm/stm32/stm32_usart_driver.h b/radio/src/targets/common/arm/stm32/stm32_usart_driver.h index 1671d49b4..17f0cc6e0 100644 --- a/radio/src/targets/common/arm/stm32/stm32_usart_driver.h +++ b/radio/src/targets/common/arm/stm32/stm32_usart_driver.h @@ -50,6 +50,7 @@ struct stm32_usart_t { void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params); void stm32_usart_init_rx_dma(const stm32_usart_t* usart, void* buffer, uint32_t length); void stm32_usart_deinit(const stm32_usart_t* usart); +void stm32_usart_deinit_rx_dma(const stm32_usart_t* usart); void stm32_usart_send_byte(const stm32_usart_t* usart, uint8_t byte); void stm32_usart_send_buffer(const stm32_usart_t* usart, const uint8_t * data, uint32_t size); void stm32_usart_wait_for_tx_dma(const stm32_usart_t* usart);