fix(f4): limit CRSF external module speed to 3.75Mbps (#6923)

Co-authored-by: elecpower <elecpower@users.noreply.github.com>
This commit is contained in:
3djc
2026-01-28 16:06:06 +10:00
committed by GitHub
co-authored by elecpower
parent 0087e258f9
commit 6b1cd88eff
9 changed files with 86 additions and 48 deletions
+5
View File
@@ -859,3 +859,8 @@ inline bool IS_STM32H7(Board::Type board)
IS_JUMPER_T15PRO(board) ||
IS_RADIOMASTER_TX15(board);
}
inline bool IS_STM32F2F4(Board::Type board)
{
return (!IS_STM32H5(board) && !IS_STM32H7(board));
}
@@ -1504,6 +1504,12 @@ bool convert<ModelData>::decode(const Node& node, ModelData& rhs)
rhs.moduleData[i].modelId = modelIds[i];
}
// v2.12 CRSF limit external module to 3.75M for older boards
if (IS_STM32F2F4(board) &&
rhs.moduleData[1].protocol == PULSES_CROSSFIRE &&
rhs.moduleData[1].crsf.telemetryBaudrate > 4)
rhs.moduleData[1].crsf.telemetryBaudrate = 4;
if (node["failsafeChannels"]) {
int failsafeChans[CPN_MAX_CHNOUT];
memset(failsafeChans, 0, sizeof(failsafeChans));
+5 -1
View File
@@ -641,12 +641,16 @@ AbstractStaticItemModel * ModuleData::protocolItemModel(GeneralSettings & settin
return mdl;
}
AbstractStaticItemModel * ModuleData::telemetryBaudrateItemModel(unsigned int protocol)
AbstractStaticItemModel * ModuleData::telemetryBaudrateItemModel(unsigned int protocol, int moduleIdx, int board)
{
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName("moduledata.baudrate");
for (int i = 0; i < moduleBaudratesList.size(); i++) {
// CRSF limit external module to 3.75M for older boards
if (protocol == PULSES_CROSSFIRE && moduleIdx == 1 &&
IS_STM32F2F4((Board::Type)board) && i > 4) break;
if (protocol == PULSES_GHOST && i >= 2) break;
mdl->appendToItemList(moduleBaudratesList.at(i), i);
}
+1 -1
View File
@@ -235,7 +235,7 @@ class ModuleData {
static AbstractStaticItemModel * internalModuleItemModel(int board = -1);
static bool isProtocolAvailable(int moduleidx, unsigned int protocol, GeneralSettings & generalSettings);
static AbstractStaticItemModel * protocolItemModel(GeneralSettings & settings);
static AbstractStaticItemModel * telemetryBaudrateItemModel(unsigned int protocol);
static AbstractStaticItemModel * telemetryBaudrateItemModel(unsigned int protocol, int moduleIdx = -1, int board = 0);
static bool isAvailable(PulsesProtocol proto, int port = 0); // moved from OpenTxFirmware EdgeTX v2.9 - TODO remove and use isProtocolAvailable
QString afhds2aMode1ToString() const;
+6 -3
View File
@@ -352,7 +352,7 @@ void ModulePanel::update()
case PULSES_CROSSFIRE:
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_BAUDRATE | MASK_CSRF_ARMING_MODE;
module.channelsCount = 16;
ui->telemetryBaudrate->setModel(ModuleData::telemetryBaudrateItemModel(protocol));
ui->telemetryBaudrate->setModel(ModuleData::telemetryBaudrateItemModel(protocol, moduleIdx, board));
ui->telemetryBaudrate->setField(module.crsf.telemetryBaudrate);
ui->crsfArmingMode->setCurrentIndex(module.crsf.crsfArmingMode);
if (module.crsf.crsfArmingMode == ModuleData::CRSF_ARMING_MODE_SWITCH) {
@@ -428,10 +428,13 @@ void ModulePanel::update()
mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT;
}
if (isExternalModule(moduleIdx))
if (isExternalModule(moduleIdx)) {
ui->label_baudrate->setVisible(mask & MASK_BAUDRATE);
ui->telemetryBaudrate->setVisible(mask & MASK_BAUDRATE);
else
} else {
ui->label_baudrate->setVisible(false);
ui->telemetryBaudrate->setVisible(false);
}
ui->label_protocol->setVisible(mask & MASK_PROTOCOL);
ui->protocol->setVisible(mask & MASK_PROTOCOL);
+48 -42
View File
@@ -35,7 +35,7 @@
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -49,7 +49,6 @@
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@@ -94,7 +93,7 @@
<item row="2" column="0" colspan="3">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -107,7 +106,7 @@
<item row="0" column="0">
<layout class="QFormLayout" name="formLayout_col1">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="horizontalSpacing">
<number>6</number>
@@ -127,7 +126,7 @@
<string>Protocol</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -146,14 +145,14 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="AutoComboBox" name="telemetryBaudrate">
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
@@ -163,7 +162,7 @@
<string>Registration ID</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -183,7 +182,7 @@
<string>Multi Radio Protocol</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -202,7 +201,7 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
@@ -228,7 +227,7 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
@@ -288,7 +287,7 @@
<string>Failsafe Mode</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -307,7 +306,7 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
<item>
<property name="text">
@@ -348,7 +347,7 @@
<string>Trainer Mode</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -367,7 +366,7 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
@@ -402,7 +401,7 @@
<item row="17" column="0" colspan="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -446,6 +445,13 @@
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_baudrate">
<property name="text">
<string>Baudrate</string>
</property>
</widget>
</item>
<item row="15" column="1">
<widget class="QCheckBox" name="enableAETR">
<property name="text">
@@ -458,7 +464,7 @@
<item row="0" column="1">
<layout class="QFormLayout" name="formLayout_2">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="horizontalSpacing">
<number>6</number>
@@ -478,7 +484,7 @@
<string>Start</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -497,7 +503,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="suffix">
<string/>
@@ -531,7 +537,7 @@
<string>Receiver No.</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -550,7 +556,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="suffix">
<string/>
@@ -581,7 +587,7 @@
<string>Polarity</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -600,7 +606,7 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
<item>
<property name="text">
@@ -630,7 +636,7 @@
<string>Receiver 1</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -687,7 +693,7 @@
<string>Receiver 2</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -723,7 +729,7 @@
<string>Receiver 3</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -818,7 +824,7 @@
<item row="9" column="0" colspan="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -833,7 +839,7 @@
<item row="0" column="2">
<layout class="QFormLayout" name="formLayout_3">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="horizontalSpacing">
<number>6</number>
@@ -859,7 +865,7 @@
<string>Channels</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -878,7 +884,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="suffix">
<string/>
@@ -909,7 +915,7 @@
<string>PPM delay</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -928,7 +934,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="suffix">
<string> us</string>
@@ -959,7 +965,7 @@
<string>PPM Frame Length</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -978,7 +984,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="suffix">
<string> ms</string>
@@ -1012,7 +1018,7 @@
<string>Antenna</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -1031,7 +1037,7 @@
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
@@ -1064,7 +1070,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -1084,7 +1090,7 @@
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
<item>
<property name="text">
@@ -1101,7 +1107,7 @@
<item row="9" column="0" colspan="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -1126,7 +1132,7 @@
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<property name="suffix">
<string> Hz</string>
@@ -1169,7 +1175,7 @@
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property>
</widget>
</item>
@@ -1200,7 +1206,7 @@ QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; pad
<property name="bottomMargin">
<number>4</number>
</property>
<item alignment="Qt::AlignRight">
<item alignment="Qt::AlignmentFlag::AlignRight">
<widget class="QWidget" name="widgetValueType" native="true">
<property name="autoFillBackground">
<bool>true</bool>
@@ -39,7 +39,7 @@ CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g,
auto line = newLine(grid);
new StaticText(line, rect_t{}, STR_BAUDRATE);
new Choice(
line, rect_t{}, STR_CRSF_BAUDRATE, 0, CROSSFIRE_MAX_INTERNAL_BAUDRATE,
line, rect_t{}, STR_CRSF_BAUDRATE, 0, CROSSFIRE_MAX_EXTERNAL_BAUDRATE,
[=]() -> int {
return CROSSFIRE_STORE_TO_INDEX(md->crsf.telemetryBaudrate);
},
+8
View File
@@ -211,6 +211,14 @@ if(g_model.rssiSource) {
storageDirty(EE_MODEL);
}
#if defined(STM32F4) && defined(CROSSFIRE)
// Limit ext. CRSF speed to 3.75Mbps due to CRC errors at higher speeds
if(isModuleCrossfire(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate == 4) {
TRACE("Downgrading external ELRS module baudrate");
g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate = 3;
storageDirty(EE_MODEL);
}
#endif
#if defined(PXX2)
bool changed = false;
+6
View File
@@ -130,6 +130,12 @@ const uint32_t CROSSFIRE_BAUDRATES[] = {
5250000,
};
#if defined(STM32F4)
#define CROSSFIRE_MAX_EXTERNAL_BAUDRATE DIM(CROSSFIRE_BAUDRATES) - 2
#else
#define CROSSFIRE_MAX_EXTERNAL_BAUDRATE DIM(CROSSFIRE_BAUDRATES) - 1
#endif
#if defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define CROSSFIRE_MAX_INTERNAL_BAUDRATE DIM(CROSSFIRE_BAUDRATES) - 3
#else