From 5e950e8c5ab8aac07cf68140c6e0bdb1552e9c6f Mon Sep 17 00:00:00 2001 From: Curtis Bangert Date: Fri, 2 Feb 2018 00:07:59 -0500 Subject: [PATCH] Updated soft serial implementation to better handle VTX half-duplex transport --- src/main/drivers/io.h | 2 ++ src/main/drivers/serial.h | 5 +++-- src/main/drivers/serial_softserial.c | 6 ++++-- src/main/io/vtx_smartaudio.c | 11 +++++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/drivers/io.h b/src/main/drivers/io.h index 55d863003..ed9e4ceae 100644 --- a/src/main/drivers/io.h +++ b/src/main/drivers/io.h @@ -52,6 +52,7 @@ #define IO_CONFIG(mode, speed, pupd) ((mode) | ((speed) << 2) | ((pupd) << 5)) #define IOCFG_OUT_PP IO_CONFIG(GPIO_MODE_OUTPUT_PP, GPIO_SPEED_FREQ_LOW, GPIO_NOPULL) +#define IOCFG_OUT_PP_UP IO_CONFIG(GPIO_MODE_OUTPUT_PP, GPIO_SPEED_FREQ_LOW, GPIO_PULLUP) #define IOCFG_OUT_PP_25 IO_CONFIG(GPIO_MODE_OUTPUT_PP, GPIO_SPEED_FREQ_HIGH, GPIO_NOPULL) #define IOCFG_OUT_OD IO_CONFIG(GPIO_MODE_OUTPUT_OD, GPIO_SPEED_FREQ_LOW, GPIO_NOPULL) #define IOCFG_AF_PP IO_CONFIG(GPIO_MODE_AF_PP, GPIO_SPEED_FREQ_LOW, GPIO_NOPULL) @@ -68,6 +69,7 @@ #define IO_CONFIG(mode, speed, otype, pupd) ((mode) | ((speed) << 2) | ((otype) << 4) | ((pupd) << 5)) #define IOCFG_OUT_PP IO_CONFIG(GPIO_Mode_OUT, 0, GPIO_OType_PP, GPIO_PuPd_NOPULL) // TODO +#define IOCFG_OUT_PP_UP IO_CONFIG(GPIO_Mode_OUT, 0, GPIO_OType_PP, GPIO_PuPd_UP) #define IOCFG_OUT_PP_25 IO_CONFIG(GPIO_Mode_OUT, GPIO_Speed_25MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define IOCFG_OUT_OD IO_CONFIG(GPIO_Mode_OUT, 0, GPIO_OType_OD, GPIO_PuPd_NOPULL) #define IOCFG_AF_PP IO_CONFIG(GPIO_Mode_AF, 0, GPIO_OType_PP, GPIO_PuPd_NOPULL) diff --git a/src/main/drivers/serial.h b/src/main/drivers/serial.h index 38bfd8847..7380c4c2c 100644 --- a/src/main/drivers/serial.h +++ b/src/main/drivers/serial.h @@ -43,8 +43,9 @@ typedef enum { * To ensure the first start bit to be sent, prepend a zero byte (0x00) * to actual data bytes. */ - SERIAL_BIDIR_OD = 0 << 4, - SERIAL_BIDIR_PP = 1 << 4 + SERIAL_BIDIR_OD = 0 << 4, + SERIAL_BIDIR_PP = 1 << 4, + SERIAL_BIDIR_NOPULL = 1 << 5, // disable pulls in BIDIR RX mode } portOptions_e; typedef void (*serialReceiveCallbackPtr)(uint16_t data, void *rxCallbackData); // used by serial drivers to return frames to app diff --git a/src/main/drivers/serial_softserial.c b/src/main/drivers/serial_softserial.c index ecf61fd58..4978d16e0 100644 --- a/src/main/drivers/serial_softserial.c +++ b/src/main/drivers/serial_softserial.c @@ -132,13 +132,15 @@ static void serialInputPortActivate(softSerial_t *softSerial) #ifdef STM32F1 IOConfigGPIO(softSerial->rxIO, IOCFG_IPD); #else - IOConfigGPIOAF(softSerial->rxIO, IOCFG_AF_PP_PD, softSerial->timerHardware->alternateFunction); + const uint8_t pinConfig = (softSerial->port.options & SERIAL_BIDIR_NOPULL) ? IOCFG_AF_PP : IOCFG_AF_PP_PD; + IOConfigGPIOAF(softSerial->rxIO, pinConfig, softSerial->timerHardware->alternateFunction); #endif } else { #ifdef STM32F1 IOConfigGPIO(softSerial->rxIO, IOCFG_IPU); #else - IOConfigGPIOAF(softSerial->rxIO, IOCFG_AF_PP_UP, softSerial->timerHardware->alternateFunction); + const uint8_t pinConfig = (softSerial->port.options & SERIAL_BIDIR_NOPULL) ? IOCFG_AF_PP : IOCFG_AF_PP_UP; + IOConfigGPIOAF(softSerial->rxIO, pinConfig, softSerial->timerHardware->alternateFunction); #endif } diff --git a/src/main/io/vtx_smartaudio.c b/src/main/io/vtx_smartaudio.c index 3681b9fb8..343f87c34 100644 --- a/src/main/io/vtx_smartaudio.c +++ b/src/main/io/vtx_smartaudio.c @@ -434,7 +434,14 @@ static void saReceiveFramer(uint8_t c) static void saSendFrame(uint8_t *buf, int len) { - serialWrite(smartAudioSerialPort, 0x00); // Generate 1st start bit + switch (smartAudioSerialPort->identifier) { + case SERIAL_PORT_SOFTSERIAL1: + case SERIAL_PORT_SOFTSERIAL2: + break; + default: + serialWrite(smartAudioSerialPort, 0x00); // Generate 1st start bit + break; + } for (int i = 0 ; i < len ; i++) { serialWrite(smartAudioSerialPort, buf[i]); @@ -669,7 +676,7 @@ bool vtxSmartAudioInit(void) serialPortConfig_t *portConfig = findSerialPortConfig(FUNCTION_VTX_SMARTAUDIO); if (portConfig) { - portOptions_e portOptions = SERIAL_STOPBITS_2; + portOptions_e portOptions = SERIAL_STOPBITS_2 | SERIAL_BIDIR_NOPULL; #if defined(USE_VTX_COMMON) portOptions = portOptions | (vtxConfig()->halfDuplex ? SERIAL_BIDIR | SERIAL_BIDIR_PP : SERIAL_UNIDIR); #else