8#ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_H_
9#define ZEPHYR_INCLUDE_DRIVERS_CAN_H_
35#define CAN_STD_ID_MASK 0x7FFU
39#define CAN_MAX_STD_ID CAN_STD_ID_MASK
43#define CAN_EXT_ID_MASK 0x1FFFFFFFU
47#define CAN_MAX_EXT_ID CAN_EXT_ID_MASK
55#define CANFD_MAX_DLC CONFIG_CANFD_MAX_DLC
61#ifndef CONFIG_CANFD_MAX_DLC
62#define CAN_MAX_DLEN 8U
64#if CONFIG_CANFD_MAX_DLC <= 8
65#define CAN_MAX_DLEN CONFIG_CANFD_MAX_DLC
66#elif CONFIG_CANFD_MAX_DLC <= 12
67#define CAN_MAX_DLEN (CONFIG_CANFD_MAX_DLC + (CONFIG_CANFD_MAX_DLC - 8U) * 4U)
68#elif CONFIG_CANFD_MAX_DLC == 13
69#define CAN_MAX_DLEN 32U
70#elif CONFIG_CANFD_MAX_DLC == 14
71#define CAN_MAX_DLEN 48U
72#elif CONFIG_CANFD_MAX_DLC == 15
73#define CAN_MAX_DLEN 64U
149#if defined(CONFIG_CAN_RX_TIMESTAMP) || defined(__DOXYGEN__)
298typedef int (*can_set_timing_t)(
const struct device *dev,
307typedef int (*can_set_mode_t)(
const struct device *dev,
enum can_mode mode);
314typedef int (*can_send_t)(
const struct device *dev,
324typedef int (*can_add_rx_filter_t)(
const struct device *dev,
334typedef void (*can_remove_rx_filter_t)(
const struct device *dev,
int filter_id);
356typedef void(*can_set_state_change_callback_t)(
const struct device *dev,
365typedef int (*can_get_core_clock_t)(
const struct device *dev,
uint32_t *rate);
372typedef int (*can_get_max_filters_t)(
const struct device *dev,
enum can_ide id_type);
374__subsystem
struct can_driver_api {
375 can_set_mode_t set_mode;
376 can_set_timing_t set_timing;
378 can_add_rx_filter_t add_rx_filter;
379 can_remove_rx_filter_t remove_rx_filter;
380#if !defined(CONFIG_CAN_AUTO_BUS_OFF_RECOVERY) || defined(__DOXYGEN__)
381 can_recover_t recover;
383 can_get_state_t get_state;
384 can_set_state_change_callback_t set_state_change_callback;
385 can_get_core_clock_t get_core_clock;
386 can_get_max_filters_t get_max_filters;
391#if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
419static inline int z_impl_can_get_core_clock(
const struct device *dev,
uint32_t *rate)
421 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
423 return api->get_core_clock(dev, rate);
449#if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
494#define CAN_SJW_NO_CHANGE 0
516static inline int z_impl_can_set_timing(
const struct device *dev,
520 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
522 return api->set_timing(dev, timing, timing_data);
536static inline int z_impl_can_set_mode(
const struct device *dev,
enum can_mode mode)
538 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
540 return api->set_mode(dev, mode);
565#ifdef CONFIG_CAN_FD_MODE
577#ifdef CONFIG_CAN_FD_MODE
632static inline int z_impl_can_send(
const struct device *dev,
const struct zcan_frame *frame,
636 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
673 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
675 return api->add_rx_filter(dev, callback,
user_data, filter);
688#define CAN_MSGQ_DEFINE(name, max_frames) \
689 K_MSGQ_DEFINE(name, sizeof(struct zcan_frame), max_frames, 4)
726static inline void z_impl_can_remove_rx_filter(
const struct device *dev,
int filter_id)
728 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
730 return api->remove_rx_filter(dev, filter_id);
747static inline int z_impl_can_get_max_filters(
const struct device *dev,
enum can_ide id_type)
749 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
751 if (api->get_max_filters == NULL) {
755 return api->get_max_filters(dev, id_type);
785 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
787 return api->get_state(dev,
state, err_cnt);
804#if !defined(CONFIG_CAN_AUTO_BUS_OFF_RECOVERY) || defined(__DOXYGEN__)
809 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
811 return api->recover(dev,
timeout);
838 const struct can_driver_api *api = (
const struct can_driver_api *)dev->
api;
840 api->set_state_change_callback(dev, callback,
user_data);
860 static const uint8_t dlc_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12,
861 16, 20, 24, 32, 48, 64};
863 return dlc > 0x0F ? 64 : dlc_table[dlc];
875 return num_bytes <= 8 ? num_bytes :
876 num_bytes <= 12 ? 9 :
877 num_bytes <= 16 ? 10 :
878 num_bytes <= 20 ? 11 :
879 num_bytes <= 24 ? 12 :
880 num_bytes <= 32 ? 13 :
881 num_bytes <= 48 ? 14 :
1007 (zfilter->
rtr << 30) | zfilter->
id;
1034#define CAN_TX_OK (0) __DEPRECATED_MACRO
1036#define CAN_TX_ERR (-EIO) __DEPRECATED_MACRO
1038#define CAN_TX_ARB_LOST (-EBUSY) __DEPRECATED_MACRO
1040#define CAN_TX_BUS_OFF (-ENETDOWN) __DEPRECATED_MACRO
1042#define CAN_TX_UNKNOWN (CAN_TX_ERR) __DEPRECATED_MACRO
1044#define CAN_TX_EINVAL (-EINVAL) __DEPRECATED_MACRO
1046#define CAN_NO_FREE_FILTER (-ENOSPC) __DEPRECATED_MACRO
1048#define CAN_TIMEOUT (-EAGAIN) __DEPRECATED_MACRO
1064__deprecated
static inline int can_configure(
const struct device *dev,
enum can_mode mode,
1082#ifndef CONFIG_CAN_WORKQ_FRAMES_BUF_CNT
1083#define CONFIG_CAN_WORKQ_FRAMES_BUF_CNT 4
1091struct can_frame_buffer {
1092 struct zcan_frame buf[CONFIG_CAN_WORKQ_FRAMES_BUF_CNT];
1105 struct can_frame_buffer buf;
1142__deprecated
int can_attach_workq(
const struct device *dev,
struct k_work_q *work_q,
1158#define CAN_DEFINE_MSGQ(name, size) CAN_MSGQ_DEFINE(name, size) __DEPRECATED_MACRO
1163__deprecated
static inline int can_attach_msgq(
const struct device *dev,
struct k_msgq *msg_q,
1172__deprecated
static inline void can_detach(
const struct device *dev,
int filter_id)
1180__deprecated
static inline void can_register_state_change_isr(
const struct device *dev,
1216__deprecated
static inline int can_write(
const struct device *dev,
const uint8_t *
data,
1251#include <syscalls/can.h>
ZTEST_BMEM int timeout
Definition: main.c:31
#define BIT_MASK(n)
Definition: adc.h:14
int can_set_mode(const struct device *dev, enum can_mode mode)
Set the CAN controller to the given operation mode.
int can_send(const struct device *dev, const struct zcan_frame *frame, k_timeout_t timeout, can_tx_callback_t callback, void *user_data)
Transmit a CAN frame on the CAN bus.
int can_add_rx_filter_msgq(const struct device *dev, struct k_msgq *msgq, const struct zcan_filter *filter)
Wrapper function for adding a message queue for a given filter.
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.
void(* can_tx_callback_t)(int error, void *user_data)
Defines the application callback handler function signature.
Definition: can.h:264
#define CAN_SJW_NO_CHANGE
Definition: can.h:494
int can_get_core_clock(const struct device *dev, uint32_t *rate)
Get the CAN core clock rate.
can_mode
Defines the mode of the CAN controller.
Definition: can.h:84
#define CAN_MAX_STD_ID
Maximum value for a standard (11-bit) CAN identifier.
Definition: can.h:39
int can_calc_prescaler(const struct device *dev, struct can_timing *timing, uint32_t bitrate)
Fill in the prescaler value for a given bitrate and timing.
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:873
can_rtr
Defines if the CAN frame is a data frame or a Remote Transmission Request (RTR) frame.
Definition: can.h:123
can_ide
Defines if the CAN frame has a standard (11-bit) or extended (29-bit) CAN identifier.
Definition: can.h:113
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:858
void(* can_rx_callback_t)(struct zcan_frame *frame, void *user_data)
Defines the application callback handler function signature for receiving.
Definition: can.h:273
int can_get_max_filters(const struct device *dev, enum can_ide id_type)
Get maximum number of RX filters.
void(* can_state_change_callback_t)(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:283
int can_get_state(const struct device *dev, enum can_state *state, struct can_bus_err_cnt *err_cnt)
Get current CAN controller state.
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 bus.
Definition: can.h:98
static int can_add_rx_filter(const struct device *dev, can_rx_callback_t callback, void *user_data, const struct zcan_filter *filter)
Add a callback function for a given CAN filter.
Definition: can.h:670
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:834
static void can_copy_zframe_to_frame(const struct zcan_frame *zframe, struct can_frame *frame)
Translate a zcan_frame struct to a can_frame struct.
Definition: can.h:973
static int can_set_bitrate(const struct device *dev, uint32_t bitrate, uint32_t bitrate_data)
Set the bitrate of the CAN controller.
Definition: can.h:560
static void can_copy_zfilter_to_filter(const struct zcan_filter *zfilter, struct can_filter *filter)
Translate a zcan_filter struct to a can_filter struct.
Definition: can.h:1003
int can_set_timing(const struct device *dev, const struct can_timing *timing, const struct can_timing *timing_data)
Configure the bus timing of a CAN controller.
uint32_t canid_t
Definition: can.h:917
static void can_copy_frame_to_zframe(const struct can_frame *frame, struct zcan_frame *zframe)
Translate a can_frame struct to a zcan_frame struct.
Definition: can.h:957
static void can_copy_filter_to_zfilter(const struct can_filter *filter, struct zcan_filter *zfilter)
Translate a can_filter struct to a zcan_filter struct.
Definition: can.h:987
@ CAN_SILENT_MODE
Definition: can.h:88
@ CAN_LOOPBACK_MODE
Definition: can.h:90
@ CAN_NORMAL_MODE
Definition: can.h:86
@ CAN_SILENT_LOOPBACK_MODE
Definition: can.h:92
@ CAN_DATAFRAME
Definition: can.h:125
@ CAN_REMOTEREQUEST
Definition: can.h:127
@ CAN_EXTENDED_IDENTIFIER
Definition: can.h:117
@ CAN_STANDARD_IDENTIFIER
Definition: can.h:115
@ CAN_ERROR_WARNING
Definition: can.h:102
@ CAN_ERROR_PASSIVE
Definition: can.h:104
@ CAN_ERROR_ACTIVE
Definition: can.h:100
@ CAN_BUS_OFF
Definition: can.h:106
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition: util_macro.h:44
#define ceiling_fraction(numerator, divider)
Ceiling function applied to numerator / divider as a fraction.
Definition: util.h:174
#define EINVAL
Definition: errno.h:61
#define ENOSYS
Definition: errno.h:83
state
Definition: http_parser_state.h:30
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
struct k_msgq msgq
Definition: test_msgq_contexts.c:12
static ssize_t send(int sock, const void *buf, size_t len, int flags)
Definition: socket.h:61
static struct k_work work[2]
Definition: main.c:16
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
CAN controller error counters.
Definition: can.h:204
uint8_t tx_err_cnt
Definition: can.h:206
uint8_t rx_err_cnt
Definition: can.h:208
CAN filter for Linux SocketCAN compatibility.
Definition: can.h:944
canid_t can_mask
Definition: can.h:948
canid_t can_id
Definition: can.h:946
CAN frame for Linux SocketCAN compatibility.
Definition: can.h:922
uint8_t can_dlc
Definition: can.h:927
uint8_t data[CAN_MAX_DLEN]
Definition: can.h:936
canid_t can_id
Definition: can.h:924
CAN bus timing structure.
Definition: can.h:243
uint16_t sjw
Definition: can.h:245
uint16_t phase_seg2
Definition: can.h:251
uint16_t prescaler
Definition: can.h:253
uint16_t phase_seg1
Definition: can.h:249
uint16_t prop_seg
Definition: can.h:247
Runtime device structure (in ROM) per driver instance.
Definition: device.h:450
const void * api
Definition: device.h:456
Message Queue Structure.
Definition: kernel.h:4235
Kernel timeout type.
Definition: sys_clock.h:65
A structure used to hold work until it can be processed.
Definition: kernel.h:3719
A structure used to submit work.
Definition: kernel.h:3572
CAN filter structure.
Definition: can.h:174
uint32_t id_mask
Definition: can.h:187
uint32_t rtr
Definition: can.h:181
uint32_t rtr_mask
Definition: can.h:195
uint32_t id_type
Definition: can.h:183
uint32_t id
Definition: can.h:176
CAN frame structure.
Definition: can.h:133
uint8_t dlc
Definition: can.h:143
uint32_t data_32[ceiling_fraction(CAN_MAX_DLEN, sizeof(uint32_t))]
Definition: can.h:167
uint32_t id_type
Definition: can.h:141
uint8_t data[CAN_MAX_DLEN]
Definition: can.h:166
uint32_t rtr
Definition: can.h:139
uint16_t timestamp
Definition: can.h:157
uint8_t brs
Definition: can.h:145
uint32_t fd
Definition: can.h:137
uint32_t id
Definition: can.h:135
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
static const intptr_t user_data[5]
Definition: main.c:590