]> rtime.felk.cvut.cz Git - arc.git/commitdiff
EcuM: Adding more sleep functionility
authormahi <devnull@localhost>
Sun, 9 Sep 2012 12:25:16 +0000 (14:25 +0200)
committermahi <devnull@localhost>
Sun, 9 Sep 2012 12:25:16 +0000 (14:25 +0200)
arch/ppc/mpc55xx/drivers/Fls.c
arch/ppc/mpc55xx/drivers/Mcu.c
arch/ppc/mpc55xx/drivers/Mcu_Sleep.sx
include/EcuM.h
include/EcuM_Cbk.h
include/EcuM_Types.h
include/Gpt_ConfigTypes.h
system/EcuM/EcuM.c
system/EcuM/EcuM_Internals.h
system/EcuM/EcuM_Main.c

index 9ffb2f874688676a84d592c831a8413fab4ac20d..adceda9d5621737a5b24df85af43c098cd049cf7 100644 (file)
@@ -548,6 +548,10 @@ void Fls_MainFunction(void) {
                        // ( 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
index dae6e09fa925f8839a64d7466a642e83fdbdef18..7f9b4fc249d78fb301679824ac572681faa1de63 100644 (file)
@@ -716,6 +716,8 @@ static void enterLowPower (Mcu_ModeType mcuMode )
 \r
     /* Clear sleep flags to allow pads to operate */\r
     CRP.PSCR.B.SLEEPF = 0x1;\r
+\r
+\r
 }\r
 \r
 \r
index aa6cb3f4e3294f80a77ee612f014f43dadc40eb7..485fa9029e0ec64584d466713e89c8d7970c4c89 100644 (file)
@@ -26,10 +26,13 @@ McuE_EnterLowPower:
        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
@@ -69,46 +72,46 @@ McuE_LowPowerVector:
 #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
@@ -119,9 +122,13 @@ McuE_LowPowerRecoverFlash:
  #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
index 23e2c5fc4bd3d43e381f09bfabe3c04649f8edc3..767eb57f5dbd209065b112d6f32afdc0298a5d9a 100644 (file)
 #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
index 396eeeea16ecac8899905037befb3554ae2580b1..2b07f3550ebe6d94a1e236132f5c073215371bab 100644 (file)
@@ -45,13 +45,13 @@ void EcuM_OnGoOffOne(void);
 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
index 56ace85d9ed74008a29dd42081b2c2d4fcf98448..4d6b1d6ca65d44652ba41152cb1af76fb94b7f4d 100644 (file)
@@ -148,7 +148,7 @@ typedef enum
 \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
index 33b07881dd1ba077e3509294ded0d09896541d5b..9f9680b5a72192390e43dc53b683f723a36f5cf2 100644 (file)
@@ -23,7 +23,10 @@ typedef struct  {
        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
index 9cf1c8f18af7c89cc672b5fe5d447a9231a03a0a..04d1cf8fff0edb2d3d37a84e55c4c6c4a6c33f60 100644 (file)
 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
@@ -362,12 +364,45 @@ Std_ReturnType EcuM_ReleaseRUN(EcuM_UserType user)
        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
@@ -441,13 +476,32 @@ void EcuM_ClearWakeupEvent( EcuM_WakeupSourceType source )
 }\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
index 4139c4c66edc8303ad68009761188d2b081989c8..d1dd4e4e25da1deafe9586a19e0b1168298976e9 100644 (file)
@@ -67,6 +67,8 @@ typedef struct
 #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
index 811c1dd43184b2229cf15f27fffe17a88dcabd09..a96cabeff1e763c82bf6b569ae961f3db9afc3b4 100644 (file)
@@ -209,6 +209,16 @@ static void in_state_sleep ( void ) {
        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
@@ -337,6 +347,8 @@ static inline void in_state_goOffOne(void){
 \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
@@ -361,6 +373,73 @@ void EcuM_MainFunction(void){
                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