uint8_t configFlashWrite(void) { configRec_t *recs; uint8_t ret = 0; int i; recs = (void *)aqCalloc(CONFIG_NUM_PARAMS, sizeof(configRec_t)); if (recs) { configToken_t *tr = (configToken_t *)recs; configToken_t *tf = 0; // read all tokens do { tf = configTokenIterate(tf); // copy to RAM if (tf) { // only one instance per key do { if (tr->key == 0 || tr->key == tf->key) { memcpy(tr, tf, sizeof(configToken_t)); break; } tr++; } while (1); } } while (tf); ret = flashErase(flashStartAddr(), CONFIG_NUM_PARAMS*sizeof(configRec_t)/sizeof(uint32_t)); // invalidate the flash data cache FLASH_DataCacheCmd(DISABLE); FLASH_DataCacheReset(); FLASH_DataCacheCmd(ENABLE); if (ret) { tr = (configToken_t *)recs; // copy tokens back to flash while (tr->key) configTokenStore(tr++); // create param list in RAM for (i = 0; i < CONFIG_NUM_PARAMS; i++) { memcpy(recs[i].name, configParameterStrings[i], 16); recs[i].val = p[i]; } ret = flashAddress(flashStartAddr(), (uint32_t *)recs, CONFIG_NUM_PARAMS*sizeof(configRec_t)/sizeof(uint32_t)); } aqFree(recs, CONFIG_NUM_PARAMS, sizeof(configRec_t)); AQ_NOTICE("config: Parameters saved to flash memory.\n"); } else { AQ_NOTICE("config: Error writing params to flash, cannot allocate memory.\n"); } return ret; }
unsigned char configFlashWrite(void) { return flashAddress(flashStartAddr(), (uint32_t *)&p, sizeof(p)); }
void configTokenStore(configToken_t *token) { flashAddress((uint32_t)configTokenFindEmpty(), (uint32_t *)token, sizeof(configToken_t)/sizeof(uint32_t)); }