From c5c2829c24e31acbd13f9fcdbb85034b55dafa16 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 18 Nov 2021 08:40:44 +0100 Subject: [PATCH] Added baud rate changing on the fly to serial pass through --- radio/src/cli.cpp | 30 ++++++++++++++++--- .../arm/stm32/intmodule_serial_driver.cpp | 2 -- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/radio/src/cli.cpp b/radio/src/cli.cpp index 7741ac56e..d6bbe5a64 100644 --- a/radio/src/cli.cpp +++ b/radio/src/cli.cpp @@ -870,8 +870,21 @@ static void spInternalModuleTx(uint8_t* buf, uint32_t len) intmoduleWaitForTxCompleted(); } +static void spInternalModuleSetBaudRate(uint32_t baud) +{ + etx_serial_init params; + params.baudrate = baud; + params.rx_enable = true; + + // just in case... + intmoduleWaitForTxCompleted(); + + // re-configure serial port + intmoduleSerialStart(¶ms); +} + +// TODO: use proper method instead extern bool cdcConnected; -uint32_t usbSerialFreeSpace(); int cliSerialPassthrough(const char **argv) { @@ -896,8 +909,8 @@ int cliSerialPassthrough(const char **argv) err = toInt(argv, 3, &baudrate); if (err == -1) return err; if (err == 0) { - serialPrint("%s: missing baudrate", argv[0]); - return -1; + // use current USB CDC baudrate + baudrate = usbSerialBaudRate(); } if (!strcmp("rfmod", port_type)) { @@ -931,11 +944,16 @@ int cliSerialPassthrough(const char **argv) auto backupCB = cliReceiveCallBack; cliReceiveCallBack = spInternalModuleTx; + // setup CDC baudrate callback + usbSerialSetBaudRateCb(spInternalModuleSetBaudRate); + // loop until cable disconnected while (cdcConnected) { uint8_t data; if (intmoduleFifo.pop(data)) { + GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); + uint8_t timeout = 10; // 10 ms while(!usbSerialFreeSpace() && (timeout > 0)) { delay_ms(1); @@ -943,14 +961,18 @@ int cliSerialPassthrough(const char **argv) } usbSerialPutc(data); + GPIO_ResetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); } // keep us up & running WDG_RESET(); } - // restore CLI input + // restore callsbacks + usbSerialSetBaudRateCb(nullptr); cliReceiveCallBack = backupCB; + + // and stop module intmoduleStop(); } #endif diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 9ffb4c022..61081d9f0 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -133,8 +133,6 @@ void intmoduleSerialStart(const etx_serial_init* params) USART_Cmd(INTMODULE_USART, ENABLE); if (params->rx_enable) { - // TODO: move into the caller - intmoduleFifo.clear(); USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); NVIC_SetPriority(INTMODULE_USART_IRQn, 6); NVIC_EnableIRQ(INTMODULE_USART_IRQn);