]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Merge with 88ca177adfa9c286cb1f95a85e54ea11a9fec4f4
authormahi <devnull@localhost>
Tue, 11 Sep 2012 19:56:17 +0000 (21:56 +0200)
committermahi <devnull@localhost>
Tue, 11 Sep 2012 19:56:17 +0000 (21:56 +0200)
26 files changed:
arch/arm/arm_cm3/drivers/Mcu.c
arch/ppc/mpc55xx/drivers/Fls.c
arch/ppc/mpc55xx/drivers/Gpt.c
arch/ppc/mpc55xx/drivers/Mcu.c
arch/ppc/mpc55xx/drivers/Mcu_Sleep.sx [new file with mode: 0644]
arch/ppc/mpc55xx/scripts/linkscript_gcc.ldf
boards/board_common.mk
boards/generic/EcuM_Callout_Stubs.c
boards/mpc5516it/build_config.mk
boards/mpc5516it/config/Wdg_Cfg.h [new file with mode: 0644]
boards/mpc5516it/config/Wdg_Lcfg.c [new file with mode: 0644]
include/EcuM.h
include/EcuM_Cbk.h
include/EcuM_Types.h
include/Gpt.h
include/Gpt_ConfigTypes.h
include/Mcu.h
include/WdgM.h
include/WdgM_ConfigTypes.h
include/ppc/asm_ppc.h
system/EcuM/EcuM.c
system/EcuM/EcuM_Internals.h
system/EcuM/EcuM_Main.c
system/SchM/SchM.c
system/SchM/SchM_WdgM.h [new file with mode: 0644]
system/SchM/SchM_cfg.h

index 075ed34cf1d6879ca954962c630ee8b305125053..17b391f99101b46508517f8a1117c8b98e536359 100644 (file)
@@ -497,7 +497,6 @@ void Mcu_SetMode(const Mcu_ModeType McuMode)
   //VALIDATE( ( McuMode <= Mcu_Global.config->McuNumberOfMcuModes ), MCU_SETMODE_SERVICE_ID, MCU_E_PARAM_MODE );\r
   (void) McuMode;\r
 \r
-  /* NOT SUPPORTED */\r
 }\r
 \r
 //-------------------------------------------------------------------\r
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 9676cf120ab4158c4df8062593d215c513541588..d71bd69163ee38d81ebd7990ac51841ce59ce1fd 100644 (file)
@@ -581,82 +581,82 @@ void Gpt_DisableNotification(Gpt_ChannelType channel)
 \r
 #if ( GPT_WAKEUP_FUNCTIONALITY_API == STD_ON )\r
 \r
-       void Gpt_SetMode(Gpt_ModeType mode)\r
-       {\r
-               int i;\r
+void Gpt_SetMode(Gpt_ModeType mode)\r
+{\r
+       int i;\r
 \r
-               VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_SETMODE_SERVIVCE_ID, GPT_E_UNINIT );\r
-               VALIDATE( ( mode <= GPT_MODE_SLEEP ), GPT_SETMODE_SERVIVCE_ID, GPT_E_PARAM_MODE );\r
+       VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_SETMODE_SERVIVCE_ID, GPT_E_UNINIT );\r
+       VALIDATE( ( mode <= GPT_MODE_SLEEP ), GPT_SETMODE_SERVIVCE_ID, GPT_E_PARAM_MODE );\r
 \r
 #if defined(CFG_MPC560X)\r
-               if (mode == GPT_MODE_NORMAL)\r
-               {\r
-                       PIT.PITMCR.B.MDIS = 0;\r
-                       // Do NOT restart channels\r
-               }\r
-               else if (mode == GPT_MODE_SLEEP)\r
+       if (mode == GPT_MODE_NORMAL)\r
+       {\r
+               PIT.PITMCR.B.MDIS = 0;\r
+               // Do NOT restart channels\r
+       }\r
+       else if (mode == GPT_MODE_SLEEP)\r
+       {\r
+               PIT.PITMCR.B.MDIS = 0;\r
+               // Disable all but RTI\r
+               for (i= 0; i <= GPT_CHANNEL_PIT_LAST; i++)\r
                {\r
-                       PIT.PITMCR.B.MDIS = 0;\r
-                       // Disable all but RTI\r
-                       for (i= 0; i <= GPT_CHANNEL_PIT_LAST; i++)\r
-                       {\r
-                               Gpt_StopTimer(i);\r
-                       }\r
+                       Gpt_StopTimer(i);\r
                }\r
+       }\r
 #else\r
-               if (mode == GPT_MODE_NORMAL)\r
-               {\r
-                       PIT.CTRL.B.MDIS = 0;\r
-                       // Do NOT restart channels\r
-               }\r
-               else if (mode == GPT_MODE_SLEEP)\r
-               {\r
-\r
-                       PIT.CTRL.B.MDIS = 1;\r
-                       // Disable all but RTI\r
-                       for (i= 0; i <= GPT_CHANNEL_PIT_LAST; i++)\r
-                       {\r
-                               Gpt_StopTimer(i);\r
-                       }\r
-               }\r
-#endif\r
+       if (mode == GPT_MODE_NORMAL)\r
+       {\r
+               PIT.CTRL.B.MDIS = 0;\r
+               // Do NOT restart channels\r
        }\r
-\r
-       void Gpt_DisableWakeup(Gpt_ChannelType channel)\r
+       else if (mode == GPT_MODE_SLEEP)\r
        {\r
-               VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_DISABLEWAKEUP_SERVICE_ID, GPT_E_UNINIT );\r
-               VALIDATE( VALID_CHANNEL(channel), GPT_DISABLEWAKEUP_SERVICE_ID, GPT_E_PARAM_CHANNEL );\r
-               // Only RTI have system wakeup\r
-               if (channel == GPT_CHANNEL_RTI)\r
-               {\r
-                       Gpt_Global.wakeupEnabled = STD_OFF;\r
-               }\r
-               else\r
+\r
+               PIT.CTRL.B.MDIS = 1;\r
+               // Disable all but RTI\r
+               for (i= 0; i <= GPT_CHANNEL_PIT_LAST; i++)\r
                {\r
-                       // TODO:\r
-                       //assert(0);\r
+                       Gpt_StopTimer(i);\r
                }\r
        }\r
+#endif\r
+}\r
 \r
-       void Gpt_EnableWakeup(Gpt_ChannelType channel)\r
+void Gpt_DisableWakeup(Gpt_ChannelType channel)\r
+{\r
+       VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_DISABLEWAKEUP_SERVICE_ID, GPT_E_UNINIT );\r
+       VALIDATE( VALID_CHANNEL(channel), GPT_DISABLEWAKEUP_SERVICE_ID, GPT_E_PARAM_CHANNEL );\r
+       // Only RTI have system wakeup\r
+       if (channel == GPT_CHANNEL_RTI)\r
        {\r
-               VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_ENABLEWAKEUP_SERVICE_ID, GPT_E_UNINIT );\r
-               VALIDATE( VALID_CHANNEL(channel),GPT_ENABLEWAKEUP_SERVICE_ID, GPT_E_PARAM_CHANNEL );\r
-               if (channel == GPT_CHANNEL_RTI)\r
-               {\r
-                       Gpt_Global.wakeupEnabled = STD_ON;\r
-               }\r
-               else\r
-               {\r
-                       // TODO:\r
-                       //assert(0);\r
-               }\r
+               Gpt_Global.wakeupEnabled = STD_OFF;\r
        }\r
