Zephyr Project API  3.1.0
A Scalable Open Source RTOS
can.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Vestas Wind Systems A/S
3 * Copyright (c) 2018 Alexander Wachter
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_H_
9#define ZEPHYR_INCLUDE_DRIVERS_CAN_H_
10
11#include <zephyr/types.h>
12#include <zephyr/device.h>
13#include <string.h>
14#include <zephyr/sys/util.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
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
51#define CAN_MAX_DLC 8U
55#define CANFD_MAX_DLC CONFIG_CANFD_MAX_DLC
56
61#ifndef CONFIG_CANFD_MAX_DLC
62#define CAN_MAX_DLEN 8U
63#else
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
74#endif
75#endif /* CONFIG_CANFD_MAX_DLC */
76
89#define CAN_MODE_NORMAL 0
90
92#define CAN_MODE_LOOPBACK BIT(0)
93
95#define CAN_MODE_LISTENONLY BIT(1)
96
98#define CAN_MODE_FD BIT(2)
99
111
124};
125
136
146
164 uint8_t res : 7; /* reserved/padding. */
166#if defined(CONFIG_CAN_RX_TIMESTAMP) || defined(__DOXYGEN__)
175#else
177 uint8_t res0; /* reserved/padding. */
178 uint8_t res1; /* reserved/padding. */
180#endif
182 union {
183 uint8_t data[CAN_MAX_DLEN];
184 uint32_t data_32[ceiling_fraction(CAN_MAX_DLEN, sizeof(uint32_t))];
185 };
186};
187
195 uint32_t res0 : 1;
206 uint32_t res1 : 1;
214 uint32_t res2 : 1;
216};
217
226};
227
271};
272
281typedef void (*can_tx_callback_t)(const struct device *dev, int error, void *user_data);
282
290typedef void (*can_rx_callback_t)(const struct device *dev, struct zcan_frame *frame,
291 void *user_data);
292
301typedef void (*can_state_change_callback_t)(const struct device *dev,
302 enum can_state state,
303 struct can_bus_err_cnt err_cnt,
304 void *user_data);
305
316typedef int (*can_set_timing_t)(const struct device *dev,
317 const struct can_timing *timing);
318
323typedef int (*can_set_timing_data_t)(const struct device *dev,
324 const struct can_timing *timing_data);
325
330typedef int (*can_set_mode_t)(const struct device *dev, can_mode_t mode);
331
336typedef int (*can_send_t)(const struct device *dev,
337 const struct zcan_frame *frame,
339 void *user_data);
340
345typedef int (*can_add_rx_filter_t)(const struct device *dev,
346 can_rx_callback_t callback,
347 void *user_data,
348 const struct zcan_filter *filter);
349
354typedef void (*can_remove_rx_filter_t)(const struct device *dev, int filter_id);
355
360typedef int (*can_recover_t)(const struct device *dev, k_timeout_t timeout);
361
366typedef int (*can_get_state_t)(const struct device *dev, enum can_state *state,
367 struct can_bus_err_cnt *err_cnt);
368
373typedef void(*can_set_state_change_callback_t)(const struct device *dev,
375 void *user_data);
376
381typedef int (*can_get_core_clock_t)(const struct device *dev, uint32_t *rate);
382
387typedef int (*can_get_max_filters_t)(const struct device *dev, enum can_ide id_type);
388
393typedef int (*can_get_max_bitrate_t)(const struct device *dev, uint32_t *max_bitrate);
394
395__subsystem struct can_driver_api {
396 can_set_mode_t set_mode;
397 can_set_timing_t set_timing;
398 can_send_t send;
399 can_add_rx_filter_t add_rx_filter;
400 can_remove_rx_filter_t remove_rx_filter;
401#if !defined(CONFIG_CAN_AUTO_BUS_OFF_RECOVERY) || defined(__DOXYGEN__)
402 can_recover_t recover;
403#endif /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
404 can_get_state_t get_state;
405 can_set_state_change_callback_t set_state_change_callback;
406 can_get_core_clock_t get_core_clock;
407 can_get_max_filters_t get_max_filters;
408 can_get_max_bitrate_t get_max_bitrate;
409 /* Min values for the timing registers */
410 struct can_timing timing_min;
411 /* Max values for the timing registers */
412 struct can_timing timing_max;
413#if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
414 can_set_timing_data_t set_timing_data;
415 /* Min values for the timing registers during the data phase */
416 struct can_timing timing_data_min;
417 /* Max values for the timing registers during the data phase */
418 struct can_timing timing_data_max;
419#endif /* CONFIG_CAN_FD_MODE */
420};
421
424#if defined(CONFIG_CAN_STATS) || defined(__DOXYGEN__)
425
426#include <zephyr/stats/stats.h>
427
431STATS_SECT_ENTRY32(bit0_error)
432STATS_SECT_ENTRY32(bit1_error)
433STATS_SECT_ENTRY32(stuff_error)
434STATS_SECT_ENTRY32(crc_error)
435STATS_SECT_ENTRY32(form_error)
436STATS_SECT_ENTRY32(ack_error)
438
440STATS_NAME(can, bit0_error)
441STATS_NAME(can, bit1_error)
442STATS_NAME(can, stuff_error)
443STATS_NAME(can, crc_error)
444STATS_NAME(can, form_error)
445STATS_NAME(can, ack_error)
446STATS_NAME_END(can);
447
456 struct stats_can stats;
457};
458
464#define Z_CAN_GET_STATS(dev_) \
465 CONTAINER_OF(dev_->state, struct can_device_state, devstate)->stats
466
477#define CAN_STATS_BIT0_ERROR_INC(dev_) \
478 STATS_INC(Z_CAN_GET_STATS(dev_), bit0_error)
479
488#define CAN_STATS_BIT1_ERROR_INC(dev_) \
489 STATS_INC(Z_CAN_GET_STATS(dev_), bit1_error)
490
499#define CAN_STATS_STUFF_ERROR_INC(dev_) \
500 STATS_INC(Z_CAN_GET_STATS(dev_), stuff_error)
501
510#define CAN_STATS_CRC_ERROR_INC(dev_) \
511 STATS_INC(Z_CAN_GET_STATS(dev_), crc_error)
512
521#define CAN_STATS_FORM_ERROR_INC(dev_) \
522 STATS_INC(Z_CAN_GET_STATS(dev_), form_error)
523
532#define CAN_STATS_ACK_ERROR_INC(dev_) \
533 STATS_INC(Z_CAN_GET_STATS(dev_), ack_error)
534
540#define Z_CAN_DEVICE_STATE_DEFINE(node_id, dev_name) \
541 static struct can_device_state Z_DEVICE_STATE_NAME(dev_name) \
542 __attribute__((__section__(".z_devstate")));
543
550#define Z_CAN_INIT_FN(dev_name, init_fn) \
551 static inline int UTIL_CAT(dev_name, _init)(const struct device *dev) \
552 { \
553 struct can_device_state *state = \
554 CONTAINER_OF(dev->state, struct can_device_state, devstate); \
555 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 6, \
556 STATS_NAME_INIT_PARMS(can)); \
557 stats_register(dev->name, &(state->stats.s_hdr)); \
558 return init_fn(dev); \
559 }
560
583#define CAN_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
584 data_ptr, cfg_ptr, level, prio, \
585 api_ptr, ...) \
586 Z_CAN_DEVICE_STATE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id)); \
587 Z_CAN_INIT_FN(Z_DEVICE_DT_DEV_NAME(node_id), init_fn) \
588 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id), \
589 DEVICE_DT_NAME(node_id), \
590 &UTIL_CAT(Z_DEVICE_DT_DEV_NAME(node_id), _init), \
591 pm_device, \
592 data_ptr, cfg_ptr, level, prio, \
593 api_ptr, \
594 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_NAME(node_id)).devstate), \
595 __VA_ARGS__)
596
597#else /* CONFIG_CAN_STATS */
598
599#define CAN_STATS_BIT0_ERROR_INC(dev_)
600#define CAN_STATS_BIT1_ERROR_INC(dev_)
601#define CAN_STATS_STUFF_ERROR_INC(dev_)
602#define CAN_STATS_CRC_ERROR_INC(dev_)
603#define CAN_STATS_FORM_ERROR_INC(dev_)
604#define CAN_STATS_ACK_ERROR_INC(dev_)
605
606#define CAN_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
607 data_ptr, cfg_ptr, level, prio, \
608 api_ptr, ...) \
609 DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
610 data_ptr, cfg_ptr, level, prio, \
611 api_ptr, __VA_ARGS__)
612
613#endif /* CONFIG_CAN_STATS */
614
622#define CAN_DEVICE_DT_INST_DEFINE(inst, ...) \
623 CAN_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
624
641__syscall int can_get_core_clock(const struct device *dev, uint32_t *rate);
642
643static inline int z_impl_can_get_core_clock(const struct device *dev, uint32_t *rate)
644{
645 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
646
647 return api->get_core_clock(dev, rate);
648}
649
661__syscall int can_get_max_bitrate(const struct device *dev, uint32_t *max_bitrate);
662
663static inline int z_impl_can_get_max_bitrate(const struct device *dev, uint32_t *max_bitrate)
664{
665 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
666
667 if (api->get_max_bitrate == NULL) {
668 return -ENOSYS;
669 }
670
671 return api->get_max_bitrate(dev, max_bitrate);
672}
673
681__syscall const struct can_timing *can_get_timing_min(const struct device *dev);
682
683static inline const struct can_timing *z_impl_can_get_timing_min(const struct device *dev)
684{
685 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
686
687 return &api->timing_min;
688}
689
697__syscall const struct can_timing *can_get_timing_max(const struct device *dev);
698
699static inline const struct can_timing *z_impl_can_get_timing_max(const struct device *dev)
700{
701 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
702
703 return &api->timing_max;
704}
705
726__syscall int can_calc_timing(const struct device *dev, struct can_timing *res,
727 uint32_t bitrate, uint16_t sample_pnt);
728
742__syscall const struct can_timing *can_get_timing_data_min(const struct device *dev);
743
744#ifdef CONFIG_CAN_FD_MODE
745static inline const struct can_timing *z_impl_can_get_timing_data_min(const struct device *dev)
746{
747 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
748
749 return &api->timing_data_min;
750}
751#endif /* CONFIG_CAN_FD_MODE */
752
766__syscall const struct can_timing *can_get_timing_data_max(const struct device *dev);
767
768#ifdef CONFIG_CAN_FD_MODE
769static inline const struct can_timing *z_impl_can_get_timing_data_max(const struct device *dev)
770{
771 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
772
773 return &api->timing_data_max;
774}
775#endif /* CONFIG_CAN_FD_MODE */
776
795__syscall int can_calc_timing_data(const struct device *dev, struct can_timing *res,
796 uint32_t bitrate, uint16_t sample_pnt);
797
814__syscall int can_set_timing_data(const struct device *dev,
815 const struct can_timing *timing_data);
816
817#ifdef CONFIG_CAN_FD_MODE
818static inline int z_impl_can_set_timing_data(const struct device *dev,
819 const struct can_timing *timing_data)
820{
821 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
822
823 return api->set_timing_data(dev, timing_data);
824}
825#endif /* CONFIG_CAN_FD_MODE */
826
852__syscall int can_set_bitrate_data(const struct device *dev, uint32_t bitrate_data);
853
870int can_calc_prescaler(const struct device *dev, struct can_timing *timing,
871 uint32_t bitrate);
872
876#define CAN_SJW_NO_CHANGE 0
877
891__syscall int can_set_timing(const struct device *dev,
892 const struct can_timing *timing);
893
894static inline int z_impl_can_set_timing(const struct device *dev,
895 const struct can_timing *timing)
896{
897 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
898
899 return api->set_timing(dev, timing);
900}
901
911__syscall int can_set_mode(const struct device *dev, can_mode_t mode);
912
913static inline int z_impl_can_set_mode(const struct device *dev, can_mode_t mode)
914{
915 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
916
917 return api->set_mode(dev, mode);
918}
919
942__syscall int can_set_bitrate(const struct device *dev, uint32_t bitrate);
943
995__syscall int can_send(const struct device *dev, const struct zcan_frame *frame,
997 void *user_data);
998
999static inline int z_impl_can_send(const struct device *dev, const struct zcan_frame *frame,
1001 void *user_data)
1002{
1003 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1004
1005 return api->send(dev, frame, timeout, callback, user_data);
1006}
1007
1037static inline int can_add_rx_filter(const struct device *dev, can_rx_callback_t callback,
1038 void *user_data, const struct zcan_filter *filter)
1039{
1040 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1041
1042 return api->add_rx_filter(dev, callback, user_data, filter);
1043}
1044
1055#define CAN_MSGQ_DEFINE(name, max_frames) \
1056 K_MSGQ_DEFINE(name, sizeof(struct zcan_frame), max_frames, 4)
1057
1079__syscall int can_add_rx_filter_msgq(const struct device *dev, struct k_msgq *msgq,
1080 const struct zcan_filter *filter);
1081
1091__syscall void can_remove_rx_filter(const struct device *dev, int filter_id);
1092
1093static inline void z_impl_can_remove_rx_filter(const struct device *dev, int filter_id)
1094{
1095 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1096
1097 return api->remove_rx_filter(dev, filter_id);
1098}
1099
1112__syscall int can_get_max_filters(const struct device *dev, enum can_ide id_type);
1113
1114static inline int z_impl_can_get_max_filters(const struct device *dev, enum can_ide id_type)
1115{
1116 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1117
1118 if (api->get_max_filters == NULL) {
1119 return -ENOSYS;
1120 }
1121
1122 return api->get_max_filters(dev, id_type);
1123}
1124
1146__syscall int can_get_state(const struct device *dev, enum can_state *state,
1147 struct can_bus_err_cnt *err_cnt);
1148
1149static inline int z_impl_can_get_state(const struct device *dev, enum can_state *state,
1150 struct can_bus_err_cnt *err_cnt)
1151{
1152 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1153
1154 return api->get_state(dev, state, err_cnt);
1155}
1156
1171#if !defined(CONFIG_CAN_AUTO_BUS_OFF_RECOVERY) || defined(__DOXYGEN__)
1172__syscall int can_recover(const struct device *dev, k_timeout_t timeout);
1173
1174static inline int z_impl_can_recover(const struct device *dev, k_timeout_t timeout)
1175{
1176 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1177
1178 return api->recover(dev, timeout);
1179}
1180#else /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
1181/* This implementation prevents inking errors for auto recovery */
1182static inline int z_impl_can_recover(const struct device *dev, k_timeout_t timeout)
1183{
1184 ARG_UNUSED(dev);
1185 ARG_UNUSED(timeout);
1186 return 0;
1187}
1188#endif /* !CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
1189
1203static inline void can_set_state_change_callback(const struct device *dev,
1205 void *user_data)
1206{
1207 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
1208
1209 api->set_state_change_callback(dev, callback, user_data);
1210}
1211
1228{
1229 static const uint8_t dlc_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12,
1230 16, 20, 24, 32, 48, 64};
1231
1232 return dlc > 0x0F ? 64 : dlc_table[dlc];
1233}
1234
1242static inline uint8_t can_bytes_to_dlc(uint8_t num_bytes)
1243{
1244 return num_bytes <= 8 ? num_bytes :
1245 num_bytes <= 12 ? 9 :
1246 num_bytes <= 16 ? 10 :
1247 num_bytes <= 20 ? 11 :
1248 num_bytes <= 24 ? 12 :
1249 num_bytes <= 32 ? 13 :
1250 num_bytes <= 48 ? 14 :
1251 15;
1252}
1253
1287
1294
1297
1299 uint8_t pad; /* padding. */
1300 uint8_t res0; /* reserved/padding. */
1301 uint8_t res1; /* reserved/padding. */
1305 uint8_t data[CAN_MAX_DLEN];
1306};
1307
1318};
1319
1326static inline void can_copy_frame_to_zframe(const struct can_frame *frame,
1327 struct zcan_frame *zframe)
1328{
1329 zframe->id_type = (frame->can_id & BIT(31)) >> 31;
1330 zframe->rtr = (frame->can_id & BIT(30)) >> 30;
1331 zframe->id = frame->can_id & BIT_MASK(29);
1332 zframe->dlc = frame->can_dlc;
1333 memcpy(zframe->data, frame->data, sizeof(zframe->data));
1334}
1335
1342static inline void can_copy_zframe_to_frame(const struct zcan_frame *zframe,
1343 struct can_frame *frame)
1344{
1345 frame->can_id = (zframe->id_type << 31) | (zframe->rtr << 30) | zframe->id;
1346 frame->can_dlc = zframe->dlc;
1347 memcpy(frame->data, zframe->data, sizeof(frame->data));
1348}
1349
1356static inline void can_copy_filter_to_zfilter(const struct can_filter *filter,
1357 struct zcan_filter *zfilter)
1358{
1359 zfilter->id_type = (filter->can_id & BIT(31)) >> 31;
1360 zfilter->rtr = (filter->can_id & BIT(30)) >> 30;
1361 zfilter->id = filter->can_id & BIT_MASK(29);
1362 zfilter->rtr_mask = (filter->can_mask & BIT(30)) >> 30;
1363 zfilter->id_mask = filter->can_mask & BIT_MASK(29);
1364}
1365
1372static inline void can_copy_zfilter_to_filter(const struct zcan_filter *zfilter,
1373 struct can_filter *filter)
1374{
1375 filter->can_id = (zfilter->id_type << 31) |
1376 (zfilter->rtr << 30) | zfilter->id;
1377 filter->can_mask = (zfilter->rtr_mask << 30) |
1378 (zfilter->id_type << 31) | zfilter->id_mask;
1379}
1380
1387#ifdef __cplusplus
1388}
1389#endif
1390
1391#include <syscalls/can.h>
1392
1393#endif /* ZEPHYR_INCLUDE_DRIVERS_CAN_H_ */
ZTEST_BMEM int timeout
Definition: main.c:31
#define BIT_MASK(n)
Definition: adc.h:14
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:301
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:110
int can_set_timing(const struct device *dev, const struct can_timing *timing)
Configure the bus timing of a CAN controller.
int can_send(const struct device *dev, const struct zcan_frame *frame, k_timeout_t timeout, can_tx_callback_t callback, void *user_data)
Queue a CAN frame for transmission 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_rx_callback_t)(const struct device *dev, struct zcan_frame *frame, void *user_data)
Defines the application callback handler function signature for receiving.
Definition: can.h:290
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.
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.
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:1242
can_rtr
Defines if the CAN frame is a data frame or a Remote Transmission Request (RTR) frame.
Definition: can.h:140
int can_get_max_bitrate(const struct device *dev, uint32_t *max_bitrate)
Get maximum supported bitrate.
can_ide
Defines if the CAN frame has a standard (11-bit) or extended (29-bit) CAN identifier.
Definition: can.h:130
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:1227
int can_get_max_filters(const struct device *dev, enum can_ide id_type)
Get maximum number of RX filters.
void(* can_tx_callback_t)(const struct device *dev, int error, void *user_data)
Defines the application callback handler function signature.
Definition: can.h:281
int can_get_state(const struct device *dev, enum can_state *state, struct can_bus_err_cnt *err_cnt)
Get current CAN controller state.
const struct can_timing * can_get_timing_max(const struct device *dev)
Get the maximum supported timing parameter values.
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:115
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:1037
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:1203
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:1342
int can_set_mode(const struct device *dev, can_mode_t mode)
Set the CAN controller to the given operation mode.
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:1372
uint32_t canid_t
Definition: can.h:1286
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:1326
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:1356
@ CAN_DATAFRAME
Definition: can.h:142
@ CAN_REMOTEREQUEST
Definition: can.h:144
@ CAN_EXTENDED_IDENTIFIER
Definition: can.h:134
@ CAN_STANDARD_IDENTIFIER
Definition: can.h:132
@ CAN_ERROR_WARNING
Definition: can.h:119
@ CAN_ERROR_PASSIVE
Definition: can.h:121
@ CAN_ERROR_ACTIVE
Definition: can.h:117
@ CAN_BUS_OFF
Definition: can.h:123
#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 ENOSYS
Definition: errno.h:83
state
Definition: http_parser_state.h:29
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
Statistics.
#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
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
CAN controller error counters.
Definition: can.h:221
uint8_t tx_err_cnt
Definition: can.h:223
uint8_t rx_err_cnt
Definition: can.h:225
CAN specific device state which allows for CAN device class specific additions.
Definition: can.h:454
struct device_state devstate
Definition: can.h:455
struct stats_can stats
Definition: can.h:456
CAN filter for Linux SocketCAN compatibility.
Definition: can.h:1313
canid_t can_mask
Definition: can.h:1317
canid_t can_id
Definition: can.h:1315
CAN frame for Linux SocketCAN compatibility.
Definition: can.h:1291
uint8_t can_dlc
Definition: can.h:1296
uint8_t data[CAN_MAX_DLEN]
Definition: can.h:1305
canid_t can_id
Definition: can.h:1293
CAN bus timing structure.
Definition: can.h:260
uint16_t sjw
Definition: can.h:262
uint16_t phase_seg2
Definition: can.h:268
uint16_t prescaler
Definition: can.h:270
uint16_t phase_seg1
Definition: can.h:266
uint16_t prop_seg
Definition: can.h:264
Runtime device dynamic structure (in RAM) per driver instance.
Definition: device.h:429
Runtime device structure (in ROM) per driver instance.
Definition: device.h:456
const void * api
Definition: device.h:462
Message Queue Structure.
Definition: kernel.h:4305
Kernel timeout type.
Definition: sys_clock.h:65
CAN filter structure.
Definition: can.h:191
uint32_t id_mask
Definition: can.h:204
uint32_t rtr
Definition: can.h:198
uint32_t rtr_mask
Definition: can.h:212
uint32_t id_type
Definition: can.h:200
uint32_t id
Definition: can.h:193
CAN frame structure.
Definition: can.h:150
uint8_t dlc
Definition: can.h:160
uint32_t data_32[ceiling_fraction(CAN_MAX_DLEN, sizeof(uint32_t))]
Definition: can.h:184
uint32_t id_type
Definition: can.h:158
uint8_t data[CAN_MAX_DLEN]
Definition: can.h:183
uint32_t rtr
Definition: can.h:156
uint16_t timestamp
Definition: can.h:174
uint8_t brs
Definition: can.h:162
uint32_t fd
Definition: can.h:154
uint32_t id
Definition: can.h:152
static const intptr_t user_data[5]
Definition: main.c:590
Misc utilities.