diff --git a/firmware/console/binary/tunerstudio.cpp b/firmware/console/binary/tunerstudio.cpp index 22bcc7f4b0..00b3ded0d7 100644 --- a/firmware/console/binary/tunerstudio.cpp +++ b/firmware/console/binary/tunerstudio.cpp @@ -251,6 +251,23 @@ void handleWriteChunkCommand(ts_channel_s *tsChannel, ts_response_format_e mode, printTsStats(); } +void handleCrc32Check(ts_channel_s *tsChannel, ts_response_format_e mode, uint16_t pageId, uint16_t offset, uint16_t count) { + tsState.crc32CheckCommandCounter++; + + count = SWAP_UINT16(count); + + count = 14008; + + scheduleMsg(tsLogger, "CRC32 request: offset %d size %d", offset, count); + + uint32_t crc = SWAP_UINT32(crc32((void *) getWorkingPageAddr(0), count)); + + scheduleMsg(tsLogger, "CRC32 response: %x", crc); + + tsSendResponse(tsChannel, mode, (const uint8_t *)&crc, 4); +} + + /** * 'Write' command receives a single value at a given offset * @note Writing values one by one is pretty slow @@ -362,7 +379,8 @@ static bool isKnownCommand(char command) { return command == TS_HELLO_COMMAND || command == TS_READ_COMMAND || command == TS_OUTPUT_COMMAND || command == TS_PAGE_COMMAND || command == TS_BURN_COMMAND || command == TS_SINGLE_WRITE_COMMAND || command == TS_LEGACY_HELLO_COMMAND || command == TS_CHUNK_WRITE_COMMAND - || command == TS_EXECUTE || command == TS_GET_TEXT; + || command == TS_EXECUTE || command == TS_GET_TEXT + || command == TS_CRC_CHECK_COMMAND; } static uint8_t firstByte; @@ -648,6 +666,11 @@ int tunerStudioHandleCrcCommand(ts_channel_s *tsChannel, char *data, int incomin uint16_t offset = *(uint16_t *) (data + 2); uint8_t value = data[4]; handleWriteValueCommand(tsChannel, TS_CRC, page, offset, value); + } else if (command == TS_CRC_CHECK_COMMAND) { + uint16_t page = *(uint16_t *) data; + uint16_t offset = *(uint16_t *) (data + 2); + uint16_t count = *(uint16_t *) (data + 4); + handleCrc32Check(tsChannel, TS_CRC, page, offset, count); } else if (command == TS_BURN_COMMAND) { uint16_t page = *(uint16_t *) data; handleBurnCommand(tsChannel, TS_CRC, page); diff --git a/firmware/console/binary/tunerstudio.h b/firmware/console/binary/tunerstudio.h index e67d87e827..f64f3a63c4 100644 --- a/firmware/console/binary/tunerstudio.h +++ b/firmware/console/binary/tunerstudio.h @@ -24,6 +24,7 @@ typedef struct { int burnCommandCounter; int pageCommandCounter; int writeValueCommandCounter; + int crc32CheckCommandCounter; int writeChunkCommandCounter; int errorCounter; int tsCounter; diff --git a/firmware/console/binary/tunerstudio_io.h b/firmware/console/binary/tunerstudio_io.h index 991b34ca9a..bf5981f43c 100644 --- a/firmware/console/binary/tunerstudio_io.h +++ b/firmware/console/binary/tunerstudio_io.h @@ -51,6 +51,8 @@ typedef struct { #define TS_CHUNK_WRITE_COMMAND 'C' #define TS_BURN_COMMAND 'B' +#define TS_CRC_CHECK_COMMAND 'k' + #define CRC_VALUE_SIZE 4 // todo: double-check this #define CRC_WRAPPING_SIZE (CRC_VALUE_SIZE + 3) diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index 895650ca5f..e823c62100 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -276,5 +276,5 @@ int getRusEfiVersion(void) { return 1; // this is here to make the compiler happy about the unused array if (UNUSED_CCM_SIZE[0] == 0) return 1; // this is here to make the compiler happy about the unused array - return 20150310; + return 20150311; } diff --git a/firmware/tunerstudio/rusefi.ini b/firmware/tunerstudio/rusefi.ini index 42f74b3666..536029c4b7 100644 --- a/firmware/tunerstudio/rusefi.ini +++ b/firmware/tunerstudio/rusefi.ini @@ -13,6 +13,8 @@ enable2ndByteCanID = false endianness = little nPages = 1 + + pageSize = 14008 pageIdentifier = "\x00\x00" pageReadCommand = "R\x00\x00%2o%2c" @@ -20,6 +22,8 @@ enable2ndByteCanID = false pageActivate = "P\x00\x00" pageValueWrite = "W\x00\x00%2o%v" pageChunkWrite = "C\x00\x00%2o%2c%v" +; crc32CheckCommand = "k%2i%2o\xB8\x36" + crc32CheckCommand = "k\x00\x00\x00\x00\x36\xB8" ;communication settings ;e.g. put writeblocks off and add an interwrite delay