-\r
-       void Gpt_Cbk_CheckWakeup(EcuM_WakeupSourceType wakeupSource)\r
+       else\r
        {\r
+               // TODO:\r
+               //assert(0);\r
+       }\r
+}\r
 \r
+void Gpt_EnableWakeup(Gpt_ChannelType channel)\r
+{\r
+       VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_ENABLEWAKEUP_SERVICE_ID, GPT_E_UNINIT );\r
+       VALIDATE( VALID_CHANNEL(channel),GPT_ENABLEWAKEUP_SERVICE_ID, GPT_E_PARAM_CHANNEL );\r
+       if (channel == GPT_CHANNEL_RTI)\r
+       {\r
+               Gpt_Global.wakeupEnabled = STD_ON;\r
+       }\r
+       else\r
+       {\r
+               // TODO:\r
+               //assert(0);\r
        }\r
+}\r
+\r
+void Gpt_Cbk_CheckWakeup(EcuM_WakeupSourceType wakeupSource)\r
+{\r
+\r
+}\r
 \r
 #endif\r
 \r
index be6d308e45434c2faaef79f2cd1f198935af4698..5b14c60c178e29cd12bad7db8948643d19271f2e 100644 (file)
@@ -677,13 +677,101 @@ void Mcu_PerformReset(void)
 \r
 //-------------------------------------------------------------------\r
 \r
-void Mcu_SetMode(const Mcu_ModeType McuMode)\r
+/**\r
+ *\r
+ * Application Notes!\r
+ * - AN3584, "MPC5510 Family Low Power Features"\r
+ *   Since it's not complete also check MPC5668\r
+ * - AN4150 , "Using Sleep Mode on the MPC5668x" and it's code\r
+ *\r
+ *\r
+ * @param LPM\r
+ */\r
+static void enterLowPower (Mcu_ModeType mcuMode )\r
+{\r
+       uint32 timeout;\r
+       /* Set the sleep bit; following a WAIT instruction, the device will go to sleep */\r
+       CRP.PSCR.B.SLEEP = 1;\r
+       /* enable the 1.2V internal regulator when in sleep mode only */\r
+       CRP.PSCR.B.STOP12EN = 1;\r
+       /* 0x1 8k, 0x2 16k, 0x3 32k, 0x6 64k -- RAMs maintain power */\r
+       CRP.PSCR.B.RAMSEL = 0x7;                // Keep all 80K\r
+\r
+       CRP.Z1VEC.R = (uint32)&McuE_LowPowerRecoverFlash;\r
+#if defined(CFG_VLE)\r
+       CRP.VLE = 1;\r
+#endif\r
+\r
+       /* If we "Mcu_Wakeup()" is located in RAM, set FASTREC */\r
+       CRP.RECPRTR.B.FASTREC = 0;\r
+\r
+       /* Halt everything */\r
+       SIU.HLT.R = 0x3FFFFFFF;\r
+       while((SIU.HLTACK.R != 0x3FFFFFFF) && (timeout<3000)) {}\r
+\r
+       /* put Z0 in reset if not used for wakeup */\r
+       CRP.Z0VEC.B.Z0RST = 1;\r
+\r
+       // TODO: Enable_all_internal_pull_devices (PULL_DOWN);\r
+\r
+       /* Save context and execute wait instruction.\r
+        *\r
+        * Things that matter here are\r
+        * - Z1VEC, determines where TLB0 will point. TLB0 is written with a\r
+        *   value at startup that 4K aligned to this address.\r
+        * - LowPower_Sleep() will save a interrupt context so we will return\r
+        *   intact.\r
+        * - For devices with little RAM we don't want to impose the alignment\r
+        *   requirements there. Almost as we have to occupy a 4K block for this..\r
+        *   although the code does not take that much space.\r
+        * */\r
+       McuE_EnterLowPower(mcuMode);\r
+\r
+    /* Clear sleep flags to allow pads to operate */\r
+    CRP.PSCR.B.SLEEPF = 0x1;\r
+\r
+\r
+}\r
+\r
+\r
+void Mcu_SetMode( Mcu_ModeType mcuMode)\r
 {\r
        VALIDATE( ( 1 == Mcu_Global.initRun ), MCU_SETMODE_SERVICE_ID, MCU_E_UNINIT );\r
        // VALIDATE( ( McuMode <= Mcu_Global.config->McuNumberOfMcuModes ), MCU_SETMODE_SERVICE_ID, MCU_E_PARAM_MODE );\r
-       (void) McuMode;\r
 \r
+\r
+#if defined(CFG_MPC5516)\r
+       if( MCU_MODE_RUN == mcuMode ) {\r
+\r
+       } else if( MCU_MODE_SLEEP == mcuMode ) {\r
+               /*\r
+                * Follows the AN3548 from Freescale\r
+                *\r
+                */\r
+#if defined(USE_DMA)\r
+               Dma_StopAll();\r
+#endif\r
+\r
+\r
+               /* Set system clock to 16Mhz IRC */\r
+               SIU.SYSCLK.B.SYSCLKSEL = 0;\r
+\r
+               /* Put flash in low-power mode */\r
+               // TODO\r
+\r
+               /* Put QQADC in low-power mode */\r
+               // TODO\r
+\r
+               /* Set us in SLEEP mode */\r
+               CRP.PSCR.B.SLEEP = 1;\r
+\r
+\r
+               enterLowPower(mcuMode);\r
+       }\r
+#else\r
        /* NOT SUPPORTED */\r
+       (void) McuMode;\r
+#endif\r
 }\r
 \r
 //-------------------------------------------------------------------\r
