1 /* -------------------------------- Arctic Core ------------------------------
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
6 * This source code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by the
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * -------------------------------- Arctic Core ------------------------------*/
27 #include "CanIf_Cbk.h"
33 #if defined(USE_CANTP)
34 #include "CanTp_Cbk.h"
37 #if defined(USE_CANNM)
42 // TODO: Include upper layer functions, See CANIF208 and CANIF233
43 #include "PduR_CanIf.h"
48 #include "CanNm_Cbk.h"
49 #include "CanTp_Cbk.h"
52 #if ( CANIF_DEV_ERROR_DETECT == STD_ON )
53 #define VALIDATE(_exp,_api,_err ) \
55 Det_ReportError(MODULE_ID_CANIF, 0, _api, _err); \
59 #define VALIDATE_NO_RV(_exp,_api,_err ) \
61 Det_ReportError(MODULE_ID_CANIF, 0, _api, _err); \
64 #undef DET_REPORTERROR
65 #define DET_REPORTERROR(_x,_y,_z,_q) Det_ReportError(_x, _y, _z, _q)
68 #define VALIDATE(_exp,_api,_err )
69 #define VALIDATE_NO_RV(_exp,_api,_err )
70 #define DET_REPORTERROR(_x,_y,_z,_q)
74 // Helper to get the Can Controller refered to by a CanIf Channel
75 #define ARC_GET_CHANNEL_CONTROLLER(_channel) \
76 CanIf_ConfigPtr->Arc_ChannelToControllerMap[channel]
78 /* Global configure */
79 static const CanIf_ConfigType *CanIf_ConfigPtr;
81 // Struct of controller private data.
84 CanIf_ControllerModeType ControllerMode;
85 CanIf_ChannelGetModeType PduMode;
86 } CanIf_ChannelPrivateType;
91 CanIf_ChannelPrivateType channelData[CANIF_CHANNEL_CNT];
94 void CanIf_PreInit_InitController(uint8 Controller, uint8 ConfigurationIndex);
96 static CanIf_Arc_ChannelIdType CanIf_Arc_FindHrhChannel( Can_Arc_HRHType hrh )
98 const CanIf_InitHohConfigType *hohConfig;
99 const CanIf_HrhConfigType *hrhConfig;
101 // foreach(hoh){ foreach(hrh in hoh) {} }
102 hohConfig = CanIf_ConfigPtr->InitConfig->CanIfHohConfigPtr;
108 hrhConfig = hohConfig->CanIfHrhConfig;
113 if (hrhConfig->CanIfHrhIdSymRef == hrh)
114 return hrhConfig->CanIfCanControllerHrhIdRef;
115 } while(!hrhConfig->CanIf_Arc_EOL);
116 } while(!hohConfig->CanIf_Arc_EOL);
118 DET_REPORTERROR(MODULE_ID_CANIF, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);
124 CanIf_GlobalType CanIf_Global;
126 void CanIf_Init(const CanIf_ConfigType *ConfigPtr)
128 VALIDATE_NO_RV(ConfigPtr != 0, CANIF_INIT_ID, CANIF_E_PARAM_POINTER); // Only PostBuild case supported
130 CanIf_ConfigPtr = ConfigPtr;
132 for (uint8 i = 0; i < CANIF_CHANNEL_CNT; i++)
134 CanIf_Global.channelData[i].ControllerMode = CANIF_CS_STOPPED;
135 CanIf_Global.channelData[i].PduMode = CANIF_GET_OFFLINE;
136 CanIf_PreInit_InitController(i, CanIf_ConfigPtr->Arc_ChannelDefaultConfIndex[i]);
140 CanIf_Global.initRun = TRUE;
146 //-------------------------------------------------------------------
148 * Controller :: CanIf_Arc_ChannelIdType (CanIf-specific id to abstract from Can driver/controllers)
149 * ConfigurationIndex :: CanIf_Arc_ConfigurationIndexType
152 void CanIf_InitController(uint8 Controller, uint8 ConfigurationIndex)
154 // We call this a CanIf channel. Hopefully makes it easier to follow.
155 CanIf_Arc_ChannelIdType channel = Controller;
157 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_INIT_CONTROLLER_ID, CANIF_E_UNINIT );
158 VALIDATE_NO_RV(channel < CANIF_CHANNEL_CNT, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
159 VALIDATE_NO_RV(ConfigurationIndex < CANIF_CHANNEL_CONFIGURATION_CNT, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_POINTER);
161 #if (CANIF_DEV_ERROR_DETECT == STD_ON)
162 CanIf_ControllerModeType mode;
164 if (CanIf_GetControllerMode(channel, &mode) == E_OK)
166 VALIDATE_NO_RV((mode != CANIF_CS_UNINIT), CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE );
170 VALIDATE_NO_RV(FALSE, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE);
174 if (CanIf_GetControllerMode(channel, &mode) == E_OK)
176 if (mode == CANIF_CS_STARTED)
178 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED); // CANIF092
180 else if (mode != CANIF_CS_STOPPED)
182 VALIDATE_NO_RV(FALSE, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE); // CANIF092
186 // CANIF293: ..Subsequently the CAN Interface calls the corresponding
187 // CAN Driver initialization services.
189 // CANIF066: The CAN Interface has access to the CAN Driver configuration data. All
190 // public CAN Driver configuration data are described in [8] Specification of CAN Driver.
192 // Grab the configuration from the Can Controller
193 const Can_ControllerConfigType *canConfig;
194 const CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(channel);
196 // Validate that the configuration at the index match the right channel
197 VALIDATE_NO_RV(CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfControllerIdRef == channel, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
199 canConfig = CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfInitControllerRef;
201 // Validate that the CanIfControllerConfig points to configuration for the right Can Controller
202 VALIDATE_NO_RV(canConfig->CanControllerId == canControllerId, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
204 Can_InitController(canControllerId, canConfig);
206 // Set mode to stopped
207 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED);
210 void CanIf_PreInit_InitController(uint8 Controller, uint8 ConfigurationIndex){
211 // We call this a CanIf channel. Hopefully makes it easier to follow.
212 CanIf_Arc_ChannelIdType channel = Controller;
214 VALIDATE_NO_RV(channel < CANIF_CHANNEL_CNT, CANIF_INIT_ID, CANIF_E_PARAM_CONTROLLER);
215 VALIDATE_NO_RV(ConfigurationIndex < CANIF_CHANNEL_CONFIGURATION_CNT, CANIF_INIT_ID, CANIF_E_PARAM_POINTER);
218 const CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(channel);
219 // Validate that the configuration at the index match the right channel
220 VALIDATE_NO_RV(CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfControllerIdRef == channel, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
221 const Can_ControllerConfigType *canConfig = CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfInitControllerRef;
222 // Validate that the CanIfControllerConfig points to configuration for the right Can Controller
223 VALIDATE_NO_RV(canConfig->CanControllerId == canControllerId, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
225 Can_InitController(canControllerId, canConfig);
228 //-------------------------------------------------------------------
230 Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
231 CanIf_ControllerModeType ControllerMode)
233 // We call this a CanIf channel. Hopefully makes it easier to follow.
234 CanIf_Arc_ChannelIdType channel = Controller;
237 CanIf_ControllerModeType oldMode;
239 VALIDATE( CanIf_Global.initRun, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );
240 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );
242 oldMode = CanIf_Global.channelData[channel].ControllerMode;
244 if (oldMode == CANIF_CS_UNINIT)
246 VALIDATE(FALSE, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_UNINIT); // See figure 32, 33
249 CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(Controller);
250 switch (ControllerMode)
252 case CANIF_CS_STARTED: // Figure 32
257 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
259 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
266 CanIf_SetPduMode(channel, CANIF_SET_ONLINE);
267 if (Can_SetControllerMode(canControllerId, CAN_T_START) == CAN_NOT_OK)
269 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STARTED;
273 case CANIF_CS_SLEEP: // Figure 33
276 case CANIF_CS_STARTED:
277 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
279 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
282 // Just fall through for other cases
286 if (Can_SetControllerMode(canControllerId, CAN_T_SLEEP) == CAN_NOT_OK)
288 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_SLEEP;
291 case CANIF_CS_STOPPED:
296 if (Can_SetControllerMode(canControllerId, CAN_T_WAKEUP) == CAN_NOT_OK)
300 // Just fall through for other cases
304 CanIf_SetPduMode(channel, CANIF_SET_OFFLINE);
305 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
307 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
310 case CANIF_CS_UNINIT:
317 //-------------------------------------------------------------------
319 Std_ReturnType CanIf_GetControllerMode(uint8 Controller,
320 CanIf_ControllerModeType *ControllerModePtr)
322 // We call this a CanIf channel. Hopefully makes it easier to follow.
323 CanIf_Arc_ChannelIdType channel = Controller;
325 VALIDATE(CanIf_Global.initRun, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );
326 VALIDATE(channel < CANIF_CHANNEL_CNT, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );
327 VALIDATE(ControllerModePtr != NULL, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_POINTER );
329 *ControllerModePtr = CanIf_Global.channelData[channel].ControllerMode;
334 //-------------------------------------------------------------------
336 * Matches a Tx PDU id agaist the ones that are in the database.
338 * @returns Ptr a TxPdu
340 static const CanIf_TxPduConfigType * CanIf_FindTxPduEntry(PduIdType id)
342 if (id >= CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds) {
345 return &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[id];
348 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)
350 if (entry->CanIfTxPduId == id)
361 //-------------------------------------------------------------------
363 Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId,
364 const PduInfoType *PduInfoPtr)
367 const CanIf_TxPduConfigType *txEntry;
368 CanIf_ControllerModeType csMode;
369 CanIf_ChannelGetModeType pduMode;
371 VALIDATE(CanIf_Global.initRun, CANIF_TRANSMIT_ID, CANIF_E_UNINIT );
372 VALIDATE((PduInfoPtr != 0), CANIF_TRANSMIT_ID, CANIF_E_PARAM_POINTER );
374 // Get the controller from L-PDU handle
375 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
379 VALIDATE(FALSE, CANIF_TRANSMIT_ID, CANIF_E_INVALID_TXPDUID);
383 CanIf_Arc_ChannelIdType channel = txEntry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef;
385 // Get and verify the controller mode
386 if (CanIf_GetControllerMode(channel, &csMode) == E_NOT_OK)
389 if (csMode != CANIF_CS_STARTED) // CANIF_161
392 // Get and verify the PDU channel mode control
393 if (CanIf_GetPduMode(channel, &pduMode) == E_NOT_OK)
396 if ((pduMode != CANIF_GET_TX_ONLINE) && (pduMode != CANIF_GET_ONLINE))
399 canPdu.id = txEntry->CanIfCanTxPduIdCanId;
401 canPdu.length = PduInfoPtr->SduLength;
402 canPdu.sdu = PduInfoPtr->SduDataPtr;
403 canPdu.swPduHandle = CanTxPduId;
405 Can_ReturnType rVal = Can_Write(txEntry->CanIfCanTxPduHthRef->CanIfHthIdSymRef, &canPdu);
407 if (rVal == CAN_NOT_OK)
410 if (rVal == CAN_BUSY) // CANIF 082, CANIF 161
412 // Tx buffering not supported so just return.
419 //-------------------------------------------------------------------
421 #if ( CANIF_READRXPDU_DATA_API == STD_ON )
422 Std_ReturnType CanIf_ReadRxPduData(PduIdType CanRxPduId,
423 PduInfoType *PduInfoPtr)
425 VALIDATE(FALSE, CANIF_READTXPDUDATA_ID, CANIF_E_NOK_NOSUPPORT);
426 VALIDATE(CanIf_Global.initRun == STD_ON, CANIF_READTXPDUDATA_ID, CANIF_E_UNINIT );
427 VALIDATE(PduInfoPtr != 0, CANIF_READTXPDUDATA_ID, CANIF_E_PARAM_POINTER );
429 // This function is not supported
435 //-------------------------------------------------------------------
437 #if ( CANIF_READTXPDU_NOTIFY_STATUS_API == STD_ON )
438 CanIf_NotifStatusType CanIf_ReadTxNotifStatus(PduIdType CanTxPduId)
440 const CanIf_TxPduConfigType *txEntry;
441 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_NOK_NOSUPPORT);
442 VALIDATE(CanIf_Global.initRun, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_UNINIT );
444 // Get the controller from L-PDU handle
445 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
449 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_INVALID_TXPDUID);
450 return CANIF_NO_NOTIFICATION;
453 if (txEntry->CanIfReadTxPduNotifyStatus == FALSE)
455 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_INVALID_TXPDUID);
456 return CANIF_NO_NOTIFICATION;
459 // This function is not supported
461 return CANIF_NO_NOTIFICATION;
465 //-------------------------------------------------------------------
467 #if ( CANIF_READRXPDU_NOTIFY_STATUS_API == STD_ON )
468 CanIf_NotifStatusType CanIf_ReadRxNotifStatus(PduIdType CanRxPduId)
470 VALIDATE(FALSE, CANIF_READRXNOTIFSTATUS_ID, CANIF_E_NOK_NOSUPPORT);
471 VALIDATE(CanIf_Global.initRun, CANIF_READRXNOTIFSTATUS_ID, CANIF_E_UNINIT );
473 return CANIF_NO_NOTIFICATION;
477 //-------------------------------------------------------------------
479 Std_ReturnType CanIf_SetPduMode(uint8 Controller,
480 CanIf_ChannelSetModeType PduModeRequest)
482 // We call this a CanIf channel. Hopefully makes it easier to follow.
483 CanIf_Arc_ChannelIdType channel = Controller;
485 VALIDATE( CanIf_Global.initRun, CANIF_SETPDUMODE_ID, CANIF_E_UNINIT );
486 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );
488 CanIf_ChannelGetModeType oldMode = CanIf_Global.channelData[channel].PduMode;
490 switch(PduModeRequest)
492 case CANIF_SET_OFFLINE:
493 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
495 case CANIF_SET_RX_OFFLINE:
496 if (oldMode == CANIF_GET_RX_ONLINE)
497 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
498 else if (oldMode == CANIF_GET_ONLINE)
499 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
500 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
501 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
503 // Other oldmodes don't care
505 case CANIF_SET_RX_ONLINE:
506 if (oldMode == CANIF_GET_OFFLINE)
507 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
508 else if (oldMode == CANIF_GET_TX_ONLINE)
509 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
510 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
511 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
513 // Other oldmodes don't care
515 case CANIF_SET_TX_OFFLINE:
516 if (oldMode == CANIF_GET_TX_ONLINE)
517 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
518 else if (oldMode == CANIF_GET_ONLINE)
519 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
520 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
521 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
522 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
523 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
525 // Other oldmodes don't care
527 case CANIF_SET_TX_ONLINE:
528 if (oldMode == CANIF_GET_OFFLINE)
529 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
530 else if (oldMode == CANIF_GET_RX_ONLINE)
531 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
532 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
533 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
534 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
535 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
537 // Other oldmodes don't care
539 case CANIF_SET_ONLINE:
540 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
543 case CANIF_SET_TX_OFFLINE_ACTIVE:
544 if (oldMode == CANIF_GET_OFFLINE)
545 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
546 else if (oldMode == CANIF_GET_RX_ONLINE)
547 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
548 else if (oldMode == CANIF_GET_TX_ONLINE)
549 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
550 else if (oldMode == CANIF_GET_ONLINE)
551 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
553 // Other oldmodes don't care
560 //-------------------------------------------------------------------
562 Std_ReturnType CanIf_GetPduMode(uint8 Controller,
563 CanIf_ChannelGetModeType *PduModePtr)
565 // We call this a CanIf channel. Hopefully makes it easier to follow.
566 CanIf_Arc_ChannelIdType channel = Controller;
568 VALIDATE( CanIf_Global.initRun, CANIF_GETPDUMODE_ID, CANIF_E_UNINIT );
569 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_GETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );
571 *PduModePtr = CanIf_Global.channelData[channel].PduMode;
576 #if ( CANIF_SETDYNAMICTXID_API == STD_ON )
577 void CanIf_SetDynamicTxId(PduIdType CanTxPduId, Can_IdType CanId)
579 const CanIf_TxPduConfigType *txEntry;
580 VALIDATE(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_NOK_NOSUPPORT);
581 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_SETDYNAMICTX_ID, CANIF_E_UNINIT );
583 // Get the controller from L-PDU handle
584 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
588 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_INVALID_TXPDUID);
592 // Check that this is a dymanic PDU
593 if (txEntry->CanIfCanTxPduType != ARC_PDU_TYPE_DYNAMIC)
595 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_INVALID_TXPDUID);
599 // Check that this is an extended or standard id
600 if (((CanId & 0x80000000) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_29)) ||
601 (((CanId & 0x80000000) == 0) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_11)))
604 //txEntry->CanIfCanTxPduIdCanId = CanId; // TODO How do we fix this from a const pointer
610 // Inavlid Canid to configuration
611 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_PARAM_CANID);
616 #if ( CANIF_TRANSCEIVER_API == STD_ON )
617 Std_ReturnType CanIf_SetTransceiverMode(uint8 Transceiver,
618 CanIf_TransceiverModeType TransceiverMode)
620 VALIDATE(FALSE, CANIF_SET_TRANSCEIVERMODE_ID, CANIF_E_NOK_NOSUPPORT);
626 Std_ReturnType CanIf_GetTransceiverMode(uint8 Transceiver,
627 CanIf_TransceiverModeType *TransceiverModePtr)
629 VALIDATE(FALSE, CANIF_GET_TRANSCEIVERMODE_ID, CANIF_E_NOK_NOSUPPORT);
635 Std_ReturnType CanIf_GetTrcvWakeupReason(uint8 Transceiver,
636 CanIf_TrcvWakeupReasonType *TrcvWuReasonPtr)
638 VALIDATE(FALSE, CANIF_GET_TRCVMODEREASON_ID, CANIF_E_NOK_NOSUPPORT);
644 Std_ReturnType CanIf_SetTransceiverWakeupMode(uint8 Transceiver,
645 CanIf_TrcvWakeupModeType *TrcvWakeupMode)
647 VALIDATE(FALSE, CANIF_SET_TRANSCEIVERWAKEMODE_ID, CANIF_E_NOK_NOSUPPORT);
654 #if ( CANIF_WAKEUP_EVENT_API == STD_ON )
655 Std_ReturnType CanIf_CheckWakeup(EcuM_WakeupSourceType WakeupSource)
657 VALIDATE(FALSE, CANIF_CHECKWAKEUP_ID, CANIF_E_NOK_NOSUPPORT);
663 Std_ReturnType CanIf_CheckValidation(EcuM_WakeupSourceType WakeupSource)
665 VALIDATE(FALSE, CANIF_CHECKVALIDATION_ID, CANIF_E_NOK_NOSUPPORT);
673 * Callback interface from driver
675 void CanIf_TxConfirmation(PduIdType canTxPduId)
677 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_TXCONFIRMATION_ID, CANIF_E_UNINIT)
678 VALIDATE_NO_RV(canTxPduId < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds, CANIF_TXCONFIRMATION_ID, CANIF_E_PARAM_LPDU);
680 const CanIf_TxPduConfigType* entry =
681 &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[canTxPduId];
683 /* Find the CAN id in the TxPduList */
685 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)
687 if (entry->CanIfTxPduId == canTxPduId)
690 if (entry->CanIfUserTxConfirmation != NULL)
692 CanIf_ChannelGetModeType mode;
693 CanIf_GetPduMode(entry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef, &mode);
694 if ((mode == CANIF_GET_TX_ONLINE) || (mode == CANIF_GET_ONLINE)
695 || (mode == CANIF_GET_OFFLINE_ACTIVE) || (mode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE) )
697 entry->CanIfUserTxConfirmation(entry->CanIfTxPduId); /* CANIF053 */
707 // Did not find the PDU, something is wrong
711 void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
712 const uint8 *CanSduPtr)
714 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_RXINDICATION_ID, CANIF_E_UNINIT);
715 VALIDATE_NO_RV(CanSduPtr != NULL, CANIF_RXINDICATION_ID, CANIF_E_PARAM_POINTER);
717 /* Check PDU mode before continue processing */
718 CanIf_ChannelGetModeType mode;
719 CanIf_Arc_ChannelIdType channel = CanIf_Arc_FindHrhChannel(Hrh);
720 if (channel == -1) // Invalid HRH
725 if (CanIf_GetPduMode(channel, &mode) == E_OK)
727 if (mode == CANIF_GET_OFFLINE || mode == CANIF_GET_TX_ONLINE ||
728 mode == CANIF_GET_OFFLINE_ACTIVE)
730 // Receiver path is disabled so just drop it
736 return; // No mode so just return
739 const CanIf_RxPduConfigType *entry = CanIf_ConfigPtr->InitConfig->CanIfRxPduConfigPtr;
741 /* Find the CAN id in the RxPduList */
742 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanRxPduIds; i++)
744 if (entry->CanIfCanRxPduHrhRef->CanIfHrhIdSymRef == Hrh)
746 // Software filtering
747 if (entry->CanIfCanRxPduHrhRef->CanIfHrhType == CAN_ARC_HANDLE_TYPE_BASIC)
749 if (entry->CanIfCanRxPduHrhRef->CanIfSoftwareFilterHrh)
751 if (entry->CanIfSoftwareFilterType == CANIF_SOFTFILTER_TYPE_MASK)
753 if ((CanId & entry->CanIfCanRxPduCanIdMask ) ==
754 ( entry->CanIfCanRxPduCanId & entry->CanIfCanRxPduCanIdMask))
756 // We found a pdu so call higher layers
761 continue; // Not a supported filter type, so just drop the frame
766 DET_REPORTERROR(MODULE_ID_CAN, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);
767 continue; // Not a supported filter type, so just drop the frame
772 #if (CANIF_DLC_CHECK == STD_ON)
773 if (CanDlc < entry->CanIfCanRxPduDlc)
775 VALIDATE_NO_RV(FALSE, CANIF_RXINDICATION_ID, CANIF_E_PARAM_DLC);
780 switch (entry->CanIfRxUserType)
782 case CANIF_USER_TYPE_CAN_SPECIAL:
784 ((CanIf_FuncTypeCanSpecial) (entry->CanIfUserRxIndication))(entry->CanIfCanRxPduId,
785 CanSduPtr, CanDlc, CanId);
790 case CANIF_USER_TYPE_CAN_NM:
791 case CANIF_USER_TYPE_CAN_PDUR:
792 // Send Can frame to PDU router
793 PduR_CanIfRxIndication(entry->CanIfCanRxPduId,CanSduPtr);
797 case CANIF_USER_TYPE_CAN_TP:
798 // Send Can frame to CAN TP
799 #if defined(USE_CANTP)
801 PduInfoType CanTpRxPdu;
802 CanTpRxPdu.SduLength = CanDlc;
803 CanTpRxPdu.SduDataPtr = (uint8 *)CanSduPtr;
804 CanTp_RxIndication(entry->CanIfCanRxPduId, &CanTpRxPdu);
815 // Did not find the PDU, something is wrong
816 VALIDATE_NO_RV(FALSE, CANIF_RXINDICATION_ID, CANIF_E_PARAM_LPDU);
819 #if ( CANIF_TRANSMIT_CANCELLATION == STD_ON )
820 void CanIf_CancelTxConfirmation(const Can_PduType *PduInfoPtr)
822 VALIDATE(FALSE, CANIF_CANCELTXCONFIRMATION_ID, CANIF_E_NOK_NOSUPPORT);
823 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_CANCELTXCONFIRMATION_ID, CANIF_E_UNINIT);
824 VALIDATE_NO_RV(PduInfoPtr != NULL, CANIF_RXINDICATION_ID, CANIF_E_PARAM_POINTER);
826 const CanIf_TxPduConfigType *entry =
827 CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr;
831 // Did not find the PDU, something is wrong
832 VALIDATE_NO_RV(FALSE, CANIF_TXCONFIRMATION_ID, CANIF_E_PARAM_LPDU);
836 void CanIf_ControllerBusOff(uint8 Controller)
838 // We call this a CanIf channel. Hopefully makes it easier to follow.
839 CanIf_Arc_ChannelIdType channel = Controller;
841 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_UNINIT );
842 VALIDATE_NO_RV( Controller < CANIF_CHANNEL_CNT, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_PARAM_CONTROLLER );
844 // According to figure 35 in canif spec this should be done in
845 // Can driver but it is better to do it here
846 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED);
848 if (CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification != NULL)
850 CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification(channel);
854 void CanIf_SetWakeupEvent(uint8 Controller)
856 // We call this a CanIf channel. Hopefully makes it easier to follow.
857 CanIf_Arc_ChannelIdType channel = Controller;
859 VALIDATE_NO_RV(FALSE, CANIF_SETWAKEUPEVENT_ID, CANIF_E_NOK_NOSUPPORT);
860 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_SETWAKEUPEVENT_ID, CANIF_E_UNINIT );
861 VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_SETWAKEUPEVENT_ID, CANIF_E_PARAM_CONTROLLER );
866 void CanIf_Arc_Error(uint8 Controller, Can_Arc_ErrorType Error)
868 // We call this a CanIf channel. Hopefully makes it easier to follow.
869 CanIf_Arc_ChannelIdType channel = Controller;
871 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_ARCERROR_ID, CANIF_E_UNINIT );
872 VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_ARCERROR_ID, CANIF_E_PARAM_CONTROLLER );
874 if (CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton != NULL)
876 CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton(Controller, Error);