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