Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions radio/src/io/multi_firmware_update.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ class MultiFirmwareUpdateDriver
{
}

const char* flashFirmware(FIL* file, const char* label,
ProgressHandler progressHandler);
const char* flashFirmware(
FIL* file, const char* label, ProgressHandler progressHandler,
MultiFirmwareInformation::MultiFirmwareBoardType boardType);
};

static const etx_serial_init serialInitParams = {
Expand Down Expand Up @@ -305,7 +306,8 @@ void MultiFirmwareUpdateDriver::leaveProgMode()
}

const char* MultiFirmwareUpdateDriver::flashFirmware(
FIL* file, const char* label, ProgressHandler progressHandler)
FIL* file, const char* label, ProgressHandler progressHandler,
MultiFirmwareInformation::MultiFirmwareBoardType boardType)
{
#if defined(SIMU)
for (uint16_t i = 0; i < 100; i++) {
Expand All @@ -318,9 +320,14 @@ const char* MultiFirmwareUpdateDriver::flashFirmware(
const char * result = nullptr;
if (!init()) return "Initialisation error";

/* wait 500ms for power on */
bool mpmV2File =
boardType == MultiFirmwareInformation::FIRMWARE_MULTI_MPM_V2;

/* wait 500ms for power on; the MPM v2 boot loader only listens for a
short time after power on (the module must start fast after a radio
reboot): sync at once */
watchdogSuspend(500 /*5s*/);
sleep_ms(500);
sleep_ms(mpmV2File ? 10 : 500);

result = waitForInitialSync();
if (result) {
Expand All @@ -344,7 +351,14 @@ const char* MultiFirmwareUpdateDriver::flashFirmware(
return STR_DEVICE_FILE_WRONG_SIG;
}

if (signature[1] == 0x55 && signature[2] == 0xAA) {
// MPM v2 boot loader (CC26xx, CC27xx): 1E 55 26, the STM32 layout
bool mpmV2Device = signature[1] == 0x55 && signature[2] == 0x26;
if (mpmV2Device != mpmV2File) {
leaveProgMode();
return STR_DEVICE_FILE_WRONG_SIG;
}

if (signature[1] == 0x55 && (signature[2] == 0xAA || mpmV2Device)) {
pageSize = 256;
writeOffset = 0x1000; // start offset (word address)
}
Expand Down Expand Up @@ -507,6 +521,9 @@ bool MultiDeviceFirmwareUpdate::flashFirmware(const char * filename, ProgressHan
return false;
}

// ELRS files carry no board type: written like STM32 ones, to anything but
// the MPM v2 boot loader
auto boardType = MultiFirmwareInformation::FIRMWARE_MULTI_STM;
if (type == MULTI_TYPE_MULTIMODULE) {
MultiFirmwareInformation firmwareFile;
if (firmwareFile.readMultiFirmwareInformation(&file)) {
Expand All @@ -515,6 +532,7 @@ bool MultiDeviceFirmwareUpdate::flashFirmware(const char * filename, ProgressHan
return false;
}
f_lseek(&file, 0);
boardType = firmwareFile.getBoardType();

#if defined(HARDWARE_EXTERNAL_MODULE)
if (module == EXTERNAL_MODULE) {
Expand Down Expand Up @@ -555,7 +573,7 @@ bool MultiDeviceFirmwareUpdate::flashFirmware(const char * filename, ProgressHan
sleep_ms(3000);

MultiFirmwareUpdateDriver driver(module, type);
const char * result = driver.flashFirmware(&file, getBasename(filename), progressHandler);
const char * result = driver.flashFirmware(&file, getBasename(filename), progressHandler, boardType);
f_close(&file);

AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1);
Expand Down
16 changes: 12 additions & 4 deletions radio/src/io/multi_firmware_update.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

/* Signature format is multi-[board type]-[bootloader support][check for bootloader][multi telemetry type][telemetry inversion][debug]-[firmware version]
Where:
[board type] is avr, stm, or orx
[board type] is avr, stm, or orx (v2 signature: also 3, MPM v2: TI CC26xx / CC27xx)
[bootloader support] b for optiboot (AVR) / USB (STM) or u (unsupported)
[check for bootloader] is c (CHECK_FOR_BOOTLOADER) or u (undefined)
[telemetry type] is t (MULTI_TELEMETRY), s (MULTI_STATUS), or u (undefined) for neither
Expand All @@ -43,6 +43,7 @@ class MultiFirmwareInformation
FIRMWARE_MULTI_AVR = 0,
FIRMWARE_MULTI_STM,
FIRMWARE_MULTI_ORX,
FIRMWARE_MULTI_MPM_V2, // MPM v2: its own boot loader, signature 1E 55 26
};

enum MultiFirmwareTelemetryType
Expand All @@ -67,21 +68,28 @@ class MultiFirmwareInformation
return boardType == FIRMWARE_MULTI_ORX;
}

MultiFirmwareBoardType getBoardType() const
{
return (MultiFirmwareBoardType)boardType;
}

bool isMultiWithBootloaderFirmware() const
{
return optibootSupport;
}

bool isMultiInternalFirmware() const
{
return (boardType == FIRMWARE_MULTI_STM && optibootSupport &&
bootloaderCheck &&
return ((boardType == FIRMWARE_MULTI_STM ||
boardType == FIRMWARE_MULTI_MPM_V2) &&
optibootSupport && bootloaderCheck &&
telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY);
}

bool isMultiExternalFirmware() const
{
return ((telemetryInversion || boardType == FIRMWARE_MULTI_STM) &&
return ((telemetryInversion || boardType == FIRMWARE_MULTI_STM ||
boardType == FIRMWARE_MULTI_MPM_V2) &&
optibootSupport && bootloaderCheck &&
telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY);
}
Expand Down
Loading