void readEEPROM(void) { // Sanity check if (!isEEPROMContentValid()) failureMode(FAILURE_INVALID_EEPROM_CONTENTS); suspendRxSignal(); // Read flash memcpy(&masterConfig, (char *) CONFIG_START_FLASH_ADDRESS, sizeof(master_t)); if (masterConfig.current_profile_index > MAX_PROFILE_COUNT - 1) // sanity check masterConfig.current_profile_index = 0; setProfile(masterConfig.current_profile_index); if (currentProfile->defaultRateProfileIndex > MAX_CONTROL_RATE_PROFILE_COUNT - 1) // sanity check currentProfile->defaultRateProfileIndex = 0; setControlRateProfile(currentProfile->defaultRateProfileIndex); validateAndFixConfig(); activateConfig(); resumeRxSignal(); }
void writeEEPROM(void) { suspendRxSignal(); writeConfigToEEPROM(); resumeRxSignal(); }
void writeEEPROM(void) { // Generate compile time error if the config does not fit in the reserved area of flash. BUILD_BUG_ON(sizeof(master_t) > FLASH_TO_RESERVE_FOR_CONFIG); FLASH_Status status = 0; uint32_t wordOffset; int8_t attemptsRemaining = 3; suspendRxSignal(); // prepare checksum/version constants masterConfig.version = EEPROM_CONF_VERSION; masterConfig.size = sizeof(master_t); masterConfig.magic_be = 0xBE; masterConfig.magic_ef = 0xEF; masterConfig.chk = 0; // erase checksum before recalculating masterConfig.chk = calculateChecksum((const uint8_t *) &masterConfig, sizeof(master_t)); // write it FLASH_Unlock(); while (attemptsRemaining--) { #ifdef STM32F303 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); #endif #ifdef STM32F10X FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); #endif for (wordOffset = 0; wordOffset < sizeof(master_t); wordOffset += 4) { if (wordOffset % FLASH_PAGE_SIZE == 0) { status = FLASH_ErasePage(CONFIG_START_FLASH_ADDRESS + wordOffset); if (status != FLASH_COMPLETE) { break; } } status = FLASH_ProgramWord(CONFIG_START_FLASH_ADDRESS + wordOffset, *(uint32_t *) ((char *) &masterConfig + wordOffset)); if (status != FLASH_COMPLETE) { break; } } if (status == FLASH_COMPLETE) { break; } } FLASH_Lock(); // Flash write failed - just die now if (status != FLASH_COMPLETE || !isEEPROMContentValid()) { failureMode(FAILURE_FLASH_WRITE_FAILED); } resumeRxSignal(); }
void writeEEPROM(void) { #ifndef USE_OSD_SLAVE suspendRxSignal(); #endif writeConfigToEEPROM(); #ifndef USE_OSD_SLAVE resumeRxSignal(); #endif }
void readEEPROM(void) { suspendRxSignal(); // Sanity check, read flash if (!loadEEPROM()) { failureMode(FAILURE_INVALID_EEPROM_CONTENTS); } pgActivateProfile(getCurrentProfile()); setControlRateProfile(rateProfileSelection()->defaultRateProfileIndex); validateAndFixConfig(); activateConfig(); resumeRxSignal(); }
void readEEPROM(void) { #ifndef USE_OSD_SLAVE suspendRxSignal(); #endif // Sanity check, read flash if (!loadEEPROM()) { failureMode(FAILURE_INVALID_EEPROM_CONTENTS); } validateAndFixConfig(); activateConfig(); #ifndef USE_OSD_SLAVE resumeRxSignal(); #endif }
void readEEPROM(void) { suspendRxSignal(); // Sanity check // Read flash if (!scanEEPROM(true)) { failureMode(FAILURE_INVALID_EEPROM_CONTENTS); } pgActivateProfile(getCurrentProfile()); if (rateProfileSelection()->defaultRateProfileIndex > MAX_CONTROL_RATE_PROFILE_COUNT - 1) // sanity check rateProfileSelection()->defaultRateProfileIndex = 0; setControlRateProfile(rateProfileSelection()->defaultRateProfileIndex); validateAndFixConfig(); activateConfig(); resumeRxSignal(); }
// FIXME: HAL for now this will only work for F4/F7 as flash layout is different void writeEEPROM(void) { // Generate compile time error if the config does not fit in the reserved area of flash. BUILD_BUG_ON(sizeof(master_t) > FLASH_TO_RESERVE_FOR_CONFIG); HAL_StatusTypeDef status; uint32_t wordOffset; int8_t attemptsRemaining = 3; suspendRxSignal(); // prepare checksum/version constants masterConfig.version = EEPROM_CONF_VERSION; masterConfig.size = sizeof(master_t); masterConfig.magic_be = 0xBE; masterConfig.magic_ef = 0xEF; masterConfig.chk = 0; // erase checksum before recalculating masterConfig.chk = calculateChecksum((const uint8_t *) &masterConfig, sizeof(master_t)); // write it /* Unlock the Flash to enable the flash control register access *************/ HAL_FLASH_Unlock(); while (attemptsRemaining--) { /* Fill EraseInit structure*/ FLASH_EraseInitTypeDef EraseInitStruct = {0}; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 2.7-3.6V EraseInitStruct.Sector = (FLASH_SECTOR_TOTAL-1); EraseInitStruct.NbSectors = 1; uint32_t SECTORError; status = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError); if (status != HAL_OK) { continue; } else { for (wordOffset = 0; wordOffset < sizeof(master_t); wordOffset += 4) { status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, CONFIG_START_FLASH_ADDRESS + wordOffset, *(uint32_t *) ((char *) &masterConfig + wordOffset)); if(status != HAL_OK) { break; } } } if (status == HAL_OK) { break; } } HAL_FLASH_Lock(); // Flash write failed - just die now if (status != HAL_OK || !isEEPROMContentValid()) { failureMode(FAILURE_FLASH_WRITE_FAILED); } resumeRxSignal(); }