Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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 <device.h>
13#include <string.h>
14#include <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
93};
94
107};
108
119
129
147 uint8_t res : 7; /* reserved/padding. */
149#if defined(CONFIG_CAN_RX_TIMESTAMP) || defined(__DOXYGEN__)
158#else
160 uint8_t res0; /* reserved/padding. */
161 uint8_t res1; /* reserved/padding. */
163#endif
165 union {
166 uint8_t data[CAN_MAX_DLEN];
167 uint32_t data_32[ceiling_fraction(CAN_MAX_DLEN, sizeof(uint32_t))];
168 };
169};
170
178 uint32_t res0 : 1;
189 uint32_t res1 : 1;
197 uint32_t res2 : 1;
199};
200
209};
210
254};
255
264typedef void (*can_tx_callback_t)(int error, void *user_data);
265
273typedef void (*can_rx_callback_t)(struct zcan_frame *frame, void *user_data);
274
284 struct can_bus_err_cnt err_cnt,
285 void *user_data);
286
298typedef int (*can_set_timing_t)(const struct device *dev,
299 const struct can_timing *timing,
300 const struct can_timing *timing_data);
301
307typedef int (*can_set_mode_t)(const struct device *dev, enum can_mode mode);
308
314typedef int (*can_send_t)(const struct device *dev,
315 const struct zcan_frame *frame,
317 void *user_data);
318
324typedef int (*can_add_rx_filter_t)(const struct device *dev,
325 can_rx_callback_t callback,
326 void *user_data,
327 const struct zcan_filter *filter);
328
334typedef void (*can_remove_rx_filter_t)(const struct device *dev, int filter_id);
335
341typedef int (*can_recover_t)(const struct device *dev, k_timeout_t timeout);
342
348typedef int (*can_get_state_t)(const struct device *dev, enum can_state *state,
349 struct can_bus_err_cnt *err_cnt);
350
356typedef void(*can_set_state_change_callback_t)(const struct device *dev,
358 void *user_data);
359
365typedef int (*can_get_core_clock_t)(const struct device *dev, uint32_t *rate);
366
372typedef int (*can_get_max_filters_t)(const struct device *dev, enum can_ide id_type);
373
374__subsystem struct can_driver_api {
375 can_set_mode_t set_mode;
376 can_set_timing_t set_timing;
377 can_send_t send;
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;
382#endif /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
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;
387 /* Min values for the timing registers */
388 struct can_timing timing_min;
389 /* Max values for the timing registers */
390 struct can_timing timing_max;
391#if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
392 /* Min values for the timing registers during the data phase */
393 struct can_timing timing_min_data;
394 /* Max values for the timing registers during the data phase */
395 struct can_timing timing_max_data;
396#endif /* CONFIG_CAN_FD_MODE */
397};
398
417__syscall int can_get_core_clock(const struct device *dev, uint32_t *rate);
418
419static inline int z_impl_can_get_core_clock(const struct device *dev, uint32_t *rate)
420{
421 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
422
423 return api->get_core_clock(dev, rate);
424}
425
446int can_calc_timing(const struct device *dev, struct can_timing *res,
447 uint32_t bitrate, uint16_t sample_pnt);
448
449#if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__)
468int can_calc_timing_data(const struct device *dev, struct can_timing *res,
469 uint32_t bitrate, uint16_t sample_pnt);
470#endif /* CONFIG_CAN_FD_MODE */
471
488int can_calc_prescaler(const struct device *dev, struct can_timing *timing,
489 uint32_t bitrate);
490
494#define CAN_SJW_NO_CHANGE 0
495
512__syscall int can_set_timing(const struct device *dev,
513 const struct can_timing *timing,
514 const struct can_timing *timing_data);
515
516static inline int z_impl_can_set_timing(const struct device *dev,
517 const struct can_timing *timing,
518 const struct can_timing *timing_data)
519{
520 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
521
522 return api->set_timing(dev, timing, timing_data);
523}
524
534__syscall int can_set_mode(const struct device *dev, enum can_mode mode);
535
536static inline int z_impl_can_set_mode(const struct device *dev, enum can_mode mode)
537{
538 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
539
540 return api->set_mode(dev, mode);
541}
542
560static inline int can_set_bitrate(const struct device *dev,
561 uint32_t bitrate,
562 uint32_t bitrate_data)
563{
564 struct can_timing timing;
565#ifdef CONFIG_CAN_FD_MODE
566 struct can_timing timing_data;
567#endif
568 int ret;
569
570 ret = can_calc_timing(dev, &timing, bitrate, 875);
571 if (ret < 0) {
572 return -EINVAL;
573 }
574
575 timing.sjw = CAN_SJW_NO_CHANGE;
576
577#ifdef CONFIG_CAN_FD_MODE
578 ret = can_calc_timing_data(dev, &timing_data, bitrate_data, 875);
579 if (ret < 0) {
580 return -EINVAL;
581 }
582
583 timing_data.sjw = CAN_SJW_NO_CHANGE;
584
585 return can_set_timing(dev, &timing, &timing_data);
586#else /* CONFIG_CAN_FD_MODE */
587 return can_set_timing(dev, &timing, NULL);
588#endif /* !CONFIG_CAN_FD_MODE */
589}
590
628__syscall int can_send(const struct device *dev, const struct zcan_frame *frame,
630 void *user_data);
631
632static inline int z_impl_can_send(const struct device *dev, const struct zcan_frame *frame,
634 void *user_data)
635{
636 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
637
638 return api->send(dev, frame, timeout, callback, user_data);
639}
640
670static inline int can_add_rx_filter(const struct device *dev, can_rx_callback_t callback,
671 void *user_data, const struct zcan_filter *filter)
672{
673 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
674
675 return api->add_rx_filter(dev, callback, user_data, filter);
676}
677
688#define CAN_MSGQ_DEFINE(name, max_frames) \
689 K_MSGQ_DEFINE(name, sizeof(struct zcan_frame), max_frames, 4)
690
712__syscall int can_add_rx_filter_msgq(const struct device *dev, struct k_msgq *msgq,
713 const struct zcan_filter *filter);
714
724__syscall void can_remove_rx_filter(const struct device *dev, int filter_id);
725
726static inline void z_impl_can_remove_rx_filter(const struct device *dev, int filter_id)
727{
728 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
729
730 return api->remove_rx_filter(dev, filter_id);
731}
732
745__syscall int can_get_max_filters(const struct device *dev, enum can_ide id_type);
746
747static inline int z_impl_can_get_max_filters(const struct device *dev, enum can_ide id_type)
748{
749 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
750
751 if (api->get_max_filters == NULL) {
752 return -ENOSYS;
753 }
754
755 return api->get_max_filters(dev, id_type);
756}
757
779__syscall int can_get_state(const struct device *dev, enum can_state *state,
780 struct can_bus_err_cnt *err_cnt);
781
782static inline int z_impl_can_get_state(const struct device *dev, enum can_state *state,
783 struct can_bus_err_cnt *err_cnt)
784{
785 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
786
787 return api->get_state(dev, state, err_cnt);
788}
789
804#if !defined(CONFIG_CAN_AUTO_BUS_OFF_RECOVERY) || defined(__DOXYGEN__)
805__syscall int can_recover(const struct device *dev, k_timeout_t timeout);
806
807static inline int z_impl_can_recover(const struct device *dev, k_timeout_t timeout)
808{
809 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
810
811 return api->recover(dev, timeout);
812}
813#else /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
814/* This implementation prevents inking errors for auto recovery */
815static inline int z_impl_can_recover(const struct device *dev, k_timeout_t timeout)
816{
817 return 0;
818}
819#endif /* !CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
820
834static inline void can_set_state_change_callback(const struct device *dev,
836 void *user_data)
837{
838 const struct can_driver_api *api = (const struct can_driver_api *)dev->api;
839
840 api->set_state_change_callback(dev, callback, user_data);
841}
842
859{
860 static const uint8_t dlc_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12,
861 16, 20, 24, 32, 48, 64};
862
863 return dlc > 0x0F ? 64 : dlc_table[dlc];
864}
865
873static inline uint8_t can_bytes_to_dlc(uint8_t num_bytes)
874{
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 :
882 15;
883}
884
918
922struct can_frame {
925
928
930 uint8_t pad; /* padding. */
931 uint8_t res0; /* reserved/padding. */
932 uint8_t res1; /* reserved/padding. */
936 uint8_t data[CAN_MAX_DLEN];
937};
938
949};
950
957static inline void can_copy_frame_to_zframe(const struct can_frame *frame,
958 struct zcan_frame *zframe)
959{
960 zframe->id_type = (frame->can_id & BIT(31)) >> 31;
961 zframe->rtr = (frame->can_id & BIT(30)) >> 30;
962 zframe->id = frame->can_id & BIT_MASK(29);
963 zframe->dlc = frame->can_dlc;
964 memcpy(zframe->data, frame->data, sizeof(zframe->data));
965}
966
973static inline void can_copy_zframe_to_frame(const struct zcan_frame *zframe,
974 struct can_frame *frame)
975{
976 frame->can_id = (zframe->id_type << 31) | (zframe->rtr << 30) | zframe->id;
977 frame->can_dlc = zframe->dlc;
978 memcpy(frame->data, zframe->data, sizeof(frame->data));
979}
980
987static inline void can_copy_filter_to_zfilter(const struct can_filter *filter,
988 struct zcan_filter *zfilter)
989{
990 zfilter->id_type = (filter->can_id & BIT(31)) >> 31;
991 zfilter->rtr = (filter->can_id & BIT(30)) >> 30;
992 zfilter->id = filter->can_id & BIT_MASK(29);
993 zfilter->rtr_mask = (filter->can_mask & BIT(30)) >> 30;
994 zfilter->id_mask = filter->can_mask & BIT_MASK(29);
995}
996
1003static inline void can_copy_zfilter_to_filter(const struct zcan_filter *zfilter,
1004 struct can_filter *filter)
1005{
1006 filter->can_id = (zfilter->id_type << 31) |
1007 (zfilter->rtr << 30) | zfilter->id;
1008 filter->can_mask = (zfilter->rtr_mask << 30) |
1009 (zfilter->id_type << 31) | zfilter->id_mask;
1010}
1011
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
1049
1064__deprecated static inline int can_configure(const struct device *dev, enum can_mode mode,
1065 uint32_t bitrate)
1066{
1067 int err;
1068
1069 if (bitrate > 0) {
1070 err = can_set_bitrate(dev, bitrate, bitrate);
1071 if (err != 0) {
1072 return err;
1073 }
1074 }
1075
1076 return can_set_mode(dev, mode);
1077}
1078
1082#ifndef CONFIG_CAN_WORKQ_FRAMES_BUF_CNT
1083#define CONFIG_CAN_WORKQ_FRAMES_BUF_CNT 4
1084#endif
1085
1091struct can_frame_buffer {
1092 struct zcan_frame buf[CONFIG_CAN_WORKQ_FRAMES_BUF_CNT];
1093 uint16_t head;
1094 uint16_t tail;
1095};
1096
1102struct zcan_work {
1103 struct k_work work_item;
1104 struct k_work_q *work_queue;
1105 struct can_frame_buffer buf;
1107 void *cb_arg;
1108};
1109
1142__deprecated int can_attach_workq(const struct device *dev, struct k_work_q *work_q,
1143 struct zcan_work *work, can_rx_callback_t callback,
1144 void *user_data, const struct zcan_filter *filter);
1145
1149__deprecated static inline int can_attach_isr(const struct device *dev, can_rx_callback_t isr,
1150 void *user_data, const struct zcan_filter *filter)
1151{
1152 return can_add_rx_filter(dev, isr, user_data, filter);
1153}
1154
1158#define CAN_DEFINE_MSGQ(name, size) CAN_MSGQ_DEFINE(name, size) __DEPRECATED_MACRO
1159
1163__deprecated static inline int can_attach_msgq(const struct device *dev, struct k_msgq *msg_q,
1164 const struct zcan_filter *filter)
1165{
1166 return can_add_rx_filter_msgq(dev, msg_q, filter);
1167}
1168
1172__deprecated static inline void can_detach(const struct device *dev, int filter_id)
1173{
1174 can_remove_rx_filter(dev, filter_id);
1175}
1176
1180__deprecated static inline void can_register_state_change_isr(const struct device *dev,
1182{
1183 can_set_state_change_callback(dev, isr, NULL);
1184}
1185
1216__deprecated static inline int can_write(const struct device *dev, const uint8_t *data,
1217 uint8_t length, uint32_t id, enum can_rtr rtr,
1219{
1220 struct zcan_frame frame;
1221
1222 if (length > 8) {
1223 return -EINVAL;
1224 }
1225
1226 frame.id = id;
1227
1228 if (id > CAN_MAX_STD_ID) {
1230 } else {
1232 }
1233
1234 frame.dlc = length;
1235 frame.rtr = rtr;
1236 memcpy(frame.data, data, length);
1237
1238 return can_send(dev, &frame, timeout, NULL, NULL);
1239}
1240
1247#ifdef __cplusplus
1248}
1249#endif
1250
1251#include <syscalls/can.h>
1252
1253#endif /* ZEPHYR_INCLUDE_DRIVERS_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
Misc utilities.