+\r
/* -------------------------------- Arctic Core ------------------------------\r
* Arctic Core - the open source AUTOSAR platform http://arccore.com\r
*\r
* for more details.\r
* -------------------------------- Arctic Core ------------------------------*/\r
\r
+/* ----------------------------[includes]------------------------------------*/\r
+/* ----------------------------[private define]------------------------------*/\r
+/* ----------------------------[private macro]-------------------------------*/\r
+/* ----------------------------[private typedef]-----------------------------*/\r
+/* ----------------------------[private function prototypes]-----------------*/\r
+/* ----------------------------[private variables]---------------------------*/\r
+/* ----------------------------[private functions]---------------------------*/\r
+/* ----------------------------[public functions]----------------------------*/\r
+\r
+\r
+/* ----------------------------[includes]------------------------------------*/\r
+\r
#include "internal.h"\r
-#include "asm_book_e.h"\r
#include "irq_types.h"\r
#include "mpc55xx.h"\r
-#if !defined(USE_KERNEL)\r
-#include "Mcu.h"\r
-#endif\r
-\r
-#if defined(USE_KERNEL)\r
#include "pcb.h"\r
#include "sys.h"\r
#include "internal.h"\r
#include "task_i.h"\r
#include "hooks.h"\r
-\r
-#if 0\r
-#define INTC_SSCIR0_CLR7 7\r
-#define MLB_SERVICE_REQUEST 293\r
-#define CRITICAL_INPUT_EXCEPTION 320\r
-#define DEBUG_EXCEPTION 335\r
-#define NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS 336\r
-#endif\r
-\r
#include "debug.h"\r
-#endif\r
-#include "irq.h"\r
-\r
-static void dump_exception_regs( uint32_t *regs );\r
+#include "isr.h"\r
+#include <stdint.h>\r
\r
+/* ----------------------------[private define]------------------------------*/\r
+/* ----------------------------[private macro]-------------------------------*/\r
+/* ----------------------------[private typedef]-----------------------------*/\r
typedef void (*f_t)( uint32_t *);\r
-//typedef void (*func_t)();\r
-//extern vfunc_t Irq_VectorTable[];\r
-extern void exception_tbl(void);\r
\r
+/* ----------------------------[private function prototypes]-----------------*/\r
+//extern uintptr_t Irq_VectorTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];\r
+//extern uint8 Irq_IsrTypeTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];\r
+//extern const OsIsrConstType *Irq_Map[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];\r
\r
+static void dumpExceptionRegs( uint32_t *regs );\r
\r
-#if defined(USE_KERNEL)\r
-extern void * Irq_VectorTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];\r
-extern uint8 Irq_IsrTypeTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];\r
-#else\r
-extern func_t Irq_VectorTable[];\r
-#endif\r
+/* ----------------------------[private variables]---------------------------*/\r
+extern void exception_tbl(void);\r
+\r
+/* ----------------------------[private functions]---------------------------*/\r
+/* ----------------------------[public functions]----------------------------*/\r
\r
// write 0 to pop INTC stack\r
void Irq_Init( void ) {\r
INTC.MCR.B.VTES = 0; // 4 byte offset between entries\r
#endif\r
\r
-\r
- // Pointless in software vector more???\r
-#if 0\r
- // Check alignment requirements for the INTC table\r
- assert( (((uint32_t)&Irq_VectorTable[0]) & 0x7ff) == 0 );\r
- #if defined(CFG_MPC5516)\r
- INTC.IACKR_PRC0.R = (uint32_t) & Irq_VectorTable[0]; // Set INTC ISR vector table\r
- #elif defined(CFG_MPC5554) || defined(CFG_MPC5567)\r
- INTC.IACKR.R = (uint32_t) & Irq_VectorTable[0]; // Set INTC ISR vector table\r
- #endif\r
-#endif\r
// Pop the FIFO queue\r
for (int i = 0; i < 15; i++)\r
{\r
#elif defined(CFG_MPC5554) || defined(CFG_MPC5567)\r
INTC.CPR.B.PRI = 0;\r
#endif\r
-\r
}\r
\r
void Irq_EOI( void ) {\r
#if defined(CFG_MPC5516)\r
- struct INTC_tag *intc = &INTC;\r
+ volatile struct INTC_tag *intc = &INTC;\r
intc->EOIR_PRC0.R = 0;\r
#elif defined(CFG_MPC5554)||defined(CFG_MPC5567)\r
volatile struct INTC_tag *intc = &INTC;\r
#endif\r
}\r
\r
-\r
+#if 0\r
/**\r
*\r
* @param stack_p Ptr to the current stack.\r
uint32_t vector;\r
uint32_t *stack = (uint32_t *)stack_p;\r
uint32_t exc_vector = (EXC_OFF_FROM_BOTTOM+EXC_VECTOR_OFF) / sizeof(uint32_t);\r
+ const OsIsrConstType *isr;\r
\r
// Check for exception\r
if( stack[exc_vector]>=CRITICAL_INPUT_EXCEPTION )\r
}\r
}\r
\r
-#if defined(USE_KERNEL)\r
-\r
- if( Irq_GetIsrType(vector) == ISR_TYPE_1 ) {\r
- // It's a function, just call it.\r
- ((func_t)Irq_VectorTable[vector])();\r
+ isr = Os_IsrGet(exc_vector);\r
+ if( isr->type == ISR_TYPE_1 ) {\r
+ isr->entry();\r
return stack;\r
} else {\r
- // It's a PCB\r
- // Let the kernel handle the rest,\r
- return Os_Isr(stack, (void *)Irq_VectorTable[vector]);\r
- }\r
-\r
-\r
-#else\r
- //read address\r
- t = (func_t)Irq_VectorTable[vector];\r
-\r
- if( t == ((void *)0) )\r
- {\r
- while(1);\r
+ return Os_Isr(stack, vector);\r
}\r
-\r
- // Enable nestling interrupts\r
- Irq_Enable();\r
- t();\r
- Irq_Disable();\r
-\r
- if( vector < INTC_NUMBER_OF_INTERRUPTS )\r
- {\r
- // write 0 to pop INTC stack\r
- intc->EOIR_PRC0.R = 0;\r
- }\r
- return NULL;\r
-\r
-#endif\r
}\r
-\r
-\r
-\r
-#if defined(USE_KERNEL)\r
-\r
+#endif\r
\r
\r
static inline int osPrioToCpuPio( uint8_t prio ) {\r
\r
\r
\r
+#if 0\r
/**\r
* Attach an ISR type 1 to the interrupt controller.\r
*\r
}\r
\r
}\r
+#endif\r
+\r
+\r
+void Irq_EnableVector( int16_t vector, int priority, int core ) {\r
+\r
+ if (vector < INTC_NUMBER_OF_INTERRUPTS) {\r
+ Irq_SetPriority(core,vector + IRQ_INTERRUPT_OFFSET, osPrioToCpuPio(priority));\r
+ } else if ((vector >= CRITICAL_INPUT_EXCEPTION)\r
+ && (vector<= DEBUG_EXCEPTION)) {\r
+ } else {\r
+ /* Invalid vector! */\r
+ assert(0);\r
+ }\r
+}\r
+\r
+\r
+\r
+#if 0\r
+\r
+/**\r
+ *\r
+ * @param isrPtr\r
+ * @param type\r
+ * @param int_ctrl\r
+ */\r
+ISRType Irq_Attach( int vector ) {\r
+// Os_Sys.isrCnt\r
+// uint32_t vector = isrPtr->vector;\r
+\r
+ //Irq_VectorTable[vector] = (uintptr_t)isrPtr;\r
+// Irq_IsrTypeTable[vector] = type;\r
+// Irq_VectorTable[vector] = isrPtr;\r
+\r
+\r
+ if (vector < INTC_NUMBER_OF_INTERRUPTS) {\r
+ Irq_SetPriority(Irq_Map[vector]->core ,vector + IRQ_INTERRUPT_OFFSET, osPrioToCpuPio(Irq_Map[vector]->priority));\r
+ } else if ((vector >= CRITICAL_INPUT_EXCEPTION)\r
+ && (vector<= DEBUG_EXCEPTION)) {\r
+ } else {\r
+ /* Invalid vector! */\r
+ assert(0);\r
+ }\r
+\r
+\r
+ return;\r
+}\r
+#endif\r
\r
+#if 0\r
/**\r
* Attach a ISR type 2 to the interrupt controller.\r
*\r
* @param vector\r
*/\r
void Irq_AttachIsr2(TaskType tid,void *int_ctrl,IrqType vector ) {\r
- OsPcbType *pcb;\r
+ OsTaskVarType *pcb;\r
\r
- pcb = os_find_task(tid);\r
+ pcb = Os_TaskGet(tid);\r
Irq_VectorTable[vector] = (void *)pcb;\r
Irq_IsrTypeTable[vector] = PROC_ISR2;\r
\r
assert(0);\r
}\r
}\r
-\r
-#endif /* defined(USE_KERNEL) */\r
-\r
-#if !defined(USE_KERNEL)\r
-/**\r
- * Installs a vector in intc vector table. It also sets the priority in the INTC\r
- * internal registers.\r
- *\r
- * This does NOT use the kernel\r
- *\r
- * @param func The function to install\r
- * @param vector INTC vector to install it to\r
- * @param priority INTC priority. 0 - Low prio. 15- Highest( NMI )\r
- * @param cpu\r
- */\r
-\r
-void Irq_InstallVector(void(*func)(), IrqType vector,\r
- uint8_t priority, Cpu_t cpu)\r
-{\r
- VALIDATE( ( 1 == Mcu_Global.initRun ), MCU_INTCVECTORINSTALL_SERVICE_ID, MCU_E_UNINIT );\r
- DEBUG(DEBUG_LOW,"Installing INTC vector:%d,prio:%d,cpu,%d\n",vector,priority,cpu);\r
- Irq_VectorTable[vector] = func;\r
-\r
- if (vector <= MLB_SERVICE_REQUEST)\r
- {\r
- INTC.PSR[vector].B.PRC_SEL = cpu;\r
- INTC.PSR[vector].B.PRI = priority;\r
-\r
- Irq_VectorTable[vector] = func;\r
- } else if ((vector >= CRITICAL_INPUT_EXCEPTION)\r
- && (vector <= DEBUG_EXCEPTION))\r
- {\r
- Irq_VectorTable[vector] = func;\r
- } else\r
- {\r
- /* Invalid vector! */\r
- assert(0);\r
- }\r
-}\r
#endif\r
\r
\r
-\r
/**\r
* Generates a soft interrupt\r
* @param vector\r
// ExceptionSave(srr0,srr1,esr,mcsr,dear;)\r
// CSRR0, CSSR1\r
// Nothing more\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
{\r
// CSRR0, CSSR1\r
// MCSR - Source of machine check\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
// Data Storage Interrupt\r
{\r
// SRR0, SRR1\r
// ESR - lots of stuff\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
{\r
// SRR0, SRR1\r
// ESR - lots of stuff\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
// SRR0, SRR1\r
// ESR - lots of stuff\r
// DEAR - Address of load store that caused the exception\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
{\r
// SRR0, SRR1\r
// ESR - lots of stuff\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
void IVOR7Exception (uint32_t *regs)\r
{\r
// SRR0, SRR1\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
{\r
// SRR0, SRR1\r
// ESR\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
void IVOR9Exception (uint32_t *regs)\r
{\r
// Does not happen on e200\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
#if 0\r
void IVOR11Exception (uint32_t *regs)\r
{\r
// SRR0, SRR1\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
void IVOR12Exception (uint32_t *regs)\r
{\r
// SRR0, SRR1\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
{\r
// SRR0, SRR1\r
// ESR - MIF set, All others cleared\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
void IVOR15Exception (uint32_t *regs)\r
{\r
// Debug\r
- dump_exception_regs(regs);\r
+ dumpExceptionRegs(regs);\r
while (1);\r
}\r
\r
\r
\r
\r
-static void dump_exception_regs( uint32_t *regs ) {\r
+static void dumpExceptionRegs( uint32_t *regs ) {\r
exc_stack_t *r = (exc_stack_t *)regs;\r
\r
LDEBUG_PRINTF("sp %08x srr0 %08x srr1 %08x\n",r->sp,r->srr0,r->srr1);\r
}\r
\r
#else\r
-static void dump_exception_regs( uint32_t *regs ) {\r
+static void dumpExceptionRegs( uint32_t *regs ) {\r
}\r
#endif\r
\r
-#if !defined(USE_KERNEL)\r
-func_t Irq_VectorTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS] __attribute__ ((aligned (0x800))) = {\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 00 - 04 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 05 - 09 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 10 - 14 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 15 - 19 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 20 - 24 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 25 - 29 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 30 - 34 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 35 - 39 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 40 - 44 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 45 - 49 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 50 - 54 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 55 - 59 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 60 - 64 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 55 - 69 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 70 - 74 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 75 - 79 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 80 - 84 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 85 - 89 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 90 - 94 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 95 - 99 */\r
-\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 100 - 104 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 105 - 109 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 110 - 114 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 115 - 119 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 120 - 124 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 125 - 129 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 130 - 134 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 135 - 139 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 140 - 144 */\r
- dummy, dummy, dummy, dummy, dummy /* PIT1 */, /* ISRs 145 - 149 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 150 - 154 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 155 - 159 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 160 - 164 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 155 - 169 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 170 - 174 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 175 - 179 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 180 - 184 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 185 - 189 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 190 - 194 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 195 - 199 */\r
-\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 200 - 204 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 205 - 209 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 210 - 214 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 215 - 219 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 220 - 224 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 225 - 229 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 230 - 234 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 235 - 239 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 240 - 244 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 245 - 249 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 250 - 254 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 255 - 259 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 260 - 264 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 255 - 269 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 270 - 274 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 275 - 279 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 280 - 284 */\r
- dummy, dummy, dummy, dummy, dummy, /* ISRs 285 - 289 */\r
- dummy, dummy, dummy, dummy, /* ISRs 290 - 293 */\r
-\r
- /* Some reserved vectors between INC interrupts and exceptions. */\r
- dummy, /* INTC_NUMBER_OF_INTERRUPTS */\r
-\r
- dummy, dummy, dummy, dummy, dummy,\r
- dummy, dummy, dummy, dummy, dummy,\r
- dummy, dummy, dummy, dummy, dummy,\r
- dummy, dummy, dummy, dummy, dummy,\r
- dummy, dummy, dummy, dummy, dummy,\r
-\r
- IVOR0Exception, /* CRITICAL_INPUT_EXCEPTION, */\r
- IVOR1Exception, /* MACHINE_CHECK_EXCEPTION */\r
- IVOR2Exception, /* DATA_STORAGE_EXCEPTION */\r
- IVOR3Exception, /* INSTRUCTION_STORAGE_EXCEPTION */\r
- dummy, /* EXTERNAL_INTERRUPT */\r
- /* This is the place where the "normal" interrupts will hit the CPU... */\r
- IVOR5Exception, /* ALIGNMENT_EXCEPTION */\r
- IVOR6Exception, /* PROGRAM_EXCEPTION */\r
- IVOR7Exception, /* FLOATING_POINT_EXCEPTION */\r
- IVOR8Exception, /* SYSTEM_CALL_EXCEPTION */\r
- dummy, /* AUX_EXCEPTION Not implemented in MPC5516. */\r
- dummy, /* DECREMENTER_EXCEPTION */\r
- IVOR11Exception, /* FIXED_INTERVAL_TIMER_EXCEPTION */\r
- IVOR12Exception, /* WATCHDOG_TIMER_EXCEPTION */\r
- IVOR13Exception, /* DATA_TLB_EXCEPTION */\r
- IVOR14Exception, /* INSTRUCTION_TLB_EXCEPTION */\r
- IVOR15Exception, /* DEBUG_EXCEPTION */\r
-};\r
-\r
-void dummy (void) {\r
- while (1){\r
- /* TODO: Rename and check for what spurious interrupt have happend */\r
- };\r
- }\r
-\r
-#endif\r
-\r