From d73d1a0757a05906a8f4aa9e067f29618d30ecdf Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Tue, 24 Sep 2024 10:33:19 +0200 Subject: [PATCH] [4.5.2] Fix kiss passthrough (#13922) Fixes #13220: Fix kiss esc passthrough, Fix castle (escprog cc) command. (#13911) * Fix kiss esc passthrough, Fix castle (escprog cc) command. * Update src/main/drivers/serial_escserial.c Thank you. --------- Co-authored-by: Kiss Ultra <86871477+KissUltra@users.noreply.github.com> Co-authored-by: Alex Fedorov --- src/main/cli/cli.c | 2 +- src/main/drivers/serial_escserial.c | 41 +++++++++++++++++------------ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/cli/cli.c b/src/main/cli/cli.c index cde04624d7..3c7106f7b0 100644 --- a/src/main/cli/cli.c +++ b/src/main/cli/cli.c @@ -3926,7 +3926,7 @@ static void cliEscPassthrough(const char *cmdName, char *cmdline) } else if (strncasecmp(pch, "ki", strlen(pch)) == 0) { mode = PROTOCOL_KISS; } else if (strncasecmp(pch, "cc", strlen(pch)) == 0) { - mode = PROTOCOL_KISSALL; + mode = PROTOCOL_CASTLE; } else { cliShowParseError(cmdName); diff --git a/src/main/drivers/serial_escserial.c b/src/main/drivers/serial_escserial.c index 3e53ffc186..072560a501 100644 --- a/src/main/drivers/serial_escserial.c +++ b/src/main/drivers/serial_escserial.c @@ -661,10 +661,13 @@ static serialPort_t *openEscSerial(const motorDevConfig_t *motorConfig, escSeria { escSerial_t *escSerial = &(escSerialPorts[portIndex]); - if (escSerialConfig()->ioTag == IO_TAG_NONE) { - return NULL; - } + if (mode != PROTOCOL_KISSALL) { + + if (escSerialConfig()->ioTag == IO_TAG_NONE) { + return NULL; + } + const ioTag_t tag = motorConfig->ioTags[output]; const timerHardware_t *timerHardware = timerAllocate(tag, OWNER_MOTOR, 0); @@ -684,22 +687,22 @@ static serialPort_t *openEscSerial(const motorDevConfig_t *motorConfig, escSeria // Workaround to ensure that the timerHandle is configured before use, timer will be reconfigured to a different frequency below // this prevents a null-pointer dereference in __HAL_TIM_CLEAR_FLAG called by timerChClearCCFlag and similar accesses of timerHandle without the Instance being configured first. timerConfigure(escSerial->rxTimerHardware, 0xffff, 1); + + escSerial->txTimerHardware = timerAllocate(escSerialConfig()->ioTag, OWNER_MOTOR, 0); + if (escSerial->txTimerHardware == NULL) { + return NULL; + } + +#ifdef USE_HAL_DRIVER + escSerial->txTimerHandle = timerFindTimerHandle(escSerial->txTimerHardware->tim); +#endif + + // Workaround to ensure that the timerHandle is configured before use, timer will be reconfigured to a different frequency below + // this prevents a null-pointer dereference in __HAL_TIM_CLEAR_FLAG called by timerChClearCCFlag and similar accesses of timerHandle without the Instance being configured first. + timerConfigure(escSerial->txTimerHardware, 0xffff, 1); } escSerial->mode = mode; - escSerial->txTimerHardware = timerAllocate(escSerialConfig()->ioTag, OWNER_MOTOR, 0); - if (escSerial->txTimerHardware == NULL) { - return NULL; - } - -#ifdef USE_HAL_DRIVER - escSerial->txTimerHandle = timerFindTimerHandle(escSerial->txTimerHardware->tim); -#endif - - // Workaround to ensure that the timerHandle is configured before use, timer will be reconfigured to a different frequency below - // this prevents a null-pointer dereference in __HAL_TIM_CLEAR_FLAG called by timerChClearCCFlag and similar accesses of timerHandle without the Instance being configured first. - timerConfigure(escSerial->txTimerHardware, 0xffff, 1); - escSerial->port.vTable = escSerialVTable; escSerial->port.baudRate = baud; escSerial->port.mode = MODE_RXTX; @@ -752,11 +755,15 @@ static serialPort_t *openEscSerial(const motorDevConfig_t *motorConfig, escSeria if (tag != IO_TAG_NONE) { const timerHardware_t *timerHardware = timerAllocate(tag, OWNER_MOTOR, 0); if (timerHardware) { + // Workaround to ensure that the timerHandle is configured before use, timer will be reconfigured to a different frequency below + // this prevents a null-pointer dereference in __HAL_TIM_CLEAR_FLAG called by timerChClearCCFlag and similar accesses of timerHandle without the Instance being configured first. + timerConfigure(timerHardware, 0xffff, 1); escSerialOutputPortConfig(timerHardware); escOutputs[escSerial->outputCount].io = pwmMotors[i].io; if (timerHardware->output & TIMER_OUTPUT_INVERTED) { escOutputs[escSerial->outputCount].inverted = 1; } + escSerial->txTimerHardware = timerHardware; escSerial->outputCount++; } } @@ -1011,7 +1018,7 @@ bool escEnablePassthrough(serialPort_t *escPassthroughPort, const motorDevConfig closeEscSerial(ESCSERIAL1, mode); return true; } - if (mode==PROTOCOL_BLHELI) { + if (mode==PROTOCOL_BLHELI || mode==PROTOCOL_KISS || mode==PROTOCOL_KISSALL) { serialWrite(escPassthroughPort, ch); // blheli loopback } serialWrite(escPort, ch);