15#ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_H_
16#define ZEPHYR_INCLUDE_DRIVERS_CAN_H_
53#define CAN_STD_ID_MASK 0x7FFU
58#define CAN_EXT_ID_MASK 0x1FFFFFFFU
68#define CANFD_MAX_DLC 15U
74#ifndef CONFIG_CAN_FD_MODE
75#define CAN_MAX_DLEN 8U
77#define CAN_MAX_DLEN 64U
92#define CAN_MODE_NORMAL 0
95#define CAN_MODE_LOOPBACK BIT(0)
98#define CAN_MODE_LISTENONLY BIT(1)
101#define CAN_MODE_FD BIT(2)
104#define CAN_MODE_ONE_SHOT BIT(3)
107#define CAN_MODE_3_SAMPLES BIT(4)
110#define CAN_MODE_MANUAL_RECOVERY BIT(5)
148#define CAN_FRAME_IDE BIT(0)
151#define CAN_FRAME_RTR BIT(1)
154#define CAN_FRAME_FDF BIT(2)
157#define CAN_FRAME_BRS BIT(3)
162#define CAN_FRAME_ESI BIT(4)
176#if defined(CONFIG_CAN_RX_TIMESTAMP) || defined(__DOXYGEN__)
208#define CAN_FILTER_IDE BIT(0)
333#define CAN_CALC_TDCO(_timing_data, _tdco_min, _tdco_max) \
334 CLAMP((1U + _timing_data->prop_seg + _timing_data->phase_seg1) * _timing_data->prescaler, \
335 _tdco_min, _tdco_max)
343struct can_driver_config {
354#ifdef CONFIG_CAN_FD_MODE
369#define CAN_DT_DRIVER_CONFIG_GET(node_id, _min_bitrate, _max_bitrate) \
371 .phy = DEVICE_DT_GET_OR_NULL(DT_PHANDLE(node_id, phys)), \
372 .min_bitrate = DT_CAN_TRANSCEIVER_MIN_BITRATE(node_id, _min_bitrate), \
373 .max_bitrate = DT_CAN_TRANSCEIVER_MAX_BITRATE(node_id, _max_bitrate), \
374 .bitrate = DT_PROP_OR(node_id, bitrate, \
375 DT_PROP_OR(node_id, bus_speed, CONFIG_CAN_DEFAULT_BITRATE)), \
376 .sample_point = DT_PROP_OR(node_id, sample_point, 0), \
377 IF_ENABLED(CONFIG_CAN_FD_MODE, \
378 (.bitrate_data = DT_PROP_OR(node_id, bitrate_data, \
379 DT_PROP_OR(node_id, bus_speed_data, CONFIG_CAN_DEFAULT_BITRATE_DATA)), \
380 .sample_point_data = DT_PROP_OR(node_id, sample_point_data, 0),)) \
391#define CAN_DT_DRIVER_CONFIG_INST_GET(inst, _min_bitrate, _max_bitrate) \
392 CAN_DT_DRIVER_CONFIG_GET(DT_DRV_INST(inst), _min_bitrate, _max_bitrate)
400struct can_driver_data {
408 void *state_change_cb_user_data;
415typedef int (*can_set_timing_t)(
const struct device *dev,
422typedef int (*can_set_timing_data_t)(
const struct device *dev,
429typedef int (*can_get_capabilities_t)(
const struct device *dev,
can_mode_t *cap);
435typedef int (*can_start_t)(
const struct device *dev);
441typedef int (*can_stop_t)(
const struct device *dev);
456typedef int (*can_send_t)(
const struct device *dev,
465typedef int (*can_add_rx_filter_t)(
const struct device *dev,
474typedef void (*can_remove_rx_filter_t)(
const struct device *dev,
int filter_id);
493typedef void(*can_set_state_change_callback_t)(
const struct device *dev,
501typedef int (*can_get_core_clock_t)(
const struct device *dev,
uint32_t *rate);
507typedef int (*can_get_max_filters_t)(
const struct device *dev,
bool ide);
509__subsystem
struct can_driver_api {
510 can_get_capabilities_t get_capabilities;
513 can_set_mode_t set_mode;
514 can_set_timing_t set_timing;
516 can_add_rx_filter_t add_rx_filter;
517 can_remove_rx_filter_t remove_rx_filter;
518#if defined(CONFIG_CAN_MANUAL_RECOVERY_MODE) || defined(__DOXYGEN__)
519 can_recover_t recover;
521 can_get_state_t get_state;
522 can_set_state_change_callback_t set_state_change_callback;
523 can_get_core_clock_t get_core_clock;
524 can_get_max_filters_t get_max_filters;
526 struct can_timing timing_min;
528 struct can_timing timing_max;
529#if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
530 can_set_timing_data_t set_timing_data;
532 struct can_timing timing_data_min;
534 struct can_timing timing_data_max;
540#if defined(CONFIG_CAN_STATS) || defined(__DOXYGEN__)
586#define Z_CAN_GET_STATS(dev_) \
587 CONTAINER_OF(dev_->state, struct can_device_state, devstate)->stats
607#define CAN_STATS_BIT_ERROR_INC(dev_) \
608 STATS_INC(Z_CAN_GET_STATS(dev_), bit_error)
621#define CAN_STATS_BIT0_ERROR_INC(dev_) \
623 STATS_INC(Z_CAN_GET_STATS(dev_), bit0_error); \
624 CAN_STATS_BIT_ERROR_INC(dev_); \
638#define CAN_STATS_BIT1_ERROR_INC(dev_) \
640 STATS_INC(Z_CAN_GET_STATS(dev_), bit1_error); \
641 CAN_STATS_BIT_ERROR_INC(dev_); \
652#define CAN_STATS_STUFF_ERROR_INC(dev_) \
653 STATS_INC(Z_CAN_GET_STATS(dev_), stuff_error)
663#define CAN_STATS_CRC_ERROR_INC(dev_) \
664 STATS_INC(Z_CAN_GET_STATS(dev_), crc_error)
674#define CAN_STATS_FORM_ERROR_INC(dev_) \
675 STATS_INC(Z_CAN_GET_STATS(dev_), form_error)
685#define CAN_STATS_ACK_ERROR_INC(dev_) \
686 STATS_INC(Z_CAN_GET_STATS(dev_), ack_error)
697#define CAN_STATS_RX_OVERRUN_INC(dev_) \
698 STATS_INC(Z_CAN_GET_STATS(dev_), rx_overrun)
708#define CAN_STATS_RESET(dev_) \
709 stats_reset(&(Z_CAN_GET_STATS(dev_).s_hdr))
716#define Z_CAN_DEVICE_STATE_DEFINE(dev_id) \
717 static struct can_device_state Z_DEVICE_STATE_NAME(dev_id) \
718 __attribute__((__section__(".z_devstate")))
726#define Z_CAN_INIT_FN(dev_id, init_fn) \
727 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
729 struct can_device_state *state = \
730 CONTAINER_OF(dev->state, struct can_device_state, devstate); \
731 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 8, \
732 STATS_NAME_INIT_PARMS(can)); \
733 stats_register(dev->name, &(state->stats.s_hdr)); \
734 if (!is_null_no_warn(init_fn)) { \
735 return init_fn(dev); \
763#define CAN_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
765 Z_CAN_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
766 Z_CAN_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
767 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
768 DEVICE_DT_NAME(node_id), \
769 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
770 NULL, Z_DEVICE_DT_FLAGS(node_id), pm, data, \
771 config, level, prio, api, \
772 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
777#define CAN_STATS_BIT_ERROR_INC(dev_)
778#define CAN_STATS_BIT0_ERROR_INC(dev_)
779#define CAN_STATS_BIT1_ERROR_INC(dev_)
780#define CAN_STATS_STUFF_ERROR_INC(dev_)
781#define CAN_STATS_CRC_ERROR_INC(dev_)
782#define CAN_STATS_FORM_ERROR_INC(dev_)
783#define CAN_STATS_ACK_ERROR_INC(dev_)
784#define CAN_STATS_RX_OVERRUN_INC(dev_)
785#define CAN_STATS_RESET(dev_)
787#define CAN_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
789 DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
790 prio, api, __VA_ARGS__)
801#define CAN_DEVICE_DT_INST_DEFINE(inst, ...) \
802 CAN_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
824static inline int z_impl_can_get_core_clock(
const struct device *dev,
uint32_t *rate)
826 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
828 return api->get_core_clock(dev, rate);
849static inline uint32_t z_impl_can_get_bitrate_min(
const struct device *dev)
851 const struct can_driver_config *common = (
const struct can_driver_config *)dev->
config;
853 return common->min_bitrate;
874static inline uint32_t z_impl_can_get_bitrate_max(
const struct device *dev)
876 const struct can_driver_config *common = (
const struct can_driver_config *)dev->
config;
878 return common->max_bitrate;
890static inline const struct can_timing *z_impl_can_get_timing_min(
const struct device *dev)
892 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
894 return &api->timing_min;
906static inline const struct can_timing *z_impl_can_get_timing_max(
const struct device *dev)
908 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
910 return &api->timing_max;
957#ifdef CONFIG_CAN_FD_MODE
958static inline const struct can_timing *z_impl_can_get_timing_data_min(
const struct device *dev)
960 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
962 return &api->timing_data_min;
981#ifdef CONFIG_CAN_FD_MODE
982static inline const struct can_timing *z_impl_can_get_timing_data_max(
const struct device *dev)
984 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
986 return &api->timing_data_max;
1094static inline int z_impl_can_get_capabilities(
const struct device *dev,
can_mode_t *cap)
1096 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1098 return api->get_capabilities(dev, cap);
1112static const struct device *z_impl_can_get_transceiver(
const struct device *dev)
1114 const struct can_driver_config *common = (
const struct can_driver_config *)dev->
config;
1138static inline int z_impl_can_start(
const struct device *dev)
1140 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1142 return api->start(dev);
1162static inline int z_impl_can_stop(
const struct device *dev)
1164 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1166 return api->stop(dev);
1181static inline int z_impl_can_set_mode(
const struct device *dev,
can_mode_t mode)
1183 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1185 return api->set_mode(dev, mode);
1199 const struct can_driver_data *common = (
const struct can_driver_data *)dev->
data;
1201 return common->mode;
1319 void *user_data,
const struct can_filter *filter);
1331#define CAN_MSGQ_DEFINE(name, max_frames) \
1332 K_MSGQ_DEFINE(name, sizeof(struct can_frame), max_frames, 4)
1374static inline void z_impl_can_remove_rx_filter(
const struct device *dev,
int filter_id)
1376 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1378 api->remove_rx_filter(dev, filter_id);
1396static inline int z_impl_can_get_max_filters(
const struct device *dev,
bool ide)
1398 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1400 if (api->get_max_filters ==
NULL) {
1404 return api->get_max_filters(dev, ide);
1434 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1436 return api->get_state(dev,
state, err_cnt);
1458#ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
1459static inline int z_impl_can_recover(
const struct device *dev,
k_timeout_t timeout)
1461 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1463 if (api->recover ==
NULL) {
1467 return api->recover(dev, timeout);
1488 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
1490 api->set_state_change_callback(dev, callback, user_data);
1515#ifdef CONFIG_CAN_STATS
1516static inline uint32_t z_impl_can_stats_get_bit_errors(
const struct device *dev)
1518 return Z_CAN_GET_STATS(dev).bit_error;
1538#ifdef CONFIG_CAN_STATS
1539static inline uint32_t z_impl_can_stats_get_bit0_errors(
const struct device *dev)
1541 return Z_CAN_GET_STATS(dev).bit0_error;
1561#ifdef CONFIG_CAN_STATS
1562static inline uint32_t z_impl_can_stats_get_bit1_errors(
const struct device *dev)
1564 return Z_CAN_GET_STATS(dev).bit1_error;
1582#ifdef CONFIG_CAN_STATS
1583static inline uint32_t z_impl_can_stats_get_stuff_errors(
const struct device *dev)
1585 return Z_CAN_GET_STATS(dev).stuff_error;
1603#ifdef CONFIG_CAN_STATS
1604static inline uint32_t z_impl_can_stats_get_crc_errors(
const struct device *dev)
1606 return Z_CAN_GET_STATS(dev).crc_error;
1624#ifdef CONFIG_CAN_STATS
1625static inline uint32_t z_impl_can_stats_get_form_errors(
const struct device *dev)
1627 return Z_CAN_GET_STATS(dev).form_error;
1645#ifdef CONFIG_CAN_STATS
1646static inline uint32_t z_impl_can_stats_get_ack_errors(
const struct device *dev)
1648 return Z_CAN_GET_STATS(dev).ack_error;
1667#ifdef CONFIG_CAN_STATS
1668static inline uint32_t z_impl_can_stats_get_rx_overruns(
const struct device *dev)
1670 return Z_CAN_GET_STATS(dev).rx_overrun;
1691 static const uint8_t dlc_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12,
1692 16, 20, 24, 32, 48, 64};
1706 return num_bytes <= 8 ? num_bytes :
1707 num_bytes <= 12 ? 9 :
1708 num_bytes <= 16 ? 10 :
1709 num_bytes <= 20 ? 11 :
1710 num_bytes <= 24 ? 12 :
1711 num_bytes <= 32 ? 13 :
1712 num_bytes <= 48 ? 14 :
1736 if ((frame->
id ^ filter->
id) & filter->
mask) {
1754#include <zephyr/syscalls/can.h>
void(* can_state_change_callback_t)(const struct device *dev, enum can_state state, struct can_bus_err_cnt err_cnt, void *user_data)
Defines the state change callback handler function signature.
Definition can.h:309
int can_set_bitrate(const struct device *dev, uint32_t bitrate)
Set the bitrate of the CAN controller.
int can_set_bitrate_data(const struct device *dev, uint32_t bitrate_data)
Set the bitrate for the data phase of the CAN FD controller.
uint32_t can_mode_t
Provides a type to hold CAN controller configuration flags.
Definition can.h:122
uint32_t can_stats_get_stuff_errors(const struct device *dev)
Get the stuffing error counter for a CAN device.
int can_stop(const struct device *dev)
Stop the CAN controller.
int can_set_timing(const struct device *dev, const struct can_timing *timing)
Configure the bus timing of a CAN controller.
uint32_t can_get_bitrate_max(const struct device *dev)
Get maximum supported bitrate.
uint32_t can_stats_get_bit_errors(const struct device *dev)
Get the bit error counter for a CAN device.
uint32_t can_stats_get_crc_errors(const struct device *dev)
Get the CRC error counter for a CAN device.
uint32_t can_get_bitrate_min(const struct device *dev)
Get minimum supported bitrate.
int can_calc_timing_data(const struct device *dev, struct can_timing *res, uint32_t bitrate, uint16_t sample_pnt)
Calculate timing parameters for the data phase.
int can_send(const struct device *dev, const struct can_frame *frame, k_timeout_t timeout, can_tx_callback_t callback, void *user_data)
Queue a CAN frame for transmission on the CAN bus.
const struct can_timing * can_get_timing_data_max(const struct device *dev)
Get the maximum supported timing parameter values for the data phase.
int can_get_core_clock(const struct device *dev, uint32_t *rate)
Get the CAN core clock rate.
int can_get_capabilities(const struct device *dev, can_mode_t *cap)
Get the supported modes of the CAN controller.
uint32_t can_stats_get_bit1_errors(const struct device *dev)
Get the bit1 error counter for a CAN device.
uint32_t can_stats_get_ack_errors(const struct device *dev)
Get the acknowledge error counter for a CAN device.
int can_get_max_filters(const struct device *dev, bool ide)
Get maximum number of RX filters.
const struct can_timing * can_get_timing_min(const struct device *dev)
Get the minimum supported timing parameter values.
int can_set_timing_data(const struct device *dev, const struct can_timing *timing_data)
Configure the bus timing for the data phase of a CAN FD controller.
const struct can_timing * can_get_timing_data_min(const struct device *dev)
Get the minimum supported timing parameter values for the data phase.
uint32_t can_stats_get_bit0_errors(const struct device *dev)
Get the bit0 error counter for a CAN device.
void can_remove_rx_filter(const struct device *dev, int filter_id)
Remove a CAN RX filter.
static uint8_t can_bytes_to_dlc(uint8_t num_bytes)
Convert from number of bytes to Data Length Code (DLC)
Definition can.h:1704
uint32_t can_stats_get_rx_overruns(const struct device *dev)
Get the RX overrun counter for a CAN device.
#define CAN_FRAME_IDE
Frame uses extended (29-bit) CAN ID.
Definition can.h:148
static uint8_t can_dlc_to_bytes(uint8_t dlc)
Convert from Data Length Code (DLC) to the number of data bytes.
Definition can.h:1689
int can_add_rx_filter_msgq(const struct device *dev, struct k_msgq *msgq, const struct can_filter *filter)
Simple wrapper function for adding a message queue for a given filter.
void(* can_rx_callback_t)(const struct device *dev, struct can_frame *frame, void *user_data)
Defines the application callback handler function signature for receiving.
Definition can.h:298
static bool can_frame_matches_filter(const struct can_frame *frame, const struct can_filter *filter)
Check if a CAN frame matches a CAN filter.
Definition can.h:1723
void(* can_tx_callback_t)(const struct device *dev, int error, void *user_data)
Defines the application callback handler function signature.
Definition can.h:289
int can_get_state(const struct device *dev, enum can_state *state, struct can_bus_err_cnt *err_cnt)
Get current CAN controller state.
can_mode_t can_get_mode(const struct device *dev)
Get the operation mode of the CAN controller.
const struct can_timing * can_get_timing_max(const struct device *dev)
Get the maximum supported timing parameter values.
uint32_t can_stats_get_form_errors(const struct device *dev)
Get the form error counter for a CAN device.
int can_calc_timing(const struct device *dev, struct can_timing *res, uint32_t bitrate, uint16_t sample_pnt)
Calculate timing parameters from bitrate and sample point.
int can_recover(const struct device *dev, k_timeout_t timeout)
Recover from bus-off state.
can_state
Defines the state of the CAN controller.
Definition can.h:127
static void can_set_state_change_callback(const struct device *dev, can_state_change_callback_t callback, void *user_data)
Set a callback for CAN controller state change events.
Definition can.h:1484
const struct device * can_get_transceiver(const struct device *dev)
Get the CAN transceiver associated with the CAN controller.
int can_set_mode(const struct device *dev, can_mode_t mode)
Set the CAN controller to the given operation mode.
int can_start(const struct device *dev)
Start the CAN controller.
int can_add_rx_filter(const struct device *dev, can_rx_callback_t callback, void *user_data, const struct can_filter *filter)
Add a callback function for a given CAN filter.
#define CAN_FILTER_IDE
Filter matches frames with extended (29-bit) CAN IDs.
Definition can.h:208
@ CAN_STATE_ERROR_ACTIVE
Error-active state (RX/TX error count < 96).
Definition can.h:129
@ CAN_STATE_ERROR_WARNING
Error-warning state (RX/TX error count < 128).
Definition can.h:131
@ CAN_STATE_STOPPED
CAN controller is stopped and does not participate in CAN communication.
Definition can.h:137
@ CAN_STATE_BUS_OFF
Bus-off state (RX/TX error count >= 256).
Definition can.h:135
@ CAN_STATE_ERROR_PASSIVE
Error-passive state (RX/TX error count < 256).
Definition can.h:133
#define MIN(a, b)
Obtain the minimum of two values.
Definition util.h:402
#define ARRAY_SIZE(array)
Number of elements in the given array.
Definition util.h:121
#define DIV_ROUND_UP(n, d)
Divide and round up.
Definition util.h:353
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
state
Definition parser_state.h:29
ssize_t send(int sock, const void *buf, size_t len, int flags)
#define STATS_NAME_END(name__)
Definition stats.h:391
#define STATS_NAME(name__, entry__)
Definition stats.h:390
#define STATS_SECT_END
Ends a stats group struct definition.
Definition stats.h:89
#define STATS_SECT_ENTRY32(var__)
Definition stats.h:359
#define STATS_NAME_START(name__)
Definition stats.h:389
#define STATS_SECT_START(group__)
Definition stats.h:354
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
CAN controller error counters.
Definition can.h:229
uint8_t tx_err_cnt
Value of the CAN controller transmit error counter.
Definition can.h:231
uint8_t rx_err_cnt
Value of the CAN controller receive error counter.
Definition can.h:233
CAN specific device state which allows for CAN device class specific additions.
Definition can.h:574
struct device_state devstate
Common device state.
Definition can.h:576
struct stats_can stats
CAN device statistics.
Definition can.h:578
CAN filter structure.
Definition can.h:215
uint32_t mask
CAN identifier matching mask.
Definition can.h:221
uint8_t flags
Flags.
Definition can.h:223
uint32_t id
CAN identifier to match.
Definition can.h:217
CAN frame structure.
Definition can.h:169
uint8_t dlc
Data Length Code (DLC) indicating data length in bytes.
Definition can.h:173
uint8_t flags
Flags.
Definition can.h:175
uint32_t id
Standard (11-bit) or extended (29-bit) CAN identifier.
Definition can.h:171
uint8_t data[CAN_MAX_DLEN]
Payload data accessed as unsigned 8 bit values.
Definition can.h:194
uint32_t data_32[DIV_ROUND_UP(CAN_MAX_DLEN, sizeof(uint32_t))]
Payload data accessed as unsigned 32 bit values.
Definition can.h:196
uint16_t timestamp
Captured value of the free-running timer in the CAN controller when this frame was received.
Definition can.h:184
CAN bus timing structure.
Definition can.h:268
uint16_t sjw
Synchronisation jump width.
Definition can.h:270
uint16_t phase_seg2
Phase segment 2.
Definition can.h:276
uint16_t prescaler
Prescaler value.
Definition can.h:278
uint16_t phase_seg1
Phase segment 1.
Definition can.h:274
uint16_t prop_seg
Propagation segment.
Definition can.h:272
Runtime device dynamic structure (in RAM) per driver instance.
Definition device.h:455
Runtime device structure (in ROM) per driver instance.
Definition device.h:510
void * data
Address of the device instance private data.
Definition device.h:520
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:516
const void * config
Address of device instance config information.
Definition device.h:514
Message Queue Structure.
Definition kernel.h:4731
Kernel timeout type.
Definition clock.h:65