diff --git a/arch/ppc/mpc55xx/drivers/Mcu_Sleep.sx b/arch/ppc/mpc55xx/drivers/Mcu_Sleep.sx
new file mode 100644 (file)
index 0000000..485fa90
--- /dev/null
@@ -0,0 +1,189 @@
+#define _ASSEMBLER_\r
+#include "asm_ppc.h"\r
+\r
+\r
+#if defined(__CWCC__) && defined(CFG_VLE)\r
+.section .text_vle,text_vle\r
+#elif defined(__DCC__)\r
+       // Must be indented (diab)\r
+       .section .text_vle,x\r
+#elif defined(__GNUC__)\r
+.section .text\r
+#endif\r
+\r
+\r
+#define CRP_RECPTR             0xfffec058\r
+\r
+       .global McuE_EnterLowPower\r
+       \r
+McuE_EnterLowPower:\r
+       subi    r1, r1, 0x94    // Allocate space on stack 0x94 = 148 r2--r31 + 7 SPRs\r
+       stmw    r2, 0(r1)               // Save registers r2-r31 to stack\r
+       mfSRR1  r25\r
+       mfSRR0  r26\r
+       mfLR    r27\r
+       mfmsr   r28\r
+       mfCR    r29\r
+       mfXER   r30\r
+       mfCTR   r31\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
+       blr\r
+\r
+\r
+/*\r
+ * Low Power Vector...needs to be on 4K + 0xffc\r
+ * We only have 1 instruction before we are outside TLB0 so just jump\r
+ */\r
+#if defined(__GNUC__)  \r
+.section ".lowpower_vector","ax"\r
+#elif defined(__CWCC__)\r
+#if defined(CFG_VLE)\r
+.section .lowpower_vector,text_vle\r
+#else\r
+.section .lowpower_vector,4,"rw"\r
+#endif\r
+#elif defined(__DCC__)\r
+       .section .text_vle,x\r
+#endif\r
+\r
+       .global McuE_LowPowerVector\r
+\r
+McuE_LowPowerVector:\r
+       b       McuE_LowPowerRecoverFlash\r
+       \r
+\r
+#if defined(__GNUC__)  \r
+.section ".lowpower_text","ax"\r
+#elif defined(__CWCC__)\r
+#if defined(CFG_VLE)\r
+.section .lowpower_text,text_vle\r
+#else\r
+.section .lowpower_text,4,"rw"\r
+#endif\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
+ *\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
+/* 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
+       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
+\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
\r
+ #if defined(CFG_VLE)\r
+ #define VLE_VAL               MAS2_VLE\r
+ #else\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
+\r
+#***************************************************/\r
+#     setup MMU                                    */\r
+#***************************************************/\r
+\r
+#TLB Entry 0 =  1M Internal flash \r
+       LOAD_ADDR_32(5, 0x10000000 + (0<<16))\r
+    mtspr SPR_MAS0,r5     \r
+    LOAD_ADDR_32(5, 0xC0000000 + MAS1_TSIZE_4M )\r
+    mtspr SPR_MAS1,r5     \r
+    LOAD_ADDR_32(5, FLASH_START + VLE_VAL )\r
+    mtspr SPR_MAS2,r5     \r
+    LOAD_ADDR_32(5, FLASH_START + MAS3_FULL_ACCESS )\r
+    mtspr SPR_MAS3,r5\r
+    msync\r
+    isync\r
+       tlbwe\r
+       isync\r
+\r
+\r
+#TLB Entry 1 =  Peripheral bridge and BAM\r
+       LOAD_ADDR_32(5, 0x10000000 + (1<<16))\r
+    mtspr SPR_MAS0,r5     \r
+    LOAD_ADDR_32(5, 0xC0000000 + MAS1_TSIZE_1M)\r
+    mtspr SPR_MAS1,r5\r
+    LOAD_ADDR_32(5, PERIPHERAL_START + VLE_VAL +  MAS2_I)\r
+    mtspr SPR_MAS2,r5     \r
+    LOAD_ADDR_32(5, PERIPHERAL_START + MAS3_FULL_ACCESS )\r
+    mtspr SPR_MAS3,r5\r
+    msync\r
+    isync\r
+       tlbwe\r
+       isync\r
+\r
+\r
+#TLB Entry 2 =  External RAM. Skip this. \r
+\r
+#TLB Entry 3 =  Internal SRAM\r
+       LOAD_ADDR_32(5, 0x10000000+(3<<16))\r
+    mtspr SPR_MAS0,r5     \r
+    LOAD_ADDR_32(5, 0xC0000000 + MAS1_TSIZE_256K )\r
+    mtspr SPR_MAS1,r5     \r
+    LOAD_ADDR_32(5, SRAM_START + VLE_VAL )\r
+    mtspr SPR_MAS2,r5     \r
+    LOAD_ADDR_32(5, SRAM_START + MAS3_FULL_ACCESS )\r
+    mtspr SPR_MAS3,r5\r
+    msync\r
+    isync\r
+       tlbwe\r
+       isync\r
+       blr\r
+       \r
\r
+\r
+\r
index f8f9010088a4fa55f8a14e4176a755be71965399..146e6443623f39474eea496f10557ebb7b0fc8ce 100644 (file)
@@ -142,6 +142,15 @@ __FLS_PROG_START__ = 0;    /* Must be aligned to a sector start. */
                *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*);\r
                __TEXT_END = .;\r
        } > flash\r
+\r
+#if defined(CFG_MPC5516)\r
+       .McuE_LowPowerRecoverFlash 0x000ff000: {\r
+           *(.lowpower_text);\r
+       }\r
+       .lowpower_vector 0x000ffffc: {\r
+           *(.lowpower_vector);\r
+       }\r
+#endif \r
        \r
 \r
        .data : {\r
index f44697a0daa1cc46021f9730c988967b54b04c07..f52e4e793d708b77874967b6041c576e47330339 100644 (file)
@@ -37,7 +37,9 @@ endif
 obj-$(USE_ECUM) += EcuM.o\r
 obj-$(USE_ECUM) += EcuM_Main.o\r
 obj-$(USE_ECUM) += EcuM_PBcfg.o\r
+ifneq ($(filter EcuM_Callout_Stubs.o,$(obj-y)),)\r
 obj-$(USE_ECUM) += EcuM_Callout_Stubs.o\r
+endif\r
 obj-$(USE_ECUM)-$(CFG_ECUM_USE_SERVICE_COMPONENT) += EcuM_ServiceComponent.o\r
 inc-$(USE_ECUM) += $(ROOTDIR)/system/EcuM\r
 vpath-$(USE_ECUM) += $(ROOTDIR)/system/EcuM\r
@@ -59,6 +61,7 @@ inc-$(USE_DMA) += $(ROOTDIR)/$(ARCH_PATH-y)/drivers
 # Mcu\r
 obj-$(USE_MCU) += Mcu.o\r
 obj-$(USE_MCU) += Mcu_Cfg.o\r
+obj-$(USE_MCU) += Mcu_Sleep.o\r
 #obj-$(CFG_MPC55XX)-$(USE_MCU) += Mcu_Exceptions.o\r
 \r
 # Flash\r
@@ -113,7 +116,7 @@ vpath-$(USE_NVM) += $(ROOTDIR)/system/Crc
 obj-$(USE_NVM) += Crc_32.o\r
 obj-$(USE_NVM) += Crc_16.o\r
 \r
-# SchM\r
+# SchM, always find the include files.\r
 inc-y += $(ROOTDIR)/system/SchM\r
 vpath-$(USE_SCHM) += $(ROOTDIR)/system/SchM\r
 obj-$(USE_SCHM) += SchM.o\r
index 28d99186b1681f91c1b722d80bf371e87c421173..a56f1f289bc7e9b2b03a0dd6fff62c76da6c2409 100644 (file)
@@ -291,7 +291,7 @@ void EcuM_AL_DriverInitThree(const EcuM_ConfigType* ConfigPtr)
 #endif\r
 }\r
 \r
-void EcuM_OnEnterRUN(void)\r
+void EcuM_OnEnterRun(void)\r
 {\r
 \r
 }\r
index 880b8279f6e672a15754975abdb3e9fac69ba1bb..c3e5d74b7d5526c9f2f8d025351a40e7723dd1dc 100644 (file)
@@ -13,7 +13,7 @@ CFG=PPC BOOKE E200Z1 MPC55XX MPC5516 BRD_MPC5516IT
 # Memory + Peripherals\r
 MOD_AVAIL+=ADC DIO DMA CAN GPT LIN MCU PORT PWM WDG NVM MEMIF FEE FLS SPI EEP \r
 # System + Communication + Diagnostic\r
-MOD_AVAIL+=CANIF CANTP LINIF COM DCM DEM DET ECUM IOHWAB KERNEL PDUR WDGM RTE J1939TP\r
+MOD_AVAIL+=CANIF CANTP LINIF COM DCM DEM DET ECUM IOHWAB KERNEL PDUR WDGM WDGIF RTE J1939TP\r
 # Network management\r
 MOD_AVAIL+=COMM NM CANNM CANSM EA LINSM\r
 # Additional\r
