bool HAL_Core_Validate_User_Module(void) { bool valid = false; if (!SYSTEM_FLAG(StartupMode_SysFlag) & 1) { //CRC verification Enabled by default if (FLASH_isUserModuleInfoValid(FLASH_INTERNAL, USER_FIRMWARE_IMAGE_LOCATION, USER_FIRMWARE_IMAGE_LOCATION)) { //CRC check the user module and set to module_user_part_validated valid = FLASH_VerifyCRC32(FLASH_INTERNAL, USER_FIRMWARE_IMAGE_LOCATION, FLASH_ModuleLength(FLASH_INTERNAL, USER_FIRMWARE_IMAGE_LOCATION)) && HAL_Verify_User_Dependencies(); } else if(FLASH_isUserModuleInfoValid(FLASH_INTERNAL, INTERNAL_FLASH_FAC_ADDRESS, USER_FIRMWARE_IMAGE_LOCATION)) { //Reset and let bootloader perform the user module factory reset //Doing this instead of calling FLASH_RestoreFromFactoryResetModuleSlot() //saves precious system_part2 flash size i.e. fits in < 128KB HAL_Core_Factory_Reset(); while(1);//Device should reset before reaching this line } } return valid; }
uint8_t is_application_valid(uint32_t address) { #ifdef FLASH_UPDATE_MODULES return FLASH_isUserModuleInfoValid(FLASH_INTERNAL, address, address); #else return (((*(__IO uint32_t*)address) & APP_START_MASK) == 0x20000000); #endif }
uint8_t is_application_valid(uint32_t address) { #ifdef FLASH_UPDATE_MODULES return FLASH_isUserModuleInfoValid(FLASH_INTERNAL, address, address) && FLASH_VerifyCRC32(FLASH_INTERNAL, address, FLASH_ModuleLength(FLASH_INTERNAL, address)); #else return (((*(volatile uint32_t*)address) & APP_START_MASK) == 0x20000000); #endif }