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"
30 // Added by Mattias 2008-11-18
34 #if defined(USE_CANTP)
35 #include "CanTp_Cbk.h"
39 // TODO: Include upper layer functions, See CANIF208 and CANIF233
40 #include "PduR_CanIf.h"
45 #include "CanNm_Cbk.h"
46 #include "CanTp_Cbk.h"
49 #if ( CANIF_DEV_ERROR_DETECT == STD_ON )
50 #define VALIDATE(_exp,_api,_err ) \
52 Det_ReportError(MODULE_ID_CANIF, 0, _api, _err); \
56 #define VALIDATE_NO_RV(_exp,_api,_err ) \
58 Det_ReportError(MODULE_ID_CANIF, 0, _api, _err); \
61 #undef DET_REPORTERROR
62 #define DET_REPORTERROR(_x,_y,_z,_q) Det_ReportError(_x, _y, _z, _q)
65 #define VALIDATE(_exp,_api,_err )
66 #define VALIDATE_NO_RV(_exp,_api,_err )
67 #define DET_REPORTERROR(_x,_y,_z,_q)
71 // Helper to get the Can Controller refered to by a CanIf Channel
72 #define ARC_GET_CHANNEL_CONTROLLER(_channel) \
73 CanIf_ConfigPtr->Arc_ChannelToControllerMap[channel]
75 /* Global configure */
76 static const CanIf_ConfigType *CanIf_ConfigPtr;
78 // Struct of controller private data.
81 CanIf_ControllerModeType ControllerMode;
82 CanIf_ChannelGetModeType PduMode;
83 } CanIf_ChannelPrivateType;
88 CanIf_ChannelPrivateType channelData[CANIF_CHANNEL_CNT];
91 void CanIf_PreInit_InitController(uint8 Controller, uint8 ConfigurationIndex);
93 static CanIf_Arc_ChannelIdType CanIf_Arc_FindHrhChannel( Can_Arc_HRHType hrh )
95 const CanIf_HrhConfigType *hrhConfig;
97 hrhConfig = CanIf_ConfigPtr->InitConfig->CanIfHohConfigPtr->CanIfHrhConfig;
103 if (hrhConfig->CanIfHrhIdSymRef == hrh)
104 return hrhConfig->CanIfCanControllerHrhIdRef;
105 } while(!hrhConfig->CanIf_Arc_EOL);
107 DET_REPORTERROR(MODULE_ID_CANIF, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);
113 CanIf_GlobalType CanIf_Global;
115 void CanIf_Init(const CanIf_ConfigType *ConfigPtr)
117 VALIDATE_NO_RV(ConfigPtr != 0, CANIF_INIT_ID, CANIF_E_PARAM_POINTER); // Only PostBuild case supported
119 CanIf_ConfigPtr = ConfigPtr;
121 for (uint8 i = 0; i < CANIF_CHANNEL_CNT; i++)
123 CanIf_Global.channelData[i].ControllerMode = CANIF_CS_STOPPED;
124 CanIf_Global.channelData[i].PduMode = CANIF_GET_OFFLINE;
125 CanIf_PreInit_InitController(i, CanIf_ConfigPtr->Arc_ChannelDefaultConfIndex[i]);
129 CanIf_Global.initRun = TRUE;
135 //-------------------------------------------------------------------
137 * Controller :: CanIf_Arc_ChannelIdType (CanIf-specific id to abstract from Can driver/controllers)
138 * ConfigurationIndex :: CanIf_Arc_ConfigurationIndexType
141 void CanIf_InitController(uint8 Controller, uint8 ConfigurationIndex)
143 // We call this a CanIf channel. Hopefully makes it easier to follow.
144 CanIf_Arc_ChannelIdType channel = Controller;
146 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_INIT_CONTROLLER_ID, CANIF_E_UNINIT );
147 VALIDATE_NO_RV(channel < CANIF_CHANNEL_CNT, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
148 VALIDATE_NO_RV(ConfigurationIndex < CANIF_CHANNEL_CONFIGURATION_CNT, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_POINTER);
150 #if (CANIF_DEV_ERROR_DETECT == STD_ON)
151 CanIf_ControllerModeType mode;
153 if (CanIf_GetControllerMode(channel, &mode) == E_OK)
155 VALIDATE_NO_RV((mode != CANIF_CS_UNINIT), CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE );
159 VALIDATE_NO_RV(FALSE, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE);
163 if (CanIf_GetControllerMode(channel, &mode) == E_OK)
165 if (mode == CANIF_CS_STARTED)
167 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED); // CANIF092
169 else if (mode != CANIF_CS_STOPPED)
171 VALIDATE_NO_RV(FALSE, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE); // CANIF092
175 // CANIF293: ..Subsequently the CAN Interface calls the corresponding
176 // CAN Driver initialization services.
178 // CANIF066: The CAN Interface has access to the CAN Driver configuration data. All
179 // public CAN Driver configuration data are described in [8] Specification of CAN Driver.
181 // Grab the configuration from the Can Controller
182 const Can_ControllerConfigType *canConfig;
183 const CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(channel);
185 // Validate that the configuration at the index match the right channel
186 VALIDATE_NO_RV(CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfControllerIdRef == channel, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
188 canConfig = CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfInitControllerRef;
190 // Validate that the CanIfControllerConfig points to configuration for the right Can Controller
191 VALIDATE_NO_RV(canConfig->CanControllerId == canControllerId, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
193 Can_InitController(canControllerId, canConfig);
195 // Set mode to stopped
196 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED);
199 void CanIf_PreInit_InitController(uint8 Controller, uint8 ConfigurationIndex){
200 // We call this a CanIf channel. Hopefully makes it easier to follow.
201 CanIf_Arc_ChannelIdType channel = Controller;
203 VALIDATE_NO_RV(channel < CANIF_CHANNEL_CNT, CANIF_INIT_ID, CANIF_E_PARAM_CONTROLLER);
204 VALIDATE_NO_RV(ConfigurationIndex < CANIF_CHANNEL_CONFIGURATION_CNT, CANIF_INIT_ID, CANIF_E_PARAM_POINTER);
207 const CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(channel);
208 // Validate that the configuration at the index match the right channel
209 VALIDATE_NO_RV(CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfControllerIdRef == channel, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
210 const Can_ControllerConfigType *canConfig = CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfInitControllerRef;
211 // Validate that the CanIfControllerConfig points to configuration for the right Can Controller
212 VALIDATE_NO_RV(canConfig->CanControllerId == canControllerId, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
214 Can_InitController(canControllerId, canConfig);
217 //-------------------------------------------------------------------
219 Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
220 CanIf_ControllerModeType ControllerMode)
222 // We call this a CanIf channel. Hopefully makes it easier to follow.
223 CanIf_Arc_ChannelIdType channel = Controller;
226 CanIf_ControllerModeType oldMode;
228 VALIDATE( CanIf_Global.initRun, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );
229 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );
231 oldMode = CanIf_Global.channelData[channel].ControllerMode;
233 if (oldMode == CANIF_CS_UNINIT)
235 VALIDATE(FALSE, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_UNINIT); // See figure 32, 33
238 CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(Controller);
239 switch (ControllerMode)
241 case CANIF_CS_STARTED: // Figure 32
246 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
248 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
255 CanIf_SetPduMode(channel, CANIF_SET_ONLINE);
256 if (Can_SetControllerMode(canControllerId, CAN_T_START) == CAN_NOT_OK)
258 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STARTED;
262 case CANIF_CS_SLEEP: // Figure 33
265 case CANIF_CS_STARTED:
266 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
268 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
271 // Just fall through for other cases
275 if (Can_SetControllerMode(canControllerId, CAN_T_SLEEP) == CAN_NOT_OK)
277 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_SLEEP;
280 case CANIF_CS_STOPPED:
285 if (Can_SetControllerMode(canControllerId, CAN_T_WAKEUP) == CAN_NOT_OK)
289 // Just fall through for other cases
293 CanIf_SetPduMode(channel, CANIF_SET_OFFLINE);
294 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
296 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
299 case CANIF_CS_UNINIT:
306 //-------------------------------------------------------------------
308 Std_ReturnType CanIf_GetControllerMode(uint8 Controller,
309 CanIf_ControllerModeType *ControllerModePtr)
311 // We call this a CanIf channel. Hopefully makes it easier to follow.
312 CanIf_Arc_ChannelIdType channel = Controller;
314 VALIDATE(CanIf_Global.initRun, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );
315 VALIDATE(channel < CANIF_CHANNEL_CNT, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );
316 VALIDATE(ControllerModePtr != NULL, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_POINTER );
318 *ControllerModePtr = CanIf_Global.channelData[channel].ControllerMode;
323 //-------------------------------------------------------------------
325 * Matches a Tx PDU id agaist the ones that are in the database.
327 * @returns Ptr a TxPdu
329 static const CanIf_TxPduConfigType * CanIf_FindTxPduEntry(PduIdType id)
331 if (id >= CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds) {
334 return &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[id];
337 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)
339 if (entry->CanIfTxPduId == id)
350 //-------------------------------------------------------------------
352 Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId,
353 const PduInfoType *PduInfoPtr)
356 const CanIf_TxPduConfigType *txEntry;
357 CanIf_ControllerModeType csMode;
358 CanIf_ChannelGetModeType pduMode;
360 VALIDATE(CanIf_Global.initRun, CANIF_TRANSMIT_ID, CANIF_E_UNINIT );
361 VALIDATE((PduInfoPtr != 0), CANIF_TRANSMIT_ID, CANIF_E_PARAM_POINTER );
363 // Get the controller from L-PDU handle
364 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
368 VALIDATE(FALSE, CANIF_TRANSMIT_ID, CANIF_E_INVALID_TXPDUID);
372 CanIf_Arc_ChannelIdType channel = txEntry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef;
374 // Get and verify the controller mode
375 if (CanIf_GetControllerMode(channel, &csMode) == E_NOT_OK)
378 if (csMode != CANIF_CS_STARTED) // CANIF_161
381 // Get and verify the PDU channel mode control
382 if (CanIf_GetPduMode(channel, &pduMode) == E_NOT_OK)
385 if ((pduMode != CANIF_GET_TX_ONLINE) && (pduMode != CANIF_GET_ONLINE))
388 canPdu.id = txEntry->CanIfCanTxPduIdCanId;
390 canPdu.length = PduInfoPtr->SduLength;
391 canPdu.sdu = PduInfoPtr->SduDataPtr;
392 canPdu.swPduHandle = CanTxPduId;
394 Can_ReturnType rVal = Can_Write(txEntry->CanIfCanTxPduHthRef->CanIfHthIdSymRef, &canPdu);
396 if (rVal == CAN_NOT_OK)
399 if (rVal == CAN_BUSY) // CANIF 082, CANIF 161
401 // Tx buffering not supported so just return.
408 //-------------------------------------------------------------------
410 #if ( CANIF_READRXPDU_DATA_API == STD_ON )
411 Std_ReturnType CanIf_ReadRxPduData(PduIdType CanRxPduId,
412 PduInfoType *PduInfoPtr)
414 VALIDATE(FALSE, CANIF_READTXPDUDATA_ID, CANIF_E_NOK_NOSUPPORT);
415 VALIDATE(CanIf_Global.initRun == STD_ON, CANIF_READTXPDUDATA_ID, CANIF_E_UNINIT );
416 VALIDATE(PduInfoPtr != 0, CANIF_READTXPDUDATA_ID, CANIF_E_PARAM_POINTER );
418 // This function is not supported
424 //-------------------------------------------------------------------
426 #if ( CANIF_READTXPDU_NOTIFY_STATUS_API == STD_ON )
427 CanIf_NotifStatusType CanIf_ReadTxNotifStatus(PduIdType CanTxPduId)
429 const CanIf_TxPduConfigType *txEntry;
430 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_NOK_NOSUPPORT);
431 VALIDATE(CanIf_Global.initRun, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_UNINIT );
433 // Get the controller from L-PDU handle
434 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
438 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_INVALID_TXPDUID);
439 return CANIF_NO_NOTIFICATION;
442 if (txEntry->CanIfReadTxPduNotifyStatus == FALSE)
444 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_INVALID_TXPDUID);
445 return CANIF_NO_NOTIFICATION;
448 // This function is not supported
450 return CANIF_NO_NOTIFICATION;
454 //-------------------------------------------------------------------
456 #if ( CANIF_READRXPDU_NOTIFY_STATUS_API == STD_ON )
457 CanIf_NotifStatusType CanIf_ReadRxNotifStatus(PduIdType CanRxPduId)
459 VALIDATE(FALSE, CANIF_READRXNOTIFSTATUS_ID, CANIF_E_NOK_NOSUPPORT);
460 VALIDATE(CanIf_Global.initRun, CANIF_READRXNOTIFSTATUS_ID, CANIF_E_UNINIT );
462 return CANIF_NO_NOTIFICATION;
466 //-------------------------------------------------------------------
468 Std_ReturnType CanIf_SetPduMode(uint8 Controller,
469 CanIf_ChannelSetModeType PduModeRequest)
471 // We call this a CanIf channel. Hopefully makes it easier to follow.
472 CanIf_Arc_ChannelIdType channel = Controller;
474 VALIDATE( CanIf_Global.initRun, CANIF_SETPDUMODE_ID, CANIF_E_UNINIT );
475 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );
477 CanIf_ChannelGetModeType oldMode = CanIf_Global.channelData[channel].PduMode;
479 switch(PduModeRequest)
481 case CANIF_SET_OFFLINE:
482 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
484 case CANIF_SET_RX_OFFLINE:
485 if (oldMode == CANIF_GET_RX_ONLINE)
486 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
487 else if (oldMode == CANIF_GET_ONLINE)
488 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
489 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
490 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
492 // Other oldmodes don't care
494 case CANIF_SET_RX_ONLINE:
495 if (oldMode == CANIF_GET_OFFLINE)
496 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
497 else if (oldMode == CANIF_GET_TX_ONLINE)
498 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
499 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
500 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
502 // Other oldmodes don't care
504 case CANIF_SET_TX_OFFLINE:
505 if (oldMode == CANIF_GET_TX_ONLINE)
506 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
507 else if (oldMode == CANIF_GET_ONLINE)
508 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
509 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
510 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
511 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
512 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
514 // Other oldmodes don't care
516 case CANIF_SET_TX_ONLINE:
517 if (oldMode == CANIF_GET_OFFLINE)
518 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
519 else if (oldMode == CANIF_GET_RX_ONLINE)
520 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
521 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
522 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
523 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
524 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
526 // Other oldmodes don't care
528 case CANIF_SET_ONLINE:
529 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
532 case CANIF_SET_TX_OFFLINE_ACTIVE:
533 if (oldMode == CANIF_GET_OFFLINE)
534 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
535 else if (oldMode == CANIF_GET_RX_ONLINE)
536 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
537 else if (oldMode == CANIF_GET_TX_ONLINE)
538 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
539 else if (oldMode == CANIF_GET_ONLINE)
540 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
542 // Other oldmodes don't care
549 //-------------------------------------------------------------------
551 Std_ReturnType CanIf_GetPduMode(uint8 Controller,
552 CanIf_ChannelGetModeType *PduModePtr)
554 // We call this a CanIf channel. Hopefully makes it easier to follow.
555 CanIf_Arc_ChannelIdType channel = Controller;
557 VALIDATE( CanIf_Global.initRun, CANIF_GETPDUMODE_ID, CANIF_E_UNINIT );
558 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_GETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );
560 *PduModePtr = CanIf_Global.channelData[channel].PduMode;
565 #if ( CANIF_SETDYNAMICTXID_API == STD_ON )
566 void CanIf_SetDynamicTxId(PduIdType CanTxPduId, Can_IdType CanId)
568 const CanIf_TxPduConfigType *txEntry;
569 VALIDATE(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_NOK_NOSUPPORT);
570 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_SETDYNAMICTX_ID, CANIF_E_UNINIT );
572 // Get the controller from L-PDU handle
573 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
577 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_INVALID_TXPDUID);
581 // Check that this is a dymanic PDU
582 if (txEntry->CanIfCanTxPduType != ARC_PDU_TYPE_DYNAMIC)
584 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_INVALID_TXPDUID);
588 // Check that this is an extended or standard id
589 if (((CanId & 0x80000000) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_29)) ||
590 (((CanId & 0x80000000) == 0) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_11)))
593 //txEntry->CanIfCanTxPduIdCanId = CanId; // TODO How do we fix this from a const pointer
599 // Inavlid Canid to configuration
600 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_PARAM_CANID);
605 #if ( CANIF_TRANSCEIVER_API == STD_ON )
606 Std_ReturnType CanIf_SetTransceiverMode(uint8 Transceiver,
607 CanIf_TransceiverModeType TransceiverMode)
609 VALIDATE(FALSE, CANIF_SET_TRANSCEIVERMODE_ID, CANIF_E_NOK_NOSUPPORT);
615 Std_ReturnType CanIf_GetTransceiverMode(uint8 Transceiver,
616 CanIf_TransceiverModeType *TransceiverModePtr)
618 VALIDATE(FALSE, CANIF_GET_TRANSCEIVERMODE_ID, CANIF_E_NOK_NOSUPPORT);
624 Std_ReturnType CanIf_GetTrcvWakeupReason(uint8 Transceiver,
625 CanIf_TrcvWakeupReasonType *TrcvWuReasonPtr)
627 VALIDATE(FALSE, CANIF_GET_TRCVMODEREASON_ID, CANIF_E_NOK_NOSUPPORT);
633 Std_ReturnType CanIf_SetTransceiverWakeupMode(uint8 Transceiver,
634 CanIf_TrcvWakeupModeType *TrcvWakeupMode)
636 VALIDATE(FALSE, CANIF_SET_TRANSCEIVERWAKEMODE_ID, CANIF_E_NOK_NOSUPPORT);
643 #if ( CANIF_WAKEUP_EVENT_API == STD_ON )
644 Std_ReturnType CanIf_CheckWakeup(EcuM_WakeupSourceType WakeupSource)
646 VALIDATE(FALSE, CANIF_CHECKWAKEUP_ID, CANIF_E_NOK_NOSUPPORT);
652 Std_ReturnType CanIf_CheckValidation(EcuM_WakeupSourceType WakeupSource)
654 VALIDATE(FALSE, CANIF_CHECKVALIDATION_ID, CANIF_E_NOK_NOSUPPORT);
662 * Callback interface from driver
664 void CanIf_TxConfirmation(PduIdType canTxPduId)
666 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_TXCONFIRMATION_ID, CANIF_E_UNINIT)
667 VALIDATE_NO_RV(canTxPduId < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds, CANIF_TXCONFIRMATION_ID, CANIF_E_PARAM_LPDU);
669 const CanIf_TxPduConfigType* entry =
670 &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[canTxPduId];
672 /* Find the CAN id in the TxPduList */
674 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)
676 if (entry->CanIfTxPduId == canTxPduId)
679 if (entry->CanIfUserTxConfirmation != NULL)
681 CanIf_ChannelGetModeType mode;
682 CanIf_GetPduMode(entry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef, &mode);
683 if ((mode == CANIF_GET_TX_ONLINE) || (mode == CANIF_GET_ONLINE)
684 || (mode == CANIF_GET_OFFLINE_ACTIVE) || (mode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE) )
686 entry->CanIfUserTxConfirmation(entry->CanIfTxPduId); /* CANIF053 */
696 // Did not find the PDU, something is wrong
700 void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
701 const uint8 *CanSduPtr)
703 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_RXINDICATION_ID, CANIF_E_UNINIT);
704 VALIDATE_NO_RV(CanSduPtr != NULL, CANIF_RXINDICATION_ID, CANIF_E_PARAM_POINTER);
706 /* Check PDU mode before continue processing */
707 CanIf_ChannelGetModeType mode;
708 CanIf_Arc_ChannelIdType channel = CanIf_Arc_FindHrhChannel(Hrh);
709 if (channel == -1) // Invalid HRH
714 if (CanIf_GetPduMode(channel, &mode) == E_OK)
716 if (mode == CANIF_GET_OFFLINE || mode == CANIF_GET_TX_ONLINE ||
717 mode == CANIF_GET_OFFLINE_ACTIVE)
719 // Receiver path is disabled so just drop it
725 return; // No mode so just return
728 const CanIf_RxPduConfigType *entry = CanIf_ConfigPtr->InitConfig->CanIfRxPduConfigPtr;
730 /* Find the CAN id in the RxPduList */
731 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanRxPduIds; i++)
733 if (entry->CanIfCanRxPduHrhRef->CanIfHrhIdSymRef == Hrh)
735 // Software filtering
736 if (entry->CanIfCanRxPduHrhRef->CanIfHrhType == CAN_ARC_HANDLE_TYPE_BASIC)
738 if (entry->CanIfCanRxPduHrhRef->CanIfSoftwareFilterHrh)
740 if (entry->CanIfSoftwareFilterType == CANIF_SOFTFILTER_TYPE_MASK)
742 if ((CanId & entry->CanIfCanRxPduCanIdMask ) ==
743 ( entry->CanIfCanRxPduCanId & entry->CanIfCanRxPduCanIdMask))
745 // We found a pdu so call higher layers
750 continue; // Not a supported filter type, so just drop the frame
755 DET_REPORTERROR(MODULE_ID_CAN, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);
756 continue; // Not a supported filter type, so just drop the frame
761 #if (CANIF_DLC_CHECK == STD_ON)
762 if (CanDlc < entry->CanIfCanRxPduDlc)
764 VALIDATE_NO_RV(FALSE, CANIF_RXINDICATION_ID, CANIF_E_PARAM_DLC);
769 switch (entry->CanIfRxUserType)
771 case CANIF_USER_TYPE_CAN_SPECIAL:
773 ((CanIf_FuncTypeCanSpecial) (entry->CanIfUserRxIndication))(entry->CanIfCanRxPduId,
774 CanSduPtr, CanDlc, CanId);
779 case CANIF_USER_TYPE_CAN_NM:
780 case CANIF_USER_TYPE_CAN_PDUR:
781 // Send Can frame to PDU router
782 PduR_CanIfRxIndication(entry->CanIfCanRxPduId,CanSduPtr);
786 case CANIF_USER_TYPE_CAN_TP:
787 // Send Can frame to CAN TP
788 #if defined(USE_CANTP)
790 PduInfoType CanTpRxPdu;
791 CanTpRxPdu.SduLength = CanDlc;
792 CanTpRxPdu.SduDataPtr = (uint8 *)CanSduPtr;
793 CanTp_RxIndication(entry->CanIfCanRxPduId, &CanTpRxPdu);
804 // Did not find the PDU, something is wrong
805 VALIDATE_NO_RV(FALSE, CANIF_RXINDICATION_ID, CANIF_E_PARAM_LPDU);
808 #if ( CANIF_TRANSMIT_CANCELLATION == STD_ON )
809 void CanIf_CancelTxConfirmation(const Can_PduType *PduInfoPtr)
811 VALIDATE(FALSE, CANIF_CANCELTXCONFIRMATION_ID, CANIF_E_NOK_NOSUPPORT);
812 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_CANCELTXCONFIRMATION_ID, CANIF_E_UNINIT);
813 VALIDATE_NO_RV(PduInfoPtr != NULL, CANIF_RXINDICATION_ID, CANIF_E_PARAM_POINTER);
815 const CanIf_TxPduConfigType *entry =
816 CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr;
820 // Did not find the PDU, something is wrong
821 VALIDATE_NO_RV(FALSE, CANIF_TXCONFIRMATION_ID, CANIF_E_PARAM_LPDU);
825 void CanIf_ControllerBusOff(uint8 Controller)
827 // We call this a CanIf channel. Hopefully makes it easier to follow.
828 CanIf_Arc_ChannelIdType channel = Controller;
830 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_UNINIT );
831 VALIDATE_NO_RV( Controller < CANIF_CHANNEL_CNT, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_PARAM_CONTROLLER );
833 // According to figure 35 in canif spec this should be done in
834 // Can driver but it is better to do it here
835 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED);
837 if (CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification != NULL)
839 CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification(channel);
843 void CanIf_SetWakeupEvent(uint8 Controller)
845 // We call this a CanIf channel. Hopefully makes it easier to follow.
846 CanIf_Arc_ChannelIdType channel = Controller;
848 VALIDATE_NO_RV(FALSE, CANIF_SETWAKEUPEVENT_ID, CANIF_E_NOK_NOSUPPORT);
849 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_SETWAKEUPEVENT_ID, CANIF_E_UNINIT );
850 VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_SETWAKEUPEVENT_ID, CANIF_E_PARAM_CONTROLLER );
855 void CanIf_Arc_Error(uint8 Controller, Can_Arc_ErrorType Error)
857 // We call this a CanIf channel. Hopefully makes it easier to follow.
858 CanIf_Arc_ChannelIdType channel = Controller;
860 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_ARCERROR_ID, CANIF_E_UNINIT );
861 VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_ARCERROR_ID, CANIF_E_PARAM_CONTROLLER );
863 if (CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton != NULL)
865 CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton(Controller, Error);