LCOV - code coverage report
Current view: top level - zephyr/drivers - can.h Hit Total Coverage
Test: new.info Lines: 97 97 100.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /*
       2             :  * Copyright (c) 2021 Vestas Wind Systems A/S
       3             :  * Copyright (c) 2018 Karsten Koenig
       4             :  * Copyright (c) 2018 Alexander Wachter
       5             :  *
       6             :  * SPDX-License-Identifier: Apache-2.0
       7             :  */
       8             : 
       9             : /**
      10             :  * @file
      11             :  * @brief Controller Area Network (CAN) driver API.
      12             :  */
      13             : 
      14             : #ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_H_
      15             : #define ZEPHYR_INCLUDE_DRIVERS_CAN_H_
      16             : 
      17             : #include <errno.h>
      18             : 
      19             : #include <zephyr/types.h>
      20             : #include <zephyr/device.h>
      21             : #include <zephyr/kernel.h>
      22             : #include <string.h>
      23             : #include <zephyr/sys_clock.h>
      24             : #include <zephyr/sys/util.h>
      25             : 
      26             : #ifdef __cplusplus
      27             : extern "C" {
      28             : #endif
      29             : 
      30             : /**
      31             :  * @brief CAN Interface
      32             :  * @defgroup can_interface CAN Interface
      33             :  * @since 1.12
      34             :  * @version 1.1.0
      35             :  * @ingroup io_interfaces
      36             :  * @{
      37             :  */
      38             : 
      39             : /**
      40             :  * @name CAN frame definitions
      41             :  * @{
      42             :  */
      43             : 
      44             : /**
      45             :  * @brief Bit mask for a standard (11-bit) CAN identifier.
      46             :  */
      47           1 : #define CAN_STD_ID_MASK 0x7FFU
      48             : 
      49             : /**
      50             :  * @brief Bit mask for an extended (29-bit) CAN identifier.
      51             :  */
      52           1 : #define CAN_EXT_ID_MASK 0x1FFFFFFFU
      53             : 
      54             : /**
      55             :  * @brief Maximum data length code for CAN 2.0A/2.0B.
      56             :  */
      57           1 : #define CAN_MAX_DLC     8U
      58             : 
      59             : /**
      60             :  * @brief Maximum data length code for CAN FD.
      61             :  */
      62           1 : #define CANFD_MAX_DLC   15U
      63             : 
      64             : /**
      65             :  * @cond INTERNAL_HIDDEN
      66             :  * Internally calculated maximum data length
      67             :  */
      68             : #ifndef CONFIG_CAN_FD_MODE
      69             : #define CAN_MAX_DLEN    8U
      70             : #else
      71             : #define CAN_MAX_DLEN    64U
      72             : #endif /* CONFIG_CAN_FD_MODE */
      73             : 
      74             : /** @endcond */
      75             : 
      76             : /** @} */
      77             : 
      78             : /**
      79             :  * @name CAN controller mode flags
      80             :  * @anchor CAN_MODE_FLAGS
      81             :  *
      82             :  * @{
      83             :  */
      84             : 
      85             : /** Normal mode. */
      86           1 : #define CAN_MODE_NORMAL     0
      87             : 
      88             : /** Controller is in loopback mode (receives own frames). */
      89           1 : #define CAN_MODE_LOOPBACK        BIT(0)
      90             : 
      91             : /** Controller is not allowed to send dominant bits. */
      92           1 : #define CAN_MODE_LISTENONLY      BIT(1)
      93             : 
      94             : /** Controller allows transmitting/receiving CAN FD frames. */
      95           1 : #define CAN_MODE_FD              BIT(2)
      96             : 
      97             : /** Controller does not retransmit in case of lost arbitration or missing ACK */
      98           1 : #define CAN_MODE_ONE_SHOT        BIT(3)
      99             : 
     100             : /** Controller uses triple sampling mode */
     101           1 : #define CAN_MODE_3_SAMPLES       BIT(4)
     102             : 
     103             : /** Controller requires manual recovery after entering bus-off state */
     104           1 : #define CAN_MODE_MANUAL_RECOVERY BIT(5)
     105             : 
     106             : /** @} */
     107             : 
     108             : /**
     109             :  * @brief Provides a type to hold CAN controller configuration flags.
     110             :  *
     111             :  * The lower 24 bits are reserved for common CAN controller mode flags. The upper 8 bits are
     112             :  * reserved for CAN controller/driver specific flags.
     113             :  *
     114             :  * @see @ref CAN_MODE_FLAGS.
     115             :  */
     116           1 : typedef uint32_t can_mode_t;
     117             : 
     118             : /**
     119             :  * @brief Defines the state of the CAN controller
     120             :  */
     121           1 : enum can_state {
     122             :         /** Error-active state (RX/TX error count < 96). */
     123             :         CAN_STATE_ERROR_ACTIVE,
     124             :         /** Error-warning state (RX/TX error count < 128). */
     125             :         CAN_STATE_ERROR_WARNING,
     126             :         /** Error-passive state (RX/TX error count < 256). */
     127             :         CAN_STATE_ERROR_PASSIVE,
     128             :         /** Bus-off state (RX/TX error count >= 256). */
     129             :         CAN_STATE_BUS_OFF,
     130             :         /** CAN controller is stopped and does not participate in CAN communication. */
     131             :         CAN_STATE_STOPPED,
     132             : };
     133             : 
     134             : /**
     135             :  * @name CAN frame flags
     136             :  * @anchor CAN_FRAME_FLAGS
     137             :  *
     138             :  * @{
     139             :  */
     140             : 
     141             : /** Frame uses extended (29-bit) CAN ID */
     142           1 : #define CAN_FRAME_IDE BIT(0)
     143             : 
     144             : /** Frame is a Remote Transmission Request (RTR) */
     145           1 : #define CAN_FRAME_RTR BIT(1)
     146             : 
     147             : /** Frame uses CAN FD format (FDF) */
     148           1 : #define CAN_FRAME_FDF BIT(2)
     149             : 
     150             : /** Frame uses CAN FD Baud Rate Switch (BRS). Only valid in combination with ``CAN_FRAME_FDF``. */
     151           1 : #define CAN_FRAME_BRS BIT(3)
     152             : 
     153             : /** CAN FD Error State Indicator (ESI). Indicates that the transmitting node is in error-passive
     154             :  * state. Only valid in combination with ``CAN_FRAME_FDF``.
     155             :  */
     156           1 : #define CAN_FRAME_ESI BIT(4)
     157             : 
     158             : /** @} */
     159             : 
     160             : /**
     161             :  * @brief CAN frame structure
     162             :  */
     163           1 : struct can_frame {
     164             :         /** Standard (11-bit) or extended (29-bit) CAN identifier. */
     165           1 :         uint32_t id;
     166             :         /** Data Length Code (DLC) indicating data length in bytes. */
     167           1 :         uint8_t dlc;
     168             :         /** Flags. @see @ref CAN_FRAME_FLAGS. */
     169           1 :         uint8_t flags;
     170             : #if defined(CONFIG_CAN_RX_TIMESTAMP) || defined(__DOXYGEN__)
     171             :         /** Captured value of the free-running timer in the CAN controller when
     172             :          * this frame was received. The timer is incremented every bit time and
     173             :          * captured at the start of frame bit (SOF).
     174             :          *
     175             :          * @note @kconfig{CONFIG_CAN_RX_TIMESTAMP} must be selected for this
     176             :          * field to be available.
     177             :          */
     178           1 :         uint16_t timestamp;
     179             : #else
     180             :         /** @cond INTERNAL_HIDDEN */
     181             :         /** Padding. */
     182             :         uint16_t reserved;
     183             :         /** @endcond */
     184             : #endif
     185             :         /** The frame payload data. */
     186             :         union {
     187             :                 /** Payload data accessed as unsigned 8 bit values. */
     188           1 :                 uint8_t data[CAN_MAX_DLEN];
     189             :                 /** Payload data accessed as unsigned 32 bit values. */
     190           1 :                 uint32_t data_32[DIV_ROUND_UP(CAN_MAX_DLEN, sizeof(uint32_t))];
     191           1 :         };
     192             : };
     193             : 
     194             : /**
     195             :  * @name CAN filter flags
     196             :  * @anchor CAN_FILTER_FLAGS
     197             :  *
     198             :  * @{
     199             :  */
     200             : 
     201             : /** Filter matches frames with extended (29-bit) CAN IDs */
     202           1 : #define CAN_FILTER_IDE  BIT(0)
     203             : 
     204             : /** @} */
     205             : 
     206             : /**
     207             :  * @brief CAN filter structure
     208             :  */
     209           1 : struct can_filter {
     210             :         /** CAN identifier to match. */
     211           1 :         uint32_t id;
     212             :         /** CAN identifier matching mask. If a bit in this mask is 0, the value
     213             :          * of the corresponding bit in the ``id`` field is ignored by the filter.
     214             :          */
     215           1 :         uint32_t mask;
     216             :         /** Flags. @see @ref CAN_FILTER_FLAGS. */
     217           1 :         uint8_t flags;
     218             : };
     219             : 
     220             : /**
     221             :  * @brief CAN controller error counters
     222             :  */
     223           1 : struct can_bus_err_cnt {
     224             :         /** Value of the CAN controller transmit error counter. */
     225           1 :         uint8_t tx_err_cnt;
     226             :         /** Value of the CAN controller receive error counter. */
     227           1 :         uint8_t rx_err_cnt;
     228             : };
     229             : 
     230             : /**
     231             :  * @brief CAN bus timing structure
     232             :  *
     233             :  * This struct is used to pass bus timing values to the configuration and
     234             :  * bitrate calculation functions.
     235             :  *
     236             :  * The propagation segment represents the time of the signal propagation. Phase
     237             :  * segment 1 and phase segment 2 define the sampling point. The ``prop_seg`` and
     238             :  * ``phase_seg1`` values affect the sampling point in the same way and some
     239             :  * controllers only have a register for the sum of those two. The sync segment
     240             :  * always has a length of 1 time quantum (see below).
     241             :  *
     242             :  * @code{.text}
     243             :  *
     244             :  * +---------+----------+------------+------------+
     245             :  * |sync_seg | prop_seg | phase_seg1 | phase_seg2 |
     246             :  * +---------+----------+------------+------------+
     247             :  *                                   ^
     248             :  *                             Sampling-Point
     249             :  *
     250             :  * @endcode
     251             :  *
     252             :  * 1 time quantum (tq) has the length of 1/(core_clock / prescaler). The bitrate
     253             :  * is defined by the core clock divided by the prescaler and the sum of the
     254             :  * segments:
     255             :  *
     256             :  *   br = (core_clock / prescaler) / (1 + prop_seg + phase_seg1 + phase_seg2)
     257             :  *
     258             :  * The Synchronization Jump Width (SJW) defines the amount of time quanta the
     259             :  * sample point can be moved. The sample point is moved when resynchronization
     260             :  * is needed.
     261             :  */
     262           1 : struct can_timing {
     263             :         /** Synchronisation jump width. */
     264           1 :         uint16_t sjw;
     265             :         /** Propagation segment. */
     266           1 :         uint16_t prop_seg;
     267             :         /** Phase segment 1. */
     268           1 :         uint16_t phase_seg1;
     269             :         /** Phase segment 2. */
     270           1 :         uint16_t phase_seg2;
     271             :         /** Prescaler value. */
     272           1 :         uint16_t prescaler;
     273             : };
     274             : 
     275             : /**
     276             :  * @brief Defines the application callback handler function signature
     277             :  *
     278             :  * @param dev       Pointer to the device structure for the driver instance.
     279             :  * @param error     Status of the performed send operation. See the list of
     280             :  *                  return values for @a can_send() for value descriptions.
     281             :  * @param user_data User data provided when the frame was sent.
     282             :  */
     283           1 : typedef void (*can_tx_callback_t)(const struct device *dev, int error, void *user_data);
     284             : 
     285             : /**
     286             :  * @brief Defines the application callback handler function signature for receiving.
     287             :  *
     288             :  * @param dev       Pointer to the device structure for the driver instance.
     289             :  * @param frame     Received frame.
     290             :  * @param user_data User data provided when the filter was added.
     291             :  */
     292           1 : typedef void (*can_rx_callback_t)(const struct device *dev, struct can_frame *frame,
     293             :                                   void *user_data);
     294             : 
     295             : /**
     296             :  * @brief Defines the state change callback handler function signature
     297             :  *
     298             :  * @param dev       Pointer to the device structure for the driver instance.
     299             :  * @param state     State of the CAN controller.
     300             :  * @param err_cnt   CAN controller error counter values.
     301             :  * @param user_data User data provided the callback was set.
     302             :  */
     303           1 : typedef void (*can_state_change_callback_t)(const struct device *dev,
     304             :                                             enum can_state state,
     305             :                                             struct can_bus_err_cnt err_cnt,
     306             :                                             void *user_data);
     307             : 
     308             : /**
     309             :  * @cond INTERNAL_HIDDEN
     310             :  *
     311             :  * For internal driver use only, skip these in public documentation.
     312             :  */
     313             : 
     314             : /**
     315             :  * @brief Calculate Transmitter Delay Compensation Offset from data phase timing parameters.
     316             :  *
     317             :  * Calculates the TDC Offset in minimum time quanta (mtq) using the sample point and CAN core clock
     318             :  * prescaler specified by a set of data phase timing parameters.
     319             :  *
     320             :  * The result is clamped to the minimum/maximum supported TDC Offset values provided.
     321             :  *
     322             :  * @param _timing_data Pointer to data phase timing parameters.
     323             :  * @param _tdco_min    Minimum supported TDC Offset value in mtq.
     324             :  * @param _tdco_max    Maximum supported TDC Offset value in mtq.
     325             :  * @return             Calculated TDC Offset value in mtq.
     326             :  */
     327             : #define CAN_CALC_TDCO(_timing_data, _tdco_min, _tdco_max)                                          \
     328             :         CLAMP((1U + _timing_data->prop_seg + _timing_data->phase_seg1) * _timing_data->prescaler,  \
     329             :               _tdco_min, _tdco_max)
     330             : 
     331             : /**
     332             :  * @brief Common CAN controller driver configuration.
     333             :  *
     334             :  * This structure is common to all CAN controller drivers and is expected to be the first element in
     335             :  * the object pointed to by the config field in the device structure.
     336             :  */
     337             : struct can_driver_config {
     338             :         /** Pointer to the device structure for the associated CAN transceiver device or NULL. */
     339             :         const struct device *phy;
     340             :         /** The minimum bitrate supported by the CAN controller/transceiver combination. */
     341             :         uint32_t min_bitrate;
     342             :         /** The maximum bitrate supported by the CAN controller/transceiver combination. */
     343             :         uint32_t max_bitrate;
     344             :         /** Initial CAN classic/CAN FD arbitration phase bitrate. */
     345             :         uint32_t bitrate;
     346             :         /** Initial CAN classic/CAN FD arbitration phase sample point in permille. */
     347             :         uint16_t sample_point;
     348             : #ifdef CONFIG_CAN_FD_MODE
     349             :         /** Initial CAN FD data phase sample point in permille. */
     350             :         uint16_t sample_point_data;
     351             :         /** Initial CAN FD data phase bitrate. */
     352             :         uint32_t bitrate_data;
     353             : #endif /* CONFIG_CAN_FD_MODE */
     354             : };
     355             : 
     356             : /**
     357             :  * @brief Static initializer for @p can_driver_config struct
     358             :  *
     359             :  * @param node_id Devicetree node identifier
     360             :  * @param _min_bitrate minimum bitrate supported by the CAN controller
     361             :  * @param _max_bitrate maximum bitrate supported by the CAN controller
     362             :  */
     363             : #define CAN_DT_DRIVER_CONFIG_GET(node_id, _min_bitrate, _max_bitrate)                           \
     364             :         {                                                                                       \
     365             :                 .phy = DEVICE_DT_GET_OR_NULL(DT_PHANDLE(node_id, phys)),                        \
     366             :                 .min_bitrate = DT_CAN_TRANSCEIVER_MIN_BITRATE(node_id, _min_bitrate),           \
     367             :                 .max_bitrate = DT_CAN_TRANSCEIVER_MAX_BITRATE(node_id, _max_bitrate),           \
     368             :                 .bitrate = DT_PROP_OR(node_id, bitrate,                                         \
     369             :                         DT_PROP_OR(node_id, bus_speed, CONFIG_CAN_DEFAULT_BITRATE)),            \
     370             :                 .sample_point = DT_PROP_OR(node_id, sample_point, 0),                           \
     371             :                 IF_ENABLED(CONFIG_CAN_FD_MODE,                                                  \
     372             :                         (.bitrate_data = DT_PROP_OR(node_id, bitrate_data,                      \
     373             :                          DT_PROP_OR(node_id, bus_speed_data, CONFIG_CAN_DEFAULT_BITRATE_DATA)), \
     374             :                          .sample_point_data = DT_PROP_OR(node_id, sample_point_data, 0),))      \
     375             :         }
     376             : 
     377             : /**
     378             :  * @brief Static initializer for @p can_driver_config struct from DT_DRV_COMPAT instance
     379             :  *
     380             :  * @param inst DT_DRV_COMPAT instance number
     381             :  * @param _min_bitrate minimum bitrate supported by the CAN controller
     382             :  * @param _max_bitrate maximum bitrate supported by the CAN controller
     383             :  * @see CAN_DT_DRIVER_CONFIG_GET()
     384             :  */
     385             : #define CAN_DT_DRIVER_CONFIG_INST_GET(inst, _min_bitrate, _max_bitrate)                         \
     386             :         CAN_DT_DRIVER_CONFIG_GET(DT_DRV_INST(inst), _min_bitrate, _max_bitrate)
     387             : 
     388             : /**
     389             :  * @brief Common CAN controller driver data.
     390             :  *
     391             :  * This structure is common to all CAN controller drivers and is expected to be the first element in
     392             :  * the driver's struct driver_data declaration.
     393             :  */
     394             : struct can_driver_data {
     395             :         /** Current CAN controller mode. */
     396             :         can_mode_t mode;
     397             :         /** True if the CAN controller is started, false otherwise. */
     398             :         bool started;
     399             :         /** State change callback function pointer or NULL. */
     400             :         can_state_change_callback_t state_change_cb;
     401             :         /** State change callback user data pointer or NULL. */
     402             :         void *state_change_cb_user_data;
     403             : };
     404             : 
     405             : /**
     406             :  * @brief Callback API upon setting CAN bus timing
     407             :  * See @a can_set_timing() for argument description
     408             :  */
     409             : typedef int (*can_set_timing_t)(const struct device *dev,
     410             :                                 const struct can_timing *timing);
     411             : 
     412             : /**
     413             :  * @brief Optional callback API upon setting CAN FD bus timing for the data phase.
     414             :  * See @a can_set_timing_data() for argument description
     415             :  */
     416             : typedef int (*can_set_timing_data_t)(const struct device *dev,
     417             :                                      const struct can_timing *timing_data);
     418             : 
     419             : /**
     420             :  * @brief Callback API upon getting CAN controller capabilities
     421             :  * See @a can_get_capabilities() for argument description
     422             :  */
     423             : typedef int (*can_get_capabilities_t)(const struct device *dev, can_mode_t *cap);
     424             : 
     425             : /**
     426             :  * @brief Callback API upon starting CAN controller
     427             :  * See @a can_start() for argument description
     428             :  */
     429             : typedef int (*can_start_t)(const struct device *dev);
     430             : 
     431             : /**
     432             :  * @brief Callback API upon stopping CAN controller
     433             :  * See @a can_stop() for argument description
     434             :  */
     435             : typedef int (*can_stop_t)(const struct device *dev);
     436             : 
     437             : /**
     438             :  * @brief Callback API upon setting CAN controller mode
     439             :  * See @a can_set_mode() for argument description
     440             :  */
     441             : typedef int (*can_set_mode_t)(const struct device *dev, can_mode_t mode);
     442             : 
     443             : /**
     444             :  * @brief Callback API upon sending a CAN frame
     445             :  * See @a can_send() for argument description
     446             :  *
     447             :  * @note From a driver perspective `callback` will never be `NULL` as a default callback will be
     448             :  * provided if none is provided by the caller. This allows for simplifying the driver handling.
     449             :  */
     450             : typedef int (*can_send_t)(const struct device *dev,
     451             :                           const struct can_frame *frame,
     452             :                           k_timeout_t timeout, can_tx_callback_t callback,
     453             :                           void *user_data);
     454             : 
     455             : /**
     456             :  * @brief Callback API upon adding an RX filter
     457             :  * See @a can_add_rx_callback() for argument description
     458             :  */
     459             : typedef int (*can_add_rx_filter_t)(const struct device *dev,
     460             :                                    can_rx_callback_t callback,
     461             :                                    void *user_data,
     462             :                                    const struct can_filter *filter);
     463             : 
     464             : /**
     465             :  * @brief Callback API upon removing an RX filter
     466             :  * See @a can_remove_rx_filter() for argument description
     467             :  */
     468             : typedef void (*can_remove_rx_filter_t)(const struct device *dev, int filter_id);
     469             : 
     470             : /**
     471             :  * @brief Optional callback API upon manually recovering the CAN controller from bus-off state
     472             :  * See @a can_recover() for argument description
     473             :  */
     474             : typedef int (*can_recover_t)(const struct device *dev, k_timeout_t timeout);
     475             : 
     476             : /**
     477             :  * @brief Callback API upon getting the CAN controller state
     478             :  * See @a can_get_state() for argument description
     479             :  */
     480             : typedef int (*can_get_state_t)(const struct device *dev, enum can_state *state,
     481             :                                struct can_bus_err_cnt *err_cnt);
     482             : 
     483             : /**
     484             :  * @brief Callback API upon setting a state change callback
     485             :  * See @a can_set_state_change_callback() for argument description
     486             :  */
     487             : typedef void(*can_set_state_change_callback_t)(const struct device *dev,
     488             :                                                can_state_change_callback_t callback,
     489             :                                                void *user_data);
     490             : 
     491             : /**
     492             :  * @brief Callback API upon getting the CAN core clock rate
     493             :  * See @a can_get_core_clock() for argument description
     494             :  */
     495             : typedef int (*can_get_core_clock_t)(const struct device *dev, uint32_t *rate);
     496             : 
     497             : /**
     498             :  * @brief Optional callback API upon getting the maximum number of concurrent CAN RX filters
     499             :  * See @a can_get_max_filters() for argument description
     500             :  */
     501             : typedef int (*can_get_max_filters_t)(const struct device *dev, bool ide);
     502             : 
     503             : __subsystem struct can_driver_api {
     504             :         can_get_capabilities_t get_capabilities;
     505             :         can_start_t start;
     506             :         can_stop_t stop;
     507             :         can_set_mode_t set_mode;
     508             :         can_set_timing_t set_timing;
     509             :         can_send_t send;
     510             :         can_add_rx_filter_t add_rx_filter;
     511             :         can_remove_rx_filter_t remove_rx_filter;
     512             : #if defined(CONFIG_CAN_MANUAL_RECOVERY_MODE) || defined(__DOXYGEN__)
     513             :         can_recover_t recover;
     514             : #endif /* CONFIG_CAN_MANUAL_RECOVERY_MODE */
     515             :         can_get_state_t get_state;
     516             :         can_set_state_change_callback_t set_state_change_callback;
     517             :         can_get_core_clock_t get_core_clock;
     518             :         can_get_max_filters_t get_max_filters;
     519             :         /* Min values for the timing registers */
     520             :         struct can_timing timing_min;
     521             :         /* Max values for the timing registers */
     522             :         struct can_timing timing_max;
     523             : #if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
     524             :         can_set_timing_data_t set_timing_data;
     525             :         /* Min values for the timing registers during the data phase */
     526             :         struct can_timing timing_data_min;
     527             :         /* Max values for the timing registers during the data phase */
     528             :         struct can_timing timing_data_max;
     529             : #endif /* CONFIG_CAN_FD_MODE */
     530             : };
     531             : 
     532             : /** @endcond */
     533             : 
     534             : #if defined(CONFIG_CAN_STATS) || defined(__DOXYGEN__)
     535             : 
     536             : #include <zephyr/stats/stats.h>
     537             : 
     538             : /** @cond INTERNAL_HIDDEN */
     539             : 
     540             : STATS_SECT_START(can)
     541             : STATS_SECT_ENTRY32(bit_error)
     542             : STATS_SECT_ENTRY32(bit0_error)
     543             : STATS_SECT_ENTRY32(bit1_error)
     544             : STATS_SECT_ENTRY32(stuff_error)
     545             : STATS_SECT_ENTRY32(crc_error)
     546             : STATS_SECT_ENTRY32(form_error)
     547             : STATS_SECT_ENTRY32(ack_error)
     548             : STATS_SECT_ENTRY32(rx_overrun)
     549             : STATS_SECT_END;
     550             : 
     551             : STATS_NAME_START(can)
     552             : STATS_NAME(can, bit_error)
     553             : STATS_NAME(can, bit0_error)
     554             : STATS_NAME(can, bit1_error)
     555             : STATS_NAME(can, stuff_error)
     556             : STATS_NAME(can, crc_error)
     557             : STATS_NAME(can, form_error)
     558             : STATS_NAME(can, ack_error)
     559             : STATS_NAME(can, rx_overrun)
     560             : STATS_NAME_END(can);
     561             : 
     562             : /** @endcond */
     563             : 
     564             : /**
     565             :  * @brief CAN specific device state which allows for CAN device class specific
     566             :  * additions
     567             :  */
     568           1 : struct can_device_state {
     569             :         /** Common device state. */
     570           1 :         struct device_state devstate;
     571             :         /** CAN device statistics */
     572           1 :         struct stats_can stats;
     573             : };
     574             : 
     575             : /** @cond INTERNAL_HIDDEN */
     576             : 
     577             : /**
     578             :  * @brief Get pointer to CAN statistics structure
     579             :  */
     580             : #define Z_CAN_GET_STATS(dev_)                           \
     581             :         CONTAINER_OF(dev_->state, struct can_device_state, devstate)->stats
     582             : 
     583             : /** @endcond */
     584             : 
     585             : /**
     586             :  * @brief Increment the bit error counter for a CAN device
     587             :  *
     588             :  * The bit error counter is incremented when the CAN controller is unable to
     589             :  * transmit either a dominant or a recessive bit.
     590             :  *
     591             :  * @note This error counter should only be incremented if the CAN controller is unable to
     592             :  * distinguish between failure to transmit a dominant versus failure to transmit a recessive bit. If
     593             :  * the CAN controller supports distinguishing between the two, the `bit0` or `bit1` error counter
     594             :  * shall be incremented instead.
     595             :  *
     596             :  * @see CAN_STATS_BIT0_ERROR_INC()
     597             :  * @see CAN_STATS_BIT1_ERROR_INC()
     598             :  *
     599             :  * @param dev_ Pointer to the device structure for the driver instance.
     600             :  */
     601           1 : #define CAN_STATS_BIT_ERROR_INC(dev_)                  \
     602             :         STATS_INC(Z_CAN_GET_STATS(dev_), bit_error)
     603             : 
     604             : /**
     605             :  * @brief Increment the bit0 error counter for a CAN device
     606             :  *
     607             :  * The bit0 error counter is incremented when the CAN controller is unable to
     608             :  * transmit a dominant bit.
     609             :  *
     610             :  * Incrementing this counter will automatically increment the bit error counter.
     611             :  * @see CAN_STATS_BIT_ERROR_INC()
     612             :  *
     613             :  * @param dev_ Pointer to the device structure for the driver instance.
     614             :  */
     615           1 : #define CAN_STATS_BIT0_ERROR_INC(dev_)                          \
     616             :         do {                                                    \
     617             :                 STATS_INC(Z_CAN_GET_STATS(dev_), bit0_error);   \
     618             :                 CAN_STATS_BIT_ERROR_INC(dev_);                  \
     619             :         } while (0)
     620             : 
     621             : /**
     622             :  * @brief Increment the bit1 (recessive) error counter for a CAN device
     623             :  *
     624             :  * The bit1 error counter is incremented when the CAN controller is unable to
     625             :  * transmit a recessive bit.
     626             :  *
     627             :  * Incrementing this counter will automatically increment the bit error counter.
     628             :  * @see CAN_STATS_BIT_ERROR_INC()
     629             :  *
     630             :  * @param dev_ Pointer to the device structure for the driver instance.
     631             :  */
     632           1 : #define CAN_STATS_BIT1_ERROR_INC(dev_)                          \
     633             :         do {                                                    \
     634             :                 STATS_INC(Z_CAN_GET_STATS(dev_), bit1_error);   \
     635             :                 CAN_STATS_BIT_ERROR_INC(dev_);                  \
     636             :         } while (0)
     637             : 
     638             : /**
     639             :  * @brief Increment the stuffing error counter for a CAN device
     640             :  *
     641             :  * The stuffing error counter is incremented when the CAN controller detects a
     642             :  * bit stuffing error.
     643             :  *
     644             :  * @param dev_ Pointer to the device structure for the driver instance.
     645             :  */
     646           1 : #define CAN_STATS_STUFF_ERROR_INC(dev_)                 \
     647             :         STATS_INC(Z_CAN_GET_STATS(dev_), stuff_error)
     648             : 
     649             : /**
     650             :  * @brief Increment the CRC error counter for a CAN device
     651             :  *
     652             :  * The CRC error counter is incremented when the CAN controller detects a frame
     653             :  * with an invalid CRC.
     654             :  *
     655             :  * @param dev_ Pointer to the device structure for the driver instance.
     656             :  */
     657           1 : #define CAN_STATS_CRC_ERROR_INC(dev_)                   \
     658             :         STATS_INC(Z_CAN_GET_STATS(dev_), crc_error)
     659             : 
     660             : /**
     661             :  * @brief Increment the form error counter for a CAN device
     662             :  *
     663             :  * The form error counter is incremented when the CAN controller detects a
     664             :  * fixed-form bit field containing illegal bits.
     665             :  *
     666             :  * @param dev_ Pointer to the device structure for the driver instance.
     667             :  */
     668           1 : #define CAN_STATS_FORM_ERROR_INC(dev_)                  \
     669             :         STATS_INC(Z_CAN_GET_STATS(dev_), form_error)
     670             : 
     671             : /**
     672             :  * @brief Increment the acknowledge error counter for a CAN device
     673             :  *
     674             :  * The acknowledge error counter is incremented when the CAN controller does not
     675             :  * monitor a dominant bit in the ACK slot.
     676             :  *
     677             :  * @param dev_ Pointer to the device structure for the driver instance.
     678             :  */
     679           1 : #define CAN_STATS_ACK_ERROR_INC(dev_)                   \
     680             :         STATS_INC(Z_CAN_GET_STATS(dev_), ack_error)
     681             : 
     682             : /**
     683             :  * @brief Increment the RX overrun counter for a CAN device
     684             :  *
     685             :  * The RX overrun counter is incremented when the CAN controller receives a CAN
     686             :  * frame matching an installed filter but lacks the capacity to store it (either
     687             :  * due to an already full RX mailbox or a full RX FIFO).
     688             :  *
     689             :  * @param dev_ Pointer to the device structure for the driver instance.
     690             :  */
     691           1 : #define CAN_STATS_RX_OVERRUN_INC(dev_)                  \
     692             :         STATS_INC(Z_CAN_GET_STATS(dev_), rx_overrun)
     693             : 
     694             : /**
     695             :  * @brief Zero all statistics for a CAN device
     696             :  *
     697             :  * The driver is responsible for resetting the statistics before starting the CAN
     698             :  * controller.
     699             :  *
     700             :  * @param dev_ Pointer to the device structure for the driver instance.
     701             :  */
     702           1 : #define CAN_STATS_RESET(dev_)                           \
     703             :         stats_reset(&(Z_CAN_GET_STATS(dev_).s_hdr))
     704             : 
     705             : /** @cond INTERNAL_HIDDEN */
     706             : 
     707             : /**
     708             :  * @brief Define a statically allocated and section assigned CAN device state
     709             :  */
     710             : #define Z_CAN_DEVICE_STATE_DEFINE(dev_id)                               \
     711             :         static struct can_device_state Z_DEVICE_STATE_NAME(dev_id)      \
     712             :         __attribute__((__section__(".z_devstate")))
     713             : 
     714             : /**
     715             :  * @brief Define a CAN device init wrapper function
     716             :  *
     717             :  * This does device instance specific initialization of common data (such as stats)
     718             :  * and calls the given init_fn
     719             :  */
     720             : #define Z_CAN_INIT_FN(dev_id, init_fn)                                  \
     721             :         static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
     722             :         {                                                               \
     723             :                 struct can_device_state *state =                        \
     724             :                         CONTAINER_OF(dev->state, struct can_device_state, devstate); \
     725             :                 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 8,        \
     726             :                            STATS_NAME_INIT_PARMS(can));                 \
     727             :                 stats_register(dev->name, &(state->stats.s_hdr));     \
     728             :                 if (!is_null_no_warn(init_fn)) {                        \
     729             :                         return init_fn(dev);                            \
     730             :                 }                                                       \
     731             :                                                                         \
     732             :                 return 0;                                               \
     733             :         }
     734             : 
     735             : /** @endcond */
     736             : 
     737             : /**
     738             :  * @brief Like DEVICE_DT_DEFINE() with CAN device specifics.
     739             :  *
     740             :  * @details Defines a device which implements the CAN API. May generate a custom
     741             :  * device_state container struct and init_fn wrapper when needed depending on
     742             :  * @kconfig{CONFIG_CAN_STATS}.
     743             :  *
     744             :  * @param node_id   The devicetree node identifier.
     745             :  * @param init_fn   Name of the init function of the driver.
     746             :  * @param pm        PM device resources reference (NULL if device does not use PM).
     747             :  * @param data      Pointer to the device's private data.
     748             :  * @param config    The address to the structure containing the configuration
     749             :  *                  information for this instance of the driver.
     750             :  * @param level     The initialization level. See SYS_INIT() for
     751             :  *                  details.
     752             :  * @param prio      Priority within the selected initialization level. See
     753             :  *                  SYS_INIT() for details.
     754             :  * @param api       Provides an initial pointer to the API function struct
     755             :  *                  used by the driver. Can be NULL.
     756             :  */
     757             : #define CAN_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
     758           1 :                              prio, api, ...)                            \
     759             :         Z_CAN_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id));         \
     760             :         Z_CAN_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn)             \
     761             :         Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id),           \
     762             :                         DEVICE_DT_NAME(node_id),                        \
     763             :                         &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init),      \
     764             :                         pm, data, config, level, prio, api,             \
     765             :                         &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
     766             :                         __VA_ARGS__)
     767             : 
     768             : #else /* CONFIG_CAN_STATS */
     769             : 
     770             : #define CAN_STATS_BIT_ERROR_INC(dev_)
     771             : #define CAN_STATS_BIT0_ERROR_INC(dev_)
     772             : #define CAN_STATS_BIT1_ERROR_INC(dev_)
     773             : #define CAN_STATS_STUFF_ERROR_INC(dev_)
     774             : #define CAN_STATS_CRC_ERROR_INC(dev_)
     775             : #define CAN_STATS_FORM_ERROR_INC(dev_)
     776             : #define CAN_STATS_ACK_ERROR_INC(dev_)
     777             : #define CAN_STATS_RX_OVERRUN_INC(dev_)
     778             : #define CAN_STATS_RESET(dev_)
     779             : 
     780             : #define CAN_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
     781             :                              prio, api, ...)                            \
     782             :         DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level,     \
     783             :                          prio, api, __VA_ARGS__)
     784             : 
     785             : #endif /* CONFIG_CAN_STATS */
     786             : 
     787             : /**
     788             :  * @brief Like CAN_DEVICE_DT_DEFINE() for an instance of a DT_DRV_COMPAT compatible
     789             :  *
     790             :  * @param inst Instance number. This is replaced by <tt>DT_DRV_COMPAT(inst)</tt>
     791             :  *             in the call to CAN_DEVICE_DT_DEFINE().
     792             :  * @param ...  Other parameters as expected by CAN_DEVICE_DT_DEFINE().
     793             :  */
     794           1 : #define CAN_DEVICE_DT_INST_DEFINE(inst, ...)                    \
     795             :         CAN_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
     796             : 
     797             : /**
     798             :  * @name CAN controller configuration
     799             :  *
     800             :  * @{
     801             :  */
     802             : 
     803             : /**
     804             :  * @brief Get the CAN core clock rate
     805             :  *
     806             :  * Returns the CAN core clock rate. One minimum time quantum (mtq) is 1/(core clock rate). The CAN
     807             :  * core clock can be further divided by the CAN clock prescaler (see the @a can_timing struct),
     808             :  * providing the time quantum (tq).
     809             :  *
     810             :  * @param dev  Pointer to the device structure for the driver instance.
     811             :  * @param[out] rate CAN core clock rate in Hz.
     812             :  *
     813             :  * @return 0 on success, or a negative error code on error
     814             :  */
     815           1 : __syscall int can_get_core_clock(const struct device *dev, uint32_t *rate);
     816             : 
     817             : static inline int z_impl_can_get_core_clock(const struct device *dev, uint32_t *rate)
     818             : {
     819             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
     820             : 
     821             :         return api->get_core_clock(dev, rate);
     822             : }
     823             : 
     824             : /**
     825             :  * @brief Get minimum supported bitrate
     826             :  *
     827             :  * Get the minimum supported bitrate for the CAN controller/transceiver combination.
     828             :  *
     829             :  * @note The minimum bitrate represents limitations of the CAN controller/transceiver
     830             :  * combination. Whether the CAN controller can achieve this bitrate depends on the CAN core clock
     831             :  * rate and the minimum CAN timing limits.
     832             :  *
     833             :  * @see can_get_core_clock()
     834             :  * @see can_get_timing_min()
     835             :  * @see can_get_timing_data_min()
     836             :  *
     837             :  * @param dev Pointer to the device structure for the driver instance.
     838             :  * @return Minimum supported bitrate in bits/s. A value of 0 means the lower limit is unspecified.
     839             :  */
     840           1 : __syscall uint32_t can_get_bitrate_min(const struct device *dev);
     841             : 
     842             : static inline uint32_t z_impl_can_get_bitrate_min(const struct device *dev)
     843             : {
     844             :         const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
     845             : 
     846             :         return common->min_bitrate;
     847             : }
     848             : 
     849             : /**
     850             :  * @brief Get maximum supported bitrate
     851             :  *
     852             :  * Get the maximum supported bitrate for the CAN controller/transceiver combination.
     853             :  *
     854             :  * @note The maximum bitrate represents limitations of the CAN controller/transceiver
     855             :  * combination. Whether the CAN controller can achieve this bitrate depends on the CAN core clock
     856             :  * rate and the maximum CAN timing limits.
     857             :  *
     858             :  * @see can_get_core_clock()
     859             :  * @see can_get_timing_max()
     860             :  * @see can_get_timing_data_max()
     861             :  *
     862             :  * @param dev Pointer to the device structure for the driver instance.
     863             :  * @return Maximum supported bitrate in bits/s
     864             :  */
     865           1 : __syscall uint32_t can_get_bitrate_max(const struct device *dev);
     866             : 
     867             : static inline uint32_t z_impl_can_get_bitrate_max(const struct device *dev)
     868             : {
     869             :         const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
     870             : 
     871             :         return common->max_bitrate;
     872             : }
     873             : 
     874             : /**
     875             :  * @brief Get the minimum supported timing parameter values.
     876             :  *
     877             :  * @param dev Pointer to the device structure for the driver instance.
     878             :  *
     879             :  * @return Pointer to the minimum supported timing parameter values.
     880             :  */
     881           1 : __syscall const struct can_timing *can_get_timing_min(const struct device *dev);
     882             : 
     883             : static inline const struct can_timing *z_impl_can_get_timing_min(const struct device *dev)
     884             : {
     885             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
     886             : 
     887             :         return &api->timing_min;
     888             : }
     889             : 
     890             : /**
     891             :  * @brief Get the maximum supported timing parameter values.
     892             :  *
     893             :  * @param dev Pointer to the device structure for the driver instance.
     894             :  *
     895             :  * @return Pointer to the maximum supported timing parameter values.
     896             :  */
     897           1 : __syscall const struct can_timing *can_get_timing_max(const struct device *dev);
     898             : 
     899             : static inline const struct can_timing *z_impl_can_get_timing_max(const struct device *dev)
     900             : {
     901             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
     902             : 
     903             :         return &api->timing_max;
     904             : }
     905             : 
     906             : /**
     907             :  * @brief Calculate timing parameters from bitrate and sample point
     908             :  *
     909             :  * Calculate the timing parameters from a given bitrate in bits/s and the
     910             :  * sampling point in permill (1/1000) of the entire bit time. The bitrate must
     911             :  * always match perfectly. If no result can be reached for the given parameters,
     912             :  * -EINVAL is returned.
     913             :  *
     914             :  * If the sample point is set to 0, this function defaults to a sample point of 75.0%
     915             :  * for bitrates over 800 kbit/s, 80.0% for bitrates over 500 kbit/s, and 87.5% for
     916             :  * all other bitrates.
     917             :  *
     918             :  * @note The requested ``sample_pnt`` will not always be matched perfectly. The
     919             :  * algorithm calculates the best possible match.
     920             :  *
     921             :  * @param dev        Pointer to the device structure for the driver instance.
     922             :  * @param[out] res   Result is written into the @a can_timing struct provided.
     923             :  * @param bitrate    Target bitrate in bits/s.
     924             :  * @param sample_pnt Sample point in permille of the entire bit time or 0 for
     925             :  *                   automatic sample point location.
     926             :  *
     927             :  * @retval 0 or positive sample point error on success.
     928             :  * @retval -EINVAL if the requested bitrate or sample point is out of range.
     929             :  * @retval -ENOTSUP if the requested bitrate is not supported.
     930             :  * @retval -EIO if @a can_get_core_clock() is not available.
     931             :  */
     932           1 : __syscall int can_calc_timing(const struct device *dev, struct can_timing *res,
     933             :                               uint32_t bitrate, uint16_t sample_pnt);
     934             : 
     935             : /**
     936             :  * @brief Get the minimum supported timing parameter values for the data phase.
     937             :  *
     938             :  * Same as @a can_get_timing_min() but for the minimum values for the data phase.
     939             :  *
     940             :  * @note @kconfig{CONFIG_CAN_FD_MODE} must be selected for this function to be
     941             :  * available.
     942             :  *
     943             :  * @param dev Pointer to the device structure for the driver instance.
     944             :  *
     945             :  * @return Pointer to the minimum supported timing parameter values, or NULL if
     946             :  *         CAN FD support is not implemented by the driver.
     947             :  */
     948           1 : __syscall const struct can_timing *can_get_timing_data_min(const struct device *dev);
     949             : 
     950             : #ifdef CONFIG_CAN_FD_MODE
     951             : static inline const struct can_timing *z_impl_can_get_timing_data_min(const struct device *dev)
     952             : {
     953             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
     954             : 
     955             :         return &api->timing_data_min;
     956             : }
     957             : #endif /* CONFIG_CAN_FD_MODE */
     958             : 
     959             : /**
     960             :  * @brief Get the maximum supported timing parameter values for the data phase.
     961             :  *
     962             :  * Same as @a can_get_timing_max() but for the maximum values for the data phase.
     963             :  *
     964             :  * @note @kconfig{CONFIG_CAN_FD_MODE} must be selected for this function to be
     965             :  * available.
     966             :  *
     967             :  * @param dev Pointer to the device structure for the driver instance.
     968             :  *
     969             :  * @return Pointer to the maximum supported timing parameter values, or NULL if
     970             :  *         CAN FD support is not implemented by the driver.
     971             :  */
     972           1 : __syscall const struct can_timing *can_get_timing_data_max(const struct device *dev);
     973             : 
     974             : #ifdef CONFIG_CAN_FD_MODE
     975             : static inline const struct can_timing *z_impl_can_get_timing_data_max(const struct device *dev)
     976             : {
     977             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
     978             : 
     979             :         return &api->timing_data_max;
     980             : }
     981             : #endif /* CONFIG_CAN_FD_MODE */
     982             : 
     983             : /**
     984             :  * @brief Calculate timing parameters for the data phase
     985             :  *
     986             :  * Same as @a can_calc_timing() but with the maximum and minimum values from the
     987             :  * data phase.
     988             :  *
     989             :  * @note @kconfig{CONFIG_CAN_FD_MODE} must be selected for this function to be
     990             :  * available.
     991             :  *
     992             :  * @param dev        Pointer to the device structure for the driver instance.
     993             :  * @param[out] res   Result is written into the @a can_timing struct provided.
     994             :  * @param bitrate    Target bitrate for the data phase in bits/s
     995             :  * @param sample_pnt Sample point for the data phase in permille of the entire bit
     996             :  *                   time or 0 for automatic sample point location.
     997             :  *
     998             :  * @retval 0 or positive sample point error on success.
     999             :  * @retval -EINVAL if the requested bitrate or sample point is out of range.
    1000             :  * @retval -ENOTSUP if the requested bitrate is not supported.
    1001             :  * @retval -EIO if @a can_get_core_clock() is not available.
    1002             :  */
    1003           1 : __syscall int can_calc_timing_data(const struct device *dev, struct can_timing *res,
    1004             :                                    uint32_t bitrate, uint16_t sample_pnt);
    1005             : 
    1006             : /**
    1007             :  * @brief Configure the bus timing for the data phase of a CAN FD controller.
    1008             :  *
    1009             :  * @note @kconfig{CONFIG_CAN_FD_MODE} must be selected for this function to be
    1010             :  * available.
    1011             :  *
    1012             :  * @see can_set_timing()
    1013             :  *
    1014             :  * @param dev         Pointer to the device structure for the driver instance.
    1015             :  * @param timing_data Bus timings for data phase
    1016             :  *
    1017             :  * @retval 0 If successful.
    1018             :  * @retval -EBUSY if the CAN controller is not in stopped state.
    1019             :  * @retval -EIO General input/output error, failed to configure device.
    1020             :  * @retval -ENOTSUP if the timing parameters are not supported by the driver.
    1021             :  * @retval -ENOSYS if CAN FD support is not implemented by the driver.
    1022             :  */
    1023           1 : __syscall int can_set_timing_data(const struct device *dev,
    1024             :                                   const struct can_timing *timing_data);
    1025             : 
    1026             : /**
    1027             :  * @brief Set the bitrate for the data phase of the CAN FD controller
    1028             :  *
    1029             :  * CAN in Automation (CiA) 301 v4.2.0 recommends a sample point location of
    1030             :  * 87.5% percent for all bitrates. However, some CAN controllers have
    1031             :  * difficulties meeting this for higher bitrates.
    1032             :  *
    1033             :  * This function defaults to using a sample point of 75.0% for bitrates over 800
    1034             :  * kbit/s, 80.0% for bitrates over 500 kbit/s, and 87.5% for all other
    1035             :  * bitrates. This is in line with the sample point locations used by the Linux
    1036             :  * kernel.
    1037             :  *
    1038             :  * @note @kconfig{CONFIG_CAN_FD_MODE} must be selected for this function to be
    1039             :  * available.
    1040             :  *
    1041             :  * @see can_set_bitrate()
    1042             : 
    1043             :  * @param dev          Pointer to the device structure for the driver instance.
    1044             :  * @param bitrate_data Desired data phase bitrate.
    1045             :  *
    1046             :  * @retval 0 If successful.
    1047             :  * @retval -EBUSY if the CAN controller is not in stopped state.
    1048             :  * @retval -EINVAL if the requested bitrate is out of range.
    1049             :  * @retval -ENOTSUP if the requested bitrate not supported by the CAN controller/transceiver
    1050             :  *                  combination.
    1051             :  * @retval -ERANGE if the resulting sample point is off by more than +/- 5%.
    1052             :  * @retval -EIO General input/output error, failed to set bitrate.
    1053             :  */
    1054           1 : __syscall int can_set_bitrate_data(const struct device *dev, uint32_t bitrate_data);
    1055             : 
    1056             : /**
    1057             :  * @brief Configure the bus timing of a CAN controller.
    1058             :  *
    1059             :  * @see can_set_timing_data()
    1060             :  *
    1061             :  * @param dev         Pointer to the device structure for the driver instance.
    1062             :  * @param timing      Bus timings.
    1063             :  *
    1064             :  * @retval 0 If successful.
    1065             :  * @retval -EBUSY if the CAN controller is not in stopped state.
    1066             :  * @retval -ENOTSUP if the timing parameters are not supported by the driver.
    1067             :  * @retval -EIO General input/output error, failed to configure device.
    1068             :  */
    1069           1 : __syscall int can_set_timing(const struct device *dev,
    1070             :                              const struct can_timing *timing);
    1071             : 
    1072             : /**
    1073             :  * @brief Get the supported modes of the CAN controller
    1074             :  *
    1075             :  * The returned capabilities may not necessarily be supported at the same time (e.g. some CAN
    1076             :  * controllers support both ``CAN_MODE_LOOPBACK`` and ``CAN_MODE_LISTENONLY``, but not at the same
    1077             :  * time).
    1078             :  *
    1079             :  * @param dev      Pointer to the device structure for the driver instance.
    1080             :  * @param[out] cap Supported capabilities.
    1081             :  *
    1082             :  * @retval 0 If successful.
    1083             :  * @retval -EIO General input/output error, failed to get capabilities.
    1084             :  */
    1085           1 : __syscall int can_get_capabilities(const struct device *dev, can_mode_t *cap);
    1086             : 
    1087             : static inline int z_impl_can_get_capabilities(const struct device *dev, can_mode_t *cap)
    1088             : {
    1089             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1090             : 
    1091             :         return api->get_capabilities(dev, cap);
    1092             : }
    1093             : 
    1094             : /**
    1095             :  * @brief Get the CAN transceiver associated with the CAN controller
    1096             :  *
    1097             :  * Get a pointer to the device structure for the CAN transceiver associated with the CAN controller.
    1098             :  *
    1099             :  * @param dev Pointer to the device structure for the driver instance.
    1100             :  * @return Pointer to the device structure for the associated CAN transceiver driver instance, or
    1101             :  *         NULL if no transceiver is associated.
    1102             :  */
    1103           1 : __syscall const struct device *can_get_transceiver(const struct device *dev);
    1104             : 
    1105             : static const struct device *z_impl_can_get_transceiver(const struct device *dev)
    1106             : {
    1107             :         const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
    1108             : 
    1109             :         return common->phy;
    1110             : }
    1111             : 
    1112             : /**
    1113             :  * @brief Start the CAN controller
    1114             :  *
    1115             :  * Bring the CAN controller out of `CAN_STATE_STOPPED`. This will reset the RX/TX error counters,
    1116             :  * enable the CAN controller to participate in CAN communication, and enable the CAN transceiver, if
    1117             :  * supported.
    1118             :  *
    1119             :  * Starting the CAN controller resets all the CAN controller statistics.
    1120             :  *
    1121             :  * @see can_stop()
    1122             :  * @see can_transceiver_enable()
    1123             :  *
    1124             :  * @param dev Pointer to the device structure for the driver instance.
    1125             :  * @retval 0 if successful.
    1126             :  * @retval -EALREADY if the device is already started.
    1127             :  * @retval -EIO General input/output error, failed to start device.
    1128             :  */
    1129           1 : __syscall int can_start(const struct device *dev);
    1130             : 
    1131             : static inline int z_impl_can_start(const struct device *dev)
    1132             : {
    1133             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1134             : 
    1135             :         return api->start(dev);
    1136             : }
    1137             : 
    1138             : /**
    1139             :  * @brief Stop the CAN controller
    1140             :  *
    1141             :  * Bring the CAN controller into `CAN_STATE_STOPPED`. This will disallow the CAN controller from
    1142             :  * participating in CAN communication, abort any pending CAN frame transmissions, and disable the
    1143             :  * CAN transceiver, if supported.
    1144             :  *
    1145             :  * @see can_start()
    1146             :  * @see can_transceiver_disable()
    1147             :  *
    1148             :  * @param dev Pointer to the device structure for the driver instance.
    1149             :  * @retval 0 if successful.
    1150             :  * @retval -EALREADY if the device is already stopped.
    1151             :  * @retval -EIO General input/output error, failed to stop device.
    1152             :  */
    1153           1 : __syscall int can_stop(const struct device *dev);
    1154             : 
    1155             : static inline int z_impl_can_stop(const struct device *dev)
    1156             : {
    1157             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1158             : 
    1159             :         return api->stop(dev);
    1160             : }
    1161             : 
    1162             : /**
    1163             :  * @brief Set the CAN controller to the given operation mode
    1164             :  *
    1165             :  * @param dev  Pointer to the device structure for the driver instance.
    1166             :  * @param mode Operation mode.
    1167             :  *
    1168             :  * @retval 0 If successful.
    1169             :  * @retval -EBUSY if the CAN controller is not in stopped state.
    1170             :  * @retval -EIO General input/output error, failed to configure device.
    1171             :  */
    1172           1 : __syscall int can_set_mode(const struct device *dev, can_mode_t mode);
    1173             : 
    1174             : static inline int z_impl_can_set_mode(const struct device *dev, can_mode_t mode)
    1175             : {
    1176             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1177             : 
    1178             :         return api->set_mode(dev, mode);
    1179             : }
    1180             : 
    1181             : /**
    1182             :  * @brief Get the operation mode of the CAN controller
    1183             :  *
    1184             :  * @param dev Pointer to the device structure for the driver instance.
    1185             :  *
    1186             :  * @return Current operation mode.
    1187             :  */
    1188           1 : __syscall can_mode_t can_get_mode(const struct device *dev);
    1189             : 
    1190             : static inline can_mode_t z_impl_can_get_mode(const struct device *dev)
    1191             : {
    1192             :         const struct can_driver_data *common = (const struct can_driver_data *)dev->data;
    1193             : 
    1194             :         return common->mode;
    1195             : }
    1196             : 
    1197             : /**
    1198             :  * @brief Set the bitrate of the CAN controller
    1199             :  *
    1200             :  * CAN in Automation (CiA) 301 v4.2.0 recommends a sample point location of
    1201             :  * 87.5% percent for all bitrates. However, some CAN controllers have
    1202             :  * difficulties meeting this for higher bitrates.
    1203             :  *
    1204             :  * This function defaults to using a sample point of 75.0% for bitrates over 800
    1205             :  * kbit/s, 80.0% for bitrates over 500 kbit/s, and 87.5% for all other
    1206             :  * bitrates. This is in line with the sample point locations used by the Linux
    1207             :  * kernel.
    1208             :  *
    1209             :  * @see can_set_bitrate_data()
    1210             :  *
    1211             :  * @param dev          Pointer to the device structure for the driver instance.
    1212             :  * @param bitrate      Desired arbitration phase bitrate.
    1213             :  *
    1214             :  * @retval 0 If successful.
    1215             :  * @retval -EBUSY if the CAN controller is not in stopped state.
    1216             :  * @retval -EINVAL if the requested bitrate is out of range.
    1217             :  * @retval -ENOTSUP if the requested bitrate not supported by the CAN controller/transceiver
    1218             :  *                  combination.
    1219             :  * @retval -ERANGE if the resulting sample point is off by more than +/- 5%.
    1220             :  * @retval -EIO General input/output error, failed to set bitrate.
    1221             :  */
    1222           1 : __syscall int can_set_bitrate(const struct device *dev, uint32_t bitrate);
    1223             : 
    1224             : /** @} */
    1225             : 
    1226             : /**
    1227             :  * @name Transmitting CAN frames
    1228             :  *
    1229             :  * @{
    1230             :  */
    1231             : 
    1232             : /**
    1233             :  * @brief Queue a CAN frame for transmission on the CAN bus
    1234             :  *
    1235             :  * Queue a CAN frame for transmission on the CAN bus with optional timeout and
    1236             :  * completion callback function.
    1237             :  *
    1238             :  * Queued CAN frames are transmitted in order according to the their priority:
    1239             :  * - The lower the CAN-ID, the higher the priority.
    1240             :  * - Data frames have higher priority than Remote Transmission Request (RTR)
    1241             :  *   frames with identical CAN-IDs.
    1242             :  * - Frames with standard (11-bit) identifiers have higher priority than frames
    1243             :  *   with extended (29-bit) identifiers with identical base IDs (the higher 11
    1244             :  *   bits of the extended identifier).
    1245             :  * - Transmission order for queued frames with the same priority is hardware
    1246             :  *   dependent.
    1247             :  *
    1248             :  * @note If transmitting segmented messages spanning multiple CAN frames with
    1249             :  * identical CAN-IDs, the sender must ensure to only queue one frame at a time
    1250             :  * if FIFO order is required.
    1251             :  *
    1252             :  * By default, the CAN controller will automatically retry transmission in case
    1253             :  * of lost bus arbitration or missing acknowledge. Some CAN controllers support
    1254             :  * disabling automatic retransmissions via ``CAN_MODE_ONE_SHOT``.
    1255             :  *
    1256             :  * @param dev       Pointer to the device structure for the driver instance.
    1257             :  * @param frame     CAN frame to transmit.
    1258             :  * @param timeout   Timeout waiting for a empty TX mailbox or ``K_FOREVER``.
    1259             :  * @param callback  Optional callback for when the frame was sent or a
    1260             :  *                  transmission error occurred. If ``NULL``, this function is
    1261             :  *                  blocking until frame is sent. The callback must be ``NULL``
    1262             :  *                  if called from user mode.
    1263             :  * @param user_data User data to pass to callback function.
    1264             :  *
    1265             :  * @retval 0 if successful.
    1266             :  * @retval -EINVAL if an invalid parameter was passed to the function.
    1267             :  * @retval -ENOTSUP if an unsupported parameter was passed to the function.
    1268             :  * @retval -ENETDOWN if the CAN controller is in stopped state.
    1269             :  * @retval -ENETUNREACH if the CAN controller is in bus-off state.
    1270             :  * @retval -EBUSY if CAN bus arbitration was lost (only applicable if automatic
    1271             :  *                retransmissions are disabled).
    1272             :  * @retval -EIO if a general transmit error occurred (e.g. missing ACK if
    1273             :  *              automatic retransmissions are disabled).
    1274             :  * @retval -EAGAIN on timeout.
    1275             :  */
    1276           1 : __syscall int can_send(const struct device *dev, const struct can_frame *frame,
    1277             :                        k_timeout_t timeout, can_tx_callback_t callback,
    1278             :                        void *user_data);
    1279             : 
    1280             : /** @} */
    1281             : 
    1282             : /**
    1283             :  * @name Receiving CAN frames
    1284             :  *
    1285             :  * @{
    1286             :  */
    1287             : 
    1288             : /**
    1289             :  * @brief Add a callback function for a given CAN filter
    1290             :  *
    1291             :  * Add a callback to CAN identifiers specified by a filter. When a received CAN
    1292             :  * frame matching the filter is received by the CAN controller, the callback
    1293             :  * function is called in interrupt context.
    1294             :  *
    1295             :  * If a received frame matches more than one filter (i.e., the filter IDs/masks or
    1296             :  * flags overlap), the priority of the match is hardware dependent.
    1297             :  *
    1298             :  * The same callback function can be used for multiple filters.
    1299             :  *
    1300             :  * @param dev       Pointer to the device structure for the driver instance.
    1301             :  * @param callback  This function is called by the CAN controller driver whenever
    1302             :  *                  a frame matching the filter is received.
    1303             :  * @param user_data User data to pass to callback function.
    1304             :  * @param filter    Pointer to a @a can_filter structure defining the filter.
    1305             :  *
    1306             :  * @retval filter_id on success.
    1307             :  * @retval -ENOSPC if there are no free filters.
    1308             :  * @retval -EINVAL if the requested filter type is invalid.
    1309             :  * @retval -ENOTSUP if the requested filter type is not supported.
    1310             :  */
    1311           1 : int can_add_rx_filter(const struct device *dev, can_rx_callback_t callback,
    1312             :                       void *user_data, const struct can_filter *filter);
    1313             : 
    1314             : /**
    1315             :  * @brief Statically define and initialize a CAN RX message queue.
    1316             :  *
    1317             :  * The message queue's ring buffer contains space for @a max_frames CAN frames.
    1318             :  *
    1319             :  * @see can_add_rx_filter_msgq()
    1320             :  *
    1321             :  * @param name       Name of the message queue.
    1322             :  * @param max_frames Maximum number of CAN frames that can be queued.
    1323             :  */
    1324           1 : #define CAN_MSGQ_DEFINE(name, max_frames) \
    1325             :         K_MSGQ_DEFINE(name, sizeof(struct can_frame), max_frames, 4)
    1326             : 
    1327             : /**
    1328             :  * @brief Simple wrapper function for adding a message queue for a given filter
    1329             :  *
    1330             :  * Wrapper function for @a can_add_rx_filter() which puts received CAN frames
    1331             :  * matching the filter in a message queue instead of calling a callback.
    1332             :  *
    1333             :  * If a received frame matches more than one filter (i.e., the filter IDs/masks or
    1334             :  * flags overlap), the priority of the match is hardware dependent.
    1335             :  *
    1336             :  * The same message queue can be used for multiple filters.
    1337             :  *
    1338             :  * @note The message queue must be initialized before calling this function and
    1339             :  * the caller must have appropriate permissions on it.
    1340             :  *
    1341             :  * @warning Message queue overruns are silently ignored and overrun frames
    1342             :  * discarded. Custom error handling can be implemented by using
    1343             :  * @a can_add_rx_filter() and @a k_msgq_put() directly.
    1344             :  *
    1345             :  * @param dev    Pointer to the device structure for the driver instance.
    1346             :  * @param msgq   Pointer to the already initialized @a k_msgq struct.
    1347             :  * @param filter Pointer to a @a can_filter structure defining the filter.
    1348             :  *
    1349             :  * @retval filter_id on success.
    1350             :  * @retval -ENOSPC if there are no free filters.
    1351             :  * @retval -ENOTSUP if the requested filter type is not supported.
    1352             :  */
    1353           1 : __syscall int can_add_rx_filter_msgq(const struct device *dev, struct k_msgq *msgq,
    1354             :                                      const struct can_filter *filter);
    1355             : 
    1356             : /**
    1357             :  * @brief Remove a CAN RX filter
    1358             :  *
    1359             :  * This routine removes a CAN RX filter based on the filter ID returned by @a
    1360             :  * can_add_rx_filter() or @a can_add_rx_filter_msgq().
    1361             :  *
    1362             :  * @param dev       Pointer to the device structure for the driver instance.
    1363             :  * @param filter_id Filter ID
    1364             :  */
    1365           1 : __syscall void can_remove_rx_filter(const struct device *dev, int filter_id);
    1366             : 
    1367             : static inline void z_impl_can_remove_rx_filter(const struct device *dev, int filter_id)
    1368             : {
    1369             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1370             : 
    1371             :         api->remove_rx_filter(dev, filter_id);
    1372             : }
    1373             : 
    1374             : /**
    1375             :  * @brief Get maximum number of RX filters
    1376             :  *
    1377             :  * Get the maximum number of concurrent RX filters for the CAN controller.
    1378             :  *
    1379             :  * @param dev Pointer to the device structure for the driver instance.
    1380             :  * @param ide Get the maximum standard (11-bit) CAN ID filters if false, or extended (29-bit) CAN ID
    1381             :  *            filters if true.
    1382             :  *
    1383             :  * @retval Positive number of maximum concurrent filters.
    1384             :  * @retval -EIO General input/output error.
    1385             :  * @retval -ENOSYS If this function is not implemented by the driver.
    1386             :  */
    1387           1 : __syscall int can_get_max_filters(const struct device *dev, bool ide);
    1388             : 
    1389             : static inline int z_impl_can_get_max_filters(const struct device *dev, bool ide)
    1390             : {
    1391             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1392             : 
    1393             :         if (api->get_max_filters == NULL) {
    1394             :                 return -ENOSYS;
    1395             :         }
    1396             : 
    1397             :         return api->get_max_filters(dev, ide);
    1398             : }
    1399             : 
    1400             : /** @} */
    1401             : 
    1402             : /**
    1403             :  * @name CAN bus error reporting and handling
    1404             :  *
    1405             :  * @{
    1406             :  */
    1407             : 
    1408             : /**
    1409             :  * @brief Get current CAN controller state
    1410             :  *
    1411             :  * Returns the current state and optionally the error counter values of the CAN
    1412             :  * controller.
    1413             :  *
    1414             :  * @param dev          Pointer to the device structure for the driver instance.
    1415             :  * @param[out] state   Pointer to the state destination enum or NULL.
    1416             :  * @param[out] err_cnt Pointer to the err_cnt destination structure or NULL.
    1417             :  *
    1418             :  * @retval 0 If successful.
    1419             :  * @retval -EIO General input/output error, failed to get state.
    1420             :  */
    1421           1 : __syscall int can_get_state(const struct device *dev, enum can_state *state,
    1422             :                             struct can_bus_err_cnt *err_cnt);
    1423             : 
    1424             : static inline int z_impl_can_get_state(const struct device *dev, enum can_state *state,
    1425             :                                        struct can_bus_err_cnt *err_cnt)
    1426             : {
    1427             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1428             : 
    1429             :         return api->get_state(dev, state, err_cnt);
    1430             : }
    1431             : 
    1432             : /**
    1433             :  * @brief Recover from bus-off state
    1434             :  *
    1435             :  * Recover the CAN controller from bus-off state to error-active state.
    1436             :  *
    1437             :  * @note @kconfig{CONFIG_CAN_MANUAL_RECOVERY_MODE} must be enabled for this
    1438             :  * function to be available.
    1439             :  *
    1440             :  * @param dev     Pointer to the device structure for the driver instance.
    1441             :  * @param timeout Timeout for waiting for the recovery or ``K_FOREVER``.
    1442             :  *
    1443             :  * @retval 0 on success.
    1444             :  * @retval -ENOTSUP if the CAN controller is not in manual recovery mode.
    1445             :  * @retval -ENETDOWN if the CAN controller is in stopped state.
    1446             :  * @retval -EAGAIN on timeout.
    1447             :  * @retval -ENOSYS If this function is not implemented by the driver.
    1448             :  */
    1449           1 : __syscall int can_recover(const struct device *dev, k_timeout_t timeout);
    1450             : 
    1451             : #ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
    1452             : static inline int z_impl_can_recover(const struct device *dev, k_timeout_t timeout)
    1453             : {
    1454             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1455             : 
    1456             :         if (api->recover == NULL) {
    1457             :                 return -ENOSYS;
    1458             :         }
    1459             : 
    1460             :         return api->recover(dev, timeout);
    1461             : }
    1462             : #endif /* CONFIG_CAN_MANUAL_RECOVERY_MODE */
    1463             : 
    1464             : /**
    1465             :  * @brief Set a callback for CAN controller state change events
    1466             :  *
    1467             :  * Set the callback for CAN controller state change events. The callback
    1468             :  * function will be called in interrupt context.
    1469             :  *
    1470             :  * Only one callback can be registered per controller. Calling this function
    1471             :  * again overrides any previously registered callback.
    1472             :  *
    1473             :  * @param dev       Pointer to the device structure for the driver instance.
    1474             :  * @param callback  Callback function.
    1475             :  * @param user_data User data to pass to callback function.
    1476             :  */
    1477           1 : static inline void can_set_state_change_callback(const struct device *dev,
    1478             :                                                  can_state_change_callback_t callback,
    1479             :                                                  void *user_data)
    1480             : {
    1481             :         const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
    1482             : 
    1483             :         api->set_state_change_callback(dev, callback, user_data);
    1484             : }
    1485             : 
    1486             : /** @} */
    1487             : 
    1488             : /**
    1489             :  * @name CAN statistics
    1490             :  *
    1491             :  * @{
    1492             :  */
    1493             : 
    1494             : /**
    1495             :  * @brief Get the bit error counter for a CAN device
    1496             :  *
    1497             :  * The bit error counter is incremented when the CAN controller is unable to
    1498             :  * transmit either a dominant or a recessive bit.
    1499             :  *
    1500             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1501             :  * available.
    1502             :  *
    1503             :  * @param dev Pointer to the device structure for the driver instance.
    1504             :  * @return bit error counter
    1505             :  */
    1506           1 : __syscall uint32_t can_stats_get_bit_errors(const struct device *dev);
    1507             : 
    1508             : #ifdef CONFIG_CAN_STATS
    1509             : static inline uint32_t z_impl_can_stats_get_bit_errors(const struct device *dev)
    1510             : {
    1511             :         return Z_CAN_GET_STATS(dev).bit_error;
    1512             : }
    1513             : #endif /* CONFIG_CAN_STATS */
    1514             : 
    1515             : /**
    1516             :  * @brief Get the bit0 error counter for a CAN device
    1517             :  *
    1518             :  * The bit0 error counter is incremented when the CAN controller is unable to
    1519             :  * transmit a dominant bit.
    1520             :  *
    1521             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1522             :  * available.
    1523             :  *
    1524             :  * @see can_stats_get_bit_errors()
    1525             :  *
    1526             :  * @param dev Pointer to the device structure for the driver instance.
    1527             :  * @return bit0 error counter
    1528             :  */
    1529           1 : __syscall uint32_t can_stats_get_bit0_errors(const struct device *dev);
    1530             : 
    1531             : #ifdef CONFIG_CAN_STATS
    1532             : static inline uint32_t z_impl_can_stats_get_bit0_errors(const struct device *dev)
    1533             : {
    1534             :         return Z_CAN_GET_STATS(dev).bit0_error;
    1535             : }
    1536             : #endif /* CONFIG_CAN_STATS */
    1537             : 
    1538             : /**
    1539             :  * @brief Get the bit1 error counter for a CAN device
    1540             :  *
    1541             :  * The bit1 error counter is incremented when the CAN controller is unable to
    1542             :  * transmit a recessive bit.
    1543             :  *
    1544             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1545             :  * available.
    1546             :  *
    1547             :  * @see can_stats_get_bit_errors()
    1548             :  *
    1549             :  * @param dev Pointer to the device structure for the driver instance.
    1550             :  * @return bit1 error counter
    1551             :  */
    1552           1 : __syscall uint32_t can_stats_get_bit1_errors(const struct device *dev);
    1553             : 
    1554             : #ifdef CONFIG_CAN_STATS
    1555             : static inline uint32_t z_impl_can_stats_get_bit1_errors(const struct device *dev)
    1556             : {
    1557             :         return Z_CAN_GET_STATS(dev).bit1_error;
    1558             : }
    1559             : #endif /* CONFIG_CAN_STATS */
    1560             : 
    1561             : /**
    1562             :  * @brief Get the stuffing error counter for a CAN device
    1563             :  *
    1564             :  * The stuffing error counter is incremented when the CAN controller detects a
    1565             :  * bit stuffing error.
    1566             :  *
    1567             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1568             :  * available.
    1569             :  *
    1570             :  * @param dev Pointer to the device structure for the driver instance.
    1571             :  * @return stuffing error counter
    1572             :  */
    1573           1 : __syscall uint32_t can_stats_get_stuff_errors(const struct device *dev);
    1574             : 
    1575             : #ifdef CONFIG_CAN_STATS
    1576             : static inline uint32_t z_impl_can_stats_get_stuff_errors(const struct device *dev)
    1577             : {
    1578             :         return Z_CAN_GET_STATS(dev).stuff_error;
    1579             : }
    1580             : #endif /* CONFIG_CAN_STATS */
    1581             : 
    1582             : /**
    1583             :  * @brief Get the CRC error counter for a CAN device
    1584             :  *
    1585             :  * The CRC error counter is incremented when the CAN controller detects a frame
    1586             :  * with an invalid CRC.
    1587             :  *
    1588             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1589             :  * available.
    1590             :  *
    1591             :  * @param dev Pointer to the device structure for the driver instance.
    1592             :  * @return CRC error counter
    1593             :  */
    1594           1 : __syscall uint32_t can_stats_get_crc_errors(const struct device *dev);
    1595             : 
    1596             : #ifdef CONFIG_CAN_STATS
    1597             : static inline uint32_t z_impl_can_stats_get_crc_errors(const struct device *dev)
    1598             : {
    1599             :         return Z_CAN_GET_STATS(dev).crc_error;
    1600             : }
    1601             : #endif /* CONFIG_CAN_STATS */
    1602             : 
    1603             : /**
    1604             :  * @brief Get the form error counter for a CAN device
    1605             :  *
    1606             :  * The form error counter is incremented when the CAN controller detects a
    1607             :  * fixed-form bit field containing illegal bits.
    1608             :  *
    1609             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1610             :  * available.
    1611             :  *
    1612             :  * @param dev Pointer to the device structure for the driver instance.
    1613             :  * @return form error counter
    1614             :  */
    1615           1 : __syscall uint32_t can_stats_get_form_errors(const struct device *dev);
    1616             : 
    1617             : #ifdef CONFIG_CAN_STATS
    1618             : static inline uint32_t z_impl_can_stats_get_form_errors(const struct device *dev)
    1619             : {
    1620             :         return Z_CAN_GET_STATS(dev).form_error;
    1621             : }
    1622             : #endif /* CONFIG_CAN_STATS */
    1623             : 
    1624             : /**
    1625             :  * @brief Get the acknowledge error counter for a CAN device
    1626             :  *
    1627             :  * The acknowledge error counter is incremented when the CAN controller does not
    1628             :  * monitor a dominant bit in the ACK slot.
    1629             :  *
    1630             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1631             :  * available.
    1632             :  *
    1633             :  * @param dev Pointer to the device structure for the driver instance.
    1634             :  * @return acknowledge error counter
    1635             :  */
    1636           1 : __syscall uint32_t can_stats_get_ack_errors(const struct device *dev);
    1637             : 
    1638             : #ifdef CONFIG_CAN_STATS
    1639             : static inline uint32_t z_impl_can_stats_get_ack_errors(const struct device *dev)
    1640             : {
    1641             :         return Z_CAN_GET_STATS(dev).ack_error;
    1642             : }
    1643             : #endif /* CONFIG_CAN_STATS */
    1644             : 
    1645             : /**
    1646             :  * @brief Get the RX overrun counter for a CAN device
    1647             :  *
    1648             :  * The RX overrun counter is incremented when the CAN controller receives a CAN
    1649             :  * frame matching an installed filter but lacks the capacity to store it (either
    1650             :  * due to an already full RX mailbox or a full RX FIFO).
    1651             :  *
    1652             :  * @note @kconfig{CONFIG_CAN_STATS} must be selected for this function to be
    1653             :  * available.
    1654             :  *
    1655             :  * @param dev Pointer to the device structure for the driver instance.
    1656             :  * @return RX overrun counter
    1657             :  */
    1658           1 : __syscall uint32_t can_stats_get_rx_overruns(const struct device *dev);
    1659             : 
    1660             : #ifdef CONFIG_CAN_STATS
    1661             : static inline uint32_t z_impl_can_stats_get_rx_overruns(const struct device *dev)
    1662             : {
    1663             :         return Z_CAN_GET_STATS(dev).rx_overrun;
    1664             : }
    1665             : #endif /* CONFIG_CAN_STATS */
    1666             : 
    1667             : /** @} */
    1668             : 
    1669             : /**
    1670             :  * @name CAN utility functions
    1671             :  *
    1672             :  * @{
    1673             :  */
    1674             : 
    1675             : /**
    1676             :  * @brief Convert from Data Length Code (DLC) to the number of data bytes
    1677             :  *
    1678             :  * @param dlc Data Length Code (DLC).
    1679             :  *
    1680             :  * @retval Number of bytes.
    1681             :  */
    1682           1 : static inline uint8_t can_dlc_to_bytes(uint8_t dlc)
    1683             : {
    1684             :         static const uint8_t dlc_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12,
    1685             :                                             16, 20, 24, 32, 48, 64};
    1686             : 
    1687             :         return dlc_table[MIN(dlc, ARRAY_SIZE(dlc_table) - 1)];
    1688             : }
    1689             : 
    1690             : /**
    1691             :  * @brief Convert from number of bytes to Data Length Code (DLC)
    1692             :  *
    1693             :  * @param num_bytes Number of bytes.
    1694             :  *
    1695             :  * @retval Data Length Code (DLC).
    1696             :  */
    1697           1 : static inline uint8_t can_bytes_to_dlc(uint8_t num_bytes)
    1698             : {
    1699             :         return num_bytes <= 8  ? num_bytes :
    1700             :                num_bytes <= 12 ? 9 :
    1701             :                num_bytes <= 16 ? 10 :
    1702             :                num_bytes <= 20 ? 11 :
    1703             :                num_bytes <= 24 ? 12 :
    1704             :                num_bytes <= 32 ? 13 :
    1705             :                num_bytes <= 48 ? 14 :
    1706             :                15;
    1707             : }
    1708             : 
    1709             : /**
    1710             :  * @brief Check if a CAN frame matches a CAN filter
    1711             :  *
    1712             :  * @param frame CAN frame.
    1713             :  * @param filter CAN filter.
    1714             :  * @return true if the CAN frame matches the CAN filter, false otherwise
    1715             :  */
    1716           1 : static inline bool can_frame_matches_filter(const struct can_frame *frame,
    1717             :                                             const struct can_filter *filter)
    1718             : {
    1719             :         if ((frame->flags & CAN_FRAME_IDE) != 0 && (filter->flags & CAN_FILTER_IDE) == 0) {
    1720             :                 /* Extended (29-bit) ID frame, standard (11-bit) filter */
    1721             :                 return false;
    1722             :         }
    1723             : 
    1724             :         if ((frame->flags & CAN_FRAME_IDE) == 0 && (filter->flags & CAN_FILTER_IDE) != 0) {
    1725             :                 /* Standard (11-bit) ID frame, extended (29-bit) filter */
    1726             :                 return false;
    1727             :         }
    1728             : 
    1729             :         if ((frame->id ^ filter->id) & filter->mask) {
    1730             :                 /* Masked ID mismatch */
    1731             :                 return false;
    1732             :         }
    1733             : 
    1734             :         return true;
    1735             : }
    1736             : 
    1737             : /** @} */
    1738             : 
    1739             : /**
    1740             :  * @}
    1741             :  */
    1742             : 
    1743             : #ifdef __cplusplus
    1744             : }
    1745             : #endif
    1746             : 
    1747             : #include <zephyr/syscalls/can.h>
    1748             : 
    1749             : #endif /* ZEPHYR_INCLUDE_DRIVERS_CAN_H_ */

Generated by: LCOV version 1.14