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) && FLASH_VerifyCRC32(FLASH_INTERNAL, address, FLASH_ModuleLength(FLASH_INTERNAL, address)); #else return (((*(volatile uint32_t*)address) & APP_START_MASK) == 0x20000000); #endif }
bool FLASH_CheckCopyMemory(flash_device_t sourceDeviceID, uint32_t sourceAddress, flash_device_t destinationDeviceID, uint32_t destinationAddress, uint32_t length, uint8_t module_function, uint8_t flags) { if (FLASH_CheckValidAddressRange(sourceDeviceID, sourceAddress, length) != true) { return false; } if (FLASH_CheckValidAddressRange(destinationDeviceID, destinationAddress, length) != true) { return false; } #ifndef USE_SERIAL_FLASH // this predates the module system (early P1's using external flash for storage) if ((sourceDeviceID == FLASH_INTERNAL) && (flags & MODULE_VERIFY_MASK)) { uint32_t moduleLength = FLASH_ModuleLength(sourceDeviceID, sourceAddress); if((flags & (MODULE_VERIFY_LENGTH|MODULE_VERIFY_CRC)) && (length < moduleLength+4)) { return false; } const module_info_t* info = FLASH_ModuleInfo(sourceDeviceID, sourceAddress); if ((info->module_function != MODULE_FUNCTION_RESOURCE) && (info->platform_id != PLATFORM_ID)) { return false; } // verify destination address if ((flags & MODULE_VERIFY_DESTINATION_IS_START_ADDRESS) && (((uint32_t)info->module_start_address) != destinationAddress)) { return false; } if ((flags & MODULE_VERIFY_FUNCTION) && (info->module_function != module_function)) { return false; } if ((flags & MODULE_VERIFY_CRC) && !FLASH_VerifyCRC32(sourceDeviceID, sourceAddress, moduleLength)) { return false; } } #endif return true; }