Skip to content

Commit 1a6fa4d

Browse files
authored
Merge pull request #11564 from klutvott123/crsf-baud-persistent
CRSF use persistent object to retain baudrate
2 parents ddcd847 + e0afe42 commit 1a6fa4d

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

src/main/drivers/persistent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ typedef enum {
3737
#endif
3838
PERSISTENT_OBJECT_RTC_HIGH, // high 32 bits of rtcTime_t
3939
PERSISTENT_OBJECT_RTC_LOW, // low 32 bits of rtcTime_t
40+
PERSISTENT_OBJECT_SERIALRX_BAUD, // serial rx baudrate
4041
PERSISTENT_OBJECT_COUNT,
4142
#ifdef USE_SPRACING_PERSISTENT_RTC_WORKAROUND
4243
// On SPRACING H7 firmware use this alternate location for all reset reasons interpreted by this firmware

src/main/rx/crsf.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
#include "pg/rx.h"
4040

41+
#include "drivers/persistent.h"
4142
#include "drivers/serial.h"
4243
#include "drivers/serial_uart.h"
4344
#include "drivers/system.h"
@@ -639,7 +640,7 @@ bool crsfRxInit(const rxConfig_t *rxConfig, rxRuntimeState_t *rxRuntimeState)
639640
uint32_t crsfBaudrate = CRSF_BAUDRATE;
640641

641642
#if defined(USE_CRSF_V3)
642-
crsfBaudrate = (isMPUSoftReset() && rxConfig->crsf_use_negotiated_baud) ? getCrsfCachedBaudrate() : CRSF_BAUDRATE;
643+
crsfBaudrate = rxConfig->crsf_use_negotiated_baud ? getCrsfCachedBaudrate() : CRSF_BAUDRATE;
643644
#endif
644645

645646
serialPort = openSerialPort(portConfig->identifier,
@@ -667,6 +668,7 @@ bool crsfRxInit(const rxConfig_t *rxConfig, rxRuntimeState_t *rxRuntimeState)
667668
void crsfRxUpdateBaudrate(uint32_t baudrate)
668669
{
669670
serialSetBaudRate(serialPort, baudrate);
671+
persistentObjectWrite(PERSISTENT_OBJECT_SERIALRX_BAUD, baudrate);
670672
}
671673

672674
bool crsfRxUseNegotiatedBaud(void)

src/main/telemetry/crsf.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "common/utils.h"
4444

4545
#include "drivers/nvic.h"
46+
#include "drivers/persistent.h"
4647

4748
#include "fc/rc_modes.h"
4849
#include "fc/runtime_config.h"
@@ -103,10 +104,9 @@ typedef struct {
103104

104105
static crsfSpeedControl_s crsfSpeed = {0};
105106

106-
uint32_t crsfCachedBaudrate __attribute__ ((section (".noinit"))); // Used for retaining negotiated baudrate after soft reset
107-
108107
uint32_t getCrsfCachedBaudrate(void)
109108
{
109+
uint32_t crsfCachedBaudrate = persistentObjectRead(PERSISTENT_OBJECT_SERIALRX_BAUD);
110110
// check if valid first. return default baudrate if not
111111
for (unsigned i = 0; i < BAUD_COUNT; i++) {
112112
if (crsfCachedBaudrate == baudRates[i] && baudRates[i] >= CRSF_BAUDRATE) {
@@ -133,8 +133,7 @@ void setCrsfDefaultSpeed(void)
133133
crsfSpeed.confirmationTime = 0;
134134
crsfSpeed.index = BAUD_COUNT;
135135
isCrsfV3Running = false;
136-
crsfCachedBaudrate = getCrsfDesiredSpeed();
137-
crsfRxUpdateBaudrate(crsfCachedBaudrate);
136+
crsfRxUpdateBaudrate(getCrsfDesiredSpeed());
138137
}
139138

140139
bool crsfBaudNegotiationInProgress(void)
@@ -470,8 +469,7 @@ void speedNegotiationProcess(timeUs_t currentTimeUs)
470469
} else if (crsfSpeed.isNewSpeedValid) {
471470
if (cmpTimeUs(currentTimeUs, crsfSpeed.confirmationTime) >= 4000) {
472471
// delay 4ms before applying the new baudrate
473-
crsfCachedBaudrate = getCrsfDesiredSpeed();
474-
crsfRxUpdateBaudrate(crsfCachedBaudrate);
472+
crsfRxUpdateBaudrate(getCrsfDesiredSpeed());
475473
crsfSpeed.isNewSpeedValid = false;
476474
isCrsfV3Running = true;
477475
}

0 commit comments

Comments
 (0)