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