]> rtime.felk.cvut.cz Git - arc.git/blobdiff - arch/arm/arm_cr4/drivers/Can.c
Added an example of CAN communication for the TMS570LS31x HDK
[arc.git] / arch / arm / arm_cr4 / drivers / Can.c
index 9af6facad786c4ba5441a3f545b148cf125e8010..3f17ac90be9aefc49e5a4a7490308361774704d3 100644 (file)
@@ -41,6 +41,8 @@
 #define Dem_ReportErrorStatus(...)\r
 #endif\r
 \r
+static sint8 IfRegId = 0;\r
+\r
 /* Macro for waiting until busy flag is 0 */\r
 #define DCAN_WAIT_UNTIL_NOT_BUSY(ControllerId, IfRegId) \\r
     { \\r
@@ -104,7 +106,6 @@ static Can_StateType            ModuleState = CAN_UNINIT;
 static CanIf_ControllerModeType ControllerMode[CAN_ARC_CTRL_CONFIG_CNT];\r
 \r
 /* Used to switch between IF1 and IF2 of DCAN */\r
-static uint8 IfRegId = 0;\r
 \r
 /* Used to order Data Bytes according to hardware registers in DCAN */\r
 static const uint8 ElementIndex[] = {3, 2, 1, 0, 7, 6, 5, 4};\r
@@ -216,7 +217,7 @@ static inline Can_ReturnType handleRxMsgObject(uint8 MsgNr, const Can_HardwareOb
        uint8  *SduPtr;\r
 \r
        /* Wait until Busy Flag is 0 */\r
-       DCAN_WAIT_UNTIL_NOT_BUSY_NO_RV(controller, IfRegId);\r
+       DCAN_WAIT_UNTIL_NOT_BUSY(controller, IfRegId);\r
 \r
        // Read message control\r
        uint32 mc = CanRegs[controller]->IFx[IfRegId].MC;\r
@@ -376,6 +377,7 @@ void Can_Init(const Can_ConfigType *Config)
     uint8                     MsgNr;\r
     uint32                    ErrCounter;\r
     uint32                    Eob;\r
+    imask_t state;\r
 \r
 /* DET Error Check */\r
 #if(CAN_DEV_ERROR_DETECT == STD_ON)\r
@@ -391,7 +393,7 @@ void Can_Init(const Can_ConfigType *Config)
     }\r
 #endif \r
 \r
-    imask_t i_state = McuE_EnterCriticalSection();\r
+    Irq_Save(state);\r
 \r
     // TODO This should be used instead of other variables in the Can_Lcfg file.\r
     CurConfig        = Config;\r
@@ -517,27 +519,17 @@ void Can_Init(const Can_ConfigType *Config)
 #endif\r
 \r
         // Install interrupt handlers\r
-               TaskType tid;\r
                if (CanControllerConfigData[Controller].CanControllerId == DCAN1) {\r
-                       tid = Os_Arc_CreateIsr(Can1_InterruptHandler, 2 ,"DCAN1Level0");\r
-                       Irq_AttachIsr2(tid, NULL, 16);\r
-\r
-                       tid = Os_Arc_CreateIsr(Can1_InterruptHandler, 2, "DCAN1Level1");\r
-                       Irq_AttachIsr2(tid, NULL, 29);\r
+                       ISR_INSTALL_ISR2("DCAN1Level0",Can1_InterruptHandler,CAN1_LEVEL_0,2,0);\r
+                       ISR_INSTALL_ISR2("DCAN1Level1",Can1_InterruptHandler,CAN1_LEVEL_1,2,0);\r
 \r
                } else if (CanControllerConfigData[Controller].CanControllerId == DCAN2) {\r
-                       tid = Os_Arc_CreateIsr(Can2_InterruptHandler, 2 ,"DCAN2Level0");\r
-                       Irq_AttachIsr2(tid, NULL, 35);\r
-\r
-                       tid = Os_Arc_CreateIsr(Can2_InterruptHandler, 2, "DCAN2Level1");\r
-                       Irq_AttachIsr2(tid, NULL, 42);\r
+                       ISR_INSTALL_ISR2("DCAN2Level0",Can2_InterruptHandler,CAN2_LEVEL_0,2,0);\r
+                       ISR_INSTALL_ISR2("DCAN2Level1",Can2_InterruptHandler,CAN2_LEVEL_1,2,0);\r
 \r
                } else if (CanControllerConfigData[Controller].CanControllerId == DCAN3) {\r
-                       tid = Os_Arc_CreateIsr(Can3_InterruptHandler, 2 ,"DCAN3Level0");\r
-                       Irq_AttachIsr2(tid, NULL, 45);\r
-\r
-                       tid = Os_Arc_CreateIsr(Can3_InterruptHandler, 2, "DCAN3Level1");\r
-                       Irq_AttachIsr2(tid, NULL, 55);\r
+                       ISR_INSTALL_ISR2("DCAN3Level0",Can3_InterruptHandler,CAN3_LEVEL_0,2,0);\r
+                       ISR_INSTALL_ISR2("DCAN3Level1",Can3_InterruptHandler,CAN3_LEVEL_1,2,0);\r
 \r
                }\r
 \r
@@ -547,8 +539,15 @@ void Can_Init(const Can_ConfigType *Config)
     ModuleState = CAN_READY;\r
 #endif\r
 \r
-    McuE_ExitCriticalSection(i_state);\r
+    Irq_Restore(state);\r
+\r
+}\r
+\r
+// Unitialize the module\r
+void Can_DeInit()\r
+{\r
 \r
+  return;\r
 }\r
 \r
 \r
