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 static CanIf_Arc_ChannelIdType CanIf_Arc_FindHrhChannel( Can_Arc_HRHType hrh )
93 const CanIf_HrhConfigType *hrhConfig;
95 hrhConfig = CanIf_ConfigPtr->InitConfig->CanIfHohConfigPtr->CanIfHrhConfig;
101 if (hrhConfig->CanIfHrhIdSymRef == hrh)
102 return hrhConfig->CanIfCanControllerHrhIdRef;
103 } while(!hrhConfig->CanIf_Arc_EOL);
105 DET_REPORTERROR(MODULE_ID_CANIF, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);
111 CanIf_GlobalType CanIf_Global;
113 void CanIf_Init(const CanIf_ConfigType *ConfigPtr)
115 VALIDATE_NO_RV(ConfigPtr != 0, CANIF_INIT_ID, CANIF_E_PARAM_POINTER); // Only PostBuild case supported
117 CanIf_ConfigPtr = ConfigPtr;
119 for (uint16 i = 0; i < CANIF_CHANNEL_CNT; i++)
121 CanIf_Global.channelData[i].ControllerMode = CANIF_CS_STOPPED;
122 CanIf_Global.channelData[i].PduMode = CANIF_GET_OFFLINE;
126 // Do NOT initialise the Can Drivers and Tranceivers, see CANIF085
128 CanIf_Global.initRun = TRUE;
134 //-------------------------------------------------------------------
136 * Controller :: CanIf_Arc_ChannelIdType (CanIf-specific id to abstract from Can driver/controllers)
137 * ConfigurationIndex :: CanIf_Arc_ConfigurationIndexType
140 void CanIf_InitController(uint8 Controller, uint8 ConfigurationIndex)
142 // We call this a CanIf channel. Hopefully makes it easier to follow.
143 CanIf_Arc_ChannelIdType channel = Controller;
145 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_INIT_CONTROLLER_ID, CANIF_E_UNINIT );
146 VALIDATE_NO_RV(channel < CANIF_CHANNEL_CNT, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
147 VALIDATE_NO_RV(ConfigurationIndex < CANIF_CHANNEL_CONFIGURATION_CNT, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_POINTER);
149 #if (CANIF_DEV_ERROR_DETECT == STD_ON)
150 CanIf_ControllerModeType mode;
152 if (CanIf_GetControllerMode(channel, &mode) == E_OK)
154 VALIDATE_NO_RV((mode != CANIF_CS_UNINIT), CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE );
158 VALIDATE_NO_RV(FALSE, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE);
162 if (CanIf_GetControllerMode(channel, &mode) == E_OK)
164 if (mode == CANIF_CS_STARTED)
166 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED); // CANIF092
168 else if (mode != CANIF_CS_STOPPED)
170 VALIDATE_NO_RV(FALSE, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER_MODE); // CANIF092
174 // CANIF293: ..Subsequently the CAN Interface calls the corresponding
175 // CAN Driver initialization services.
177 // CANIF066: The CAN Interface has access to the CAN Driver configuration data. All
178 // public CAN Driver configuration data are described in [8] Specification of CAN Driver.
180 // Grab the configuration from the Can Controller
181 const Can_ControllerConfigType *canConfig;
182 const CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(channel);
184 // Validate that the configuration at the index match the right channel
185 VALIDATE_NO_RV(CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfControllerIdRef == channel, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
187 canConfig = CanIf_ConfigPtr->ControllerConfig[ConfigurationIndex].CanIfInitControllerRef;
189 // Validate that the CanIfControllerConfig points to configuration for the right Can Controller
190 VALIDATE_NO_RV(canConfig->CanControllerId == canControllerId, CANIF_INIT_CONTROLLER_ID, CANIF_E_PARAM_CONTROLLER);
192 Can_InitController(canControllerId, canConfig);
194 // Set mode to stopped
195 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED);
198 //-------------------------------------------------------------------
200 Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
201 CanIf_ControllerModeType ControllerMode)
203 // We call this a CanIf channel. Hopefully makes it easier to follow.
204 CanIf_Arc_ChannelIdType channel = Controller;
207 CanIf_ControllerModeType oldMode;
209 VALIDATE( CanIf_Global.initRun, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );
210 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );
212 oldMode = CanIf_Global.channelData[channel].ControllerMode;
214 if (oldMode == CANIF_CS_UNINIT)
216 VALIDATE(FALSE, CANIF_SET_CONTROLLER_MODE_ID, CANIF_E_UNINIT); // See figure 32, 33
219 CanControllerIdType canControllerId = ARC_GET_CHANNEL_CONTROLLER(Controller);
220 switch (ControllerMode)
222 case CANIF_CS_STARTED: // Figure 32
227 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
229 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
236 CanIf_SetPduMode(channel, CANIF_SET_ONLINE);
237 if (Can_SetControllerMode(canControllerId, CAN_T_START) == CAN_NOT_OK)
239 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STARTED;
243 case CANIF_CS_SLEEP: // Figure 33
246 case CANIF_CS_STARTED:
247 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
249 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
252 // Just fall through for other cases
256 if (Can_SetControllerMode(canControllerId, CAN_T_SLEEP) == CAN_NOT_OK)
258 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_SLEEP;
261 case CANIF_CS_STOPPED:
266 if (Can_SetControllerMode(canControllerId, CAN_T_WAKEUP) == CAN_NOT_OK)
270 // Just fall through for other cases
274 CanIf_SetPduMode(channel, CANIF_SET_OFFLINE);
275 if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)
277 CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;
280 case CANIF_CS_UNINIT:
287 //-------------------------------------------------------------------
289 Std_ReturnType CanIf_GetControllerMode(uint8 Controller,
290 CanIf_ControllerModeType *ControllerModePtr)
292 // We call this a CanIf channel. Hopefully makes it easier to follow.
293 CanIf_Arc_ChannelIdType channel = Controller;
295 VALIDATE(CanIf_Global.initRun, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );
296 VALIDATE(channel < CANIF_CHANNEL_CNT, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );
297 VALIDATE(ControllerModePtr != NULL, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_POINTER );
299 *ControllerModePtr = CanIf_Global.channelData[channel].ControllerMode;
304 //-------------------------------------------------------------------
306 * Matches a Tx PDU id agaist the ones that are in the database.
308 * @returns Ptr a TxPdu
310 static const CanIf_TxPduConfigType * CanIf_FindTxPduEntry(PduIdType id)
312 if (id >= CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds) {
315 return &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[id];
318 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)
320 if (entry->CanIfTxPduId == id)
331 //-------------------------------------------------------------------
333 Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId,
334 const PduInfoType *PduInfoPtr)
337 const CanIf_TxPduConfigType *txEntry;
338 CanIf_ControllerModeType csMode;
339 CanIf_ChannelGetModeType pduMode;
341 VALIDATE(CanIf_Global.initRun, CANIF_TRANSMIT_ID, CANIF_E_UNINIT );
342 VALIDATE((PduInfoPtr != 0), CANIF_TRANSMIT_ID, CANIF_E_PARAM_POINTER );
344 // Get the controller from L-PDU handle
345 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
349 VALIDATE(FALSE, CANIF_TRANSMIT_ID, CANIF_E_INVALID_TXPDUID);
353 CanIf_Arc_ChannelIdType channel = txEntry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef;
355 // Get and verify the controller mode
356 if (CanIf_GetControllerMode(channel, &csMode) == E_NOT_OK)
359 if (csMode != CANIF_CS_STARTED) // CANIF_161
362 // Get and verify the PDU channel mode control
363 if (CanIf_GetPduMode(channel, &pduMode) == E_NOT_OK)
366 if ((pduMode != CANIF_GET_TX_ONLINE) && (pduMode != CANIF_GET_ONLINE))
369 canPdu.id = txEntry->CanIfCanTxPduIdCanId;
371 canPdu.length = PduInfoPtr->SduLength;
372 canPdu.sdu = PduInfoPtr->SduDataPtr;
373 canPdu.swPduHandle = CanTxPduId;
375 Can_ReturnType rVal = Can_Write(txEntry->CanIfCanTxPduHthRef->CanIfHthIdSymRef, &canPdu);
377 if (rVal == CAN_NOT_OK)
380 if (rVal == CAN_BUSY) // CANIF 082, CANIF 161
382 // Tx buffering not supported so just return.
389 //-------------------------------------------------------------------
391 #if ( CANIF_READRXPDU_DATA_API == STD_ON )
392 Std_ReturnType CanIf_ReadRxPduData(PduIdType CanRxPduId,
393 PduInfoType *PduInfoPtr)
395 VALIDATE(FALSE, CANIF_READTXPDUDATA_ID, CANIF_E_NOK_NOSUPPORT);
396 VALIDATE(CanIf_Global.initRun == STD_ON, CANIF_READTXPDUDATA_ID, CANIF_E_UNINIT );
397 VALIDATE(PduInfoPtr != 0, CANIF_READTXPDUDATA_ID, CANIF_E_PARAM_POINTER );
399 // This function is not supported
405 //-------------------------------------------------------------------
407 #if ( CANIF_READTXPDU_NOTIFY_STATUS_API == STD_ON )
408 CanIf_NotifStatusType CanIf_ReadTxNotifStatus(PduIdType CanTxPduId)
410 const CanIf_TxPduConfigType *txEntry;
411 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_NOK_NOSUPPORT);
412 VALIDATE(CanIf_Global.initRun, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_UNINIT );
414 // Get the controller from L-PDU handle
415 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
419 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_INVALID_TXPDUID);
420 return CANIF_NO_NOTIFICATION;
423 if (txEntry->CanIfReadTxPduNotifyStatus == FALSE)
425 VALIDATE(FALSE, CANIF_READTXNOTIFSTATUS_ID, CANIF_E_INVALID_TXPDUID);
426 return CANIF_NO_NOTIFICATION;
429 // This function is not supported
431 return CANIF_NO_NOTIFICATION;
435 //-------------------------------------------------------------------
437 #if ( CANIF_READRXPDU_NOTIFY_STATUS_API == STD_ON )
438 CanIf_NotifStatusType CanIf_ReadRxNotifStatus(PduIdType CanRxPduId)
440 VALIDATE(FALSE, CANIF_READRXNOTIFSTATUS_ID, CANIF_E_NOK_NOSUPPORT);
441 VALIDATE(CanIf_Global.initRun, CANIF_READRXNOTIFSTATUS_ID, CANIF_E_UNINIT );
443 return CANIF_NO_NOTIFICATION;
447 //-------------------------------------------------------------------
449 Std_ReturnType CanIf_SetPduMode(uint8 Controller,
450 CanIf_ChannelSetModeType PduModeRequest)
452 // We call this a CanIf channel. Hopefully makes it easier to follow.
453 CanIf_Arc_ChannelIdType channel = Controller;
455 VALIDATE( CanIf_Global.initRun, CANIF_SETPDUMODE_ID, CANIF_E_UNINIT );
456 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );
458 CanIf_ChannelGetModeType oldMode = CanIf_Global.channelData[channel].PduMode;
460 if(PduModeRequest == CANIF_SET_OFFLINE)
462 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
464 else if(PduModeRequest == CANIF_SET_RX_OFFLINE)
466 if (oldMode == CANIF_GET_RX_ONLINE)
467 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
468 else if (oldMode == CANIF_GET_ONLINE)
469 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
470 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
471 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
473 // Other oldmodes don't care
475 else if(PduModeRequest == CANIF_SET_RX_ONLINE)
477 if (oldMode == CANIF_GET_OFFLINE)
478 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
479 else if (oldMode == CANIF_GET_TX_ONLINE)
480 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
481 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
482 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
484 // Other oldmodes don't care
486 else if(PduModeRequest == CANIF_SET_TX_OFFLINE)
488 if (oldMode == CANIF_GET_TX_ONLINE)
489 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
490 else if (oldMode == CANIF_GET_ONLINE)
491 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
492 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
493 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;
494 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
495 CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;
497 // Other oldmodes don't care
499 else if(PduModeRequest == CANIF_SET_TX_ONLINE)
501 if (oldMode == CANIF_GET_OFFLINE)
502 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
503 else if (oldMode == CANIF_GET_RX_ONLINE)
504 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
505 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)
506 CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;
507 else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)
508 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
510 // Other oldmodes don't care
512 else if(PduModeRequest == CANIF_SET_ONLINE)
514 CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;
516 else if(PduModeRequest == CANIF_SET_TX_OFFLINE_ACTIVE)
518 if (oldMode == CANIF_GET_OFFLINE)
519 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
520 else if (oldMode == CANIF_GET_RX_ONLINE)
521 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
522 else if (oldMode == CANIF_GET_TX_ONLINE)
523 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;
524 else if (oldMode == CANIF_GET_ONLINE)
525 CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;
527 // Other oldmodes don't care
533 //-------------------------------------------------------------------
535 Std_ReturnType CanIf_GetPduMode(uint8 Controller,
536 CanIf_ChannelGetModeType *PduModePtr)
538 // We call this a CanIf channel. Hopefully makes it easier to follow.
539 CanIf_Arc_ChannelIdType channel = Controller;
541 VALIDATE( CanIf_Global.initRun, CANIF_GETPDUMODE_ID, CANIF_E_UNINIT );
542 VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_GETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );
544 *PduModePtr = CanIf_Global.channelData[channel].PduMode;
549 #if ( CANIF_SETDYNAMICTXID_API == STD_ON )
550 void CanIf_SetDynamicTxId(PduIdType CanTxPduId, Can_IdType CanId)
552 const CanIf_TxPduConfigType *txEntry;
553 VALIDATE(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_NOK_NOSUPPORT);
554 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_SETDYNAMICTX_ID, CANIF_E_UNINIT );
556 // Get the controller from L-PDU handle
557 txEntry = CanIf_FindTxPduEntry(CanTxPduId);
561 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_INVALID_TXPDUID);
565 // Check that this is a dymanic PDU
566 if (txEntry->CanIfCanTxPduType != ARC_PDU_TYPE_DYNAMIC)
568 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_INVALID_TXPDUID);
572 // Check that this is an extended or standard id
573 if (((CanId & 0x80000000) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_29)) ||
574 (((CanId & 0x80000000) == 0) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_11)))
577 //txEntry->CanIfCanTxPduIdCanId = CanId; // TODO How do we fix this from a const pointer
583 // Inavlid Canid to configuration
584 VALIDATE_NO_RV(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_PARAM_CANID);
589 #if ( CANIF_TRANSCEIVER_API == STD_ON )
590 Std_ReturnType CanIf_SetTransceiverMode(uint8 Transceiver,
591 CanIf_TransceiverModeType TransceiverMode)
593 VALIDATE(FALSE, CANIF_SET_TRANSCEIVERMODE_ID, CANIF_E_NOK_NOSUPPORT);
599 Std_ReturnType CanIf_GetTransceiverMode(uint8 Transceiver,
600 CanIf_TransceiverModeType *TransceiverModePtr)
602 VALIDATE(FALSE, CANIF_GET_TRANSCEIVERMODE_ID, CANIF_E_NOK_NOSUPPORT);
608 Std_ReturnType CanIf_GetTrcvWakeupReason(uint8 Transceiver,
609 CanIf_TrcvWakeupReasonType *TrcvWuReasonPtr)
611 VALIDATE(FALSE, CANIF_GET_TRCVMODEREASON_ID, CANIF_E_NOK_NOSUPPORT);
617 Std_ReturnType CanIf_SetTransceiverWakeupMode(uint8 Transceiver,
618 CanIf_TrcvWakeupModeType *TrcvWakeupMode)
620 VALIDATE(FALSE, CANIF_SET_TRANSCEIVERWAKEMODE_ID, CANIF_E_NOK_NOSUPPORT);
627 #if ( CANIF_WAKEUP_EVENT_API == STD_ON )
628 Std_ReturnType CanIf_CheckWakeup(EcuM_WakeupSourceType WakeupSource)
630 VALIDATE(FALSE, CANIF_CHECKWAKEUP_ID, CANIF_E_NOK_NOSUPPORT);
636 Std_ReturnType CanIf_CheckValidation(EcuM_WakeupSourceType WakeupSource)
638 VALIDATE(FALSE, CANIF_CHECKVALIDATION_ID, CANIF_E_NOK_NOSUPPORT);
646 * Callback interface from driver
648 void CanIf_TxConfirmation(PduIdType canTxPduId)
650 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_TXCONFIRMATION_ID, CANIF_E_UNINIT)
651 VALIDATE_NO_RV(canTxPduId < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds, CANIF_TXCONFIRMATION_ID, CANIF_E_PARAM_LPDU);
653 const CanIf_TxPduConfigType* entry =
654 &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[canTxPduId];
656 /* Find the CAN id in the TxPduList */
658 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)
660 if (entry->CanIfTxPduId == canTxPduId)
663 if (entry->CanIfUserTxConfirmation != NULL)
665 CanIf_ChannelGetModeType mode;
666 CanIf_GetPduMode(entry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef, &mode);
667 if ((mode == CANIF_GET_TX_ONLINE) || (mode == CANIF_GET_ONLINE)
668 || (mode == CANIF_GET_OFFLINE_ACTIVE) || (mode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE) )
670 entry->CanIfUserTxConfirmation(entry->CanIfTxPduId); /* CANIF053 */
680 // Did not find the PDU, something is wrong
684 void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
685 const uint8 *CanSduPtr)
687 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_RXINDICATION_ID, CANIF_E_UNINIT);
688 VALIDATE_NO_RV(CanSduPtr != NULL, CANIF_RXINDICATION_ID, CANIF_E_PARAM_POINTER);
690 /* Check PDU mode before continue processing */
691 CanIf_ChannelGetModeType mode;
692 CanIf_Arc_ChannelIdType channel = CanIf_Arc_FindHrhChannel(Hrh);
693 if (channel == -1) // Invalid HRH
698 if (CanIf_GetPduMode(channel, &mode) == E_OK)
700 if (mode == CANIF_GET_OFFLINE || mode == CANIF_GET_TX_ONLINE ||
701 mode == CANIF_GET_OFFLINE_ACTIVE)
703 // Receiver path is disabled so just drop it
709 return; // No mode so just return
712 const CanIf_RxPduConfigType *entry = CanIf_ConfigPtr->InitConfig->CanIfRxPduConfigPtr;
714 /* Find the CAN id in the RxPduList */
715 for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanRxPduIds; i++)
717 if (entry->CanIfCanRxPduHrhRef->CanIfHrhIdSymRef == Hrh)
719 // Software filtering
720 if (entry->CanIfCanRxPduHrhRef->CanIfHrhType == CAN_ARC_HANDLE_TYPE_BASIC)
722 if (entry->CanIfCanRxPduHrhRef->CanIfSoftwareFilterHrh)
724 if (entry->CanIfSoftwareFilterType == CANIF_SOFTFILTER_TYPE_MASK)
726 if ((CanId & entry->CanIfCanRxPduCanIdMask ) ==
727 ( entry->CanIfCanRxPduCanId & entry->CanIfCanRxPduCanIdMask))
729 // We found a pdu so call higher layers
734 continue; // Not a supported filter type, so just drop the frame
739 DET_REPORTERROR(MODULE_ID_CAN, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);
740 continue; // Not a supported filter type, so just drop the frame
745 #if (CANIF_DLC_CHECK == STD_ON)
746 if (CanDlc < entry->CanIfCanRxPduDlc)
748 VALIDATE_NO_RV(FALSE, CANIF_RXINDICATION_ID, CANIF_E_PARAM_DLC);
753 switch (entry->CanIfRxUserType)
755 case CANIF_USER_TYPE_CAN_SPECIAL:
757 ((CanIf_FuncTypeCanSpecial) (entry->CanIfUserRxIndication))(entry->CanIfCanRxPduId,
758 CanSduPtr, CanDlc, CanId);
763 case CANIF_USER_TYPE_CAN_NM:
764 case CANIF_USER_TYPE_CAN_PDUR:
765 // Send Can frame to PDU router
766 PduR_CanIfRxIndication(entry->CanIfCanRxPduId,CanSduPtr);
770 case CANIF_USER_TYPE_CAN_TP:
771 // Send Can frame to CAN TP
772 #if defined(USE_CANTP)
774 PduInfoType CanTpRxPdu;
775 CanTpRxPdu.SduLength = CanDlc;
776 CanTpRxPdu.SduDataPtr = (uint8 *)CanSduPtr;
777 CanTp_RxIndication(entry->CanIfCanRxPduId, &CanTpRxPdu);
788 // Did not find the PDU, something is wrong
789 VALIDATE_NO_RV(FALSE, CANIF_RXINDICATION_ID, CANIF_E_PARAM_LPDU);
792 #if ( CANIF_TRANSMIT_CANCELLATION == STD_ON )
793 void CanIf_CancelTxConfirmation(const Can_PduType *PduInfoPtr)
795 VALIDATE(FALSE, CANIF_CANCELTXCONFIRMATION_ID, CANIF_E_NOK_NOSUPPORT);
796 VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_CANCELTXCONFIRMATION_ID, CANIF_E_UNINIT);
797 VALIDATE_NO_RV(PduInfoPtr != NULL, CANIF_RXINDICATION_ID, CANIF_E_PARAM_POINTER);
799 const CanIf_TxPduConfigType *entry =
800 CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr;
804 // Did not find the PDU, something is wrong
805 VALIDATE_NO_RV(FALSE, CANIF_TXCONFIRMATION_ID, CANIF_E_PARAM_LPDU);
809 void CanIf_ControllerBusOff(uint8 Controller)
811 // We call this a CanIf channel. Hopefully makes it easier to follow.
812 CanIf_Arc_ChannelIdType channel = Controller;
814 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_UNINIT );
815 VALIDATE_NO_RV( Controller < CANIF_CHANNEL_CNT, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_PARAM_CONTROLLER );
817 // According to figure 35 in canif spec this should be done in
818 // Can driver but it is better to do it here
819 CanIf_SetControllerMode(channel, CANIF_CS_STOPPED);
821 if (CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification != NULL)
823 CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification(channel);
827 void CanIf_SetWakeupEvent(uint8 Controller)
829 // We call this a CanIf channel. Hopefully makes it easier to follow.
830 CanIf_Arc_ChannelIdType channel = Controller;
832 VALIDATE_NO_RV(FALSE, CANIF_SETWAKEUPEVENT_ID, CANIF_E_NOK_NOSUPPORT);
833 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_SETWAKEUPEVENT_ID, CANIF_E_UNINIT );
834 VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_SETWAKEUPEVENT_ID, CANIF_E_PARAM_CONTROLLER );
839 void CanIf_Arc_Error(uint8 Controller, Can_Arc_ErrorType Error)
841 // We call this a CanIf channel. Hopefully makes it easier to follow.
842 CanIf_Arc_ChannelIdType channel = Controller;
844 VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_ARCERROR_ID, CANIF_E_UNINIT );
845 VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_ARCERROR_ID, CANIF_E_PARAM_CONTROLLER );
847 if (CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton != NULL)
849 CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton(Controller, Error);