S32 SDK
flexcan_driver.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
7  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
9  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
10  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
11  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
12  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
14  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
15  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
16  * THE POSSIBILITY OF SUCH DAMAGE.
17  */
18 
30 #ifndef FLEXCAN_DRIVER_H
31 #define FLEXCAN_DRIVER_H
32 
33 #include "flexcan_hal.h"
34 #include "osif.h"
35 #if FEATURE_CAN_HAS_DMA_ENABLE
36 #include "edma_driver.h"
37 #endif
38 
46 /*******************************************************************************
47  * Definitions
48  ******************************************************************************/
51 
64 
65 #if FEATURE_CAN_HAS_DMA_ENABLE
66 
68 #endif
69 
73 typedef enum {
77 
81 typedef enum {
85 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
86  FLEXCAN_EVENT_WAKEUP_TIMEOUT,
87  FLEXCAN_EVENT_WAKEUP_MATCH
88 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
90 
91 
95 typedef enum {
100 
104 typedef struct {
106  semaphore_t mbSema;
108  bool isBlocking;
109  bool isRemote;
111 
120 typedef struct FlexCANState {
122  void (*callback)(uint8_t instance, flexcan_event_type_t eventType,
123  struct FlexCANState * state);
125 #if FEATURE_CAN_HAS_DMA_ENABLE
126  uint8_t rxFifoDMAChannel;
127 #endif
130 
134 typedef struct {
136  uint32_t data_length;
137  bool fd_enable;
138  uint8_t fd_padding;
140  bool enable_brs;
141  bool is_remote;
143 
144 
148 typedef enum {
166 
171 typedef struct {
172  uint32_t max_num_mb;
177  bool fd_enable;
178 #if FEATURE_CAN_HAS_PE_CLKSRC_SELECT
179  flexcan_clk_source_t pe_clock;
180 #endif
186 
190 typedef void (*flexcan_callback_t)(uint8_t instance, flexcan_event_type_t eventType,
191  flexcan_state_t *flexcanState);
192 
193 /*******************************************************************************
194  * API
195  ******************************************************************************/
196 
197 #if defined(__cplusplus)
198 extern "C" {
199 #endif
200 
212 void FLEXCAN_DRV_SetBitrate(uint8_t instance, const flexcan_time_segment_t *bitrate);
224 void FLEXCAN_DRV_SetBitrateCbt(uint8_t instance, const flexcan_time_segment_t *bitrate);
231 void FLEXCAN_DRV_GetBitrate(uint8_t instance, flexcan_time_segment_t *bitrate);
232 
246 void FLEXCAN_DRV_SetRxMaskType(uint8_t instance, flexcan_rx_mask_type_t type);
247 
256  uint8_t instance,
258  uint32_t mask);
259 
268  uint8_t instance,
270  uint32_t mask);
271 
284  uint8_t instance,
286  uint8_t mb_idx,
287  uint32_t mask);
288 
308  uint32_t instance,
309  flexcan_state_t *state,
310  const flexcan_user_config_t *data);
311 
319 status_t FLEXCAN_DRV_Deinit(uint8_t instance);
320 
339  uint8_t instance,
340  uint8_t mb_idx,
341  const flexcan_data_info_t *tx_info,
342  uint32_t msg_id);
343 
363  uint8_t instance,
364  uint8_t mb_idx,
365  const flexcan_data_info_t *tx_info,
366  uint32_t msg_id,
367  const uint8_t *mb_data,
368  uint32_t timeout_ms);
369 
388  uint8_t instance,
389  uint8_t mb_idx,
390  const flexcan_data_info_t *tx_info,
391  uint32_t msg_id,
392  const uint8_t *mb_data);
393 
402 status_t FLEXCAN_DRV_AbortTransfer(uint32_t instance, uint8_t mb_idx);
403 
423  uint8_t instance,
424  uint8_t mb_idx,
425  const flexcan_data_info_t *rx_info,
426  uint32_t msg_id);
427 
437  uint8_t instance,
439  const flexcan_id_table_t *id_filter_table);
440 
458  uint8_t instance,
459  uint8_t mb_idx,
460  flexcan_msgbuff_t *data,
461  uint32_t timeout_ms);
462 
479  uint8_t instance,
480  uint8_t mb_idx,
481  flexcan_msgbuff_t *data);
482 
498  uint8_t instance,
499  flexcan_msgbuff_t *data,
500  uint32_t timeout_ms);
501 
516  uint8_t instance,
517  flexcan_msgbuff_t *data);
518 
526 void FLEXCAN_DRV_IRQHandler(uint8_t instance);
527 
528 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
529 
535 void FLEXCAN_DRV_WakeUpHandler(uint8_t instance);
536 
537 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
538 
550 status_t FLEXCAN_DRV_GetTransferStatus(uint32_t instance, uint8_t mb_idx);
551 
559 void FLEXCAN_DRV_InstallEventCallback(uint8_t instance, flexcan_callback_t callback, void *callbackParam);
560 
561 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
562 
570 void FLEXCAN_DRV_ConfigPN(uint8_t instance, bool enable, const flexcan_pn_config_t *pnConfig);
571 
572 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
573 
574 
575 #ifdef __cplusplus
576 }
577 #endif
578 
581 #endif /* FLEXCAN_DRIVER_H */
582 
583 /*******************************************************************************
584  * EOF
585  ******************************************************************************/
const IRQn_Type g_flexcanOredMessageBufferIrqId[CAN_INSTANCE_COUNT][FEATURE_CAN_MB_IRQS_MAX_COUNT]
Table to save message buffer IRQ numbers for FlexCAN instances.
const IRQn_Type g_flexcanBusOffIrqId[CAN_INSTANCE_COUNT]
Table to save Bus off IRQ numbers for FlexCAN instances.
status_t FLEXCAN_DRV_Receive(uint8_t instance, uint8_t mb_idx, flexcan_msgbuff_t *data)
Receives a CAN frame using the specified message buffer.
status_t FLEXCAN_DRV_Deinit(uint8_t instance)
Shuts down a FlexCAN instance.
Internal driver state information.
flexcan_operation_modes_t flexcanMode
flexcan_fd_payload_size_t payload
status_t FLEXCAN_DRV_ConfigTxMb(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id)
FlexCAN transmit message buffer field configuration.
flexcan_time_segment_t bitrate
void * callbackParam
flexcan_rx_fifo_id_filter_num_t num_id_filters
status_t FLEXCAN_DRV_RxFifo(uint8_t instance, flexcan_msgbuff_t *data)
Receives a CAN frame using the message FIFO.
#define FEATURE_CAN_MAX_MB_NUM
flexcan_rx_fifo_id_filter_num_t
FlexCAN Rx FIFO filters number Implements : flexcan_rx_fifo_id_filter_num_t_Class.
IRQn_Type
Defines the Interrupt Numbers definitions.
Definition: S32K144.h:269
void FLEXCAN_DRV_ConfigRxFifo(uint8_t instance, flexcan_rx_fifo_id_element_format_t id_format, const flexcan_id_table_t *id_filter_table)
FlexCAN RX FIFO field configuration.
const IRQn_Type g_flexcanRxWarningIrqId[CAN_INSTANCE_COUNT]
Table to save RX Warning IRQ numbers for FlexCAN instances.
flexcan_msgbuff_id_type_t msg_id_type
flexcan_event_type_t
The type of the event which occured when the callback was invoked. Implements : flexcan_event_type_t_...
void FLEXCAN_DRV_InstallEventCallback(uint8_t instance, flexcan_callback_t callback, void *callbackParam)
Installs a callback function for the IRQ handler.
dma_request_source_t
Structure for the DMA hardware request.
#define CAN_INSTANCE_COUNT
Definition: S32K144.h:986
struct FlexCANState flexcan_state_t
Internal driver state information.
flexcan_rxfifo_transfer_type_t transferType
const IRQn_Type g_flexcanWakeUpIrqId[CAN_INSTANCE_COUNT]
Table to save wakeup IRQ numbers for FlexCAN instances.
void FLEXCAN_DRV_SetRxMaskType(uint8_t instance, flexcan_rx_mask_type_t type)
Sets the RX masking type.
FlexCAN timing related structures Implements : flexcan_time_segment_t_Class.
Definition: flexcan_hal.h:198
status_t FLEXCAN_DRV_ConfigRxMb(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *rx_info, uint32_t msg_id)
FlexCAN receive message buffer field configuration.
const IRQn_Type g_flexcanTxWarningIrqId[CAN_INSTANCE_COUNT]
Table to save TX Warning IRQ numbers for FlexCAN instances.
status_t FLEXCAN_DRV_GetTransferStatus(uint32_t instance, uint8_t mb_idx)
Returns whether the previous FLEXCAN transfer has finished.
#define FEATURE_CAN_MB_IRQS_MAX_COUNT
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
Definition: status.h:31
status_t FLEXCAN_DRV_Init(uint32_t instance, flexcan_state_t *state, const flexcan_user_config_t *data)
Initializes the FlexCAN peripheral.
flexcan_operation_modes_t
FlexCAN operation modes Implements : flexcan_operation_modes_t_Class.
Definition: flexcan_hal.h:54
void(* flexcan_callback_t)(uint8_t instance, flexcan_event_type_t eventType, flexcan_state_t *flexcanState)
FlexCAN Driver callback function type Implements : flexcan_callback_t_Class.
const dma_request_source_t g_flexcanDmaRequests[]
status_t FLEXCAN_DRV_AbortTransfer(uint32_t instance, uint8_t mb_idx)
Ends a non-blocking FlexCAN transfer early.
flexcan_rx_fifo_id_element_format_t
ID formats for RxFIFO Implements : flexcan_rx_fifo_id_element_format_t_Class.
Definition: flexcan_hal.h:109
FlexCAN message buffer structure Implements : flexcan_msgbuff_t_Class.
Definition: flexcan_hal.h:188
status_t FLEXCAN_DRV_SendBlocking(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id, const uint8_t *mb_data, uint32_t timeout_ms)
Sends a CAN frame using the specified message buffer, in a blocking manner.
flexcan_rxfifo_transfer_type_t
The type of the RxFIFO transfer (interrupts/DMA). Implements : flexcan_rxfifo_transfer_type_t_Class.
FlexCAN RX FIFO ID filter table structure Implements : flexcan_id_table_t_Class.
Definition: flexcan_hal.h:122
CAN_Type *const g_flexcanBase[CAN_INSTANCE_COUNT]
Table of base addresses for FlexCAN instances.
status_t FLEXCAN_DRV_RxFifoBlocking(uint8_t instance, flexcan_msgbuff_t *data, uint32_t timeout_ms)
Receives a CAN frame using the message FIFO, in a blocking manner.
void(* callback)(uint8_t instance, flexcan_event_type_t eventType, struct FlexCANState *state)
flexcan_time_segment_t bitrate_cbt
flexcan_rxfifo_transfer_type_t transfer_type
flexcan_mb_state_t state
Pretended Networking configuration structure Implements : flexcan_pn_config_t_Class.
Definition: flexcan_hal.h:244
const IRQn_Type g_flexcanErrorIrqId[CAN_INSTANCE_COUNT]
Table to save error IRQ numbers for FlexCAN instances.
void FLEXCAN_DRV_SetRxFifoGlobalMask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint32_t mask)
Sets the FlexCAN RX FIFO global standard or extended mask.
Information needed for internal handling of a given MB. Implements : flexcan_mb_handle_t_Class.
status_t FLEXCAN_DRV_ReceiveBlocking(uint8_t instance, uint8_t mb_idx, flexcan_msgbuff_t *data, uint32_t timeout_ms)
Receives a CAN frame using the specified message buffer, in a blocking manner.
void FLEXCAN_DRV_SetBitrateCbt(uint8_t instance, const flexcan_time_segment_t *bitrate)
Sets the FlexCAN bit rate for FD BRS.
flexcan_msgbuff_id_type_t
FlexCAN Message Buffer ID type Implements : flexcan_msgbuff_id_type_t_Class.
Definition: flexcan_hal.h:139
flexcan_clk_source_t
FlexCAN clock source Implements : flexcan_clk_source_t_Class.
Definition: flexcan_hal.h:148
flexcan_msgbuff_t * mb_message
void FLEXCAN_DRV_SetRxMbGlobalMask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint32_t mask)
Sets the FlexCAN RX MB global standard or extended mask.
void FLEXCAN_DRV_IRQHandler(uint8_t instance)
Interrupt handler for a FlexCAN instance.
flexcan_fd_payload_size_t
FlexCAN payload sizes Implements : flexcan_fd_payload_size_t_Class.
Definition: flexcan_hal.h:99
FlexCAN data info from user Implements : flexcan_data_info_t_Class.
flexcan_rx_mask_type_t
FlexCAN RX mask type. Implements : flexcan_rx_mask_type_t_Class.
Definition: flexcan_hal.h:131
flexcan_mb_state_t
The state of a given MB (idle/Rx busy/Tx busy). Implements : flexcan_mb_state_t_Class.
status_t FLEXCAN_DRV_Send(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id, const uint8_t *mb_data)
Sends a CAN frame using the specified message buffer.
status_t FLEXCAN_DRV_SetRxIndividualMask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint8_t mb_idx, uint32_t mask)
Sets the FlexCAN RX individual standard or extended mask.
volatile flexcan_mb_handle_t mbs[FEATURE_CAN_MAX_MB_NUM]
void FLEXCAN_DRV_SetBitrate(uint8_t instance, const flexcan_time_segment_t *bitrate)
Sets the FlexCAN bit rate.
FlexCAN configuration.
void FLEXCAN_DRV_GetBitrate(uint8_t instance, flexcan_time_segment_t *bitrate)
Gets the FlexCAN bit rate.