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