]> rtime.felk.cvut.cz Git - arc.git/blobdiff - arch/ppc/mpc55xx/drivers/Can.c
Isr almost done
[arc.git] / arch / ppc / mpc55xx / drivers / Can.c
index 77730741693ea7e1bcb0a323ee9b6d0218bff8e8..98fbc704dc83998f4750724206c2801b5742ac59 100644 (file)
  * -------------------------------- Arctic Core ------------------------------*/\r
 \r
 \r
-\r
-\r
-\r
-\r
-\r
-\r
 #include "Can.h"\r
 \r
 #ifndef USE_CAN_STUB\r
@@ -36,7 +30,8 @@
 #include <string.h>\r
 #if defined(USE_KERNEL)\r
 #include "Os.h"\r
-#include "irq.h"\r
+#include "isr.h"\r
+#include "arc.h"\r
 #endif\r
 \r
 \r
 \r
 #define GET_CONTROLLER_CNT() (CAN_CONTROLLER_CNT)\r
 \r
+#if 0\r
+#define _INSTALL_HANDLER(_can_entry, _unique, _vector,_priority,_app )        \\r
+       do { \\r
+         const OsIsrConstType _can_entry ## _unique = { \\r
+                       .vector = _vector,   \\r
+                       .type = ISR_TYPE_2, \\r
+                       .priority = _priority,      \\r
+                       .entry = _can_entry,      \\r
+                       .name = "Can",      \\r
+                       .resourceMask = 0,  \\r
+                       .timingProtPtr = NULL, \\r
+                       .appOwner = _app,      \\r
+                 };                    \\r
+         Os_IsrAdd( & _can_entry ## _unique);   \\r
+       } while(0);\r
+#endif\r
+\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
+\r
 //-------------------------------------------------------------------\r
 \r
 #if ( CAN_DEV_ERROR_DETECT == STD_ON )\r
@@ -268,22 +293,6 @@ typedef struct {
 \r
 } Can_UnitType;\r
 \r
-#if defined(CFG_MPC5567)\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
-#else\r
 Can_UnitType CanUnit[CAN_CONTROLLER_CNT] =\r
 {\r
   {\r
@@ -296,11 +305,13 @@ Can_UnitType CanUnit[CAN_CONTROLLER_CNT] =
     .state = CANIF_CS_UNINIT,\r
   },{\r
     .state = CANIF_CS_UNINIT,\r
-  },{\r
+  }\r
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\r
+  ,{\r
     .state = CANIF_CS_UNINIT,\r
   }\r
-};\r
 #endif\r
+};\r
 \r
 //-------------------------------------------------------------------\r
 \r
@@ -353,8 +364,7 @@ void Can_B_Isr( void  ) {   Can_Isr(CAN_CTRL_B); }
 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
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\r
 void Can_F_Isr( void  ) {      Can_Isr(CAN_CTRL_F); }\r
 #endif\r
 \r
@@ -363,8 +373,7 @@ void Can_B_Err( void  ) {   Can_Err(CAN_CTRL_B); }
 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
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\r
 void Can_F_Err( void  ) {      Can_Err(CAN_CTRL_F); }\r
 #endif\r
 \r
@@ -373,8 +382,7 @@ void Can_B_BusOff( void  ) {        Can_BusOff(CAN_CTRL_B); }
 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
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\r
 void Can_F_BusOff( void  ) {   Can_BusOff(CAN_CTRL_F); }\r
 #endif\r
 //-------------------------------------------------------------------\r
@@ -638,6 +646,11 @@ static void Can_Isr(int unit) {
   }\r
 \r
   if (canHwConfig->Can_Arc_Fifo) {\r
+    /*\r
+     * NOTE!!!\r
+     * Do not enable RxFIFO. See [Freescale Device Errata MPC5510ACE, Rev. 10 APR 2009, errata ID: 14593].\r
+     */\r
+     \r
        /* Note\r
         * NOT tested at all\r
         */\r
@@ -658,29 +671,9 @@ static void Can_Isr(int unit) {
   }\r
 }\r
 \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,_boff); \\r
-    tid = Os_Arc_CreateIsr(_can_name ## _Err,2/*prio*/,"Can"); \\r
-    Irq_AttachIsr2(tid,NULL,_err); \\r
-    for(i=_start;i<=_stop;i++) {  \\r
-      tid = Os_Arc_CreateIsr(_can_name ## _Isr,2/*prio*/,"Can"); \\r
-                       Irq_AttachIsr2(tid,NULL,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
 \r
 // This initiates ALL can controllers\r
 void Can_Init( const Can_ConfigType *config ) {\r
@@ -731,42 +724,53 @@ void Can_Init( const Can_ConfigType *config ) {
       }\r
     } while (!hoh->Can_Arc_EOL);\r
 \r
+\r
+\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
+       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
-        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
+       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
     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
+       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
-        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
+       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
-        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
-#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
+       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
+#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\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
+       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
-#endif\r
   }\r
   return;\r
 }\r
@@ -1004,7 +1008,9 @@ Can_ReturnType Can_SetControllerMode( uint8 controller, Can_StateTransitionType
     canUnit->state = CANIF_CS_STARTED;\r
     imask_t state = McuE_EnterCriticalSection();\r
     if (canUnit->lock_cnt == 0)   // REQ CAN196\r
+    {\r
       Can_EnableControllerInterrupts(controller);\r
+    }\r
     McuE_ExitCriticalSection(state);\r
     break;\r
   case CAN_T_WAKEUP:  //CAN267\r