]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Added Jonte changes
authormahi <devnull@localhost>
Wed, 22 Feb 2012 08:10:12 +0000 (09:10 +0100)
committermahi <devnull@localhost>
Wed, 22 Feb 2012 08:10:12 +0000 (09:10 +0100)
arch/ppc/mpc55xx/drivers/Can.c

index 524c3109d3d901944b45d408c48cb7de6d011070..34a394227618119174da7c640041bfd4b8b5ca00 100644 (file)
 \r
 /** @reqSettings DEFAULT_SPECIFICATION_REVISION=3.1.5 */\r
 \r
-/*\r
- * Generator TODO:\r
- * - Generate the Rx, Tx masks in as const\r
- * - CLK_SRC\r
- *   Not avail: MPC5606S\r
- *   Avail:     MPC5516 (XOSC, See 3.3)\r
+/* Code TODO\r
+ * - REMOVE1\r
+ * - REMOVE2\r
+ * - Enable SOFT_RESET to guarantee that we get the same state every time\r
+ *   (do in Can_InitController ?)\r
  */\r
 \r
-\r
 /* ----------------------------[information]----------------------------------*/\r
 /*\r
  * Author: mahi\r
  *   **) The flexcan hardware cannot detect wakeup (at least now the ones\r
  *       this driver supports)\r
  *\r
- * Devices\r
- *   MPC560x\r
- *   MPC551x\r
- *   MPC5567\r
- *   MPC5668\r
+ *   Devices    CLK_SRC\r
+ *   ----------------------------------------------\r
+ *   MPC5604B   ?\r
+ *   MPC5606S   Only sys-clk it seems\r
+ *   MPC551x    Both sys-clk and XOSC, See 3.3\r
+ *   MPC5567    ?\r
+ *   MPC5668    ?\r
  *\r
  *   MPC5554 is NOT supported (no individual mask)\r
  *\r
@@ -544,7 +544,7 @@ static void Can_Isr_Rx(Can_UnitType *uPtr)
     while (iFlag & uPtr->Can_Arc_RxMbMask) {\r
 \r
         /* Find mailbox */\r
-        mbNr = ilog2_64(iFlag);\r
+        mbNr = ilog2_64(iFlag & uPtr->Can_Arc_RxMbMask);\r
         iFlag ^= 1ull << mbNr;\r
 \r
         /* Check for FIFO interrupt */\r
