1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 #ifndef R_CANFD_H
8 #define R_CANFD_H
9 
10 /***********************************************************************************************************************
11  * Includes
12  **********************************************************************************************************************/
13 #include "bsp_api.h"
14 #include "r_canfd_cfg.h"
15 #include "r_can_api.h"
16 
17 /* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */
18 FSP_HEADER
19 
20 /*******************************************************************************************************************//**
21  * @addtogroup CANFD
22  * @{
23  **********************************************************************************************************************/
24 
25 /***********************************************************************************************************************
26  * Macro definitions
27  **********************************************************************************************************************/
28 
29 /**********************************************************************************************************************
30  * Typedef definitions
31  **********************************************************************************************************************/
32 
33 /** CANFD Status */
34 typedef enum e_canfd_status
35 {
36     CANFD_STATUS_RESET_MODE    = 0x001, ///< Channel in Reset mode
37     CANFD_STATUS_HALT_MODE     = 0x002, ///< Channel in Halt mode
38     CANFD_STATUS_SLEEP_MODE    = 0x004, ///< Channel in Sleep mode
39     CANFD_STATUS_ERROR_PASSIVE = 0x008, ///< Channel in error-passive state
40     CANFD_STATUS_BUS_OFF       = 0x010, ///< Channel in bus-off state
41     CANFD_STATUS_TRANSMITTING  = 0x020, ///< Channel is transmitting
42     CANFD_STATUS_RECEIVING     = 0x040, ///< Channel is receiving
43     CANFD_STATUS_READY         = 0x080, ///< Channel is ready for communication
44     CANFD_STATUS_ESI           = 0x100, ///< At least one CAN-FD message was received with the ESI flag set
45 } canfd_status_t;
46 
47 /** CANFD Error Code */
48 typedef enum e_canfd_error
49 {
50     CANFD_ERROR_CHANNEL_BUS              = 0x00000001, ///< Bus Error
51     CANFD_ERROR_CHANNEL_WARNING          = 0x00000002, ///< Error Warning (TX/RX error count over 0x5F)
52     CANFD_ERROR_CHANNEL_PASSIVE          = 0x00000004, ///< Error Passive (TX/RX error count over 0x7F)
53     CANFD_ERROR_CHANNEL_BUS_OFF_ENTRY    = 0x00000008, ///< Bus-Off State Entry
54     CANFD_ERROR_CHANNEL_BUS_OFF_RECOVERY = 0x00000010, ///< Recovery from Bus-Off State
55     CANFD_ERROR_CHANNEL_OVERLOAD         = 0x00000020, ///< Overload
56     CANFD_ERROR_CHANNEL_BUS_LOCK         = 0x00000040, ///< Bus Locked
57     CANFD_ERROR_CHANNEL_ARBITRATION_LOSS = 0x00000080, ///< Arbitration Lost
58     CANFD_ERROR_CHANNEL_STUFF            = 0x00000100, ///< Stuff Error
59     CANFD_ERROR_CHANNEL_FORM             = 0x00000200, ///< Form Error
60     CANFD_ERROR_CHANNEL_ACK              = 0x00000400, ///< ACK Error
61     CANFD_ERROR_CHANNEL_CRC              = 0x00000800, ///< CRC Error
62     CANFD_ERROR_CHANNEL_BIT_RECESSIVE    = 0x00001000, ///< Bit Error (recessive) Error
63     CANFD_ERROR_CHANNEL_BIT_DOMINANT     = 0x00002000, ///< Bit Error (dominant) Error
64     CANFD_ERROR_CHANNEL_ACK_DELIMITER    = 0x00004000, ///< ACK Delimiter Error
65     CANFD_ERROR_GLOBAL_DLC               = 0x00010000, ///< DLC Error
66     CANFD_ERROR_GLOBAL_MESSAGE_LOST      = 0x00020000, ///< Message Lost
67     CANFD_ERROR_GLOBAL_PAYLOAD_OVERFLOW  = 0x00080000, ///< FD Payload Overflow
68     CANFD_ERROR_GLOBAL_TXQ_OVERWRITE     = 0x00100000, ///< TX Queue Message Overwrite
69     CANFD_ERROR_GLOBAL_TXQ_MESSAGE_LOST  = 0x00400000, ///< TX Queue Message Lost
70     CANFD_ERROR_GLOBAL_CH0_SCAN_FAIL     = 0x01000000, ///< Channel 0 RX Scan Failure
71     CANFD_ERROR_GLOBAL_CH1_SCAN_FAIL     = 0x02000000, ///< Channel 1 RX Scan Failure
72     CANFD_ERROR_GLOBAL_CH0_ECC           = 0x10000000, ///< Channel 0 ECC Error
73     CANFD_ERROR_GLOBAL_CH1_ECC           = 0x20000000, ///< Channel 1 ECC Error
74 } canfd_error_t;
75 
76 /** CANFD Transmit Message Buffer (TX MB) */
77 typedef enum e_canfd_tx_mb
78 {
79     CANFD_TX_MB_0 = 0,
80     CANFD_TX_MB_1 = 1,
81     CANFD_TX_MB_2 = 2,
82     CANFD_TX_MB_3 = 3,
83 #if !BSP_FEATURE_CANFD_LITE
84     CANFD_TX_MB_4  = 4,
85     CANFD_TX_MB_5  = 5,
86     CANFD_TX_MB_6  = 6,
87     CANFD_TX_MB_7  = 7,
88     CANFD_TX_MB_8  = 8,
89     CANFD_TX_MB_9  = 9,
90     CANFD_TX_MB_10 = 10,
91     CANFD_TX_MB_11 = 11,
92     CANFD_TX_MB_12 = 12,
93     CANFD_TX_MB_13 = 13,
94     CANFD_TX_MB_14 = 14,
95     CANFD_TX_MB_15 = 15,
96     CANFD_TX_MB_32 = 32,
97     CANFD_TX_MB_33 = 33,
98     CANFD_TX_MB_34 = 34,
99     CANFD_TX_MB_35 = 35,
100     CANFD_TX_MB_36 = 36,
101     CANFD_TX_MB_37 = 37,
102     CANFD_TX_MB_38 = 38,
103     CANFD_TX_MB_39 = 39,
104     CANFD_TX_MB_40 = 40,
105     CANFD_TX_MB_41 = 41,
106     CANFD_TX_MB_42 = 42,
107     CANFD_TX_MB_43 = 43,
108     CANFD_TX_MB_44 = 44,
109     CANFD_TX_MB_45 = 45,
110     CANFD_TX_MB_46 = 46,
111     CANFD_TX_MB_47 = 47,
112 #endif
113 } canfd_tx_mb_t;
114 
115 /** CANFD Receive Buffer (MB + FIFO) */
116 typedef enum e_canfd_rx_buffer
117 {
118     CANFD_RX_BUFFER_MB_0   = 0,
119     CANFD_RX_BUFFER_MB_1   = 1,
120     CANFD_RX_BUFFER_MB_2   = 2,
121     CANFD_RX_BUFFER_MB_3   = 3,
122     CANFD_RX_BUFFER_MB_4   = 4,
123     CANFD_RX_BUFFER_MB_5   = 5,
124     CANFD_RX_BUFFER_MB_6   = 6,
125     CANFD_RX_BUFFER_MB_7   = 7,
126     CANFD_RX_BUFFER_MB_8   = 8,
127     CANFD_RX_BUFFER_MB_9   = 9,
128     CANFD_RX_BUFFER_MB_10  = 10,
129     CANFD_RX_BUFFER_MB_11  = 11,
130     CANFD_RX_BUFFER_MB_12  = 12,
131     CANFD_RX_BUFFER_MB_13  = 13,
132     CANFD_RX_BUFFER_MB_14  = 14,
133     CANFD_RX_BUFFER_MB_15  = 15,
134     CANFD_RX_BUFFER_MB_16  = 16,
135     CANFD_RX_BUFFER_MB_17  = 17,
136     CANFD_RX_BUFFER_MB_18  = 18,
137     CANFD_RX_BUFFER_MB_19  = 19,
138     CANFD_RX_BUFFER_MB_20  = 20,
139     CANFD_RX_BUFFER_MB_21  = 21,
140     CANFD_RX_BUFFER_MB_22  = 22,
141     CANFD_RX_BUFFER_MB_23  = 23,
142     CANFD_RX_BUFFER_MB_24  = 24,
143     CANFD_RX_BUFFER_MB_25  = 25,
144     CANFD_RX_BUFFER_MB_26  = 26,
145     CANFD_RX_BUFFER_MB_27  = 27,
146     CANFD_RX_BUFFER_MB_28  = 28,
147     CANFD_RX_BUFFER_MB_29  = 29,
148     CANFD_RX_BUFFER_MB_30  = 30,
149     CANFD_RX_BUFFER_MB_31  = 31,
150     CANFD_RX_BUFFER_FIFO_0 = 32,
151     CANFD_RX_BUFFER_FIFO_1 = 33,
152 #if !BSP_FEATURE_CANFD_LITE
153     CANFD_RX_BUFFER_FIFO_2 = 34,
154     CANFD_RX_BUFFER_FIFO_3 = 35,
155     CANFD_RX_BUFFER_FIFO_4 = 36,
156     CANFD_RX_BUFFER_FIFO_5 = 37,
157     CANFD_RX_BUFFER_FIFO_6 = 38,
158     CANFD_RX_BUFFER_FIFO_7 = 39,
159 #endif
160 } canfd_rx_buffer_t;
161 
162 /** CANFD Receive Message Buffer (RX MB) */
163 typedef enum e_canfd_rx_mb
164 {
165     CANFD_RX_MB_NONE = 0,
166     CANFD_RX_MB_0    = 0x80,
167     CANFD_RX_MB_1    = 0x80 + 1,
168     CANFD_RX_MB_2    = 0x80 + 2,
169     CANFD_RX_MB_3    = 0x80 + 3,
170     CANFD_RX_MB_4    = 0x80 + 4,
171     CANFD_RX_MB_5    = 0x80 + 5,
172     CANFD_RX_MB_6    = 0x80 + 6,
173     CANFD_RX_MB_7    = 0x80 + 7,
174     CANFD_RX_MB_8    = 0x80 + 8,
175     CANFD_RX_MB_9    = 0x80 + 9,
176     CANFD_RX_MB_10   = 0x80 + 10,
177     CANFD_RX_MB_11   = 0x80 + 11,
178     CANFD_RX_MB_12   = 0x80 + 12,
179     CANFD_RX_MB_13   = 0x80 + 13,
180     CANFD_RX_MB_14   = 0x80 + 14,
181     CANFD_RX_MB_15   = 0x80 + 15,
182     CANFD_RX_MB_16   = 0x80 + 16,
183     CANFD_RX_MB_17   = 0x80 + 17,
184     CANFD_RX_MB_18   = 0x80 + 18,
185     CANFD_RX_MB_19   = 0x80 + 19,
186     CANFD_RX_MB_20   = 0x80 + 20,
187     CANFD_RX_MB_21   = 0x80 + 21,
188     CANFD_RX_MB_22   = 0x80 + 22,
189     CANFD_RX_MB_23   = 0x80 + 23,
190     CANFD_RX_MB_24   = 0x80 + 24,
191     CANFD_RX_MB_25   = 0x80 + 25,
192     CANFD_RX_MB_26   = 0x80 + 26,
193     CANFD_RX_MB_27   = 0x80 + 27,
194     CANFD_RX_MB_28   = 0x80 + 28,
195     CANFD_RX_MB_29   = 0x80 + 29,
196     CANFD_RX_MB_30   = 0x80 + 30,
197     CANFD_RX_MB_31   = 0x80 + 31,
198 } canfd_rx_mb_t;
199 
200 /** CANFD Receive FIFO (RX FIFO) */
201 typedef enum e_canfd_rx_fifo
202 {
203     CANFD_RX_FIFO_0 = (1U),
204     CANFD_RX_FIFO_1 = (1U << 1),
205 #if !BSP_FEATURE_CANFD_LITE
206     CANFD_RX_FIFO_2 = (1U << 2),
207     CANFD_RX_FIFO_3 = (1U << 3),
208     CANFD_RX_FIFO_4 = (1U << 4),
209     CANFD_RX_FIFO_5 = (1U << 5),
210     CANFD_RX_FIFO_6 = (1U << 6),
211     CANFD_RX_FIFO_7 = (1U << 7),
212 #endif
213 } canfd_rx_fifo_t;
214 
215 /** CANFD AFL Minimum DLC settings */
216 typedef enum e_canfd_minimum_dlc
217 {
218     CANFD_MINIMUM_DLC_0 = 0,
219     CANFD_MINIMUM_DLC_1,
220     CANFD_MINIMUM_DLC_2,
221     CANFD_MINIMUM_DLC_3,
222     CANFD_MINIMUM_DLC_4,
223     CANFD_MINIMUM_DLC_5,
224     CANFD_MINIMUM_DLC_6,
225     CANFD_MINIMUM_DLC_7,
226     CANFD_MINIMUM_DLC_8,
227     CANFD_MINIMUM_DLC_12,
228     CANFD_MINIMUM_DLC_16,
229     CANFD_MINIMUM_DLC_20,
230     CANFD_MINIMUM_DLC_24,
231     CANFD_MINIMUM_DLC_32,
232     CANFD_MINIMUM_DLC_48,
233     CANFD_MINIMUM_DLC_64,
234 } canfd_minimum_dlc_t;
235 
236 /** CANFD Frame Options */
237 typedef enum e_canfd_frame_option
238 {
239     CANFD_FRAME_OPTION_ERROR = 0x01,   ///< Error state set (ESI).
240     CANFD_FRAME_OPTION_BRS   = 0x02,   ///< Bit Rate Switching (BRS) enabled.
241     CANFD_FRAME_OPTION_FD    = 0x04,   ///< Flexible Data frame (FDF).
242     // CANFD_FRAME_OPTION_ONESHOT = 0x80, ///< One-shot mode (no retries).
243 } canfd_frame_options_t;
244 
245 /** CANFD TXMB Merge mode */
246 typedef enum e_canfd_txmb_merge_mode
247 {
248     CANFD_TXMB_MERGE_MODE_DISABLE = 0,
249     CANFD_TXMB_MERGE_MODE_ENABLE  = 1,
250 } canfd_txmb_merge_mode_t;
251 
252 /* CAN Instance Control Block   */
253 typedef struct st_canfd_instance_ctrl
254 {
255     R_CANFD_Type       * p_reg;                 // Pointer to register base address
256 
257     /* Parameters to control CAN peripheral device */
258     can_cfg_t const    * p_cfg;                 // Pointer to the configuration structure
259     uint32_t             open;                  // Open status of channel.
260     can_operation_mode_t operation_mode;        // Can operation mode.
261     can_test_mode_t      test_mode;             // Can operation mode.
262 #if BSP_TZ_SECURE_BUILD
263     bool callback_is_secure;                    // If the callback is in non-secure memory then a security state transistion is required to call p_callback (BLXNS)
264 #endif
265     void (* p_callback)(can_callback_args_t *); // Pointer to callback
266     can_callback_args_t * p_callback_memory;    // Pointer to optional callback argument memory
267     void const          * p_context;            // Pointer to context to be passed into callback function
268 } canfd_instance_ctrl_t;
269 
270 /** AFL Entry (based on R_CANFD_CFDGAFL_Type in renesas.h) */
271 typedef struct st_canfd_afl_entry
272 {
273     union
274     {
275         uint32_t id_u32;
276 
277         struct
278         {
279             uint32_t id                 : 29; ///< ID to match against
280             uint32_t                    : 1;
281             can_frame_type_t frame_type : 1;  ///< Frame type (Data or Remote)
282             can_id_mode_t    id_mode    : 1;  ///< ID mode (Standard or Extended)
283         } id;
284     };
285 
286     union
287     {
288         uint32_t mask_u32;
289 
290         struct
291         {
292             uint32_t mask_id         : 29; ///< ID Mask
293             uint32_t                 : 1;
294             uint32_t mask_frame_type : 1;  ///< Only accept frames with the configured frame type
295             uint32_t mask_id_mode    : 1;  ///< Only accept frames with the configured ID mode
296         } mask;
297     };
298 
299     union
300     {
301         uint32_t destination_u32[2];
302 
303         struct
304         {
305             canfd_minimum_dlc_t minimum_dlc : 4; ///< Minimum DLC value to accept (valid when DLC Check is enabled)
306             uint32_t                        : 4;
307             canfd_rx_mb_t rx_buffer         : 8; ///< RX Message Buffer to receive messages accepted by this rule
308             uint32_t                        : 16;
309             canfd_rx_fifo_t fifo_select_flags;   ///< RX FIFO(s) to receive messages accepted by this rule
310         } destination;
311     };
312 } canfd_afl_entry_t;
313 
314 /** CANFD Global Configuration */
315 typedef struct st_canfd_global_cfg
316 {
317     uint32_t global_interrupts;        ///< Global control options (CFDGCTR register setting)
318     uint32_t global_config;            ///< Global configuration options (CFDGCFG register setting)
319 #if !BSP_FEATURE_CANFD_LITE
320     uint32_t rx_fifo_config[8];        ///< RX FIFO configuration (CFDRFCCn register settings)
321 #else
322     uint32_t rx_fifo_config[2];        ///< RX FIFO configuration (CFDRFCCn register settings)
323 #endif
324     uint32_t rx_mb_config;             ///< Number and size of RX Message Buffers (CFDRMNB register setting)
325     uint8_t  global_err_ipl;           ///< Global Error interrupt priority
326     uint8_t  rx_fifo_ipl;              ///< RX FIFO interrupt priority
327 } canfd_global_cfg_t;
328 
329 /** CANFD Extended Configuration */
330 typedef struct st_canfd_extended_cfg
331 {
332     canfd_afl_entry_t const * p_afl;           ///< AFL rules list
333     uint64_t               txmb_txi_enable;    ///< Array of TX Message Buffer enable bits
334     uint32_t               error_interrupts;   ///< Error interrupt enable bits
335     can_bit_timing_cfg_t * p_data_timing;      ///< FD Data Rate (when bitrate switching is used)
336     uint8_t                delay_compensation; ///< FD Transceiver Delay Compensation (enable or disable)
337     canfd_global_cfg_t   * p_global_cfg;       ///< Global configuration (global error callback channel only)
338     canfd_txmb_merge_mode_t txmb_merge_mode_enable;  ///< TXMB buffer marge mode configuration
339 } canfd_extended_cfg_t;
340 
341 /**********************************************************************************************************************
342  * Exported global variables
343  **********************************************************************************************************************/
344 
345 /** @cond INC_HEADER_DEFS_SEC */
346 /** Filled in Interface API structure for this Instance. */
347 extern const can_api_t g_canfd_on_canfd;
348 
349 /** @endcond */
350 
351 /***********************************************************************************************************************
352  * Public APIs
353  **********************************************************************************************************************/
354 fsp_err_t R_CANFD_Open(can_ctrl_t * const p_api_ctrl, can_cfg_t const * const p_cfg);
355 fsp_err_t R_CANFD_Close(can_ctrl_t * const p_api_ctrl);
356 fsp_err_t R_CANFD_Write(can_ctrl_t * const p_api_ctrl, uint32_t const buffer, can_frame_t * const p_frame);
357 fsp_err_t R_CANFD_Read(can_ctrl_t * const p_api_ctrl, uint32_t const buffer, can_frame_t * const p_frame);
358 fsp_err_t R_CANFD_ModeTransition(can_ctrl_t * const   p_api_ctrl,
359                                  can_operation_mode_t operation_mode,
360                                  can_test_mode_t      test_mode);
361 fsp_err_t R_CANFD_InfoGet(can_ctrl_t * const p_api_ctrl, can_info_t * const p_info);
362 fsp_err_t R_CANFD_CallbackSet(can_ctrl_t * const          p_api_ctrl,
363                               void (                    * p_callback)(can_callback_args_t *),
364                               void const * const          p_context,
365                               can_callback_args_t * const p_callback_memory);
366 
367 /*******************************************************************************************************************//**
368  * @} (end defgroup CAN)
369  **********************************************************************************************************************/
370 
371 /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */
372 FSP_FOOTER
373 
374 #endif
375