Line data Source code
1 1 : /** @file
2 : * @brief SocketCAN utilities.
3 : *
4 : * Utilities for SocketCAN support.
5 : */
6 :
7 : /*
8 : * Copyright (c) 2019 Intel Corporation
9 : *
10 : * SPDX-License-Identifier: Apache-2.0
11 : */
12 :
13 : #ifndef ZEPHYR_INCLUDE_NET_SOCKETCAN_UTILS_H_
14 : #define ZEPHYR_INCLUDE_NET_SOCKETCAN_UTILS_H_
15 :
16 : #include <zephyr/drivers/can.h>
17 : #include <zephyr/net/socketcan.h>
18 :
19 : #ifdef __cplusplus
20 : extern "C" {
21 : #endif
22 :
23 : /**
24 : * @brief SocketCAN utilities
25 : * @addtogroup socket_can
26 : * @{
27 : */
28 :
29 : /**
30 : * @brief Translate a @a socketcan_frame struct to a @a can_frame struct.
31 : *
32 : * @param sframe Pointer to sockecan_frame struct.
33 : * @param zframe Pointer to can_frame struct.
34 : */
35 1 : static inline void socketcan_to_can_frame(const struct socketcan_frame *sframe,
36 : struct can_frame *zframe)
37 : {
38 : memset(zframe, 0, sizeof(*zframe));
39 :
40 : zframe->flags |= (sframe->can_id & BIT(31)) != 0 ? CAN_FRAME_IDE : 0;
41 : zframe->flags |= (sframe->can_id & BIT(30)) != 0 ? CAN_FRAME_RTR : 0;
42 : zframe->flags |= (sframe->flags & CANFD_FDF) != 0 ? CAN_FRAME_FDF : 0;
43 : zframe->flags |= (sframe->flags & CANFD_BRS) != 0 ? CAN_FRAME_BRS : 0;
44 : zframe->id = sframe->can_id & BIT_MASK(29);
45 : zframe->dlc = can_bytes_to_dlc(sframe->len);
46 :
47 : if ((zframe->flags & CAN_FRAME_RTR) == 0U) {
48 : memcpy(zframe->data, sframe->data,
49 : MIN(sframe->len, MIN(sizeof(sframe->data), sizeof(zframe->data))));
50 : }
51 : }
52 :
53 : /**
54 : * @brief Translate a @a can_frame struct to a @a socketcan_frame struct.
55 : *
56 : * @param zframe Pointer to can_frame struct.
57 : * @param sframe Pointer to socketcan_frame struct.
58 : */
59 1 : static inline void socketcan_from_can_frame(const struct can_frame *zframe,
60 : struct socketcan_frame *sframe)
61 : {
62 : memset(sframe, 0, sizeof(*sframe));
63 :
64 : sframe->can_id = zframe->id;
65 : sframe->can_id |= (zframe->flags & CAN_FRAME_IDE) != 0 ? BIT(31) : 0;
66 : sframe->can_id |= (zframe->flags & CAN_FRAME_RTR) != 0 ? BIT(30) : 0;
67 : sframe->len = can_dlc_to_bytes(zframe->dlc);
68 :
69 : if ((zframe->flags & CAN_FRAME_FDF) != 0) {
70 : sframe->flags |= CANFD_FDF;
71 : }
72 :
73 : if ((zframe->flags & CAN_FRAME_BRS) != 0) {
74 : sframe->flags |= CANFD_BRS;
75 : }
76 :
77 : if ((zframe->flags & CAN_FRAME_RTR) == 0U) {
78 : memcpy(sframe->data, zframe->data,
79 : MIN(sframe->len, MIN(sizeof(zframe->data), sizeof(sframe->data))));
80 : }
81 : }
82 :
83 : /**
84 : * @brief Translate a @a socketcan_filter struct to a @a can_filter struct.
85 : *
86 : * @param sfilter Pointer to socketcan_filter struct.
87 : * @param zfilter Pointer to can_filter struct.
88 : */
89 1 : static inline void socketcan_to_can_filter(const struct socketcan_filter *sfilter,
90 : struct can_filter *zfilter)
91 : {
92 : memset(zfilter, 0, sizeof(*zfilter));
93 :
94 : zfilter->flags |= (sfilter->can_id & BIT(31)) != 0 ? CAN_FILTER_IDE : 0;
95 : zfilter->id = sfilter->can_id & BIT_MASK(29);
96 : zfilter->mask = sfilter->can_mask & BIT_MASK(29);
97 : }
98 :
99 : /**
100 : * @brief Translate a @a can_filter struct to a @a socketcan_filter struct.
101 : *
102 : * @param zfilter Pointer to can_filter struct.
103 : * @param sfilter Pointer to socketcan_filter struct.
104 : */
105 1 : static inline void socketcan_from_can_filter(const struct can_filter *zfilter,
106 : struct socketcan_filter *sfilter)
107 : {
108 : memset(sfilter, 0, sizeof(*sfilter));
109 :
110 : sfilter->can_id = zfilter->id;
111 : sfilter->can_id |= (zfilter->flags & CAN_FILTER_IDE) != 0 ? BIT(31) : 0;
112 :
113 : sfilter->can_mask = zfilter->mask;
114 : sfilter->can_mask |= (zfilter->flags & CAN_FILTER_IDE) != 0 ? BIT(31) : 0;
115 :
116 : if (!IS_ENABLED(CONFIG_CAN_ACCEPT_RTR)) {
117 : sfilter->can_mask |= BIT(30);
118 : }
119 : }
120 :
121 : /**
122 : * @}
123 : */
124 :
125 : #ifdef __cplusplus
126 : }
127 : #endif
128 :
129 : #endif /* ZEPHYR_INCLUDE_NET_SOCKETCAN_H_ */
|