From c41e2f2680c418776fb4171a3cc1298de4cdd1a6 Mon Sep 17 00:00:00 2001 From: Auster Date: Mon, 4 Dec 2023 02:28:45 +0000 Subject: [PATCH] Allow CRSF RX binding via cli (#13119) --- src/main/rx/crsf.c | 18 ++++++++++++++++++ src/main/rx/crsf.h | 1 + src/main/rx/crsf_protocol.h | 5 +++++ src/main/rx/rx_bind.c | 11 ++++++++++- src/main/target/common_pre.h | 1 + 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/rx/crsf.c b/src/main/rx/crsf.c index eb2c0788b1..fe167105b9 100644 --- a/src/main/rx/crsf.c +++ b/src/main/rx/crsf.c @@ -681,4 +681,22 @@ bool crsfRxIsActive(void) { return serialPort != NULL; } + +void crsfRxBind(void) +{ + if (serialPort != NULL) { + uint8_t bindFrame[] = { + CRSF_SYNC_BYTE, + 0x07, // frame length + CRSF_FRAMETYPE_COMMAND, + CRSF_ADDRESS_CRSF_RECEIVER, + CRSF_ADDRESS_FLIGHT_CONTROLLER, + CRSF_COMMAND_SUBCMD_RX, + CRSF_COMMAND_SUBCMD_RX_BIND, + 0x9E, // Command CRC8 + 0xE8, // Packet CRC8 + }; + serialWriteBuf(serialPort, bindFrame, 9); + } +} #endif diff --git a/src/main/rx/crsf.h b/src/main/rx/crsf.h index a1ae3c80be..37b6ac138f 100644 --- a/src/main/rx/crsf.h +++ b/src/main/rx/crsf.h @@ -88,3 +88,4 @@ bool crsfRxInit(const struct rxConfig_s *initialRxConfig, struct rxRuntimeState_ void crsfRxUpdateBaudrate(uint32_t baudrate); bool crsfRxUseNegotiatedBaud(void); bool crsfRxIsActive(void); +void crsfRxBind(void); diff --git a/src/main/rx/crsf_protocol.h b/src/main/rx/crsf_protocol.h index 71a6bf50d3..0b56233f5c 100644 --- a/src/main/rx/crsf_protocol.h +++ b/src/main/rx/crsf_protocol.h @@ -60,9 +60,14 @@ typedef enum { } crsfFrameType_e; enum { + CRSF_COMMAND_SUBCMD_RX = 0x10, // receiver command CRSF_COMMAND_SUBCMD_GENERAL = 0x0A, // general command }; +enum { + CRSF_COMMAND_SUBCMD_RX_BIND = 0x01, // bind command +}; + enum { CRSF_COMMAND_SUBCMD_GENERAL_CRSF_SPEED_PROPOSAL = 0x70, // proposed new CRSF port speed CRSF_COMMAND_SUBCMD_GENERAL_CRSF_SPEED_RESPONSE = 0x71, // response to the proposed CRSF port speed diff --git a/src/main/rx/rx_bind.c b/src/main/rx/rx_bind.c index 170e9b7ec6..f7748340a5 100644 --- a/src/main/rx/rx_bind.c +++ b/src/main/rx/rx_bind.c @@ -24,12 +24,13 @@ #include "rx/rx_spi_common.h" #include "rx/srxl2.h" +#include "rx/crsf.h" #include "rx_bind.h" static bool doRxBind(bool doBind) { -#if !defined(USE_SERIALRX_SRXL2) && !defined(USE_RX_FRSKY_SPI) && !defined(USE_RX_SFHSS_SPI) && !defined(USE_RX_FLYSKY) && !defined(USE_RX_SPEKTRUM) && !defined(USE_RX_EXPRESSLRS) +#if !defined(USE_SERIALRX_SRXL2) && !defined(USE_RX_FRSKY_SPI) && !defined(USE_RX_SFHSS_SPI) && !defined(USE_RX_FLYSKY) && !defined(USE_RX_SPEKTRUM) && !defined(USE_RX_EXPRESSLRS) && !defined(USE_RX_CRSF) UNUSED(doBind); #endif @@ -40,6 +41,14 @@ static bool doRxBind(bool doBind) switch (rxRuntimeState.serialrxProvider) { default: return false; +#if defined(USE_RX_CRSF) + case SERIALRX_CRSF: + if (doBind) { + crsfRxBind(); + } + + break; +#endif #if defined(USE_SERIALRX_SRXL2) case SERIALRX_SRXL2: if (doBind) { diff --git a/src/main/target/common_pre.h b/src/main/target/common_pre.h index 81133f0178..da8f9ffa18 100644 --- a/src/main/target/common_pre.h +++ b/src/main/target/common_pre.h @@ -153,6 +153,7 @@ #define USE_RX_SPI #define USE_RX_CC2500 +#define USE_RX_CRSF #define USE_RX_EXPRESSLRS #define USE_RX_SX1280 #define USE_RX_SX127X