* -------------------------------- Arctic Core ------------------------------*/\r
\r
\r
-\r
-\r
-\r
-\r
-\r
-\r
#include "Can.h"\r
-\r
-#ifndef USE_CAN_STUB\r
#include "mpc55xx.h"\r
#include "Cpu.h"\r
#include "Mcu.h"\r
#include <assert.h>\r
#include <stdlib.h>\r
#include <string.h>\r
-#if defined(USE_KERNEL)\r
#include "Os.h"\r
+#include "isr.h"\r
#include "irq.h"\r
#include "arc.h"\r
-#endif\r
+\r
\r
\r
/* CONFIGURATION NOTES\r
\r
} Can_UnitType;\r
\r
-#if defined(CFG_MPC5567)\r
+\r
Can_UnitType CanUnit[CAN_CONTROLLER_CNT] =\r
{\r
{\r
.state = CANIF_CS_UNINIT,\r
},{\r
.state = CANIF_CS_UNINIT,\r
- },{\r
- .state = CANIF_CS_UNINIT,\r
- },{\r
- .state = CANIF_CS_UNINIT,\r
- },{\r
- .state = CANIF_CS_UNINIT,\r
},\r
-};\r
-#elif defined(CFG_MPC5606S)\r
-Can_UnitType CanUnit[CAN_CONTROLLER_CNT] ={\r
- {\r
- .state = CANIF_CS_UNINIT,\r
- },{\r
- .state = CANIF_CS_UNINIT,\r
- }\r
-};\r
-#else\r
-Can_UnitType CanUnit[CAN_CONTROLLER_CNT] =\r
-{\r
+#if defined(MPC5516) || defined(MPC5517) || defined(CFG_MPC5567)\r
{\r
.state = CANIF_CS_UNINIT,\r
},{\r
.state = CANIF_CS_UNINIT,\r
},{\r
.state = CANIF_CS_UNINIT,\r
- },{\r
- .state = CANIF_CS_UNINIT,\r
- },{\r
- .state = CANIF_CS_UNINIT,\r
- },{\r
+ },\r
+#endif\r
+#if defined(MPC5516) || defined(MPC5517)\r
+ {\r
.state = CANIF_CS_UNINIT,\r
}\r
-};\r
#endif\r
+};\r
+\r
\r
//-------------------------------------------------------------------\r
\r
\r
void Can_A_Isr( void ) { Can_Isr(CAN_CTRL_A); }\r
void Can_B_Isr( void ) { Can_Isr(CAN_CTRL_B); }\r
-#if !defined(CFG_MPC5606S)\r
+#if defined(MPC5516) || defined(MPC5517) || defined(MPC5567)\r
void Can_C_Isr( void ) { Can_Isr(CAN_CTRL_C); }\r
void Can_D_Isr( void ) { Can_Isr(CAN_CTRL_D); }\r
void Can_E_Isr( void ) { Can_Isr(CAN_CTRL_E); }\r
-#if defined(CFG_MPC5567)\r
-#else\r
-void Can_F_Isr( void ) { Can_Isr(CAN_CTRL_F); }\r
#endif\r
+#if defined(MPC5516) || defined(MPC5517)\r
+void Can_F_Isr( void ) { Can_Isr(CAN_CTRL_F); }\r
#endif\r
\r
void Can_A_Err( void ) { Can_Err(CAN_CTRL_A); }\r
void Can_B_Err( void ) { Can_Err(CAN_CTRL_B); }\r
-#if !defined(CFG_MPC5606S)\r
+#if defined(MPC5516) || defined(MPC5517) || defined(MPC5567)\r
void Can_C_Err( void ) { Can_Err(CAN_CTRL_C); }\r
void Can_D_Err( void ) { Can_Err(CAN_CTRL_D); }\r
void Can_E_Err( void ) { Can_Err(CAN_CTRL_E); }\r
-#if defined(CFG_MPC5567)\r
-#else\r
-void Can_F_Err( void ) { Can_Err(CAN_CTRL_F); }\r
#endif\r
+#if defined(MPC5516) || defined(MPC5517)\r
+void Can_F_Err( void ) { Can_Err(CAN_CTRL_F); }\r
#endif\r
\r
void Can_A_BusOff( void ) { Can_BusOff(CAN_CTRL_A); }\r
void Can_B_BusOff( void ) { Can_BusOff(CAN_CTRL_B); }\r
-#if !defined(CFG_MPC5606S)\r
+#if defined(MPC5516) || defined(MPC5517) || defined(MPC5567)\r
void Can_C_BusOff( void ) { Can_BusOff(CAN_CTRL_C); }\r
void Can_D_BusOff( void ) { Can_BusOff(CAN_CTRL_D); }\r
void Can_E_BusOff( void ) { Can_BusOff(CAN_CTRL_E); }\r
-#if defined(CFG_MPC5567)\r
-#else\r
-void Can_F_BusOff( void ) { Can_BusOff(CAN_CTRL_F); }\r
#endif\r
+#if defined(MPC5516) || defined(MPC5517)\r
+void Can_F_BusOff( void ) { Can_BusOff(CAN_CTRL_F); }\r
#endif\r
//-------------------------------------------------------------------\r
\r
// Clear the interrupt\r
canHw->IFRL.B.BUF05I = 1;\r
}\r
- } else {\r
+ } else\r
#endif\r
+ {\r
+\r
// No FIFO used\r
const Can_HardwareObjectType *hohObj;\r
uint32 mbMask;\r
}\r
}\r
} while ( !hohObj->Can_Arc_EOL);\r
-#if defined(CFG_MPC5516) || defined(CFG_MPC5517) || defined(CFG_MPC5606S)\r
} // FIFO code\r
-#endif\r
} else {\r
// Note! Over 32 boxes is not implemented\r
// Other reasons that we end up here\r
\r
//-------------------------------------------------------------------\r
\r
-#if defined(USE_KERNEL)\r
-#define INSTALL_HANDLERS( _can_name,_boff,_err,_start,_stop) \\r
- do { \\r
- TaskType tid; \\r
- tid = Os_Arc_CreateIsr(_can_name ## _BusOff,2/*prio*/,"Can"); \\r
- Irq_AttachIsr2(tid, NULL, (IrqType) _boff); \\r
- tid = Os_Arc_CreateIsr(_can_name ## _Err,2/*prio*/,"Can"); \\r
- Irq_AttachIsr2(tid, NULL, (IrqType) _err); \\r
- for(i=_start;i<=_stop;i++) { \\r
- tid = Os_Arc_CreateIsr(_can_name ## _Isr,2/*prio*/,"Can"); \\r
- Irq_AttachIsr2(tid, NULL, (IrqType) i); \\r
- } \\r
- } while(0);\r
-#else\r
-#define INSTALL_HANDLERS( _can_name,_boff,_err,_start,_stop) \\r
- Irq_InstallVector(_can_name ## _BusOff, _boff, 1, CPU_Z1); \\r
- Irq_InstallVector(_can_name ## _Err, _err, 1, CPU_Z1); \\r
- for(i=_start;i<=_stop;i++) { \\r
- Irq_InstallVector(_can_name ## _Isr, i, 1, CPU_Z1); \\r
- }\r
-#endif\r
+#define INSTALL_HANDLER4(_name,_can_entry, _vector,_priority,_app)\\r
+ ISR_INSTALL_ISR2(_name,_can_entry, _vector+0,_priority,_app) \\r
+ ISR_INSTALL_ISR2(_name,_can_entry, _vector+1,_priority,_app) \\r
+ ISR_INSTALL_ISR2(_name,_can_entry, _vector+2,_priority,_app) \\r
+ ISR_INSTALL_ISR2(_name,_can_entry, _vector+3,_priority,_app)\r
+\r
+#define INSTALL_HANDLER16(_name,_can_entry, _vector,_priority,_app)\\r
+ INSTALL_HANDLER4(_name,_can_entry, _vector+0,_priority,_app) \\r
+ INSTALL_HANDLER4(_name,_can_entry, _vector+4,_priority,_app) \\r
+ INSTALL_HANDLER4(_name,_can_entry, _vector+8,_priority,_app) \\r
+ INSTALL_HANDLER4(_name,_can_entry, _vector+12,_priority,_app)\r
\r
// This initiates ALL can controllers\r
void Can_Init( const Can_ConfigType *config ) {\r
Can_UnitType *canUnit;\r
const Can_ControllerConfigType *canHwConfig;\r
- int i;\r
uint32 ctlrId;\r
\r
VALIDATE_NO_RV( (Can_Global.initRun == CAN_UNINIT), 0x0, CAN_E_TRANSITION );\r
// Note!\r
// Could install handlers depending on HW objects to trap more errors\r
// in configuration\r
-#if defined(CFG_MPC5567)\r
- switch( canHwConfig->CanControllerId ) {\r
- case CAN_CTRL_A:\r
- INSTALL_HANDLERS(Can_A, FLEXCAN_A_ESR_BOFF_INT, FLEXCAN_A_ESR_ERR_INT, FLEXCAN_A_IFLAG1_BUF0I, FLEXCAN_A_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_B:\r
- INSTALL_HANDLERS(Can_B, FLEXCAN_B_ESR_BOFF_INT, FLEXCAN_B_ESR_ERR_INT, FLEXCAN_B_IFLAG1_BUF0I, FLEXCAN_B_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_C:\r
- INSTALL_HANDLERS(Can_C, FLEXCAN_C_ESR_BOFF_INT, FLEXCAN_C_ESR_ERR_INT, FLEXCAN_C_IFLAG1_BUF0I, FLEXCAN_C_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_D:\r
- INSTALL_HANDLERS(Can_D, FLEXCAN_D_ESR_BOFF_INT, FLEXCAN_D_ESR_ERR_INT, FLEXCAN_D_IFLAG1_BUF0I, FLEXCAN_D_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_E:\r
- INSTALL_HANDLERS(Can_E, FLEXCAN_E_ESR_BOFF_INT, FLEXCAN_E_ESR_ERR_INT, FLEXCAN_E_IFLAG1_BUF0I, FLEXCAN_E_IFLAG1_BUF31_16I); break;\r
- default:\r
- assert(0);\r
- }\r
-#elif defined(CFG_MPC5606S)\r
- switch( canHwConfig->CanControllerId )\r
- {\r
- case CAN_CTRL_A:\r
- INSTALL_HANDLERS(Can_A, FLEXCAN_0_ESR_BOFF_INT, FLEXCAN_0_ESR_ERR_INT, FLEXCAN_0_BUF_00_03, FLEXCAN_0_BUF_32_63);\r
- break;\r
- case CAN_CTRL_B:\r
- INSTALL_HANDLERS(Can_B, FLEXCAN_1_ESR_BOFF_INT, FLEXCAN_1_ESR_ERR_INT, FLEXCAN_1_BUF_00_03, FLEXCAN_1_BUF_32_63);\r
- break;\r
- default:\r
- assert(0);\r
- }\r
-#else\r
switch( canHwConfig->CanControllerId ) {\r
- case CAN_CTRL_A:\r
- INSTALL_HANDLERS(Can_A, FLEXCAN_A_ESR_BOFF_INT, FLEXCAN_A_ESR_ERR_INT, FLEXCAN_A_IFLAG1_BUF0I, FLEXCAN_A_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_B:\r
- INSTALL_HANDLERS(Can_B, FLEXCAN_B_ESR_BOFF_INT, FLEXCAN_B_ESR_ERR_INT, FLEXCAN_B_IFLAG1_BUF0I, FLEXCAN_B_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_C:\r
- INSTALL_HANDLERS(Can_C, FLEXCAN_C_ESR_BOFF_INT, FLEXCAN_C_ESR_ERR_INT, FLEXCAN_C_IFLAG1_BUF0I, FLEXCAN_C_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_D:\r
- INSTALL_HANDLERS(Can_D, FLEXCAN_D_ESR_BOFF_INT, FLEXCAN_D_ESR_ERR_INT, FLEXCAN_D_IFLAG1_BUF0I, FLEXCAN_D_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_E:\r
- INSTALL_HANDLERS(Can_E, FLEXCAN_E_ESR_BOFF_INT, FLEXCAN_E_ESR_ERR_INT, FLEXCAN_E_IFLAG1_BUF0I, FLEXCAN_E_IFLAG1_BUF31_16I); break;\r
- case CAN_CTRL_F:\r
- INSTALL_HANDLERS(Can_F, FLEXCAN_F_ESR_BOFF_INT, FLEXCAN_F_ESR_ERR_INT, FLEXCAN_F_IFLAG1_BUF0I, FLEXCAN_F_IFLAG1_BUF31_16I); break;\r
- default:\r
- assert(0);\r
- }\r
+ case CAN_CTRL_A:\r
+ ISR_INSTALL_ISR2( "Can", Can_A_BusOff, FLEXCAN_A_ESR_BOFF_INT, 2, 0);\r
+ ISR_INSTALL_ISR2( "Can", Can_A_Err, FLEXCAN_A_ESR_ERR_INT, 2, 0 );\r
+ INSTALL_HANDLER16( "Can", Can_A_Isr, FLEXCAN_A_IFLAG1_BUF0I, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_A_Isr, FLEXCAN_A_IFLAG1_BUF31_16I, 2, 0 );\r
+ break;\r
+ case CAN_CTRL_B:\r
+ ISR_INSTALL_ISR2( "Can", Can_B_BusOff, FLEXCAN_B_ESR_BOFF_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_B_Err, FLEXCAN_B_ESR_ERR_INT, 2, 0 );\r
+ INSTALL_HANDLER16( "Can", Can_B_Isr, FLEXCAN_B_IFLAG1_BUF0I, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_B_Isr, FLEXCAN_B_IFLAG1_BUF31_16I, 2, 0 );\r
+ break;\r
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517) || defined(MPC5567)\r
+ case CAN_CTRL_C:\r
+ ISR_INSTALL_ISR2( "Can", Can_C_BusOff, FLEXCAN_C_ESR_BOFF_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_C_Err, FLEXCAN_C_ESR_ERR_INT, 2, 0 );\r
+ INSTALL_HANDLER16( "Can", Can_C_Isr, FLEXCAN_C_IFLAG1_BUF0I, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_C_Isr, FLEXCAN_C_IFLAG1_BUF31_16I, 2, 0 );\r
+ break;\r
+ case CAN_CTRL_D:\r
+ ISR_INSTALL_ISR2( "Can", Can_D_BusOff, FLEXCAN_D_ESR_BOFF_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_D_Err, FLEXCAN_D_ESR_ERR_INT, 2, 0 );\r
+ INSTALL_HANDLER16( "Can", Can_D_Isr, FLEXCAN_D_IFLAG1_BUF0I, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_D_Isr, FLEXCAN_D_IFLAG1_BUF31_16I, 2, 0 );\r
+ break;\r
+ case CAN_CTRL_E:\r
+ ISR_INSTALL_ISR2( "Can", Can_E_BusOff, FLEXCAN_E_ESR_BOFF_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_E_Err, FLEXCAN_E_ESR_ERR_INT, 2, 0 );\r
+ INSTALL_HANDLER16( "Can", Can_E_Isr, FLEXCAN_E_IFLAG1_BUF0I, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_E_Isr, FLEXCAN_E_IFLAG1_BUF31_16I, 2, 0 );\r
+ break;\r
#endif\r
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\r
+ case CAN_CTRL_F:\r
+ ISR_INSTALL_ISR2( "Can", Can_F_BusOff, FLEXCAN_F_ESR_BOFF_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_F_Err, FLEXCAN_F_ESR_ERR_INT, 2, 0 );\r
+ INSTALL_HANDLER16( "Can", Can_F_Isr, FLEXCAN_F_IFLAG1_BUF0I, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Can", Can_F_Isr, FLEXCAN_F_IFLAG1_BUF31_16I, 2, 0 );\r
+ break;\r
+ #endif\r
+ default:\r
+ assert(0);\r
+ }\r
}\r
return;\r
}\r
\r
\r
\r
-#else // Stub all functions for use in simulator environment\r
-\r
-#include "debug.h"\r
-\r
-void Can_Init( const Can_ConfigType *Config )\r
-{\r
- // Do initial configuration of layer here\r
-}\r
-\r
-void Can_InitController( uint8 controller, const Can_ControllerConfigType *config)\r
-{\r
- // Do initialisation of controller here.\r
-}\r
-\r
-Can_ReturnType Can_SetControllerMode( uint8 Controller, Can_StateTransitionType transition )\r
-{\r
- // Turn on off controller here depending on transition\r
- return E_OK;\r
-}\r
-\r
-Can_ReturnType Can_Write( Can_Arc_HTHType hth, Can_PduType *pduInfo )\r
-{\r
- // Write to mailbox on controller here.\r
- DEBUG(DEBUG_MEDIUM, "Can_Write(stub): Received data ");\r
- for (int i = 0; i < pduInfo->length; i++) {\r
- DEBUG(DEBUG_MEDIUM, "%d ", pduInfo->sdu[i]);\r
- }\r
- DEBUG(DEBUG_MEDIUM, "\n");\r
-\r
- return E_OK;\r
-}\r
-\r
-extern void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc, const uint8 *CanSduPtr);\r
-Can_ReturnType Can_ReceiveAFrame()\r
-{\r
- // This function is not part of autosar but needed to feed the stack with data\r
- // from the mailboxes. Normally this is an interrup but probably not in the PCAN case.\r
- uint8 CanSduData[] = {1,2,1,0,0,0,0,0};\r
- CanIf_RxIndication(CAN_HRH_A_1, 3, 8, CanSduData);\r
-\r
- return E_OK;\r
-}\r
-\r
-void Can_DisableControllerInterrupts( uint8 controller )\r
-{\r
-}\r
-\r
-void Can_EnableControllerInterrupts( uint8 controller )\r
-{\r
-}\r
-\r
-\r
-// Hth - for Flexcan, the hardware message box number... .We don't care\r
-void Can_Cbk_CheckWakeup( uint8 controller ){}\r
-\r
-void Can_MainFunction_Write( void ){}\r
-void Can_MainFunction_Read( void ){}\r
-void Can_MainFunction_BusOff( void ){}\r
-void Can_MainFunction_Wakeup( void ){}\r
-\r
-void Can_Arc_GetStatistics( uint8 controller, Can_Arc_StatisticsType * stat){}\r
-\r
-#endif\r
-\r
-\r