Line data Source code
1 1 : /**
2 : * @file
3 : * @brief CAN devicetree macro public API header file.
4 : */
5 :
6 : /*
7 : * Copyright (c) 2022 Vestas Wind Systems A/S
8 : *
9 : * SPDX-License-Identifier: Apache-2.0
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DEVICETREE_CAN_H_
13 : #define ZEPHYR_INCLUDE_DEVICETREE_CAN_H_
14 :
15 : #ifdef __cplusplus
16 : extern "C" {
17 : #endif
18 :
19 : /**
20 : * @defgroup devicetree-can Devicetree CAN API
21 : * @ingroup devicetree
22 : * @{
23 : */
24 :
25 : /**
26 : * @brief Get the minimum transceiver bitrate for a CAN controller
27 : *
28 : * The bitrate will be limited to the minimum bitrate supported by the CAN
29 : * controller. If no CAN transceiver is present in the devicetree, the minimum
30 : * bitrate will be that of the CAN controller.
31 : *
32 : * Example devicetree fragment:
33 : *
34 : * transceiver0: can-phy0 {
35 : * compatible = "vnd,can-transceiver";
36 : * min-bitrate = <15000>;
37 : * max-bitrate = <1000000>;
38 : * #phy-cells = <0>;
39 : * };
40 : *
41 : * can0: can@... {
42 : * compatible = "vnd,can-controller";
43 : * phys = <&transceiver0>;
44 : * };
45 : *
46 : * can1: can@... {
47 : * compatible = "vnd,can-controller";
48 : *
49 : * can-transceiver {
50 : * min-bitrate = <25000>;
51 : * max-bitrate = <2000000>;
52 : * };
53 : * };
54 : *
55 : * can2: can@... {
56 : * compatible = "vnd,can-controller";
57 : *
58 : * can-transceiver {
59 : * max-bitrate = <2000000>;
60 : * };
61 : * };
62 : *
63 : * Example usage:
64 : *
65 : * DT_CAN_TRANSCEIVER_MIN_BITRATE(DT_NODELABEL(can0), 10000) // 15000
66 : * DT_CAN_TRANSCEIVER_MIN_BITRATE(DT_NODELABEL(can1), 0) // 250000
67 : * DT_CAN_TRANSCEIVER_MIN_BITRATE(DT_NODELABEL(can1), 50000) // 500000
68 : * DT_CAN_TRANSCEIVER_MIN_BITRATE(DT_NODELABEL(can2), 0) // 0
69 : *
70 : * @param node_id node identifier
71 : * @param min minimum bitrate supported by the CAN controller
72 : * @return the minimum bitrate supported by the CAN controller/transceiver combination
73 : */
74 1 : #define DT_CAN_TRANSCEIVER_MIN_BITRATE(node_id, min) \
75 : COND_CODE_1(DT_NODE_HAS_PROP(node_id, phys), \
76 : MAX(DT_PROP_OR(DT_PHANDLE(node_id, phys), min_bitrate, 0), min), \
77 : MAX(DT_PROP_OR(DT_CHILD(node_id, can_transceiver), min_bitrate, min), min))
78 :
79 : /**
80 : * @brief Get the maximum transceiver bitrate for a CAN controller
81 : *
82 : * The bitrate will be limited to the maximum bitrate supported by the CAN
83 : * controller. If no CAN transceiver is present in the devicetree, the maximum
84 : * bitrate will be that of the CAN controller.
85 : *
86 : * Example devicetree fragment:
87 : *
88 : * transceiver0: can-phy0 {
89 : * compatible = "vnd,can-transceiver";
90 : * max-bitrate = <1000000>;
91 : * #phy-cells = <0>;
92 : * };
93 : *
94 : * can0: can@... {
95 : * compatible = "vnd,can-controller";
96 : * phys = <&transceiver0>;
97 : * };
98 : *
99 : * can1: can@... {
100 : * compatible = "vnd,can-controller";
101 : *
102 : * can-transceiver {
103 : * max-bitrate = <2000000>;
104 : * };
105 : * };
106 : *
107 : * Example usage:
108 : *
109 : * DT_CAN_TRANSCEIVER_MAX_BITRATE(DT_NODELABEL(can0), 5000000) // 1000000
110 : * DT_CAN_TRANSCEIVER_MAX_BITRATE(DT_NODELABEL(can1), 5000000) // 2000000
111 : * DT_CAN_TRANSCEIVER_MAX_BITRATE(DT_NODELABEL(can1), 1000000) // 1000000
112 : *
113 : * @param node_id node identifier
114 : * @param max maximum bitrate supported by the CAN controller
115 : * @return the maximum bitrate supported by the CAN controller/transceiver combination
116 : */
117 1 : #define DT_CAN_TRANSCEIVER_MAX_BITRATE(node_id, max) \
118 : COND_CODE_1(DT_NODE_HAS_PROP(node_id, phys), \
119 : MIN(DT_PROP(DT_PHANDLE(node_id, phys), max_bitrate), max), \
120 : MIN(DT_PROP_OR(DT_CHILD(node_id, can_transceiver), max_bitrate, max), max))
121 :
122 : /**
123 : * @brief Get the minimum transceiver bitrate for a DT_DRV_COMPAT CAN controller
124 : * @param inst DT_DRV_COMPAT instance number
125 : * @param min minimum bitrate supported by the CAN controller
126 : * @return the minimum bitrate supported by the CAN controller/transceiver combination
127 : * @see DT_CAN_TRANSCEIVER_MIN_BITRATE()
128 : */
129 1 : #define DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(inst, min) \
130 : DT_CAN_TRANSCEIVER_MIN_BITRATE(DT_DRV_INST(inst), min)
131 :
132 : /**
133 : * @brief Get the maximum transceiver bitrate for a DT_DRV_COMPAT CAN controller
134 : * @param inst DT_DRV_COMPAT instance number
135 : * @param max maximum bitrate supported by the CAN controller
136 : * @return the maximum bitrate supported by the CAN controller/transceiver combination
137 : * @see DT_CAN_TRANSCEIVER_MAX_BITRATE()
138 : */
139 1 : #define DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(inst, max) \
140 : DT_CAN_TRANSCEIVER_MAX_BITRATE(DT_DRV_INST(inst), max)
141 :
142 : /**
143 : * @}
144 : */
145 :
146 : #ifdef __cplusplus
147 : }
148 : #endif
149 :
150 : #endif /* ZEPHYR_INCLUDE_DEVICETREE_CAN_H_ */
|