// ( we are reading directly from flash so it makes no sense )\r
memcpy( (void *)Fls_Global.ramAddr, (void *) Fls_Global.flashAddr,\r
Fls_Global.length);\r
+ if( Os_EccError ) {\r
+\r
+\r
+ }\r
Fls_Global.jobResultType = MEMIF_JOB_OK;\r
Fls_Global.status = MEMIF_IDLE;\r
Fls_Global.jobType = FLS_JOB_NONE;\r
\r
/* Clear sleep flags to allow pads to operate */\r
CRP.PSCR.B.SLEEPF = 0x1;\r
+\r
+\r
}\r
\r
\r
mfCR r29\r
mfXER r30\r
mfCTR r31\r
- stmw r25, 0x78(r1) #-- Store SPR data to stack\r
+ stmw r25, 0x78(r1) // Store SPR data to stack\r
\r
LOAD_ADDR_32(r4,CRP_RECPTR)\r
stw r1,0x0(r4) // Save stack pointer to CRP to be preserved during LPM\r
+ \r
+/* Note! You cannot step over the wait instruction with the debugger */ \r
+ \r
.long 0x7C00007C // Wait instruction\r
\r
\r
#elif defined(__DCC__)\r
.section .text_vle,x\r
#endif\r
+\r
+ .extern EcuM_CheckWakeup\r
.global McuE_LowPowerRecoverFlash\r
\r
/*\r
- * When we come back here only TLB0 is setup for flash and then only 4K\r
+ * When we come back here only TLB0 is setup for flash and then only 4K.\r
+ *\r
+ * Debuggers:\r
+ * - WinIDEA : Hardware->Emulation Options->CPU Setup->MPC55xx->Low Power Debug\r
+ * This will make the debugger stop on the function below.\r
+ * - UDE: No support for this yet. It just runs through the "wait" instruction. \r
*/ \r
McuE_LowPowerRecoverFlash:\r
\r
bl cfg_MMU\r
- \r
- \r
-#if 0 \r
- // Setup the SIU again.\r
- li r4,0x0202\r
- LOAD_ADDR_32(r3,0xfffe8040+(52*2)) // PD4, SIU_PCR \r
- sth r4,0(r3)\r
- \r
- LOAD_ADDR_32(r3,0xfffe8600+52) // PD4, SIU_GPDO\r
- stb 1,0(r3) \r
-\r
- // Release PAD keepers\r
- LOAD_ADDR_32(r3,0xfffec060) // CRP_PSCR\r
- LOAD_ADDR_32(r4,0x1000)\r
- stw r4,0(r3)\r
-#endif \r
- \r
+ \r
/* Recover the stack */\r
LOAD_ADDR_32(r4,CRP_RECPTR)\r
- lwz r1,0x0(r4) #-- Restore stack pointer from CRP\r
- lmw r25,0x78(r1) #-- Load SPR values back into GPRs\r
+ lwz r1,0x0(r4) // Restore stack pointer from CRP\r
+ lmw r25,0x78(r1) // Load SPR values back into GPRs\r
mtSRR1 r25\r
mtSRR0 r26\r
mtLR r27\r
mtmsr r28\r
mtCR r29\r
mtXER r30\r
- mtCTR r31 #-- Load SPRs with GPR values\r
- lmw r2, 0(r1) #-- Restore GPRs from stack\r
- addi r1,r1,0x94 #-- Deallocate space on stack\r
- blr #-- Branch back to calling function\r
- \r
+ mtCTR r31 // Load SPRs with GPR values\r
+ lmw r2, 0(r1) // Restore GPRs from stack\r
+ addi r1,r1,0x94 // Deallocate space on stack\r
+\r
+#if defined(USE_ECUM)\r
+\r
+ /* We have no idea what made us wakeup, pass all */\r
+ LOAD_ADDR_32(r3,0x3fffffff); // EcuM_WakeupSourceType\r
+ bl EcuM_CheckWakeup\r
+\r
+#endif\r
+\r
+\r
+\r
/* branch back to Mcu_SetMode().. */\r
blr\r
\r
#define VLE_VAL 0\r
#endif\r
\r
+#if defined(CFG_MPC5516)\r
#define SRAM_START 0x40000000\r
#define FLASH_START 0x00000000\r
#define PERIPHERAL_START 0xfff00000\r
+#else\r
+#error No support for this MCU\r
+#endif\r
\r
\r
cfg_MMU:\r
#define ECUM_GETAPPMODE_ID (0x11)\r
#define ECUM_SELECT_BOOTARGET_ID (0x12)\r
#define ECUM_GET_BOOTARGET_ID (0x13)\r
+#define ECUM_VALIDATE_WAKEUP_EVENT_ID 0x14\r
#define ECUM_MAINFUNCTION_ID (0x18)\r
#define ECUM_COMM_HASREQUESTEDRUN_ID (0x1b)\r
#define ECUM_ARC_STARTUPTWO_ID (0x20)\r
void EcuM_OnGoOffTwo(void);\r
\r
void EcuM_EnableWakeupSources(EcuM_WakeupSourceType wakeupSource);\r
-void Ecum_DisableWakeupSources(EcuM_WakeupSourceType wakeupSource);\r
+void EcuM_DisableWakeupSources(EcuM_WakeupSourceType wakeupSource);\r
\r
void EcuM_GenerateRamHash(void);\r
uint8 EcuM_CheckRamHash(void);\r
\r
void EcuM_AL_SwitchOff(void);\r
-void Ecum_AL_DriverRestart(void);\r
+void EcuM_AL_DriverRestart(void);\r
\r
void EcuM_StartWakeupSources(EcuM_WakeupSourceType wakeupSource);\r
void EcuM_CheckValidation(EcuM_WakeupSourceType wakeupSource);\r
\r
typedef enum\r
{\r
- ECUM_WWKACT_RUN = 0, /**< Initialization into RUN state */\r
+ ECUM_WKACT_RUN = 0, /**< Initialization into RUN state */\r
ECUM_WKACT_TTII = 2, /**< Execute time triggered increased inoperation protocol and shutdown */\r
ECUM_WKACT_SHUTDOWN = 3 /**< Immediate shutdown */\r
} EcuM_WakeupReactionType;\r
void (*GptNotification)();\r
uint8 GptNotificationPriority;\r
uint32 GptChannelPrescale;\r
- boolean GptEnableWakeup;\r
+ boolean GptEnableWakeup; // ?\r
+#if (GPT_REPORT_WAKEUP_SOURCE == STD_ON)\r
+ EcuM_WakeupSourceType GptWakeupSource;\r
+#endif\r
} Gpt_ConfigType;\r
\r
#endif /* GPT_CONFIGTYPES_H */\r
EcuM_GlobalType internal_data;\r
\r
/* ----------------------------[private functions]---------------------------*/\r
+\r
+\r
/* ----------------------------[public functions]----------------------------*/\r
\r
#if !defined(USE_DET) && defined(ECUM_DEV_ERROR_DETECT)\r
return E_OK;\r
}\r
\r
+/**\r
+ *\r
+ */\r
void EcuM_KillAllRUNRequests( void ) {\r
/* NOT IMPLEMENTED */\r
}\r
\r
+\r
+/**\r
+ *\r
+ * @param sources\r
+ */\r
void EcuM_SetWakeupEvent(EcuM_WakeupSourceType sources) {\r
- /* NOT IMPLEMENTED */\r
+ /* @req 3.1.5/EcuM2826 The function exists */\r
+ /* @req 3.1.5/EcuM2171 */\r
+\r
+ /* @req 3.1.5/EcuM2867 */\r
+#if ( ECUM_DEV_ERROR_DETECT == STD_ON )\r
+ {\r
+ EcuM_WakeupSourceType wkSource;\r
+ const EcuM_SleepModeType *sleepModePtr;\r
+\r
+ sleepModePtr = &internal_data.config->EcuMSleepModeConfig[internal_data.sleep_mode];\r
+ wkSource = sleepModePtr->EcuMWakeupSourceMask;\r
+\r
+ if( !((sources | wkSource) == wkSource)) {\r
+ Det_ReportError(MODULE_ID_ECUM, 0, ECUM_VALIDATE_WAKEUP_EVENT_ID, ECUM_E_UNKNOWN_WAKEUP_SOURCE );\r
+ return;\r
+ }\r
+ }\r
+#endif\r
+\r
+\r
+ /* @req 3.1.5/EcuM1117 */\r
+ internal_data.wakeupEvents |= sources;\r
+\r
+ /* @req 3.1.5/EcuM2707 @req 3.1.5/EcuM2709*/\r
+ internal_data.wakeupTimer = ECUM_VALIDATION_TIMEOUT;\r
+\r
}\r
\r
#if defined(USE_COMM) || defined(USE_ECUM_COMM)\r
}\r
\r
/**\r
- * TODO:\r
+ * Get the pending wakeup events.\r
+ *\r
* @return\r
*/\r
EcuM_WakeupSourceType EcuM_GetPendingWakeupEvents( void ) {\r
+ /* @req 3.1.5/EcuM2827 API\r
+ * @req 3.1.5/EcuM2172 Callable from interrupt context\r
+ * */\r
+\r
+ /* @req 3.1.5/EcuM1156 */\r
+ return internal_data.wakeupEvents;\r
+\r
+}\r
\r
+\r
+void EcuM_CheckValidation(EcuM_WakeupSourceType wakeupSource) {\r
+ /* Used only if CanIf is used ? CanIf_Checkvalidation(wakeupSource) */\r
+}\r
+\r
+\r
+EcuM_WakeupSourceType EcuM_GetValidatedWakeupEvents( void ) {\r
// TODO:\r
- return ECUM_WKSOURCE_INTERNAL_RESET;\r
+}\r
+\r
+EcuM_WakeupStatusType EcuM_GetStatusOfWakeupSource( EcuM_WakeupSourceType sources ) {\r
\r
}\r
\r
+\r
#endif\r
uint32 run_requests;\r
uint32 postrun_requests;\r
+ EcuM_WakeupSourceType wakeupEvents;\r
+ uint32 wakeupTimer;\r
} EcuM_GlobalType;\r
\r
extern EcuM_GlobalType internal_data;\r
sleepModePtr = &internal_data.config->EcuMSleepModeConfig[internal_data.sleep_mode];\r
\r
Mcu_SetMode(sleepModePtr->EcuMSleepModeMcuMode);\r
+\r
+ /* @req 3.1.5/ECUM2863 */\r
+ if( EcuM_CheckRamHash() == 0) {\r
+#if defined(USE_DEM)\r
+ //\r
+ EcuM_ErrorHook(ECUM_E_RAM_CHECK_FAILED);\r
+#endif\r
+ }\r
+\r
+ set_current_state(ECUM_STATE_WAKEUP_ONE);\r
}\r
\r
static inline void enter_go_off_one_mode(void){\r
\r
//----- MAIN -----------------------------------------------------------------------------------------------------------------\r
void EcuM_MainFunction(void){\r
+ EcuM_WakeupSourceType wMask;\r
+\r
VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
\r
switch(internal_data.current_state){\r
case ECUM_STATE_SLEEP:\r
in_state_sleep();\r
break;\r
+ case ECUM_STATE_WAKEUP_ONE:\r
+ {\r
+ /* TODO: we must have a normal RUN mode.. can't find any\r
+ * in the A3.1.5 spec. */\r
+ Mcu_SetMode(MCU_MODE_NORMAL);\r
+\r
+#if defined(USE_WDGM)\r
+ WdgM_SetMode(FIXME_MODE);\r
+#endif\r
+\r
+ wMask = EcuM_GetPendingWakeupEvents();\r
+\r
+ EcuM_DisableWakeupSources(wMask);\r
+\r
+ EcuM_AL_DriverRestart();\r
+\r
+ ReleaseResource(RES_SCHEDULER);\r
+\r
+ set_current_state(ECUM_STATE_WAKEUP_VALIDATION);\r
+\r
+ break;\r
+ }\r
+\r
+ case ECUM_STATE_WAKEUP_VALIDATION:\r
+ {\r
+ wMask = EcuM_GetPendingWakeupEvents();\r
+\r
+ EcuM_StartWakeupSources(wMask);\r
+\r
+ EcuM_CheckValidation( wMask );\r
+\r
+ // TODO:\r
+ // ComM_EcuM_WakeupIndication( network handle )\r
+\r
+ set_current_state(ECUM_STATE_WAKEUP_REACTION);\r
+ break;\r
+ }\r
+\r
+ case ECUM_STATE_WAKEUP_REACTION:\r
+ {\r
+ /*\r
+ * At this stage we want to know how to react to the wakeup, e.g. go\r
+ * back to RUN or SHUTDOWN, etc.\r
+ */\r
+ EcuM_WakeupReactionType wReaction;\r
+\r
+ wMask = EcuM_GetValidatedWakeupEvents();\r
+\r
+ /* TODO: We have skipped the TTII timer here */\r
+ wReaction = ( 0 == wMask ) ? ECUM_WKACT_SHUTDOWN : ECUM_WKACT_RUN\r
+ wReaction = EcuM_OnWakeupReaction(wReaction);\r
+\r
+ if( wReaction == ECUM_WKACT_RUN) {\r
+\r
+ set_current_state(ECUM_STATE_WAKEUP_TWO);\r
+ } else {\r
+ /* Shutdown, again */\r
+ /* TODO:\r
+ set_current_state(ECUM_STATE_WAKEUP_TWO);\r
+ }\r
+ break;\r
+ }\r
+\r
+ case ECUM_STATE_WAKEUP_TWO:\r
+ Dem_Init();\r
+\r
+ break;\r
\r
default:\r
//TODO: Report error.\r