/** * Restart drivers. Have no restart list, instead the * drivers restarted are drivers that have had it's hardware * registers reset. If memory is also lost (=all memory is not * powered during sleep), this strategy does not work. * * This calls: * - EcuM_AL_DriverInitOne() * - EcuM_AL_DriverInitTwo() * */ void EcuM_AL_DriverRestart(const struct EcuM_ConfigS* ConfigPtr) { EcuM_ConfigType* config; VALIDATE_STATE( ECUM_STATE_WAKEUP_ONE); config = EcuM_DeterminePbConfiguration(); /* Start all drivers for now */ EcuM_AL_DriverInitOne(config); /* Setup the systick interrupt */ #if defined(USE_MCU) { uint32_t sys_freq = McuE_GetSystemClock(); Os_SysTickInit(); Os_SysTickStart(sys_freq / OsTickFreq); } #endif EcuM_AL_DriverInitTwo(config); }
void EcuM_CheckWakeup(EcuM_WakeupSourceType source) { /* Re-enable PLL again */ EcuM_ConfigType *ecuMConfigPtr; ecuMConfigPtr = EcuM_DeterminePbConfiguration(); (void) Mcu_InitClock(ecuMConfigPtr->McuConfig->McuDefaultClockSettings); // Wait for PLL to sync. while (Mcu_GetPllStatus() != MCU_PLL_LOCKED) { ; } /* ADD CODE BELOW */ #if 0 /* Example */ if (ECUM_WKSOURCE_SWITCH & wakeupSource) { if (CRP.PSCR.R & 0x00020000) { EcuM_SetWakeupEvent(ECUM_WKSOURCE_SWITCH); } } #endif }
/** * Restart drivers. Have no restart list, instead the * drivers restarted are drivers that have had it's hardware * registers reset. If memory is also lost (=all memory is not * powered during sleep), this strategy does not work. * * This calls: * - EcuM_AL_DriverInitOne() * - EcuM_AL_DriverInitTwo() * */ void EcuM_AL_DriverRestart(const struct EcuM_ConfigS* ConfigPtr) { EcuM_ConfigType* config; VALIDATE_STATE( ECUM_STATE_WAKEUP_ONE); config = EcuM_DeterminePbConfiguration(); /* Start all drivers for now */ EcuM_AL_DriverInitOne(config); /* Setup the systick interrupt */ #if defined(USE_MCU) { #if defined(CFG_OS_SYSTICK2) Os_SysTickStart2(OsTickFreq); #else Os_SysTickStart(Mcu_Arc_GetSystemClock() / OsTickFreq); #endif } #endif EcuM_AL_DriverInitTwo(config); }
/** * Initialize EcuM. */ void EcuM_Init(void) { Std_ReturnType status; set_current_state(ECUM_STATE_STARTUP_ONE); // Initialize drivers that are needed to determine PostBuild configuration EcuM_AL_DriverInitZero(); // Initialize the OS InitOS(); // Setup interrupts Os_IsrInit(); // Determine PostBuild configuration EcuM_World.config = EcuM_DeterminePbConfiguration(); // TODO: Check consistency of PB configuration // Initialize drivers needed before the OS-starts EcuM_AL_DriverInitOne(EcuM_World.config); // Determine the reset/wakeup reason switch (Mcu_GetResetReason()) { case MCU_POWER_ON_RESET: EcuM_SetWakeupEvent(ECUM_WKSOURCE_POWER); break; case MCU_SW_RESET: EcuM_SetWakeupEvent(ECUM_WKSOURCE_RESET); break; case MCU_RESET_UNDEFINED: break; case MCU_WATCHDOG_RESET: EcuM_SetWakeupEvent(ECUM_WKSOURCE_INTERNAL_WDG); break; default: assert(0); break; } // Moved this here because EcuM_SelectShutdownTarget needs us to be initilized. EcuM_World.initiated = TRUE; // Set default shutdown target status = EcuM_SelectShutdownTarget( EcuM_World.config->EcuMDefaultShutdownTarget, EcuM_World.config->EcuMDefaultSleepMode);/** @req EcuM2181 */ if (status != E_OK) { //TODO: Report error. } // Set default application mode status = EcuM_SelectApplicationMode( EcuM_World.config->EcuMDefaultAppMode); if (status != E_OK) { //TODO: Report error. } #if defined(USE_COMM) EcuM_World.run_comm_requests = 0; #endif EcuM_World.run_requests = 0; EcuM_World.postrun_requests = 0; // Start this baby up AppModeType appMode; status = EcuM_GetApplicationMode(&appMode); if (status != E_OK) { //TODO: Report error. } StartOS(appMode); /** @req EcuM2141 */ }