@@ -557,6 +556,7 @@ void Can_InitController(uint8 Controller, const Can_ControllerConfigType* Config
 {\r
     uint8   MsgNr;\r
     uint32  ErrCounter;\r
+    imask_t state;\r
 \r
 #if(CAN_DEV_ERROR_DETECT == STD_ON)\r
     if(Config == NULL)\r
@@ -581,7 +581,7 @@ void Can_InitController(uint8 Controller, const Can_ControllerConfigType* Config
     }\r
 #endif \r
 \r
-    imask_t i_state = McuE_EnterCriticalSection();\r
+    Irq_Save(state);\r
 \r
     ErrCounter = CAN_TIMEOUT_DURATION;\r
     \r
@@ -626,7 +626,7 @@ void Can_InitController(uint8 Controller, const Can_ControllerConfigType* Config
     /* Clear CCE Bit */\r
     CanRegs[Controller]->CTL &= ~0x00000040;\r
 \r
-    McuE_ExitCriticalSection(i_state);\r
+    Irq_Restore(state);\r
 }\r
 \r
 \r
@@ -804,6 +804,7 @@ Can_ReturnType Can_Write(Can_Arc_HTHType Hth, Can_PduType *PduInfo)
     Can_PduType           *CurPduArrayPtr;\r
     uint8                 *CurCancelRqstPtr;\r
     uint8                 *CurTxRqstPtr;\r
+    imask_t state;\r
 \r
     CurSduPtr       = PduInfo->sdu;\r
     \r
@@ -876,7 +877,7 @@ Can_ReturnType Can_Write(Can_Arc_HTHType Hth, Can_PduType *PduInfo)
     DCAN_WAIT_UNTIL_NOT_BUSY(ControllerId, IfRegId);\r
 \r
     // We cannot allow an interrupt or other task to play with the COM, MC and ARB registers here.\r
-    imask_t i_state = McuE_EnterCriticalSection();\r
+    Irq_Save(state);\r
 \r
 \r
     /* Set NewDat, TxIE (dep on ControllerConfig), TxRqst, EoB and DLC */\r
@@ -885,10 +886,10 @@ Can_ReturnType Can_Write(Can_Arc_HTHType Hth, Can_PduType *PduInfo)
                                                                                        | (0x000F & PduInfo->length) // Set DLC\r
                                                                                        | (CanControllerConfigData[ControllerId].CanTxProcessing << 1); // Tx confirmation interrupt enabled\r
 \r
-\r
     /* Set ArbitrationRegister */\r
     CanRegs[ControllerId]->IFx[IfRegId].ARB = ArbRegValue;\r
 \r
+\r
     /* Set Databytes */\r
     for(DataByteIndex = 0; DataByteIndex < PduInfo->length; DataByteIndex++)\r
     {\r
@@ -905,7 +906,7 @@ Can_ReturnType Can_Write(Can_Arc_HTHType Hth, Can_PduType *PduInfo)
     \r
     IfRegId ^= 1;\r
        \r
-    McuE_ExitCriticalSection(i_state);\r
+    Irq_Restore(state);\r
     return CAN_OK;\r
 }\r
 \r