fix: update checksum

pull/1/head
TT 6 years ago
parent 39f997f7d4
commit 8e8bc6924e

@ -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;
}

@ -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

Loading…
Cancel
Save

Powered by TurnKey Linux.