1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-17 21:35:44 +03:00

ELRS SPI Fix eeprom write and reboot for msp over telemetry

This commit is contained in:
Hans Christian Olaussen 2022-05-01 00:00:49 +02:00
parent 9ca09763bb
commit 90b155ce1d
5 changed files with 73 additions and 12 deletions

View file

@ -75,6 +75,7 @@
#include "fc/board_info.h"
#include "fc/controlrate_profile.h"
#include "fc/core.h"
#include "fc/dispatch.h"
#include "fc/rc.h"
#include "fc/rc_adjustments.h"
#include "fc/rc_controls.h"
@ -142,6 +143,7 @@
#include "sensors/gyro_init.h"
#include "sensors/rangefinder.h"
#include "telemetry/msp_shared.h"
#include "telemetry/telemetry.h"
#ifdef USE_HARDWARE_REVISION_DETECTION
@ -384,6 +386,48 @@ static void mspRebootFn(serialPort_t *serialPort)
while (true) ;
}
#define MSP_DISPATCH_DELAY_US 1000000
void mspReboot(dispatchEntry_t* self)
{
UNUSED(self);
if (ARMING_FLAG(ARMED)) {
return;
}
mspRebootFn(NULL);
}
dispatchEntry_t mspRebootEntry =
{
mspReboot, 0, NULL, false
};
void writeReadEeprom(dispatchEntry_t* self)
{
UNUSED(self);
if (ARMING_FLAG(ARMED)) {
return;
}
writeEEPROM();
readEEPROM();
#ifdef USE_VTX_TABLE
if (vtxTableNeedsInit) {
vtxTableNeedsInit = false;
vtxTableInit(); // Reinitialize and refresh the in-memory copies
}
#endif
}
dispatchEntry_t writeReadEepromEntry =
{
writeReadEeprom, 0, NULL, false
};
static void serializeSDCardSummaryReply(sbuf_t *dst)
{
uint8_t flags = 0;
@ -2193,6 +2237,11 @@ static mspResult_e mspFcProcessOutCommandWithArg(mspDescriptor_t srcDesc, int16_
}
#endif
#if defined(USE_MSP_OVER_TELEMETRY)
if (featureIsEnabled(FEATURE_RX_SPI) && srcDesc == getMspTelemetryDescriptor()) {
dispatchAdd(&mspRebootEntry, MSP_DISPATCH_DELAY_US);
} else
#endif
if (mspPostProcessFn) {
*mspPostProcessFn = mspRebootFn;
}
@ -3076,15 +3125,14 @@ static mspResult_e mspProcessInCommand(mspDescriptor_t srcDesc, int16_t cmdMSP,
// ignore how long it takes to avoid confusing the scheduler
schedulerIgnoreTaskStateTime();
writeEEPROM();
readEEPROM();
#ifdef USE_VTX_TABLE
if (vtxTableNeedsInit) {
vtxTableNeedsInit = false;
vtxTableInit(); // Reinitialize and refresh the in-memory copies
}
#if defined(USE_MSP_OVER_TELEMETRY)
if (featureIsEnabled(FEATURE_RX_SPI) && srcDesc == getMspTelemetryDescriptor()) {
dispatchAdd(&writeReadEepromEntry, MSP_DISPATCH_DELAY_US);
} else
#endif
{
writeReadEeprom(NULL);
}
break;

View file

@ -290,8 +290,8 @@ void processMspPacket(uint8_t *packet)
break;
case CRSF_FRAMETYPE_MSP_REQ:
FALLTHROUGH;
case CRSF_FRAMETYPE_MSP_WRITE: //TODO: MSP_EEPROM_WRITE command is disabled.
if (packet[ELRS_MSP_COMMAND_INDEX] != MSP_EEPROM_WRITE && bufferCrsfMspFrame(&packet[ELRS_MSP_PACKET_OFFSET], CRSF_FRAME_RX_MSP_FRAME_SIZE)) {
case CRSF_FRAMETYPE_MSP_WRITE:
if (bufferCrsfMspFrame(&packet[ELRS_MSP_PACKET_OFFSET], CRSF_FRAME_RX_MSP_FRAME_SIZE)) {
handleCrsfMspFrameBuffer(&bufferMspResponse);
mspReplyPending = true;
}

View file

@ -29,13 +29,14 @@
#include "common/utils.h"
#include "config/config.h"
#include "config/feature.h"
#include "drivers/io.h"
#include "drivers/rx/rx_spi.h"
#include "drivers/rx/rx_nrf24l01.h"
#include "config/config.h"
#include "fc/dispatch.h"
#include "pg/rx_spi.h"
@ -274,6 +275,8 @@ bool rxSpiInit(const rxSpiConfig_t *rxSpiConfig, rxRuntimeState_t *rxRuntimeStat
rxRuntimeState->rcFrameStatusFn = rxSpiFrameStatus;
rxRuntimeState->rcProcessFrameFn = rxSpiProcessFrame;
dispatchEnable();
return ret;
}

View file

@ -127,7 +127,7 @@ STATIC_UNIT_TESTED mspPacket_t requestPacket;
STATIC_UNIT_TESTED mspPacket_t responsePacket;
static uint8_t lastRequestVersion; // MSP version of last request. Temporary solution. It's better to keep it in requestPacket.
static mspDescriptor_t mspSharedDescriptor;
static mspDescriptor_t mspSharedDescriptor = -1;
void initSharedMsp(void)
{
@ -137,6 +137,11 @@ void initSharedMsp(void)
mspSharedDescriptor = mspDescriptorAlloc();
}
mspDescriptor_t getMspTelemetryDescriptor(void)
{
return mspSharedDescriptor;
}
static void processMspPacket(void)
{
responsePacket.cmd = 0;

View file

@ -20,6 +20,8 @@
#pragma once
#include "msp/msp.h"
#define MSP_TLM_INBUF_SIZE MSP_PORT_INBUF_SIZE
#define MSP_TLM_OUTBUF_SIZE MSP_PORT_OUTBUF_SIZE_MIN
@ -28,6 +30,9 @@ typedef void (*mspResponseFnPtr)(uint8_t *payload, const uint8_t payloadSize);
void initSharedMsp(void);
// get descriptor for MSP over telemetry
mspDescriptor_t getMspTelemetryDescriptor(void);
// receives telemetry payload with msp and handles it.
bool handleMspFrame(uint8_t *const payload, uint8_t const payloadLength, uint8_t *const skipsBeforeResponse);