/** * @file backup_ram.cpp * @brief Non-volatile backup-RAM registers support * * @date Dec 19, 2017 */ #pragma once #include "global.h" #include "efi_gpio.h" #include "error_handling.h" typedef enum { /** * IAC Stepper motor position, 16-bit (stored in BKP0R 0..15) * Used in stepper.cpp */ BACKUP_STEPPER_POS, /** * Ignition switch counter, 8-bit (stored in BKP0R 16..23) * The counter stores the number of times the ignition switch is turned on. Used for prime injection pulse. * We need a protection against 'fake' ignition switch on and off (i.e. no engine started), to avoid repeated prime pulses. * So we check and update the ignition switch counter in non-volatile backup-RAM. * See startPrimeInjectionPulse() in controllers/trigger/main_trigger_callback.cpp */ BACKUP_IGNITION_SWITCH_COUNTER, /** * CJ125 Calibration data (16bit) */ BACKUP_CJ125_CALIBRATION_LAMBDA, /** * CJ125 Calibration data (16bit) */ BACKUP_CJ125_CALIBRATION_HEATER, DFU_JUMP_REQUESTED, /* The number of stored backup variables */ BACKUP_RAM_NUM, } backup_ram_e; // load data from backup-power RTC registers (non-volatile memory) uint32_t backupRamLoad(backup_ram_e idx); // use backup-power RTC registers (non-volatile memory) to store the data void backupRamSave(backup_ram_e idx, uint32_t value); // make sure that all changes are saved before we shutdown the MCU void backupRamFlush(void); // These use very specific values to avoid interpreting random garbage memory as a real value enum class ErrorCookie : uint32_t { None = 0, FirmwareError = 0xcafebabe, HardFault = 0xdeadbeef, }; #if EFI_PROD_CODE struct BackupSramData { ErrorCookie Cookie; critical_msg_t ErrorString; port_extctx FaultCtx; uint32_t FaultType; uint32_t FaultAddress; uint32_t Csfr; uint32_t BootCount; uint32_t BootCountCookie; }; BackupSramData* getBackupSram(); #endif // EFI_PROD_CODE