diff --git a/boards/mpc5516it/config/Wdg_Cfg.h b/boards/mpc5516it/config/Wdg_Cfg.h
new file mode 100644 (file)
index 0000000..29c26c4
--- /dev/null
@@ -0,0 +1,45 @@
+/* -------------------------------- Arctic Core ------------------------------\r
+ * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
+ *\r
+ * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
+ *\r
+ * This source code is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License version 2 as published by the\r
+ * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
+ * for more details.\r
+ * -------------------------------- Arctic Core ------------------------------*/\r
+\r
+#ifndef WDG_CFG_H_\r
+#define WDG_CFG_H_\r
+\r
+#include "Std_Types.h"\r
+#include "WdgIf_Types.h"\r
+\r
+typedef struct\r
+{\r
+   uint32 ReloadValue;\r
+   uint8 ActivationBit;\r
+}Wdg_SettingsType;\r
+\r
+typedef struct\r
+{\r
+       WdgIf_ModeType Wdg_DefaultMode;\r
+       Wdg_SettingsType WdgSettingsFast;\r
+       Wdg_SettingsType WdgSettingsSlow;\r
+       Wdg_SettingsType WdgSettingsOff;\r
+}Wdg_ModeConfigType;\r
+\r
+typedef struct\r
+{\r
+       const Wdg_GeneralType    *Wdg_General;\r
+       const Wdg_ModeConfigType *Wdg_ModeConfig;\r
+}Wdg_ConfigType;\r
+\r
+ extern const Wdg_GeneralType WdgGeneral;\r
+ extern const Wdg_ConfigType WdgConfig;\r
+\r
+#endif /* WDG_CFG_H_ */\r
diff --git a/boards/mpc5516it/config/Wdg_Lcfg.c b/boards/mpc5516it/config/Wdg_Lcfg.c
new file mode 100644 (file)
index 0000000..b948ed6
--- /dev/null
@@ -0,0 +1,52 @@
+/* -------------------------------- Arctic Core ------------------------------\r
+ * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
+ *\r
+ * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
+ *\r
+ * This source code is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License version 2 as published by the\r
+ * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
+ * for more details.\r
+ * -------------------------------- Arctic Core ------------------------------*/\r
+\r
+#include "Wdg.h"\r
+\r
+const Wdg_ModeConfigType WdgModeConfig =\r
+{\r
+       .Wdg_DefaultMode = WDGIF_OFF_MODE,\r
+       .WdgSettingsFast =\r
+       {\r
+               .ReloadValue = 0x200,\r
+               .ActivationBit = 1,\r
+       },\r
+       .WdgSettingsSlow =\r
+       {\r
+               .ReloadValue = 0x7D00,\r
+               .ActivationBit = 1,\r
+       },\r
+       .WdgSettingsOff =\r
+       {\r
+               .ReloadValue = 0x7D00,\r
+               .ActivationBit = 0,\r
+       },\r
+};\r
+\r
+const Wdg_GeneralType WdgGeneral =\r
+{\r
+       .Wdg_Index = 1,\r
+       .Wdg_TriggerLocationPtr = Wdg_Trigger,\r
+       .Wdg_SetModeLocationPtr = Wdg_SetMode,\r
+};\r
+\r
+\r
+const Wdg_ConfigType WdgConfig =\r
+{\r
+  .Wdg_General = &WdgGeneral,\r
+  .Wdg_ModeConfig = &WdgModeConfig,\r
+};\r
+\r
+\r
index f74558855612ce04d0a812f51cdbd29b9c88e4f3..767eb57f5dbd209065b112d6f32afdc0298a5d9a 100644 (file)
@@ -80,8 +80,8 @@
 #define ECUM_AR_MINOR_VERSION  2\r
 #define ECUM_AR_PATCH_VERSION  2\r
 \r
-#include "EcuM_Types.h"\r
 #include "EcuM_Cfg.h"\r
+#include "EcuM_Types.h"\r
 #include "EcuM_Cbk.h"\r
 \r
 #if defined(USE_COM)\r
@@ -92,7 +92,6 @@
 #include "ComM.h"\r
 #endif\r
 \r
-\r
 /** @name Error Codes */\r
 //@{\r
 #define ECUM_E_NOT_INITIATED (0x10)\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