@@ -661,6 +661,7 @@ static void Can_Isr(int controller )
 \r
 static void Can_BuildMaps(Can_UnitType *uPtr)\r
 {\r
+       (void)uPtr;\r
 #if 0\r
     uint8_t mbNr = 8;\r
     uint8_t fifoNr = 0;\r
@@ -751,10 +752,12 @@ void Can_Init(const Can_ConfigType *config)
 \r
         Can_BuildMaps(unitPtr);\r
 \r
+        /* REMOVE2: Can_InitController() should probably not be called from Can_Init() at all\r
+         * This is done by CanIf */\r
         Can_InitController(cfgCtrlPtr->CanControllerId,unitPtr->cfgCtrlPtr);\r
 \r
         switch (cfgCtrlPtr->CanControllerId) {\r
-#if defined(CFG_MPC5606X)\r
+#if defined(CFG_MPC560X)\r
         case CAN_CTRL_A:\r
         ISR_INSTALL_ISR2( "Can", Can_A_BusOff, FLEXCAN_0_ESR_BOFF_INT, 2, 0);\r
         ISR_INSTALL_ISR2( "Can", Can_A_Err, FLEXCAN_0_ESR_ERR_INT, 2, 0 );\r
@@ -835,8 +838,7 @@ void Can_Init(const Can_ConfigType *config)
         ISR_INSTALL_ISR2( "Can", Can_E_Isr, FLEXCAN_E_IFLAG1_BUF31_16I, 2, 0 );\r
         ISR_INSTALL_ISR2( "Can", Can_A_Isr, FLEXCAN_E_IFLAG1_BUF63_32I, 2, 0 );\r
         break;\r
-#endif\r
-#if defined(CFG_MPC5516) || defined(CFG_MPC5517)\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
@@ -844,6 +846,7 @@ void Can_Init(const Can_ConfigType *config)
         ISR_INSTALL_ISR2( "Can", Can_F_Isr, FLEXCAN_F_IFLAG1_BUF31_16I, 2, 0 );\r
         ISR_INSTALL_ISR2( "Can", Can_A_Isr, FLEXCAN_F_IFLAG1_BUF63_32I, 2, 0 );\r
         break;\r
+       #endif\r
 #endif\r
         default:\r
             assert(0);\r
@@ -934,7 +937,7 @@ void Can_InitController(uint8 controller,
     canHw->MCR.B.MAXMB = cfgCtrlPtr->Can_Arc_MailboxMax - 1;\r
 \r
 \r
-    /* Disable selfreception, if not loopback  */\r
+    /* Disable self-reception, if not loopback  */\r
     canHw->MCR.B.SRXDIS = (config->Can_Arc_Flags & CAN_CTRL_LOOPBACK) ? 0 : 1;\r
 \r
     /* Clock calucation\r
@@ -1023,7 +1026,15 @@ void Can_InitController(uint8 controller,
     }\r
 \r
     canUnit->mbTxFree = canUnit->Can_Arc_TxMbMask;\r
+    /* @req 3.1.5/CAN260 */\r
     canUnit->state = CANIF_CS_STOPPED;\r
+\r
+    // Release FREEZE to be able to write to mem mapped registers ( see 25.4.8.1 )\r
+\r
+    /* REMOVE1: Remove this cause CAN260 says it should not be able to communicate */\r
+    canHw->MCR.B.FRZ = 0;\r
+    canHw->MCR.B.HALT = 0;\r
+\r
     Can_EnableControllerInterrupts(cId);\r
 \r
     return;\r
@@ -1042,12 +1053,12 @@ Can_ReturnType Can_SetControllerMode(uint8 controller,
     imask_t state;\r
     Can_ReturnType rv = CAN_OK;\r
 \r
-    Can_UnitType *canUnit = CTRL_TO_UNIT_PTR(controller);\r
-\r
     /** @req 3.1.5/CAN198 */\r
-    VALIDATE( (canUnit->state!=CANIF_CS_UNINIT), 0x3, CAN_E_UNINIT );\r
+    VALIDATE( (Can_Global.initRun == CAN_READY), CAN_SETCONTROLLERMODE_SERVICE_ID, CAN_E_UNINIT );\r
+    Can_UnitType *canUnit = CTRL_TO_UNIT_PTR(controller);\r
+    VALIDATE( (canUnit->state!=CANIF_CS_UNINIT), CAN_SETCONTROLLERMODE_SERVICE_ID, CAN_E_UNINIT );\r
     /** @req 3.1.5/CAN199 */\r
-    VALIDATE( VALID_CONTROLLER(controller), 0x3, CAN_E_PARAM_CONTROLLER );\r
+    VALIDATE( VALID_CONTROLLER(controller), CAN_SETCONTROLLERMODE_SERVICE_ID, CAN_E_PARAM_CONTROLLER );\r
 \r
     canHw = canUnit->hwPtr;\r
 \r
@@ -1092,6 +1103,7 @@ void Can_DisableControllerInterrupts(uint8 controller)
     /** !req 3.1.5/CAN204 */\r
     /** !req 3.1.5/CAN292 */\r
 \r
+       VALIDATE_NO_RV( (Can_Global.initRun == CAN_READY), CAN_DISABLECONTROLLERINTERRUPTS_SERVICE_ID, CAN_E_UNINIT );\r
     Can_UnitType *canUnit = CTRL_TO_UNIT_PTR(controller);\r
     flexcan_t *canHw;\r
     imask_t state;\r
@@ -1139,8 +1151,9 @@ void Can_EnableControllerInterrupts(uint8 controller)
     flexcan_t *canHw;\r
     imask_t state;\r
 \r
-    canUnit = CTRL_TO_UNIT_PTR(controller);\r
     /** @req 3.1.5/CAN209 */\r
+       VALIDATE_NO_RV( (Can_Global.initRun == CAN_READY), CAN_ENABLECONTROLLERINTERRUPTS_SERVICE_ID, CAN_E_UNINIT );\r
+    canUnit = CTRL_TO_UNIT_PTR(controller);\r
     VALIDATE_NO_RV( (canUnit->state!=CANIF_CS_UNINIT), CAN_ENABLECONTROLLERINTERRUPTS_SERVICE_ID, CAN_E_UNINIT );\r
 \r
     /** @req 3.1.5/CAN210 */\r
@@ -1291,6 +1304,7 @@ void Can_Cbk_CheckWakeup( uint8 controller ) {
     /** !req 3.1.5/CAN363 */\r
 \r
     /* NOT SUPPORTED */\r
+       (void)controller;\r
 }\r
 \r
 \r
@@ -1370,8 +1384,11 @@ Can_Arc_ProcessType Can_Arc_ProcessingMode( uint8 controller ) {
 \r
 void Can_Arc_GetStatistics(uint8 controller, Can_Arc_StatisticsType *stats)\r
 {\r
-    Can_UnitType *canUnit = CTRL_TO_UNIT_PTR(controller);\r
-    *stats = canUnit->stats;\r
+       if(Can_Global.initRun == CAN_READY)\r
+       {\r
+               Can_UnitType *canUnit = CTRL_TO_UNIT_PTR(controller);\r
+               *stats = canUnit->stats;\r
+       }\r
 }\r
 #endif\r
 \r