From beccd10f660ce6ca9dfd393b8c1c8c7b9a15d29c Mon Sep 17 00:00:00 2001 From: Peter van der Perk Date: Sat, 4 May 2024 21:36:15 +0200 Subject: [PATCH] rc_input: Add SINGLEWIRE_MANUAL_DUPLEX for manually changing TXDIR Fixes telemetry on fmu-v6xrt --- boards/px4/fmu-v6xrt/src/board_config.h | 10 ++++++---- src/drivers/rc_input/RCInput.cpp | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/boards/px4/fmu-v6xrt/src/board_config.h b/boards/px4/fmu-v6xrt/src/board_config.h index a2edff8dab..61d703f8e3 100644 --- a/boards/px4/fmu-v6xrt/src/board_config.h +++ b/boards/px4/fmu-v6xrt/src/board_config.h @@ -451,10 +451,12 @@ #define HRT_PPM_CHANNEL /* GPIO_EMC_B1_09 GPIO_GPT5_CAPTURE1_1 */ 1 /* use capture/compare channel 1 */ #define GPIO_PPM_IN /* GPIO_EMC_B1_09 GPT1_CAPTURE2 */ (GPIO_GPT5_CAPTURE1_1 | GENERAL_INPUT_IOMUX) -#define RC_SERIAL_PORT "/dev/ttyS4" -#define RC_SERIAL_SINGLEWIRE 1 // Suport Single wire wiring -#define RC_SERIAL_SWAP_RXTX 1 // Set Swap (but not supported in HW) to use Single wire -#define RC_SERIAL_SWAP_USING_SINGLEWIRE 1 // Set to use Single wire swap as HW does not support swap +#define RC_SERIAL_PORT "/dev/ttyS4" +#define RC_SERIAL_SINGLEWIRE 1 // Suport Single wire wiring +#define RC_SERIAL_SWAP_RXTX 1 // Set Swap (but not supported in HW) to use Single wire +#define RC_SERIAL_SWAP_USING_SINGLEWIRE 1 // Set to use Single wire swap as HW does not support swap +#define RC_SERIAL_SINGLEWIRE_MANUAL_DUPLEX 1 // Set to use ioctl's to manually swap duplex +#define BOARD_SUPPORTS_RC_SERIAL_PORT_OUTPUT /* FLEXSPI4 */ diff --git a/src/drivers/rc_input/RCInput.cpp b/src/drivers/rc_input/RCInput.cpp index 12cd1ab0bf..6af0f00317 100644 --- a/src/drivers/rc_input/RCInput.cpp +++ b/src/drivers/rc_input/RCInput.cpp @@ -734,7 +734,15 @@ void RCInput::Run() } if (_crsf_telemetry) { +#if defined(RC_SERIAL_SINGLEWIRE_MANUAL_DUPLEX) + ioctl(_rcs_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED | SER_SINGLEWIRE_DIR_TX); +#endif _crsf_telemetry->update(cycle_timestamp); +#if defined(RC_SERIAL_SINGLEWIRE_MANUAL_DUPLEX) + tcflush(_rcs_fd, TCIOFLUSH); + tcdrain(_rcs_fd); // Ensure TX FIFO is empty before swapping + ioctl(_rcs_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED | SER_SINGLEWIRE_DIR_RX); +#endif } } } @@ -787,7 +795,15 @@ void RCInput::Run() } if (_ghst_telemetry) { +#if defined(RC_SERIAL_SINGLEWIRE_MANUAL_DUPLEX) + ioctl(_rcs_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED | SER_SINGLEWIRE_DIR_TX); +#endif _ghst_telemetry->update(cycle_timestamp); +#if defined(RC_SERIAL_SINGLEWIRE_MANUAL_DUPLEX) + tcflush(_rcs_fd, TCIOFLUSH); + tcdrain(_rcs_fd); // Ensure TX FIFO is empty before swapping + ioctl(_rcs_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED | SER_SINGLEWIRE_DIR_RX); +#endif } } }