1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-21 15:25:36 +03:00

Merge pull request #1161 from mikeller/msp_dataflash_jumbo_frames

Implemented support for MSP jumbo frames, switched dataflash reading to be using jumbo frames.
This commit is contained in:
Michael Keller 2016-09-15 08:45:06 +12:00 committed by GitHub
commit c89c0b205f
4 changed files with 50 additions and 15 deletions

View file

@ -308,7 +308,7 @@ void resetSerialConfig(serialConfig_t *serialConfig)
for (index = 0; index < SERIAL_PORT_COUNT; index++) { for (index = 0; index < SERIAL_PORT_COUNT; index++) {
serialConfig->portConfigs[index].identifier = serialPortIdentifiers[index]; serialConfig->portConfigs[index].identifier = serialPortIdentifiers[index];
serialConfig->portConfigs[index].msp_baudrateIndex = BAUD_115200; serialConfig->portConfigs[index].msp_baudrateIndex = BAUD_500000;
serialConfig->portConfigs[index].gps_baudrateIndex = BAUD_57600; serialConfig->portConfigs[index].gps_baudrateIndex = BAUD_57600;
serialConfig->portConfigs[index].telemetry_baudrateIndex = BAUD_AUTO; serialConfig->portConfigs[index].telemetry_baudrateIndex = BAUD_AUTO;
serialConfig->portConfigs[index].blackbox_baudrateIndex = BAUD_115200; serialConfig->portConfigs[index].blackbox_baudrateIndex = BAUD_115200;

View file

@ -85,7 +85,7 @@ const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT] = {
static uint8_t serialPortCount; static uint8_t serialPortCount;
const uint32_t baudRates[] = {0, 9600, 19200, 38400, 57600, 115200, 230400, 250000}; // see baudRate_e const uint32_t baudRates[] = {0, 9600, 19200, 38400, 57600, 115200, 230400, 250000, 500000, 1000000}; // see baudRate_e
#define BAUD_RATE_COUNT (sizeof(baudRates) / sizeof(baudRates[0])) #define BAUD_RATE_COUNT (sizeof(baudRates) / sizeof(baudRates[0]))

View file

@ -46,6 +46,8 @@ typedef enum {
BAUD_115200, BAUD_115200,
BAUD_230400, BAUD_230400,
BAUD_250000, BAUD_250000,
BAUD_500000,
BAUD_1000000,
} baudRate_e; } baudRate_e;
extern const uint32_t baudRates[]; extern const uint32_t baudRates[];

View file

@ -195,6 +195,10 @@ STATIC_UNIT_TESTED bufWriter_t *writer;
#define RATEPROFILE_MASK (1 << 7) #define RATEPROFILE_MASK (1 << 7)
#define JUMBO_FRAME_SIZE_LIMIT 255
#define DATAFLASH_BUFFER_SIZE 4096
static void serialize8(uint8_t a) static void serialize8(uint8_t a)
{ {
bufWriterAppend(writer, a); bufWriterAppend(writer, a);
@ -232,7 +236,7 @@ static uint32_t read32(void)
return t; return t;
} }
static void headSerialResponse(uint8_t err, uint8_t responseBodySize) static void headSerialResponse(uint8_t err, uint16_t responseBodySize)
{ {
serialBeginWrite(mspSerialPort); serialBeginWrite(mspSerialPort);
@ -240,11 +244,18 @@ static void headSerialResponse(uint8_t err, uint8_t responseBodySize)
serialize8('M'); serialize8('M');
serialize8(err ? '!' : '>'); serialize8(err ? '!' : '>');
currentPort->checksum = 0; // start calculating a new checksum currentPort->checksum = 0; // start calculating a new checksum
serialize8(responseBodySize); if (responseBodySize < JUMBO_FRAME_SIZE_LIMIT) {
serialize8(responseBodySize);
} else {
serialize8(JUMBO_FRAME_SIZE_LIMIT);
}
serialize8(currentPort->cmdMSP); serialize8(currentPort->cmdMSP);
if (responseBodySize >= JUMBO_FRAME_SIZE_LIMIT) {
serialize16(responseBodySize);
}
} }
static void headSerialReply(uint8_t responseBodySize) static void headSerialReply(uint16_t responseBodySize)
{ {
headSerialResponse(0, responseBodySize); headSerialResponse(0, responseBodySize);
} }
@ -400,25 +411,38 @@ static void serializeDataflashSummaryReply(void)
} }
#ifdef USE_FLASHFS #ifdef USE_FLASHFS
static void serializeDataflashReadReply(uint32_t address, uint8_t size) static void serializeDataflashReadReply(uint32_t address, uint16_t size, bool useLegacyFormat)
{ {
uint8_t buffer[128]; static uint8_t buffer[DATAFLASH_BUFFER_SIZE];
int bytesRead;
if (size > sizeof(buffer)) { if (size > sizeof(buffer)) {
size = sizeof(buffer); size = sizeof(buffer);
} }
headSerialReply(4 + size);
serialize32(address);
// bytesRead will be lower than that requested if we reach end of volume // bytesRead will be lower than that requested if we reach end of volume
bytesRead = flashfsReadAbs(address, buffer, size); int bytesRead = flashfsReadAbs(address, buffer, size);
for (int i = 0; i < bytesRead; i++) { if (useLegacyFormat) {
headSerialReply(sizeof(uint32_t) + size);
serialize32(address);
} else {
headSerialReply(sizeof(uint32_t) + sizeof(uint16_t) + bytesRead);
serialize32(address);
serialize16(bytesRead);
}
int i;
for (i = 0; i < bytesRead; i++) {
serialize8(buffer[i]); serialize8(buffer[i]);
} }
if (useLegacyFormat) {
for (; i < size; i++) {
serialize8(0);
}
}
} }
#endif #endif
@ -1162,8 +1186,17 @@ static bool processOutCommand(uint8_t cmdMSP)
case MSP_DATAFLASH_READ: case MSP_DATAFLASH_READ:
{ {
uint32_t readAddress = read32(); uint32_t readAddress = read32();
uint16_t readLength;
bool useLegacyFormat;
if (currentPort->dataSize >= sizeof(uint32_t) + sizeof(uint16_t)) {
readLength = read16();
useLegacyFormat = false;
} else {
readLength = 128;
useLegacyFormat = true;
}
serializeDataflashReadReply(readAddress, 128); serializeDataflashReadReply(readAddress, readLength, useLegacyFormat);
} }
break; break;
#endif #endif