diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index cf8aacca1..7fcedbd86 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -165,6 +165,8 @@ const uint8_t * FrskyDeviceFirmwareUpdate::readHalfDuplexFrame(uint32_t timeout) const uint8_t * FrskyDeviceFirmwareUpdate::readFrame(uint32_t timeout) { + RTOS_WAIT_MS(1); + switch(module) { #if defined(INTMODULE_USART) case INTERNAL_MODULE: @@ -238,7 +240,10 @@ void FrskyDeviceFirmwareUpdate::sendFrame() const char * FrskyDeviceFirmwareUpdate::sendPowerOn() { state = SPORT_POWERUP_REQ; - waitState(SPORT_IDLE, 50); // Wait 50ms and clear the fifo + + RTOS_WAIT_MS(50); + telemetryClearFifo(); + for (int i=0; i<10; i++) { // max 10 attempts startFrame(PRIM_REQ_POWERUP); @@ -268,7 +273,9 @@ const char * FrskyDeviceFirmwareUpdate::sendPowerOn() const char * FrskyDeviceFirmwareUpdate::sendReqVersion() { - waitState(SPORT_IDLE, 20); // Clear the fifo + RTOS_WAIT_MS(20); + telemetryClearFifo(); + state = SPORT_VERSION_REQ; for (int i=0; i<10; i++) { // max 10 attempts @@ -299,7 +306,9 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) } } - waitState(SPORT_IDLE, 200); // Clear the fifo + RTOS_WAIT_MS(200); + telemetryClearFifo(); + state = SPORT_DATA_TRANSFER; startFrame(PRIM_CMD_DOWNLOAD); sendFrame(); @@ -385,11 +394,10 @@ void FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); - waitState(SPORT_IDLE, 500); // Clear the fifo - /* wait 2s off */ watchdogSuspend(2000); RTOS_WAIT_MS(2000); + telemetryClearFifo(); if (intPwr) { INTERNAL_MODULE_ON(); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 719c5c124..ea4d2604e 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -600,6 +600,7 @@ void telemetryPortSetDirectionOutput(void); void sportSendByte(uint8_t byte); void sportSendBuffer(const uint8_t * buffer, uint32_t count); uint8_t telemetryGetByte(uint8_t * byte); +void telemetryClearFifo(); extern uint32_t telemetryErrors; // Sport update driver diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index f9e278da6..6d9276ef1 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -235,3 +235,13 @@ uint8_t telemetryGetByte(uint8_t * byte) return telemetryNoDMAFifo.pop(*byte); #endif } + +void telemetryClearFifo() +{ +#if defined(PCBX12S) + telemetryDMAFifo.clear(); +#endif + + telemetryNoDMAFifo.clear(); +} + diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 6d26506b9..fa3b32f8b 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -696,6 +696,7 @@ void telemetryPortSetDirectionOutput(void); void sportSendByte(uint8_t byte); void sportSendBuffer(const uint8_t * buffer, uint32_t count); uint8_t telemetryGetByte(uint8_t * byte); +void telemetryClearFifo(); extern uint32_t telemetryErrors; // PCBREV driver diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 8a3bfb3f6..dc82fcd81 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -198,3 +198,8 @@ uint8_t telemetryGetByte(uint8_t * byte) return telemetryFifo.pop(*byte); #endif } + +void telemetryClearFifo() +{ + telemetryFifo.clear(); +}