@@ -168,7 +168,7 @@ Std_ReturnType EcuM_GetShutdownTarget(EcuM_StateType* shutdownTarget, uint8* sle
 Std_ReturnType EcuM_GetLastShutdownTarget(EcuM_StateType* shutdownTarget, uint8* sleepMode);\r
 \r
 EcuM_WakeupSourceType EcuM_GetPendingWakeupEvents(void);\r
-void EcuM_ClearWakeupEvent(EcuM_WakeupSourceType sources);\r
+void EcuM_ClearWakeupEvent(EcuM_WakeupSourceType source );\r
 EcuM_WakeupSourceType EcuM_GetValidatedWakeupEvents(void);\r
 EcuM_WakeupSourceType EcuM_GetExpiredWakeupEvents(void);\r
 EcuM_WakeupStatusType EcuM_GetStatusOfWakeupSource(EcuM_WakeupSourceType sources);\r
@@ -183,5 +183,6 @@ void EcuM_SetWakeupEvent(EcuM_WakeupSourceType sources);
 \r
 void EcuM_MainFunction(void);\r
 \r
+\r
 #endif /*ECUM_H_*/\r
 /** @} */\r
index 06f18c3e5b8c83b35fea46055b413188b93d5162..2b07f3550ebe6d94a1e236132f5c073215371bab 100644 (file)
@@ -35,7 +35,7 @@ void EcuM_ErrorHook(Std_ReturnType reason);
 \r
 void EcuM_OnRTEStartup(void);\r
 \r
-void EcuM_OnEnterRUN(void);\r
+void EcuM_OnEnterRun(void);\r
 void EcuM_OnExitRun(void);\r
 void EcuM_OnExitPostRun(void);\r
 \r
@@ -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 9dbc7df7b104af9d49820974f61a3a4b88bb6411..860044c2161f3963039bb6e6dcb03c3112bac42f 100644 (file)
@@ -35,6 +35,7 @@
 #include "Rte_Type.h"\r
 #endif\r
 \r
+\r
 #if !defined(_DEFINED_TYPEDEF_FOR_EcuM_StateType_)\r
 /** Possible states */\r
 typedef enum {\r
@@ -66,12 +67,14 @@ typedef enum {
 \r
 #endif\r
 \r
+\r
 #if !defined(_DEFINED_TYPEDEF_FOR_EcuM_UserType_)\r
 typedef uint8 EcuM_UserType;\r
 \r
 #define _DEFINED_TYPEDEF_FOR_EcuM_UserType_\r
 #endif\r
 \r
+#if 0\r
 enum {\r
        /** Internal reset of ÂµC (bit 2).\r
         *  The internal reset typically only resets the ÂµC\r
@@ -102,8 +105,11 @@ enum {
        ECUM_WKSOURCE_RESET = 0x02\r
 };\r
 \r
+\r
 typedef uint32 EcuM_WakeupSourceType;\r
 \r
+#endif\r
+\r
 typedef enum\r
 {\r
        ECUM_WKSTATUS_NONE = 0,        /**< No pending wakeup event was detected */\r
@@ -114,11 +120,12 @@ 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
 \r
+\r
 #if !defined(_DEFINED_TYPEDEF_FOR_EcuM_BootTargetType_)\r
 typedef enum\r
 {\r
@@ -128,5 +135,44 @@ typedef enum
 #define _DEFINED_TYPEDEF_FOR_EcuM_BootTargetType_\r
 #endif\r
 \r
+\r
+#if defined(USE_WDGM)\r
+#include "WdgM.h"\r
+#endif\r
+\r
+#include "Mcu.h"\r
+\r
+#if defined(USE_WDGM)\r
+typedef struct EcuM_WdgM\r
+{\r
+       WdgM_SupervisedEntityIdType EcuMSupervisedEntity;\r
+       WdgM_ModeType EcuMWdgMWakeupMode;\r
+       WdgM_ModeType EcuMWdgMStartupMode;\r
+       WdgM_ModeType EcuMWdgMRunMode;\r
+       WdgM_ModeType EcuMWdgMPostRunMode;\r
+       WdgM_ModeType EcuMWdgMShutdownMode;\r
+} EcuM_WdgMType;\r
+#endif\r
+\r
+typedef struct EcuM_WakeupSourceConfig {\r
+       EcuM_WakeupSourceType   EcuMWakeupSourceId;\r
+       uint32                                  EcuMValidationTimeout;\r
+       Mcu_ResetType                   EcuMResetReason;\r
+       boolean                                 EcuMWakeupSourcePolling;\r
+       uint8                                   EcuMComMChannel;\r
+} EcuM_WakeupSourceConfigType;\r
+\r
+typedef struct EcuM_SleepMode\r
+{\r
+   uint8                                       EcuMSleepModeId;\r
+   EcuM_WakeupSourceType       EcuMWakeupSourceMask;\r
+   Mcu_ModeType                        EcuMSleepModeMcuMode;\r
+#if defined(USE_WDGM)\r
+   WdgM_ModeType                       EcuMSleepModeWdgMMode;\r
+#endif\r
+ } EcuM_SleepModeType;\r
+\r
+\r
+\r
 #endif /* ECUM_TYPES_H_ */\r
 /** @} */\r
index 9879842d593676648b117b854bde1dd497d498bf..f0ce66db0b4d9fb2c7dfae2d0ea8cc48d3ac2fe1 100644 (file)
  * for more details.\r
  * -------------------------------- Arctic Core ------------------------------*/\r
 \r
+\r
+/*\r
+ * Include structure:\r
+ *\r
+ *\r
+ *                    Gpt.h\r
+ *                      ^\r
+ *                      |\r
+ *       `---------- Gpt_xxx.c ---> Memmap.h\r
+ *\r
+ *\r
+ */\r
+\r
 /** @addtogroup Gpt GPT Driver\r
  *  @{ */\r
 \r
@@ -24,7 +37,7 @@
 #define GPT_H_\r
 \r
 #include "Std_Types.h"\r
-//#include "EcuM.h"  mahi: What for ???\r
+\r
 \r
 /** @name Error Codes */\r
 //@{\r
@@ -54,9 +67,6 @@
 #define GPT_CBK_CHECKWAKEUP_SERVICE_ID      0x0c\r
 //@}\r
 \r
-/** Channel id type */\r
-typedef uint8_t Gpt_ChannelType;\r
-\r
 /** Channel time value type */\r
 typedef uint32_t Gpt_ValueType;\r
 \r
@@ -73,6 +83,8 @@ typedef enum
   GPT_MODE_SLEEP\r
 } Gpt_ModeType;\r
 \r
+/** Channel id type */\r
+typedef uint8_t Gpt_ChannelType;\r
 \r
 #define GPT_VENDOR_ID             1\r
 #define GPT_MODULE_ID                   1\r
@@ -85,7 +97,14 @@ typedef enum
 #define GPT_AR_MINOR_VERSION     2\r
 #define GPT_AR_PATCH_VERSION     1\r
 \r
-#include "Gpt_Cfg.h"\r
+//#if (GPT_REPORT_WAKEUP_SOURCE==STD_ON)\r
+#include "EcuM_Cbk.h"          /* @req 4.0.3/GPT271 */\r
+//#endif\r
+\r
+/* Needs Gpt_ConfigType */\r
+#include "Gpt_Cfg.h"           /* @req 4.0.3/GPT259 */\r
+\r
+/* The config needs EcuM_WakeupSourceType from EcuM */\r
 \r
 #if (GPT_VERSION_INFO_API == STD_ON)\r
 #define Gpt_GetVersionInfo(_vi) STD_GET_VERSION_INFO(_vi,GPT)\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 2989a9e377aaf228402fb028a3578a06b28b7a82..0ffa2a5b811f7ac4fa297b41bc31820ce0957fde 100644 (file)
@@ -76,10 +76,6 @@ typedef enum {
 } Mcu_PllStatusType;\r
 \r
 \r
-typedef enum {\r
-       MCU_MODE_NORMAL=0\r
-} Mcu_ModeType;\r
-\r
 //TODO\r
 typedef uint8_t Mcu_RamSectionType;\r
 \r
@@ -195,5 +191,8 @@ uint32_t McuE_GetSystemClock( void );
 uint32_t McuE_GetPeripheralClock( McuE_PeriperalClock_t type );\r
 #endif\r
 \r
+void McuE_EnterLowPower( int mode );\r
+void McuE_LowPowerRecoverFlash( void );\r
+\r
 #endif /*MCU_H_*/\r
 /** @} */\r
index ad12445d6f1e7b76f75dde4396e859fb7a99946e..dcafadd6253eeac9e46c52532fe47a64ff9a1445 100644 (file)
 #define WDGM_SW_PATCH_VERSION  0
 
 #include "Std_Types.h"
+/* "forward" declare types due to circular dependency chain */
+typedef uint8 WdgM_SupervisedEntityIdType;
+typedef uint8 WdgM_ModeType;
+
+
 #include "WdgM_Cfg.h"
 
 // API Service ID's
index cc85acd8018eac0d1d35859eac9d23addbd8b7c1..d5fef146d94f0e7e4fb238760fe1908484648f0f 100644 (file)
@@ -100,17 +100,21 @@ typedef struct
        const float32                    WdgM_TriggerCycle;\r
 }WdgM_ActivationSchMType;\r
 \r
+#if (WDGM_GPT_USED == STD_ON)\r
 typedef struct\r
 {\r
        const uint32                     WdgM_GptCycle;\r
        const Gpt_ChannelType            WdgM_GptChannelRef;\r
 }WdgM_ActivationGPTType;\r
+#endif\r
 \r
 typedef struct\r
 {\r
        const boolean                    WdgM_IsGPTActivated;\r
        const WdgM_ActivationSchMType    WdgM_ActivationSchM;\r
+#if (WDGM_GPT_USED == STD_ON)\r
        const WdgM_ActivationGPTType     WdgM_ActivationGPT;\r
+#endif\r
 }WdgM_ActivationType;\r
 \r
 typedef struct\r
index ddf1c518a05f64564b8f03adcf27f624ad1fdfbb..cd434b788c2f943de1085458288efa711291685b 100644 (file)
 #define SPR_SPEFSCR            512\r
 #define SPR_MCSR               572\r
 \r
+#define SPR_MAS0      624\r
+#define SPR_MAS1      625\r
+#define SPR_MAS2      626\r
+#define SPR_MAS3      627\r
+#define SPR_MAS4      628\r
+#define SPR_MAS6      630\r
+\r
+\r
 #define ESR_PTR                (1<<(38-32))\r
 \r
 #define SPR_XER                1\r
 \r
 #define INTC_SSCIR7 0xFFF48027\r
 \r
+/* MAS bits */\r
+#define MAS1_TSIZE_4K                  (1<<8)\r
+#define MAS1_TSIZE_16K                 (2<<8)\r
+#define MAS1_TSIZE_64K                 (3<<8)\r
+#define MAS1_TSIZE_256K                        (4<<8)\r
+#define MAS1_TSIZE_1M                  (5<<8)\r
+#define MAS1_TSIZE_4M                  (6<<8)\r
+#define MAS1_TSIZE_16M                 (7<<8)\r
+#define MAS1_TSIZE_64M                 (8<<8)\r
+#define MAS1_TSIZE_256M                        (8<<9)\r
+\r
+#define MAS2_VLE       (1<<5)\r
+#define MAS2_W         (1<<4)\r
+#define MAS2_I         (1<<3)\r
+#define MAS2_M         (1<<2)\r
+#define MAS2_G         (1<<1)\r
+#define MAS2_E         (1<<0)\r
+\r
+#define MAS3_UX                (1<<5)\r
+#define MAS3_SX                (1<<4)\r
+#define MAS3_UW                (1<<3)\r
+#define MAS3_SW                (1<<2)\r
+#define MAS3_UR                (1<<1)\r
+#define MAS3_SR                (1<<0)\r
+\r
+#define MAS3_FULL_ACCESS (MAS3_UX+MAS3_UW+MAS3_UR+MAS3_SX+MAS3_SW+MAS3_SR)\r
+\r
+\r
 #if defined(_ASSEMBLER_)\r
 /*\r
  * PPC vs VLE assembler:\r
index 48b48ea8054d72a3187c7c3af052ec3a92e4278d..a7129716dc5be483c8a296ff6bafa21f0c6667df 100644 (file)
  * for more details.\r
  * -------------------------------- Arctic Core ------------------------------*/\r
 \r
+\r
+/** @reqSettings DEFAULT_SPECIFICATION_REVISION=3.1.5 */\r
+\r
+/* ----------------------------[information]----------------------------------*/\r
+/*\r
+ * Author: ?+mahi\r
+ *\r
+ * Part of Release:\r
+ *   3.1.5\r
+ *\r
+ * Description:\r
+ *   Implements the Can Driver module\r
+ *\r
+ * Support:\r
+ *   General                  Have Support\r
+ *   -------------------------------------------\r
+ *   ECUM_TTII_ENABLED                         N\r
+ *   ECUM_DEV_ERROR_DETECT                             Y\r
+ *   ECUM_VERSION_INFO_API                             Y\r
+ *   ECUM_INCLUDE_DEM                                  N (controlled by USE_x macro's instead)\r
+ *   ECUM_INCLUDE_NVRAM_MGR                            N (controlled by USE_x macro's instead)\r
+ *   ECUM_INLCUDE_DET                                  N (controlled by USE_x macro's instead)\r
+ *   ECUM_MAIN_FUNCTION_PERDIOD                        Y\r
+ *   ECUM_TTII_WKSOURCE                                        N\r
+ *\r
+ *   Configuration            Have Support\r
+ *   -------------------------------------------\r
+ *   ECUM_SLEEP_ACTIVITY_PERIOD                        ?\r
+ *   ECUM_CONFIGCONSISTENCY_HASH               N\r
+ *   ECUM_RUN_SELF_REQUEST_PERIOD              ?\r
+ *   ECUM_NVRAM_WRITEALL_TIMEOUT               Y\r
+ *   ECUM_DEFAULT_APP_MODE                             ?\r
+ *\r
+ *\r
+ *   DefaultShutdownTarget\r
+ *   -------------------------------------------\r
+ *   ECUM_DEFAULT_SHUTDOWN_TARGET              N\r
+ *\r
+ *\r
+ * Things to start with:\r
+ * - EcuM2181\r
+ * - EcuM2861 , Watchdog\r
+ * - ComM_EcuM_RunModeIndication()  not called, See Figure 8 (Seems that the ComM does not do much either)\r
+ *\r
+ *\r
+ *\r
+ */\r
+\r
 //lint -emacro(904,VALIDATE,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
 \r
+\r
+/* ----------------------------[includes]------------------------------------*/\r
+\r
 #include "Std_Types.h"\r
 #include "EcuM.h"\r
 #include "Modules.h"\r
 #endif\r
 \r
 \r
+/* ----------------------------[private define]------------------------------*/\r
+/* ----------------------------[private macro]-------------------------------*/\r
+/* ----------------------------[private typedef]-----------------------------*/\r
+/* ----------------------------[private function prototypes]-----------------*/\r
+/* ----------------------------[private variables]---------------------------*/\r
 \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
 #error EcuM configuration error. DET is not enabled when ECUM_DEV_ERROR_DETECT is set\r
 #endif\r
@@ -66,6 +127,7 @@ void EcuM_Init( void )
        // Determine PostBuild configuration\r
        internal_data.config = EcuM_DeterminePbConfiguration();\r
 \r
+\r
        // TODO: Check consistency of PB configuration\r
 \r
        // Initialize drivers needed before the OS-starts\r
@@ -124,6 +186,10 @@ void EcuM_StartupTwo(void)
        SchM_Init();\r
 #endif\r
 \r
+#if defined(USE_WDGM)\r
+       WdgM_SetMode(internal_data.config->EcuMWdgMConfig->EcuMWdgMStartupMode);\r
+#endif\r
+\r
        // Initialize drivers that don't need NVRAM data\r
        EcuM_AL_DriverInitTwo(internal_data.config);\r
 \r
@@ -302,12 +368,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
@@ -360,3 +459,55 @@ Std_ReturnType EcuM_ReleasePOST_RUN(EcuM_UserType user)
        return E_OK;\r
 }\r
 \r
+/*\r
+ * TODO: Don't yet understand the use\r
+ */\r
+void EcuM_ClearWakeupEvent( EcuM_WakeupSourceType source )\r
+{\r
+       switch(source) {\r
+       case ECUM_WKSTATUS_NONE:\r
+               /* Seems quite pointless */\r
+               break;\r
+       case ECUM_WKSTATUS_PENDING:\r
+               break;\r
+       case ECUM_WKSTATUS_VALIDATED:\r
+               break;\r
+       case ECUM_WKSTATUS_EXPIRED:\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+}\r
+\r
+/**\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
+       (void)wakeupSource;\r
+}\r
+\r
+\r
+EcuM_WakeupSourceType EcuM_GetValidatedWakeupEvents( void ) {\r
+       // TODO:\r
+       return 0;\r
+}\r
+\r
+EcuM_WakeupStatusType EcuM_GetStatusOfWakeupSource( EcuM_WakeupSourceType sources ) {\r
+       return 0;\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 fa5863833a4fd7328cb5cca49557070d743ccc5f..128a871d0cc1cc00d8cb5ef03e165e356d7e3212 100644 (file)
@@ -33,6 +33,8 @@ static uint32 internal_data_go_off_one_state_timeout = 0;
 static NvM_RequestResultType writeAllResult;\r
 #endif\r
 \r
+static uint32 internal_data_go_sleep_state_timeout = 0;\r
+\r
 #ifdef CFG_ECUM_USE_SERVICE_COMPONENT\r
 /** @req EcuM2749 */\r
 static Rte_ModeType_EcuM_Mode currentMode;\r
@@ -89,19 +91,136 @@ void set_current_state(EcuM_StateType state) {
 #endif\r
 \r
 \r
+/**\r
+ * RUN II entry\r
+ * - Called from EcuM_StartupTwo()\r
+ * - Called from\r
+ *\r
+ *\r
+ */\r
 void EcuM_enter_run_mode(void){\r
        set_current_state(ECUM_STATE_APP_RUN);\r
-       EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
-       //TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
+       EcuM_OnEnterRun(); /** @req EcuM2308 */\r
+\r
+#if defined(USE_WDGM)\r
+       /* This seems strange, should be in FW instead */\r
+       WdgM_SetMode(internal_data.config->EcuMWdgMConfig->EcuMWdgMRunMode);\r
+#endif\r
+\r
+#if defined(USE_COMM)\r
+       /*\r
+        * Loop over all channels that have requested run,\r
+        * ie EcuM_ComM_RequestRUN()\r
+        */\r
+       {\r
+               uint32 cMask = internal_data.run_comm_requests;\r
+               uint8  channel;\r
+\r
+               for (; cMask; cMask &= ~(1ul << channel)) {\r
+                       channel = ilog2(cMask);\r
+                       ComM_EcuM_RunModeIndication(channel);\r
+               }\r
+       }\r
+#endif\r
+\r
+       /* We have a configurable minimum time (EcuMRunMinimumDuration)\r
+        * we have to stay in RUN state  */\r
        internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
 }\r
 \r
 \r
 //--------- Local functions ------------------------------------------------------------------------------------------------\r
 \r
+\r
+\r
+/**\r
+ * Enter GO SLEEP state ( soon in state ECUM_STATE_GO_SLEEP)\r
+ */\r
 static inline void enter_go_sleep_mode(void){\r
+       EcuM_WakeupSourceType wakeupSource;\r
        set_current_state(ECUM_STATE_GO_SLEEP);\r
+\r
        EcuM_OnGoSleep();\r
+\r
+#if defined(USE_NVM)\r
+       NvM_WriteAll();\r
+\r
+       /* Start timer */\r
+       internal_data_go_sleep_state_timeout = internal_data.config->EcuMNvramWriteAllTimeout / ECUM_MAIN_FUNCTION_PERIOD;\r
+\r
+       wakeupSource = EcuM_GetPendingWakeupEvents();\r
+#else\r
+       wakeupSource = EcuM_GetPendingWakeupEvents();\r
+#endif\r
+}\r
+\r
+/**\r
+  In GO SLEEP state (in state ECUM_STATE_GO_SLEEP)\r
+ */\r
+static void in_state_goSleep( void ) {\r
+\r
+       /* We only wait for NvM_WriteAll() for so long */\r
+       if (internal_data_go_sleep_state_timeout){\r
+               internal_data_go_sleep_state_timeout--;\r
+       }\r
+\r
+       if( (internal_data_go_sleep_state_timeout == 0) ) {\r
+               /*\r
+                * We should go to sleep , enable source that should wake us\r
+                * */\r
+               uint32 cMask;\r
+               uint8  source;\r
+               const EcuM_SleepModeType *sleepModePtr;\r
+\r
+               /* Get the current sleep mode */\r
+\r
+               sleepModePtr = &internal_data.config->EcuMSleepModeConfig[internal_data.sleep_mode];\r
+\r
+               cMask = sleepModePtr->EcuMWakeupSourceMask;\r
+\r
+               /* Loop over the WKSOURCE for this sleep mode */\r
+               for (; cMask; cMask &= ~(1ul << source)) {\r
+                       source = ilog2(cMask);\r
+                       /* @req 3.1.5/ECUM2389 */\r
+                       EcuM_EnableWakeupSources( 1<< source );\r
+\r
+#if defined(WDGM)\r
+                       WdgM_SetMode(sleepModePtr->EcuMSleepModeWdgMMode);\r
+#endif\r
+\r
+                       /* Let no one else run */\r
+                       GetResource(RES_SCHEDULER);\r
+               }\r
+\r
+       } else if( EcuM_GetPendingWakeupEvents() != 0 ) {\r
+               /* We have pending wakeup events, need to startup again */\r
+#if defined(USE_NVM)\r
+               NvM_CancelWriteAll();\r
+#endif\r
+       }\r
+}\r
+\r
+\r
+/**\r
+ * In "Sleep Sequence I"  (in state ECUM_STATE_SLEEP)\r
+ */\r
+static void in_state_sleep ( void ) {\r
+       const EcuM_SleepModeType *sleepModePtr;\r
+       sleepModePtr = &internal_data.config->EcuMSleepModeConfig[internal_data.sleep_mode];\r
+\r
+       EcuM_GenerateRamHash();\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
@@ -137,7 +256,10 @@ static inline boolean hasPostRunRequests(void){
 }\r
 \r
 \r
-\r
+/**\r
+ * RUN II Loop (in state ECUM_STATE_APP_RUN)\r
+ * - The entry to RUN II is done in\r
+ */\r
 static inline void in_state_appRun(void){\r
        if (internal_data_run_state_timeout){\r
                internal_data_run_state_timeout--;\r
@@ -145,29 +267,49 @@ static inline void in_state_appRun(void){
 \r
        if ((!hasRunRequests()) && (internal_data_run_state_timeout == 0)){\r
                EcuM_OnExitRun();       /** @req EcuM2865 */\r
+\r
+#if defined(USE_WDGM)\r
+               WdgM_SetMode(internal_data.config->EcuMWdgMConfig->EcuMWdgMPostRunMode);\r
+#endif\r
+\r
+#if defined(USE_RTE) && defined(CFG_ECUM_USE_SERVICE_COMPONENT)\r
+               Rte_Switch_currentMode_currentMode(RTE_MODE_EcuM_Mode_POSTRUN);\r
+#endif\r
+\r
                set_current_state(ECUM_STATE_APP_POST_RUN);/** @req EcuM2865 */\r
        }\r
 }\r
 \r
 \r
+/**\r
+ * RUN III states (in state ECUM_STATE_APP_POST_RUN)\r
+ */\r
 static inline void in_state_appPostRun(void){\r
+\r
+       /* @req 3.1.5/ECUM2866 */\r
        if (hasRunRequests()){\r
-               set_current_state(ECUM_STATE_APP_RUN);/** @req EcuM2866 */ /** @req EcuM2308 */\r
-               EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
-               //TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
-               internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
+               /* We have run requests, return to RUN II */\r
+               EcuM_enter_run_mode();\r
 \r
        } else if (!hasPostRunRequests()){\r
                EcuM_OnExitPostRun(); /** @req EcuM2761 */\r
                set_current_state(ECUM_STATE_PREP_SHUTDOWN);/** @req EcuM2761 */\r
-\r
-               EcuM_OnPrepShutdown();\r
        } else {\r
-               // TODO: Do something?\r
+               /* TODO: We have postrun requests */\r
        }\r
 }\r
 \r
+\r
+/**\r
+ * PREP SHUTDOWN state (in state ECUM_STATE_PREP_SHUTDOWN)\r
+ */\r
 static inline void in_state_prepShutdown(void){\r
+\r
+       // TODO: The specification does not state what events to clear\r
+       EcuM_ClearWakeupEvent(ECUM_WKSTATUS_NONE);\r
+\r
+       EcuM_OnPrepShutdown();\r
+\r
 #if defined(USE_DEM)\r
        // DEM shutdown\r
        Dem_Shutdown();\r
@@ -197,9 +339,17 @@ static inline void in_state_goOffOne(void){
                // Wait for the NVM job (NvmWriteAll) to terminate\r
                NvM_GetErrorStatus(0, &writeAllResult);\r
                if ((writeAllResult != NVM_REQ_PENDING) || (internal_data_go_off_one_state_timeout == 0)){\r
+\r
+#if defined(USE_WDGM)\r
+                       WdgM_SetMode(internal_data.config->EcuMWdgMConfig->EcuMWdgMShutdownMode);\r
+#endif\r
                        ShutdownOS(E_OK);\r
                }\r
 #else\r
+\r
+#if defined(USE_WDGM)\r
+               WdgM_SetMode(internal_data.config->EcuMWdgMConfig->EcuMWdgMShutdownMode);\r
+#endif\r
                ShutdownOS(E_OK);\r
 #endif\r
 }\r
@@ -207,14 +357,18 @@ 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
 \r
                case ECUM_STATE_APP_RUN:\r
+                       /* RUN II state */\r
                        in_state_appRun();\r
                        break;\r
                case ECUM_STATE_APP_POST_RUN:\r
+                       /* RUN III state */\r
                        in_state_appPostRun();\r
                        break;\r
                case ECUM_STATE_PREP_SHUTDOWN:\r
@@ -224,8 +378,83 @@ void EcuM_MainFunction(void){
                        in_state_goOffOne();\r
                        break;\r
                case ECUM_STATE_GO_SLEEP:\r
-                       // TODO: Fill out\r
+                       in_state_goSleep();\r
+                       break;\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(internal_data.config->EcuMWdgMConfig->EcuMWdgMWakeupMode);\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
+\r
+                       /* If the wakeup mask here is != 0 we have a validated wakeup event ->\r
+                        * go back to RUN */\r
+                       wReaction = ( 0 == wMask ) ? ECUM_WKACT_SHUTDOWN : ECUM_WKACT_RUN;\r
+                       wReaction = EcuM_OnWakeupReaction(wReaction);\r
+\r
+                       if( wReaction == ECUM_WKACT_RUN) {\r
+                               set_current_state(ECUM_STATE_WAKEUP_TWO);\r
+                       } else {\r
+                               /* From figure 28 it seems that we should go to SHUTDOWN/GO SLEEP) again from wakeup\r
+                                * not going up to RUN/RUN II state again. */\r
+                               set_current_state(ECUM_STATE_GO_SLEEP);\r
+                       }\r
+                       break;\r
+               }\r
+\r
+               case ECUM_STATE_WAKEUP_TWO:\r
+#if defined(USE_DEM)\r
+                       Dem_Init();\r
+#endif\r
+                       set_current_state(ECUM_STATE_RUN);\r
+                       break;\r
+\r
                default:\r
                        //TODO: Report error.\r
                        break;\r
index 655b8c74b9ef1860dd5d68980e54ea5db43e21ee..cab78fc70ca956dc146a49a76512508c6f1100d1 100644 (file)
@@ -314,6 +314,8 @@ SCHM_DECLARE(NVM);
 SCHM_DECLARE(FEE);\r
 SCHM_DECLARE(EA);\r
 SCHM_DECLARE(FLS);\r
+SCHM_DECLARE(WDGM_TRIGGER);\r
+SCHM_DECLARE(WDGM_ALIVESUPERVISION);\r
 \r
 \r
 \r
@@ -346,8 +348,6 @@ TASK(SchM_Startup){
 \r
        /* At this point EcuM ==  ECUM_STATE_STARTUP_ONE */\r
 \r
-       /* Schedule memory task more often that usaul so that EcuM_StartupTwo() may return quicker */\r
-       ActivateTask(TASK_ID_SchM_BswService);\r
        /* Set events on TASK_ID_BswService_Mem */\r
        SetRelAlarm(ALARM_ID_Alarm_BswService, 10, 2);\r
 \r
@@ -360,6 +360,7 @@ TASK(SchM_Startup){
        EcuM_StartupTwo();\r
 \r
        /* Start to schedule BSW parts */\r
+       CancelAlarm(ALARM_ID_Alarm_BswService);\r
        SetRelAlarm(ALARM_ID_Alarm_BswService, 10, 5);\r
 \r
        EcuM_RequestRUN(ECUM_USER_User_1);\r
@@ -408,7 +409,8 @@ TASK(SchM_BswService) {
                SCHM_MAINFUNCTION_NM();\r
                SCHM_MAINFUNCTION_CANNM();\r
                SCHM_MAINFUNCTION_CANSM();\r
-               SCHM_MAINFUNCTION_WDMG();\r
+               SCHM_MAINFUNCTION_WDGM_TRIGGER();\r
+               SCHM_MAINFUNCTION_WDGM_ALIVESUPERVISION();\r
                break;\r
        }\r
 \r
diff --git a/system/SchM/SchM_WdgM.h b/system/SchM/SchM_WdgM.h
new file mode 100644 (file)
index 0000000..0fac7f0
--- /dev/null
@@ -0,0 +1,25 @@
+/* -------------------------------- Arctic Core ------------------------------\r
+ * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
+ *\r
+ * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
+ *\r
+ * This source code is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License version 2 as published by the\r
+ * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
+ * for more details.\r
+ * -------------------------------- Arctic Core ------------------------------*/\r
+\r
+\r
+#ifndef SCHM_WDGM_H_\r
+#define SCHM_WDGM_H_\r
+\r
+#define SCHM_MAINFUNCTION_WDGM_TRIGGER()                       SCHM_MAINFUNCTION(WDGM_TRIGGER,WdgM_MainFunction_Trigger())\r
+#define SCHM_MAINFUNCTION_WDGM_ALIVESUPERVISION()      SCHM_MAINFUNCTION(WDGM_ALIVESUPERVISION,WdgM_MainFunction_AliveSupervision())\r
+\r
+#define SCHM_MAINFUNCTION_WDGM()       SCHM_MAINFUNCTION(WDGM,Dcm_MainFunction())\r
+\r
+#endif /* SCHM_WDGM_H_ */\r
index 04e8046598198f47be3da1f90169b14558be176a..b45eb9914bbb5c35abd3389ebd8fa4f4c3a07810 100644 (file)
@@ -52,6 +52,8 @@
 #define SCHM_MAINFUNCTION_CYCLE_PDUR    SCHM_CYCLE_MAIN\r
 #define SCHM_MAINFUNCTION_CYCLE_SPI     SCHM_CYCLE_MAIN\r
 #define SCHM_MAINFUNCTION_CYCLE_WDGM    SCHM_CYCLE_MAIN\r
+#define SCHM_MAINFUNCTION_CYCLE_WDGM_TRIGGER     SCHM_CYCLE_MAIN\r
+#define SCHM_MAINFUNCTION_CYCLE_WDGM_ALIVESUPERVISION     SCHM_CYCLE_MAIN\r
 \r
 /*\r
  * Schedule BSW memory\r