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 } } }