diff --git a/firmware/controllers/algo/persistent_configuration.h b/firmware/controllers/algo/persistent_configuration.h index 041a76da14..74dbac5ec2 100644 --- a/firmware/controllers/algo/persistent_configuration.h +++ b/firmware/controllers/algo/persistent_configuration.h @@ -15,5 +15,5 @@ typedef struct { int version; int size; persistent_config_s persistentConfiguration; - crc_t value; + uint32_t value; } persistent_config_container_s; diff --git a/firmware/controllers/flash_main.cpp b/firmware/controllers/flash_main.cpp index 50e99fab94..323276b698 100644 --- a/firmware/controllers/flash_main.cpp +++ b/firmware/controllers/flash_main.cpp @@ -71,8 +71,8 @@ const MFSConfig mfsd_nor_config = { * should be in a different sector of flash since complete flash sectors are erased on write. */ -static crc_t flashStateCrc(const persistent_config_container_s& state) { - return calc_crc((const crc_t*) &state.persistentConfiguration, sizeof(persistent_config_s)); +static uint32_t flashStateCrc(const persistent_config_container_s& state) { + return crc32(&state.persistentConfiguration, sizeof(persistent_config_s)); } #if EFI_FLASH_WRITE_THREAD @@ -229,7 +229,7 @@ static FlashState readOneConfigurationCopy(flashaddr_t address) { if (flashCrc != persistentState.value) { // If the stored crc is all 1s, that probably means the flash is actually blank, not that the crc failed. - if (persistentState.value == ((crc_t)-1)) { + if (persistentState.value == ((decltype(persistentState.value))-1)) { return FlashState::BlankChip; } else { return FlashState::CrcFailed; @@ -302,9 +302,7 @@ void readFromFlash() { case FlashState::CrcFailed: warning(CUSTOM_ERR_FLASH_CRC_FAILED, "flash CRC failed"); efiPrintf("Need to reset flash to default due to CRC mismatch"); - // todo: use [[fallthrough]]? jenkins has different version on Windows - resetConfigurationExt(DEFAULT_ENGINE_TYPE); - break; + [[fallthrough]]; case FlashState::BlankChip: resetConfigurationExt(DEFAULT_ENGINE_TYPE); break; diff --git a/firmware/util/math/crc.c b/firmware/util/math/crc.c index c4c1e16f79..c1734b6851 100644 --- a/firmware/util/math/crc.c +++ b/firmware/util/math/crc.c @@ -6,43 +6,6 @@ #include "crc.h" -#define WIDTH (8) -#define TOPBIT (1 << (WIDTH - 1)) -#define POLYNOMIAL 0xD8 - -crc_t calc_crc(const crc_t message[], int nBytes) { - crc_t remainder = 0; - - /* - * Perform modulo-2 division, a byte at a time. - */ - for (int byte = 0; byte < nBytes; ++byte) { - /* - * Bring the next byte into the remainder. - */ - remainder ^= (message[byte] << (WIDTH - 8)); - - /* - * Perform modulo-2 division, a bit at a time. - */ - for (unsigned char bit = 8; bit > 0; --bit) { - /* - * Try to divide the current data bit. - */ - if (remainder & TOPBIT) { - remainder = (remainder << 1) ^ POLYNOMIAL; - } else { - remainder = (remainder << 1); - } - } - } - - /* - * The final remainder is the CRC result. - */ - return remainder; -} - static const uint32_t crc32_tab[] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, @@ -95,6 +58,19 @@ uint32_t crc32(const void *buf, uint32_t size) { return crc32inc(buf, 0, size); } +uint32_t crc32inc(const void *buf, uint32_t crc, uint32_t size) { + const uint8_t *p; + + p = buf; + crc = crc ^ 0xFFFFFFFF; + + while (size--) { + crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); + } + + return crc ^ 0xFFFFFFFF; +} + /** * http://www.sunshine2k.de/coding/javascript/crc/crc_js.html * https://stackoverflow.com/questions/38639423/understanding-results-of-crc8-sae-j1850-normal-vs-zero @@ -116,15 +92,3 @@ uint8_t crc8(const uint8_t *data, uint8_t len) { return crc; } -uint32_t crc32inc(const void *buf, uint32_t crc, uint32_t size) { - const uint8_t *p; - - p = buf; - crc = crc ^ 0xFFFFFFFF; - - while (size--) { - crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); - } - - return crc ^ 0xFFFFFFFF; -} diff --git a/firmware/util/math/crc.h b/firmware/util/math/crc.h index 83d897c270..d634c974b6 100644 --- a/firmware/util/math/crc.h +++ b/firmware/util/math/crc.h @@ -9,13 +9,10 @@ #include "stdint.h" -typedef unsigned char crc_t; - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ -crc_t calc_crc(const crc_t message[], int nBytes); uint8_t crc8(const uint8_t * buf, uint8_t len); uint32_t crc32(const void *buf, uint32_t size); uint32_t crc32inc(const void *buf, uint32_t crc, uint32_t size); diff --git a/unit_tests/tests/test_util.cpp b/unit_tests/tests/test_util.cpp index 2f6413d604..f582878b6d 100644 --- a/unit_tests/tests/test_util.cpp +++ b/unit_tests/tests/test_util.cpp @@ -48,7 +48,6 @@ TEST(util, crc) { const char * A = "A"; - ASSERT_EQ( 168, calc_crc((const crc_t *) A, 1)) << "crc8"; uint32_t c = crc32(A, 1); printf("crc32(A)=%x\r\n", c); assertEqualsM("crc32 1", 0xd3d99e8b, c);