diff --git a/flash.c b/flash.c index 01f58f1..ee63668 100644 --- a/flash.c +++ b/flash.c @@ -64,6 +64,7 @@ void flash_unlock(void) FLASH->KEYR = 0xCDEF89AB; } +#define rotate(x) ((x<<1) | (x&(1<<31)?1:0)) static uint32_t checksum(const void *start, size_t len) @@ -72,7 +73,7 @@ checksum(const void *start, size_t len) uint32_t *tail = (uint32_t*)(start + len); uint32_t value = 0; while (p < tail) - value ^= *p++; + value = rotate(value) | *p++; return value; } @@ -89,8 +90,7 @@ config_save(void) int count = sizeof(config_t) / sizeof(uint16_t); config.magic = CONFIG_MAGIC; - config.checksum = 0; - config.checksum = checksum(&config, sizeof config); + config.checksum = checksum(&config, sizeof config - sizeof config.checksum); flash_unlock(); @@ -114,7 +114,7 @@ config_recall(void) if (src->magic != CONFIG_MAGIC) return -1; - if (checksum(src, sizeof(config_t)) != 0) + if (checksum(src, sizeof *src - sizeof src->checksum) != src->checksum) return -1; /* duplicated saved data onto sram to be able to modify marker/trace */ @@ -182,7 +182,7 @@ caldata_recall(int id) if (src->magic != CONFIG_MAGIC) return -1; - if (checksum(src, sizeof(properties_t)) != 0) + if (checksum(src, sizeof *src - sizeof src->checksum) != src->checksum) return -1; /* active configuration points to save data on flash memory */ @@ -205,7 +205,7 @@ caldata_ref(int id) if (src->magic != CONFIG_MAGIC) return NULL; - if (checksum(src, sizeof(properties_t)) != 0) + if (checksum(src, sizeof *src - sizeof src->checksum) != src->checksum) return NULL; return src; } diff --git a/nanovna.h b/nanovna.h index 17add41..a19d6fa 100644 --- a/nanovna.h +++ b/nanovna.h @@ -215,7 +215,7 @@ typedef struct { uint32_t harmonic_freq_threshold; uint8_t _reserved[24]; - int32_t checksum; + uint32_t checksum; } config_t; extern config_t config; @@ -352,7 +352,7 @@ typedef struct { uint8_t _domain_mode; /* 0bxxxxxffm : where ff: TD_FUNC m: DOMAIN_MODE */ uint8_t _marker_smith_format; uint8_t _reserved[50]; - int32_t checksum; + uint32_t checksum; } properties_t; //sizeof(properties_t) == 0x1200