Line data Source code
1 0 : /*
2 : * Copyright (c) 2023 Vestas Wind Systems A/S
3 : * Copyright (c) 2020 Alexander Wachter
4 : *
5 : * SPDX-License-Identifier: Apache-2.0
6 : *
7 : */
8 :
9 : #ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_CAN_MCAN_H_
10 : #define ZEPHYR_INCLUDE_DRIVERS_CAN_CAN_MCAN_H_
11 :
12 : #include <zephyr/cache.h>
13 : #include <zephyr/devicetree.h>
14 : #include <zephyr/drivers/can.h>
15 : #include <zephyr/kernel.h>
16 : #include <zephyr/sys/sys_io.h>
17 : #include <zephyr/sys/util.h>
18 :
19 : /*
20 : * The Bosch M_CAN register definitions correspond to those found in the Bosch M_CAN Controller Area
21 : * Network User's Manual, Revision 3.3.0.
22 : */
23 :
24 : /* Core Release register */
25 0 : #define CAN_MCAN_CREL 0x000
26 0 : #define CAN_MCAN_CREL_REL GENMASK(31, 28)
27 0 : #define CAN_MCAN_CREL_STEP GENMASK(27, 24)
28 0 : #define CAN_MCAN_CREL_SUBSTEP GENMASK(23, 20)
29 0 : #define CAN_MCAN_CREL_YEAR GENMASK(19, 16)
30 0 : #define CAN_MCAN_CREL_MON GENMASK(15, 8)
31 0 : #define CAN_MCAN_CREL_DAY GENMASK(7, 0)
32 :
33 : /* Endian register */
34 0 : #define CAN_MCAN_ENDN 0x004
35 0 : #define CAN_MCAN_ENDN_ETV GENMASK(31, 0)
36 :
37 : /* Customer register */
38 0 : #define CAN_MCAN_CUST 0x008
39 0 : #define CAN_MCAN_CUST_CUST GENMASK(31, 0)
40 :
41 : /* Data Bit Timing & Prescaler register */
42 0 : #define CAN_MCAN_DBTP 0x00C
43 0 : #define CAN_MCAN_DBTP_TDC BIT(23)
44 0 : #define CAN_MCAN_DBTP_DBRP GENMASK(20, 16)
45 0 : #define CAN_MCAN_DBTP_DTSEG1 GENMASK(12, 8)
46 0 : #define CAN_MCAN_DBTP_DTSEG2 GENMASK(7, 4)
47 0 : #define CAN_MCAN_DBTP_DSJW GENMASK(3, 0)
48 :
49 : /* Test register */
50 0 : #define CAN_MCAN_TEST 0x010
51 0 : #define CAN_MCAN_TEST_SVAL BIT(21)
52 0 : #define CAN_MCAN_TEST_TXBNS GENMASK(20, 16)
53 0 : #define CAN_MCAN_TEST_PVAL BIT(13)
54 0 : #define CAN_MCAN_TEST_TXBNP GENMASK(12, 8)
55 0 : #define CAN_MCAN_TEST_RX BIT(7)
56 0 : #define CAN_MCAN_TEST_TX GENMASK(6, 5)
57 0 : #define CAN_MCAN_TEST_LBCK BIT(4)
58 :
59 : /* RAM Watchdog register */
60 0 : #define CAN_MCAN_RWD 0x014
61 0 : #define CAN_MCAN_RWD_WDV GENMASK(15, 8)
62 0 : #define CAN_MCAN_RWD_WDC GENMASK(7, 0)
63 :
64 : /* CC Control register */
65 0 : #define CAN_MCAN_CCCR 0x018
66 0 : #define CAN_MCAN_CCCR_NISO BIT(15)
67 0 : #define CAN_MCAN_CCCR_TXP BIT(14)
68 0 : #define CAN_MCAN_CCCR_EFBI BIT(13)
69 0 : #define CAN_MCAN_CCCR_PXHD BIT(12)
70 0 : #define CAN_MCAN_CCCR_WMM BIT(11)
71 0 : #define CAN_MCAN_CCCR_UTSU BIT(10)
72 0 : #define CAN_MCAN_CCCR_BRSE BIT(9)
73 0 : #define CAN_MCAN_CCCR_FDOE BIT(8)
74 0 : #define CAN_MCAN_CCCR_TEST BIT(7)
75 0 : #define CAN_MCAN_CCCR_DAR BIT(6)
76 0 : #define CAN_MCAN_CCCR_MON BIT(5)
77 0 : #define CAN_MCAN_CCCR_CSR BIT(4)
78 0 : #define CAN_MCAN_CCCR_CSA BIT(3)
79 0 : #define CAN_MCAN_CCCR_ASM BIT(2)
80 0 : #define CAN_MCAN_CCCR_CCE BIT(1)
81 0 : #define CAN_MCAN_CCCR_INIT BIT(0)
82 :
83 : /* Nominal Bit Timing & Prescaler register */
84 0 : #define CAN_MCAN_NBTP 0x01C
85 0 : #define CAN_MCAN_NBTP_NSJW GENMASK(31, 25)
86 0 : #define CAN_MCAN_NBTP_NBRP GENMASK(24, 16)
87 0 : #define CAN_MCAN_NBTP_NTSEG1 GENMASK(15, 8)
88 0 : #define CAN_MCAN_NBTP_NTSEG2 GENMASK(6, 0)
89 :
90 : /* Timestamp Counter Configuration register */
91 0 : #define CAN_MCAN_TSCC 0x020
92 0 : #define CAN_MCAN_TSCC_TCP GENMASK(19, 16)
93 0 : #define CAN_MCAN_TSCC_TSS GENMASK(1, 0)
94 :
95 : /* Timestamp Counter Value register */
96 0 : #define CAN_MCAN_TSCV 0x024
97 0 : #define CAN_MCAN_TSCV_TSC GENMASK(15, 0)
98 :
99 : /* Timeout Counter Configuration register */
100 0 : #define CAN_MCAN_TOCC 0x028
101 0 : #define CAN_MCAN_TOCC_TOP GENMASK(31, 16)
102 0 : #define CAN_MCAN_TOCC_TOS GENMASK(2, 1)
103 0 : #define CAN_MCAN_TOCC_ETOC BIT(1)
104 :
105 : /* Timeout Counter Value register */
106 0 : #define CAN_MCAN_TOCV 0x02C
107 0 : #define CAN_MCAN_TOCV_TOC GENMASK(15, 0)
108 :
109 : /* Error Counter register */
110 0 : #define CAN_MCAN_ECR 0x040
111 0 : #define CAN_MCAN_ECR_CEL GENMASK(23, 16)
112 0 : #define CAN_MCAN_ECR_RP BIT(15)
113 0 : #define CAN_MCAN_ECR_REC GENMASK(14, 8)
114 0 : #define CAN_MCAN_ECR_TEC GENMASK(7, 0)
115 :
116 : /* Protocol Status register */
117 0 : #define CAN_MCAN_PSR 0x044
118 0 : #define CAN_MCAN_PSR_TDCV GENMASK(22, 16)
119 0 : #define CAN_MCAN_PSR_PXE BIT(14)
120 0 : #define CAN_MCAN_PSR_RFDF BIT(13)
121 0 : #define CAN_MCAN_PSR_RBRS BIT(12)
122 0 : #define CAN_MCAN_PSR_RESI BIT(11)
123 0 : #define CAN_MCAN_PSR_DLEC GENMASK(10, 8)
124 0 : #define CAN_MCAN_PSR_BO BIT(7)
125 0 : #define CAN_MCAN_PSR_EW BIT(6)
126 0 : #define CAN_MCAN_PSR_EP BIT(5)
127 0 : #define CAN_MCAN_PSR_ACT GENMASK(4, 3)
128 0 : #define CAN_MCAN_PSR_LEC GENMASK(2, 0)
129 :
130 0 : enum can_mcan_psr_lec {
131 : CAN_MCAN_PSR_LEC_NO_ERROR = 0,
132 : CAN_MCAN_PSR_LEC_STUFF_ERROR = 1,
133 : CAN_MCAN_PSR_LEC_FORM_ERROR = 2,
134 : CAN_MCAN_PSR_LEC_ACK_ERROR = 3,
135 : CAN_MCAN_PSR_LEC_BIT1_ERROR = 4,
136 : CAN_MCAN_PSR_LEC_BIT0_ERROR = 5,
137 : CAN_MCAN_PSR_LEC_CRC_ERROR = 6,
138 : CAN_MCAN_PSR_LEC_NO_CHANGE = 7
139 : };
140 :
141 : /* Transmitter Delay Compensation register */
142 0 : #define CAN_MCAN_TDCR 0x048
143 0 : #define CAN_MCAN_TDCR_TDCO GENMASK(14, 8)
144 0 : #define CAN_MCAN_TDCR_TDCF GENMASK(6, 0)
145 :
146 : /* Interrupt register */
147 0 : #define CAN_MCAN_IR 0x050
148 0 : #define CAN_MCAN_IR_ARA BIT(29)
149 0 : #define CAN_MCAN_IR_PED BIT(28)
150 0 : #define CAN_MCAN_IR_PEA BIT(27)
151 0 : #define CAN_MCAN_IR_WDI BIT(26)
152 0 : #define CAN_MCAN_IR_BO BIT(25)
153 0 : #define CAN_MCAN_IR_EW BIT(24)
154 0 : #define CAN_MCAN_IR_EP BIT(23)
155 0 : #define CAN_MCAN_IR_ELO BIT(22)
156 0 : #define CAN_MCAN_IR_BEU BIT(21)
157 0 : #define CAN_MCAN_IR_BEC BIT(20)
158 0 : #define CAN_MCAN_IR_DRX BIT(19)
159 0 : #define CAN_MCAN_IR_TOO BIT(18)
160 0 : #define CAN_MCAN_IR_MRAF BIT(17)
161 0 : #define CAN_MCAN_IR_TSW BIT(16)
162 0 : #define CAN_MCAN_IR_TEFL BIT(15)
163 0 : #define CAN_MCAN_IR_TEFF BIT(14)
164 0 : #define CAN_MCAN_IR_TEFW BIT(13)
165 0 : #define CAN_MCAN_IR_TEFN BIT(12)
166 0 : #define CAN_MCAN_IR_TFE BIT(11)
167 0 : #define CAN_MCAN_IR_TCF BIT(10)
168 0 : #define CAN_MCAN_IR_TC BIT(9)
169 0 : #define CAN_MCAN_IR_HPM BIT(8)
170 0 : #define CAN_MCAN_IR_RF1L BIT(7)
171 0 : #define CAN_MCAN_IR_RF1F BIT(6)
172 0 : #define CAN_MCAN_IR_RF1W BIT(5)
173 0 : #define CAN_MCAN_IR_RF1N BIT(4)
174 0 : #define CAN_MCAN_IR_RF0L BIT(3)
175 0 : #define CAN_MCAN_IR_RF0F BIT(2)
176 0 : #define CAN_MCAN_IR_RF0W BIT(1)
177 0 : #define CAN_MCAN_IR_RF0N BIT(0)
178 :
179 : /* Interrupt Enable register */
180 0 : #define CAN_MCAN_IE 0x054
181 0 : #define CAN_MCAN_IE_ARAE BIT(29)
182 0 : #define CAN_MCAN_IE_PEDE BIT(28)
183 0 : #define CAN_MCAN_IE_PEAE BIT(27)
184 0 : #define CAN_MCAN_IE_WDIE BIT(26)
185 0 : #define CAN_MCAN_IE_BOE BIT(25)
186 0 : #define CAN_MCAN_IE_EWE BIT(24)
187 0 : #define CAN_MCAN_IE_EPE BIT(23)
188 0 : #define CAN_MCAN_IE_ELOE BIT(22)
189 0 : #define CAN_MCAN_IE_BEUE BIT(21)
190 0 : #define CAN_MCAN_IE_BECE BIT(20)
191 0 : #define CAN_MCAN_IE_DRXE BIT(19)
192 0 : #define CAN_MCAN_IE_TOOE BIT(18)
193 0 : #define CAN_MCAN_IE_MRAFE BIT(17)
194 0 : #define CAN_MCAN_IE_TSWE BIT(16)
195 0 : #define CAN_MCAN_IE_TEFLE BIT(15)
196 0 : #define CAN_MCAN_IE_TEFFE BIT(14)
197 0 : #define CAN_MCAN_IE_TEFWE BIT(13)
198 0 : #define CAN_MCAN_IE_TEFNE BIT(12)
199 0 : #define CAN_MCAN_IE_TFEE BIT(11)
200 0 : #define CAN_MCAN_IE_TCFE BIT(10)
201 0 : #define CAN_MCAN_IE_TCE BIT(9)
202 0 : #define CAN_MCAN_IE_HPME BIT(8)
203 0 : #define CAN_MCAN_IE_RF1LE BIT(7)
204 0 : #define CAN_MCAN_IE_RF1FE BIT(6)
205 0 : #define CAN_MCAN_IE_RF1WE BIT(5)
206 0 : #define CAN_MCAN_IE_RF1NE BIT(4)
207 0 : #define CAN_MCAN_IE_RF0LE BIT(3)
208 0 : #define CAN_MCAN_IE_RF0FE BIT(2)
209 0 : #define CAN_MCAN_IE_RF0WE BIT(1)
210 0 : #define CAN_MCAN_IE_RF0NE BIT(0)
211 :
212 : /* Interrupt Line Select register */
213 0 : #define CAN_MCAN_ILS 0x058
214 0 : #define CAN_MCAN_ILS_ARAL BIT(29)
215 0 : #define CAN_MCAN_ILS_PEDL BIT(28)
216 0 : #define CAN_MCAN_ILS_PEAL BIT(27)
217 0 : #define CAN_MCAN_ILS_WDIL BIT(26)
218 0 : #define CAN_MCAN_ILS_BOL BIT(25)
219 0 : #define CAN_MCAN_ILS_EWL BIT(24)
220 0 : #define CAN_MCAN_ILS_EPL BIT(23)
221 0 : #define CAN_MCAN_ILS_ELOL BIT(22)
222 0 : #define CAN_MCAN_ILS_BEUL BIT(21)
223 0 : #define CAN_MCAN_ILS_BECL BIT(20)
224 0 : #define CAN_MCAN_ILS_DRXL BIT(19)
225 0 : #define CAN_MCAN_ILS_TOOL BIT(18)
226 0 : #define CAN_MCAN_ILS_MRAFL BIT(17)
227 0 : #define CAN_MCAN_ILS_TSWL BIT(16)
228 0 : #define CAN_MCAN_ILS_TEFLL BIT(15)
229 0 : #define CAN_MCAN_ILS_TEFFL BIT(14)
230 0 : #define CAN_MCAN_ILS_TEFWL BIT(13)
231 0 : #define CAN_MCAN_ILS_TEFNL BIT(12)
232 0 : #define CAN_MCAN_ILS_TFEL BIT(11)
233 0 : #define CAN_MCAN_ILS_TCFL BIT(10)
234 0 : #define CAN_MCAN_ILS_TCL BIT(9)
235 0 : #define CAN_MCAN_ILS_HPML BIT(8)
236 0 : #define CAN_MCAN_ILS_RF1LL BIT(7)
237 0 : #define CAN_MCAN_ILS_RF1FL BIT(6)
238 0 : #define CAN_MCAN_ILS_RF1WL BIT(5)
239 0 : #define CAN_MCAN_ILS_RF1NL BIT(4)
240 0 : #define CAN_MCAN_ILS_RF0LL BIT(3)
241 0 : #define CAN_MCAN_ILS_RF0FL BIT(2)
242 0 : #define CAN_MCAN_ILS_RF0WL BIT(1)
243 0 : #define CAN_MCAN_ILS_RF0NL BIT(0)
244 :
245 : /* Interrupt Line Enable register */
246 0 : #define CAN_MCAN_ILE 0x05C
247 0 : #define CAN_MCAN_ILE_EINT1 BIT(1)
248 0 : #define CAN_MCAN_ILE_EINT0 BIT(0)
249 :
250 : /* Global filter configuration register */
251 0 : #define CAN_MCAN_GFC 0x080
252 0 : #define CAN_MCAN_GFC_ANFS GENMASK(5, 4)
253 0 : #define CAN_MCAN_GFC_ANFE GENMASK(3, 2)
254 0 : #define CAN_MCAN_GFC_RRFS BIT(1)
255 0 : #define CAN_MCAN_GFC_RRFE BIT(0)
256 :
257 : /* Standard ID Filter Configuration register */
258 0 : #define CAN_MCAN_SIDFC 0x084
259 0 : #define CAN_MCAN_SIDFC_LSS GENMASK(23, 16)
260 0 : #define CAN_MCAN_SIDFC_FLSSA GENMASK(15, 2)
261 :
262 : /* Extended ID Filter Configuration register */
263 0 : #define CAN_MCAN_XIDFC 0x088
264 0 : #define CAN_MCAN_XIDFC_LSS GENMASK(22, 16)
265 0 : #define CAN_MCAN_XIDFC_FLESA GENMASK(15, 2)
266 :
267 : /* Extended ID AND Mask register */
268 0 : #define CAN_MCAN_XIDAM 0x090
269 0 : #define CAN_MCAN_XIDAM_EIDM GENMASK(28, 0)
270 :
271 : /* High Priority Message Status register */
272 0 : #define CAN_MCAN_HPMS 0x094
273 0 : #define CAN_MCAN_HPMS_FLST BIT(15)
274 0 : #define CAN_MCAN_HPMS_FIDX GENMASK(14, 8)
275 0 : #define CAN_MCAN_HPMS_MSI GENMASK(7, 6)
276 0 : #define CAN_MCAN_HPMS_BIDX GENMASK(5, 0)
277 :
278 : /* New Data 1 register */
279 0 : #define CAN_MCAN_NDAT1 0x098
280 0 : #define CAN_MCAN_NDAT1_ND GENMASK(31, 0)
281 :
282 : /* New Data 2 register */
283 0 : #define CAN_MCAN_NDAT2 0x09C
284 0 : #define CAN_MCAN_NDAT2_ND GENMASK(31, 0)
285 :
286 : /* Rx FIFO 0 Configuration register */
287 0 : #define CAN_MCAN_RXF0C 0x0A0
288 0 : #define CAN_MCAN_RXF0C_F0OM BIT(31)
289 0 : #define CAN_MCAN_RXF0C_F0WM GENMASK(30, 24)
290 0 : #define CAN_MCAN_RXF0C_F0S GENMASK(22, 16)
291 0 : #define CAN_MCAN_RXF0C_F0SA GENMASK(15, 2)
292 :
293 : /* Rx FIFO 0 Status register */
294 0 : #define CAN_MCAN_RXF0S 0x0A4
295 0 : #define CAN_MCAN_RXF0S_RF0L BIT(25)
296 0 : #define CAN_MCAN_RXF0S_F0F BIT(24)
297 0 : #define CAN_MCAN_RXF0S_F0PI GENMASK(21, 16)
298 0 : #define CAN_MCAN_RXF0S_F0GI GENMASK(13, 8)
299 0 : #define CAN_MCAN_RXF0S_F0FL GENMASK(6, 0)
300 :
301 : /* Rx FIFO 0 Acknowledge register */
302 0 : #define CAN_MCAN_RXF0A 0x0A8
303 0 : #define CAN_MCAN_RXF0A_F0AI GENMASK(5, 0)
304 :
305 : /* Rx Buffer Configuration register */
306 0 : #define CAN_MCAN_RXBC 0x0AC
307 0 : #define CAN_MCAN_RXBC_RBSA GENMASK(15, 2)
308 :
309 : /* Rx FIFO 1 Configuration register */
310 0 : #define CAN_MCAN_RXF1C 0x0B0
311 0 : #define CAN_MCAN_RXF1C_F1OM BIT(31)
312 0 : #define CAN_MCAN_RXF1C_F1WM GENMASK(30, 24)
313 0 : #define CAN_MCAN_RXF1C_F1S GENMASK(22, 16)
314 0 : #define CAN_MCAN_RXF1C_F1SA GENMASK(15, 2)
315 :
316 : /* Rx FIFO 1 Status register */
317 0 : #define CAN_MCAN_RXF1S 0x0B4
318 0 : #define CAN_MCAN_RXF1S_RF1L BIT(25)
319 0 : #define CAN_MCAN_RXF1S_F1F BIT(24)
320 0 : #define CAN_MCAN_RXF1S_F1PI GENMASK(21, 16)
321 0 : #define CAN_MCAN_RXF1S_F1GI GENMASK(13, 8)
322 0 : #define CAN_MCAN_RXF1S_F1FL GENMASK(6, 0)
323 :
324 : /* Rx FIFO 1 Acknowledge register */
325 0 : #define CAN_MCAN_RXF1A 0x0B8
326 0 : #define CAN_MCAN_RXF1A_F1AI GENMASK(5, 0)
327 :
328 : /* Rx Buffer/FIFO Element Size Configuration register */
329 0 : #define CAN_MCAN_RXESC 0x0BC
330 0 : #define CAN_MCAN_RXESC_RBDS GENMASK(10, 8)
331 0 : #define CAN_MCAN_RXESC_F1DS GENMASK(6, 4)
332 0 : #define CAN_MCAN_RXESC_F0DS GENMASK(2, 0)
333 :
334 : /* Tx Buffer Configuration register */
335 0 : #define CAN_MCAN_TXBC 0x0C0
336 0 : #define CAN_MCAN_TXBC_TFQM BIT(30)
337 0 : #define CAN_MCAN_TXBC_TFQS GENMASK(29, 24)
338 0 : #define CAN_MCAN_TXBC_NDTB GENMASK(21, 16)
339 0 : #define CAN_MCAN_TXBC_TBSA GENMASK(15, 2)
340 :
341 : /* Tx FIFO/Queue Status register */
342 0 : #define CAN_MCAN_TXFQS 0x0C4
343 0 : #define CAN_MCAN_TXFQS_TFQF BIT(21)
344 0 : #define CAN_MCAN_TXFQS_TFQPI GENMASK(20, 16)
345 0 : #define CAN_MCAN_TXFQS_TFGI GENMASK(12, 8)
346 0 : #define CAN_MCAN_TXFQS_TFFL GENMASK(5, 0)
347 :
348 : /* Tx Buffer Element Size Configuration register */
349 0 : #define CAN_MCAN_TXESC 0x0C8
350 0 : #define CAN_MCAN_TXESC_TBDS GENMASK(2, 0)
351 :
352 : /* Tx Buffer Request Pending register */
353 0 : #define CAN_MCAN_TXBRP 0x0CC
354 0 : #define CAN_MCAN_TXBRP_TRP GENMASK(31, 0)
355 :
356 : /* Tx Buffer Add Request register */
357 0 : #define CAN_MCAN_TXBAR 0x0D0
358 0 : #define CAN_MCAN_TXBAR_AR GENMASK(31, 0)
359 :
360 : /* Tx Buffer Cancellation Request register */
361 0 : #define CAN_MCAN_TXBCR 0x0D4
362 0 : #define CAN_MCAN_TXBCR_CR GENMASK(31, 0)
363 :
364 : /* Tx Buffer Transmission Occurred register */
365 0 : #define CAN_MCAN_TXBTO 0x0D8
366 0 : #define CAN_MCAN_TXBTO_TO GENMASK(31, 0)
367 :
368 : /* Tx Buffer Cancellation Finished register */
369 0 : #define CAN_MCAN_TXBCF 0x0DC
370 0 : #define CAN_MCAN_TXBCF_CF GENMASK(31, 0)
371 :
372 : /* Tx Buffer Transmission Interrupt Enable register */
373 0 : #define CAN_MCAN_TXBTIE 0x0E0
374 0 : #define CAN_MCAN_TXBTIE_TIE GENMASK(31, 0)
375 :
376 : /* Tx Buffer Cancellation Finished Interrupt Enable register */
377 0 : #define CAN_MCAN_TXBCIE 0x0E4
378 0 : #define CAN_MCAN_TXBCIE_CFIE GENMASK(31, 0)
379 :
380 : /* Tx Event FIFO Configuration register */
381 0 : #define CAN_MCAN_TXEFC 0x0F0
382 0 : #define CAN_MCAN_TXEFC_EFWM GENMASK(29, 24)
383 0 : #define CAN_MCAN_TXEFC_EFS GENMASK(21, 16)
384 0 : #define CAN_MCAN_TXEFC_EFSA GENMASK(15, 2)
385 :
386 : /* Tx Event FIFO Status register */
387 0 : #define CAN_MCAN_TXEFS 0x0F4
388 0 : #define CAN_MCAN_TXEFS_TEFL BIT(25)
389 0 : #define CAN_MCAN_TXEFS_EFF BIT(24)
390 0 : #define CAN_MCAN_TXEFS_EFPI GENMASK(20, 16)
391 0 : #define CAN_MCAN_TXEFS_EFGI GENMASK(12, 8)
392 0 : #define CAN_MCAN_TXEFS_EFFL GENMASK(5, 0)
393 :
394 : /* Tx Event FIFO Acknowledge register */
395 0 : #define CAN_MCAN_TXEFA 0x0F8
396 0 : #define CAN_MCAN_TXEFA_EFAI GENMASK(4, 0)
397 :
398 : /**
399 : * @name Indexes for the cells in the devicetree bosch,mram-cfg property
400 : * @anchor CAN_MCAN_MRAM_CFG
401 :
402 : * These match the description of the cells in the bosch,m_can-base devicetree binding.
403 : *
404 : * @{
405 : */
406 : /** offset cell index */
407 1 : #define CAN_MCAN_MRAM_CFG_OFFSET 0
408 : /** std-filter-elements cell index */
409 1 : #define CAN_MCAN_MRAM_CFG_STD_FILTER 1
410 : /** ext-filter-elements cell index */
411 1 : #define CAN_MCAN_MRAM_CFG_EXT_FILTER 2
412 : /** rx-fifo0-elements cell index */
413 1 : #define CAN_MCAN_MRAM_CFG_RX_FIFO0 3
414 : /** rx-fifo1-elements cell index */
415 1 : #define CAN_MCAN_MRAM_CFG_RX_FIFO1 4
416 : /** rx-buffer-elements cell index */
417 1 : #define CAN_MCAN_MRAM_CFG_RX_BUFFER 5
418 : /** tx-event-fifo-elements cell index */
419 1 : #define CAN_MCAN_MRAM_CFG_TX_EVENT_FIFO 6
420 : /** tx-buffer-elements cell index */
421 1 : #define CAN_MCAN_MRAM_CFG_TX_BUFFER 7
422 : /** Total number of cells in bosch,mram-cfg property */
423 1 : #define CAN_MCAN_MRAM_CFG_NUM_CELLS 8
424 :
425 : /** @} */
426 :
427 : /**
428 : * @brief Get the Bosch M_CAN Message RAM offset
429 : *
430 : * @param node_id node identifier
431 : * @return the Message RAM offset in bytes
432 : */
433 1 : #define CAN_MCAN_DT_MRAM_OFFSET(node_id) \
434 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_OFFSET)
435 :
436 : /**
437 : * @brief Get the number of standard (11-bit) filter elements in Bosch M_CAN Message RAM
438 : *
439 : * @param node_id node identifier
440 : * @return the number of standard (11-bit) filter elements
441 : */
442 1 : #define CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id) \
443 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_STD_FILTER)
444 :
445 : /**
446 : * @brief Get the number of extended (29-bit) filter elements in Bosch M_CAN Message RAM
447 : *
448 : * @param node_id node identifier
449 : * @return the number of extended (29-bit) filter elements
450 : */
451 1 : #define CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id) \
452 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_EXT_FILTER)
453 :
454 : /**
455 : * @brief Get the number of Rx FIFO 0 elements in Bosch M_CAN Message RAM
456 : *
457 : * @param node_id node identifier
458 : * @return the number of Rx FIFO 0 elements
459 : */
460 1 : #define CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id) \
461 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_RX_FIFO0)
462 :
463 : /**
464 : * @brief Get the number of Rx FIFO 1 elements in Bosch M_CAN Message RAM
465 : *
466 : * @param node_id node identifier
467 : * @return the number of Rx FIFO 1 elements
468 : */
469 1 : #define CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id) \
470 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_RX_FIFO1)
471 :
472 : /**
473 : * @brief Get the number of Rx Buffer elements in Bosch M_CAN Message RAM
474 : *
475 : * @param node_id node identifier
476 : * @return the number of Rx Buffer elements
477 : */
478 1 : #define CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id) \
479 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_RX_BUFFER)
480 :
481 : /**
482 : * @brief Get the number of Tx Event FIFO elements in Bosch M_CAN Message RAM
483 : *
484 : * @param node_id node identifier
485 : * @return the number of Tx Event FIFO elements
486 : */
487 1 : #define CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id) \
488 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_TX_EVENT_FIFO)
489 :
490 : /**
491 : * @brief Get the number of Tx Buffer elements in Bosch M_CAN Message RAM
492 : *
493 : * @param node_id node identifier
494 : * @return the number of Tx Buffer elements
495 : */
496 1 : #define CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id) \
497 : DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_TX_BUFFER)
498 :
499 : /**
500 : * @brief Get the base offset of standard (11-bit) filter elements in Bosch M_CAN Message RAM
501 : *
502 : * @param node_id node identifier
503 : * @return the base offset of standard (11-bit) filter elements in bytes
504 : */
505 1 : #define CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(node_id) (0U)
506 :
507 : /**
508 : * @brief Get the base offset of extended (29-bit) filter elements in Bosch M_CAN Message RAM
509 : *
510 : * @param node_id node identifier
511 : * @return the base offset of extended (29-bit) filter elements in bytes
512 : */
513 1 : #define CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(node_id) \
514 : (CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(node_id) + \
515 : CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id) * sizeof(struct can_mcan_std_filter))
516 :
517 : /**
518 : * @brief Get the base offset of Rx FIFO 0 elements in Bosch M_CAN Message RAM
519 : *
520 : * @param node_id node identifier
521 : * @return the base offset of Rx FIFO 0 elements in bytes
522 : */
523 1 : #define CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(node_id) \
524 : (CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(node_id) + \
525 : CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id) * sizeof(struct can_mcan_ext_filter))
526 :
527 : /**
528 : * @brief Get the base offset of Rx FIFO 1 elements in Bosch M_CAN Message RAM
529 : *
530 : * @param node_id node identifier
531 : * @return the base offset of Rx FIFO 1 elements in bytes
532 : */
533 1 : #define CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(node_id) \
534 : (CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(node_id) + \
535 : CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id) * sizeof(struct can_mcan_rx_fifo))
536 :
537 : /**
538 : * @brief Get the base offset of Rx Buffer elements in Bosch M_CAN Message RAM
539 : *
540 : * @param node_id node identifier
541 : * @return the base offset of Rx Buffer elements in bytes
542 : */
543 1 : #define CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(node_id) \
544 : (CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(node_id) + \
545 : CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id) * sizeof(struct can_mcan_rx_fifo))
546 :
547 : /**
548 : * @brief Get the base offset of Tx Event FIFO elements in Bosch M_CAN Message RAM
549 : *
550 : * @param node_id node identifier
551 : * @return the base offset of Tx Event FIFO elements in bytes
552 : */
553 1 : #define CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(node_id) \
554 : (CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(node_id) + \
555 : CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id) * sizeof(struct can_mcan_rx_fifo))
556 :
557 : /**
558 : * @brief Get the base offset of Tx Buffer elements in Bosch M_CAN Message RAM
559 : *
560 : * @param node_id node identifier
561 : * @return the base offset of Tx Buffer elements in bytes
562 : */
563 1 : #define CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(node_id) \
564 : (CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(node_id) + \
565 : CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id) * sizeof(struct can_mcan_tx_event_fifo))
566 :
567 : /**
568 : * @brief Get the Bosch M_CAN register base address
569 : *
570 : * For devicetree nodes with just one register block, this macro returns the base address of that
571 : * register block.
572 : *
573 : * If a devicetree node has more than one register block, this macros returns the base address of
574 : * the register block named "m_can".
575 : *
576 : * @param node_id node identifier
577 : * @return the Bosch M_CAN register base address
578 : */
579 1 : #define CAN_MCAN_DT_MCAN_ADDR(node_id) \
580 : COND_CODE_1(DT_NUM_REGS(node_id), ((mm_reg_t)DT_REG_ADDR(node_id)), \
581 : ((mm_reg_t)DT_REG_ADDR_BY_NAME(node_id, m_can)))
582 :
583 : /**
584 : * @brief Get the Bosch M_CAN Message RAM base address
585 : *
586 : * For devicetree nodes with dedicated Message RAM area defined via devicetree, this macro returns
587 : * the base address of the Message RAM.
588 : *
589 : * @param node_id node identifier
590 : * @return the Bosch M_CAN Message RAM base address (MRBA)
591 : */
592 1 : #define CAN_MCAN_DT_MRBA(node_id) \
593 : (mem_addr_t)DT_REG_ADDR_BY_NAME(node_id, message_ram)
594 :
595 : /**
596 : * @brief Get the Bosch M_CAN Message RAM address
597 : *
598 : * For devicetree nodes with dedicated Message RAM area defined via devicetree, this macro returns
599 : * the address of the Message RAM, taking in the Message RAM offset into account.
600 : *
601 : * @param node_id node identifier
602 : * @return the Bosch M_CAN Message RAM address
603 : */
604 1 : #define CAN_MCAN_DT_MRAM_ADDR(node_id) \
605 : (mem_addr_t)(CAN_MCAN_DT_MRBA(node_id) + CAN_MCAN_DT_MRAM_OFFSET(node_id))
606 :
607 : /**
608 : * @brief Get the Bosch M_CAN Message RAM size
609 : *
610 : * For devicetree nodes with dedicated Message RAM area defined via devicetree, this macro returns
611 : * the size of the Message RAM, taking in the Message RAM offset into account.
612 : *
613 : * @param node_id node identifier
614 : * @return the Bosch M_CAN Message RAM base address
615 : * @see CAN_MCAN_DT_MRAM_ELEMENTS_SIZE()
616 : */
617 1 : #define CAN_MCAN_DT_MRAM_SIZE(node_id) \
618 : (mem_addr_t)(DT_REG_SIZE_BY_NAME(node_id, message_ram) - CAN_MCAN_DT_MRAM_OFFSET(node_id))
619 :
620 : /**
621 : * @brief Get the total size of all Bosch M_CAN Message RAM elements
622 : *
623 : * @param node_id node identifier
624 : * @return the total size of all Message RAM elements in bytes
625 : * @see CAN_MCAN_DT_MRAM_SIZE()
626 : */
627 1 : #define CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id) \
628 : (CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(node_id) + \
629 : CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id) * sizeof(struct can_mcan_tx_buffer))
630 :
631 : /**
632 : * @brief Define a RAM buffer for Bosch M_CAN Message RAM
633 : *
634 : * For devicetree nodes without dedicated Message RAM area, this macro defines a suitable RAM buffer
635 : * to hold the Message RAM elements. Since this buffer cannot be shared between multiple Bosch M_CAN
636 : * instances, the Message RAM offset must be set to 0x0.
637 : *
638 : * @param node_id node identifier
639 : * @param _name buffer variable name
640 : */
641 1 : #define CAN_MCAN_DT_MRAM_DEFINE(node_id, _name) \
642 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_OFFSET(node_id) == 0, "offset must be 0"); \
643 : static char __nocache_noinit __aligned(4) _name[CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id)];
644 :
645 : /**
646 : * @brief Assert that the Message RAM configuration meets the Bosch M_CAN IP core restrictions
647 : *
648 : * @param node_id node identifier
649 : */
650 1 : #define CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG(node_id) \
651 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id) <= 128, \
652 : "Maximum Standard filter elements exceeded"); \
653 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id) <= 64, \
654 : "Maximum Extended filter elements exceeded"); \
655 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id) <= 64, \
656 : "Maximum Rx FIFO 0 elements exceeded"); \
657 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id) <= 64, \
658 : "Maximum Rx FIFO 1 elements exceeded"); \
659 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id) <= 64, \
660 : "Maximum Rx Buffer elements exceeded"); \
661 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id) <= 32, \
662 : "Maximum Tx Buffer elements exceeded"); \
663 : BUILD_ASSERT(CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id) <= 32, \
664 : "Maximum Tx Buffer elements exceeded");
665 :
666 : /**
667 : * @brief Equivalent to CAN_MCAN_DT_MRAM_OFFSET(DT_DRV_INST(inst))
668 : * @param inst DT_DRV_COMPAT instance number
669 : * @return the Message RAM offset in bytes
670 : * @see CAN_MCAN_DT_MRAM_OFFSET()
671 : */
672 1 : #define CAN_MCAN_DT_INST_MRAM_OFFSET(inst) CAN_MCAN_DT_MRAM_OFFSET(DT_DRV_INST(inst))
673 :
674 : /**
675 : * @brief Equivalent to CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(DT_DRV_INST(inst))
676 : * @param inst DT_DRV_COMPAT instance number
677 : * @return the number of standard (11-bit) elements
678 : * @see CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS()
679 : */
680 1 : #define CAN_MCAN_DT_INST_MRAM_STD_FILTER_ELEMENTS(inst) \
681 : CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(DT_DRV_INST(inst))
682 :
683 : /**
684 : * @brief Equivalent to CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(DT_DRV_INST(inst))
685 : * @param inst DT_DRV_COMPAT instance number
686 : * @return the number of extended (29-bit) elements
687 : * @see CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS()
688 : */
689 1 : #define CAN_MCAN_DT_INST_MRAM_EXT_FILTER_ELEMENTS(inst) \
690 : CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(DT_DRV_INST(inst))
691 :
692 : /**
693 : * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(DT_DRV_INST(inst))
694 : * @param inst DT_DRV_COMPAT instance number
695 : * @return the number of Rx FIFO 0 elements
696 : * @see CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS()
697 : */
698 1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO0_ELEMENTS(inst) \
699 : CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(DT_DRV_INST(inst))
700 :
701 : /**
702 : * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(DT_DRV_INST(inst))
703 : * @param inst DT_DRV_COMPAT instance number
704 : * @return the number of Rx FIFO 1 elements
705 : * @see CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS()
706 : */
707 1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO1_ELEMENTS(inst) \
708 : CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(DT_DRV_INST(inst))
709 :
710 : /**
711 : * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
712 : * @param inst DT_DRV_COMPAT instance number
713 : * @return the number of Rx Buffer elements
714 : * @see CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS()
715 : */
716 1 : #define CAN_MCAN_DT_INST_MRAM_RX_BUFFER_ELEMENTS(inst) \
717 : CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
718 :
719 : /**
720 : * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(DT_DRV_INST(inst))
721 : * @param inst DT_DRV_COMPAT instance number
722 : * @return the number of Tx Event FIFO elements
723 : * @see CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS()
724 : */
725 1 : #define CAN_MCAN_DT_INST_MRAM_TX_EVENT_FIFO_ELEMENTS(inst) \
726 : CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(DT_DRV_INST(inst))
727 :
728 : /**
729 : * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
730 : * @param inst DT_DRV_COMPAT instance number
731 : * @return the number of Tx Buffer elements
732 : * @see CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS()
733 : */
734 1 : #define CAN_MCAN_DT_INST_MRAM_TX_BUFFER_ELEMENTS(inst) \
735 : CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
736 :
737 : /**
738 : * @brief Equivalent to CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(DT_DRV_INST(inst))
739 : * @param inst DT_DRV_COMPAT instance number
740 : * @return the base offset of standard (11-bit) filter elements in bytes
741 : * @see CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET()
742 : */
743 1 : #define CAN_MCAN_DT_INST_MRAM_STD_FILTER_OFFSET(inst) \
744 : CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(DT_DRV_INST(inst))
745 :
746 : /**
747 : * @brief Equivalent to CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(DT_DRV_INST(inst))
748 : * @param inst DT_DRV_COMPAT instance number
749 : * @return the base offset of extended (29-bit) filter elements in bytes
750 : * @see CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET()
751 : */
752 1 : #define CAN_MCAN_DT_INST_MRAM_EXT_FILTER_OFFSET(inst) \
753 : CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(DT_DRV_INST(inst))
754 :
755 : /**
756 : * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(DT_DRV_INST(inst))
757 : * @param inst DT_DRV_COMPAT instance number
758 : * @return the base offset of Rx FIFO 0 elements in bytes
759 : * @see CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET()
760 : */
761 1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO0_OFFSET(inst) \
762 : CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(DT_DRV_INST(inst))
763 :
764 : /**
765 : * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(DT_DRV_INST(inst))
766 : * @param inst DT_DRV_COMPAT instance number
767 : * @return the base offset of Rx FIFO 1 elements in bytes
768 : * @see CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET()
769 : */
770 1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO1_OFFSET(inst) \
771 : CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(DT_DRV_INST(inst))
772 :
773 : /**
774 : * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(DT_DRV_INST(inst))
775 : * @param inst DT_DRV_COMPAT instance number
776 : * @return the base offset of Rx Buffer elements in bytes
777 : * @see CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET()
778 : */
779 1 : #define CAN_MCAN_DT_INST_MRAM_RX_BUFFER_OFFSET(inst) \
780 : CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(DT_DRV_INST(inst))
781 :
782 : /**
783 : * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(DT_DRV_INST(inst))
784 : * @param inst DT_DRV_COMPAT instance number
785 : * @return the base offset of Tx Event FIFO elements in bytes
786 : * @see CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET()
787 : */
788 1 : #define CAN_MCAN_DT_INST_MRAM_TX_EVENT_FIFO_OFFSET(inst) \
789 : CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(DT_DRV_INST(inst))
790 :
791 : /**
792 : * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(DT_DRV_INST(inst))
793 : * @param inst DT_DRV_COMPAT instance number
794 : * @return the base offset of Tx Buffer elements in bytes
795 : * @see CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET()
796 : */
797 1 : #define CAN_MCAN_DT_INST_MRAM_TX_BUFFER_OFFSET(inst) \
798 : CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(DT_DRV_INST(inst))
799 :
800 : /**
801 : * @brief Equivalent to CAN_MCAN_DT_MCAN_ADDR(DT_DRV_INST(inst))
802 : * @param inst DT_DRV_COMPAT instance number
803 : * @return the Bosch M_CAN register base address
804 : * @see CAN_MCAN_DT_MRAM_ADDR()
805 : */
806 1 : #define CAN_MCAN_DT_INST_MCAN_ADDR(inst) CAN_MCAN_DT_MCAN_ADDR(DT_DRV_INST(inst))
807 :
808 : /**
809 : * @brief Equivalent to CAN_MCAN_DT_MRBA(DT_DRV_INST(inst))
810 : * @param inst DT_DRV_COMPAT instance number
811 : * @return the Bosch M_CAN Message RAM Base Address (MRBA)
812 : * @see CAN_MCAN_DT_MRBA()
813 : */
814 1 : #define CAN_MCAN_DT_INST_MRBA(inst) CAN_MCAN_DT_MRBA(DT_DRV_INST(inst))
815 :
816 : /**
817 : * @brief Equivalent to CAN_MCAN_DT_MRAM_ADDR(DT_DRV_INST(inst))
818 : * @param inst DT_DRV_COMPAT instance number
819 : * @return the Bosch M_CAN Message RAM address
820 : * @see CAN_MCAN_DT_MRAM_ADDR()
821 : */
822 1 : #define CAN_MCAN_DT_INST_MRAM_ADDR(inst) CAN_MCAN_DT_MRAM_ADDR(DT_DRV_INST(inst))
823 :
824 : /**
825 : * @brief Equivalent to CAN_MCAN_DT_MRAM_SIZE(DT_DRV_INST(inst))
826 : * @param inst DT_DRV_COMPAT instance number
827 : * @return the Bosch M_CAN Message RAM size in bytes
828 : * @see CAN_MCAN_DT_MRAM_SIZE()
829 : */
830 1 : #define CAN_MCAN_DT_INST_MRAM_SIZE(inst) CAN_MCAN_DT_MRAM_SIZE(DT_DRV_INST(inst))
831 :
832 : /**
833 : * @brief Equivalent to CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(DT_DRV_INST(inst))
834 : * @param inst DT_DRV_COMPAT instance number
835 : * @return the total size of all Message RAM elements in bytes
836 : * @see CAN_MCAN_DT_MRAM_ELEMENTS_SIZE()
837 : */
838 1 : #define CAN_MCAN_DT_INST_MRAM_ELEMENTS_SIZE(inst) CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(DT_DRV_INST(inst))
839 :
840 : /**
841 : * @brief Equivalent to CAN_MCAN_DT_MRAM_DEFINE(DT_DRV_INST(inst))
842 : * @param inst DT_DRV_COMPAT instance number
843 : * @param _name buffer variable name
844 : * @see CAN_MCAN_DT_MRAM_DEFINE()
845 : */
846 1 : #define CAN_MCAN_DT_INST_MRAM_DEFINE(inst, _name) CAN_MCAN_DT_MRAM_DEFINE(DT_DRV_INST(inst), _name)
847 :
848 : /**
849 : * @brief Bosch M_CAN specific static initializer for a minimum nominal @p can_timing struct
850 : */
851 1 : #define CAN_MCAN_TIMING_MIN_INITIALIZER \
852 : { \
853 : .sjw = 1, \
854 : .prop_seg = 0, \
855 : .phase_seg1 = 2, \
856 : .phase_seg2 = 2, \
857 : .prescaler = 1 \
858 : }
859 :
860 : /**
861 : * @brief Bosch M_CAN specific static initializer for a maximum nominal @p can_timing struct
862 : */
863 1 : #define CAN_MCAN_TIMING_MAX_INITIALIZER \
864 : { \
865 : .sjw = 128, \
866 : .prop_seg = 0, \
867 : .phase_seg1 = 256, \
868 : .phase_seg2 = 128, \
869 : .prescaler = 512 \
870 : }
871 :
872 : /**
873 : * @brief Bosch M_CAN specific static initializer for a minimum data phase @p can_timing struct
874 : */
875 1 : #define CAN_MCAN_TIMING_DATA_MIN_INITIALIZER \
876 : { \
877 : .sjw = 1, \
878 : .prop_seg = 0, \
879 : .phase_seg1 = 1, \
880 : .phase_seg2 = 1, \
881 : .prescaler = 1 \
882 : }
883 :
884 : /**
885 : * @brief Bosch M_CAN specific static initializer for a maximum data phase @p can_timing struct
886 : */
887 1 : #define CAN_MCAN_TIMING_DATA_MAX_INITIALIZER \
888 : { \
889 : .sjw = 16, \
890 : .prop_seg = 0, \
891 : .phase_seg1 = 32, \
892 : .phase_seg2 = 16, \
893 : .prescaler = 32 \
894 : }
895 :
896 : /**
897 : * @brief Equivalent to CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG(DT_DRV_INST(inst))
898 : * @param inst DT_DRV_COMPAT instance number
899 : * @see CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG()
900 : */
901 1 : #define CAN_MCAN_DT_INST_BUILD_ASSERT_MRAM_CFG(inst) \
902 : CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG(DT_DRV_INST(inst))
903 :
904 : /**
905 : * @brief Bosch M_CAN Rx Buffer and FIFO Element header
906 : *
907 : * See Bosch M_CAN Users Manual section 2.4.2 for details.
908 : */
909 1 : struct can_mcan_rx_fifo_hdr {
910 : union {
911 : struct {
912 0 : uint32_t ext_id: 29;
913 0 : uint32_t rtr: 1;
914 0 : uint32_t xtd: 1;
915 0 : uint32_t esi: 1;
916 : };
917 : struct {
918 0 : uint32_t pad1: 18;
919 0 : uint32_t std_id: 11;
920 0 : uint32_t pad2: 3;
921 : };
922 0 : };
923 0 : uint32_t rxts: 16;
924 0 : uint32_t dlc: 4;
925 0 : uint32_t brs: 1;
926 0 : uint32_t fdf: 1;
927 0 : uint32_t res: 2;
928 0 : uint32_t fidx: 7;
929 0 : uint32_t anmf: 1;
930 : } __packed __aligned(4);
931 :
932 : /**
933 : * @brief Bosch M_CAN Rx Buffer and FIFO Element
934 : *
935 : * See Bosch M_CAN Users Manual section 2.4.2 for details.
936 : */
937 1 : struct can_mcan_rx_fifo {
938 0 : struct can_mcan_rx_fifo_hdr hdr;
939 : union {
940 0 : uint8_t data[64];
941 0 : uint32_t data_32[16];
942 0 : };
943 : } __packed __aligned(4);
944 :
945 : /**
946 : * @brief Bosch M_CAN Tx Buffer Element header
947 : *
948 : * See Bosch M_CAN Users Manual section 2.4.3 for details.
949 : */
950 1 : struct can_mcan_tx_buffer_hdr {
951 : union {
952 : struct {
953 0 : uint32_t ext_id: 29;
954 0 : uint32_t rtr: 1;
955 0 : uint32_t xtd: 1;
956 0 : uint32_t esi: 1;
957 : };
958 : struct {
959 0 : uint32_t pad1: 18;
960 0 : uint32_t std_id: 11;
961 0 : uint32_t pad2: 3;
962 : };
963 0 : };
964 0 : uint16_t res1;
965 0 : uint8_t dlc: 4;
966 0 : uint8_t brs: 1;
967 0 : uint8_t fdf: 1;
968 0 : uint8_t tsce: 1;
969 0 : uint8_t efc: 1;
970 0 : uint8_t mm;
971 : } __packed __aligned(4);
972 :
973 : /**
974 : * @brief Bosch M_CAN Tx Buffer Element
975 : *
976 : * See Bosch M_CAN Users Manual section 2.4.3 for details.
977 : */
978 1 : struct can_mcan_tx_buffer {
979 0 : struct can_mcan_tx_buffer_hdr hdr;
980 : union {
981 0 : uint8_t data[64];
982 0 : uint32_t data_32[16];
983 0 : };
984 : } __packed __aligned(4);
985 :
986 : /**
987 : * @brief Bosch M_CAN Tx Event FIFO Element
988 : *
989 : * See Bosch M_CAN Users Manual section 2.4.4 for details.
990 : */
991 1 : struct can_mcan_tx_event_fifo {
992 : union {
993 : struct {
994 0 : uint32_t ext_id: 29;
995 0 : uint32_t rtr: 1;
996 0 : uint32_t xtd: 1;
997 0 : uint32_t esi: 1;
998 : };
999 : struct {
1000 0 : uint32_t pad1: 18;
1001 0 : uint32_t std_id: 11;
1002 0 : uint32_t pad2: 3;
1003 : };
1004 0 : };
1005 0 : uint16_t txts;
1006 0 : uint8_t dlc: 4;
1007 0 : uint8_t brs: 1;
1008 0 : uint8_t fdf: 1;
1009 0 : uint8_t et: 2;
1010 0 : uint8_t mm;
1011 : } __packed __aligned(4);
1012 :
1013 : /* Bosch M_CAN Standard/Extended Filter Element Configuration (SFEC/EFEC) */
1014 0 : #define CAN_MCAN_XFEC_DISABLE 0x0
1015 0 : #define CAN_MCAN_XFEC_FIFO0 0x1
1016 0 : #define CAN_MCAN_XFEC_FIFO1 0x2
1017 0 : #define CAN_MCAN_XFEC_REJECT 0x3
1018 0 : #define CAN_MCAN_XFEC_PRIO 0x4
1019 0 : #define CAN_MCAN_XFEC_PRIO_FIFO0 0x5
1020 0 : #define CAN_MCAN_XFEC_PRIO_FIFO1 0x7
1021 :
1022 : /* Bosch M_CAN Standard Filter Type (SFT) */
1023 0 : #define CAN_MCAN_SFT_RANGE 0x0
1024 0 : #define CAN_MCAN_SFT_DUAL 0x1
1025 0 : #define CAN_MCAN_SFT_CLASSIC 0x2
1026 0 : #define CAN_MCAN_SFT_DISABLED 0x3
1027 :
1028 : /**
1029 : * @brief Bosch M_CAN Standard Message ID Filter Element
1030 : *
1031 : * See Bosch M_CAN Users Manual section 2.4.5 for details.
1032 : */
1033 1 : struct can_mcan_std_filter {
1034 0 : uint32_t sfid2: 11;
1035 0 : uint32_t res: 5;
1036 0 : uint32_t sfid1: 11;
1037 0 : uint32_t sfec: 3;
1038 0 : uint32_t sft: 2;
1039 : } __packed __aligned(4);
1040 :
1041 : /* Bosch M_CAN Extended Filter Type (EFT) */
1042 0 : #define CAN_MCAN_EFT_RANGE_XIDAM 0x0
1043 0 : #define CAN_MCAN_EFT_DUAL 0x1
1044 0 : #define CAN_MCAN_EFT_CLASSIC 0x2
1045 0 : #define CAN_MCAN_EFT_RANGE 0x3
1046 :
1047 : /**
1048 : * @brief Bosch M_CAN Extended Message ID Filter Element
1049 : *
1050 : * See Bosch M_CAN Users Manual section 2.4.6 for details.
1051 : */
1052 1 : struct can_mcan_ext_filter {
1053 0 : uint32_t efid1: 29;
1054 0 : uint32_t efec: 3;
1055 0 : uint32_t efid2: 29;
1056 0 : uint32_t esync: 1;
1057 0 : uint32_t eft: 2;
1058 : } __packed __aligned(4);
1059 :
1060 : /**
1061 : * @brief Bosch M_CAN driver internal data structure.
1062 : */
1063 1 : struct can_mcan_data {
1064 0 : struct can_driver_data common;
1065 0 : struct k_mutex lock;
1066 0 : struct k_sem tx_sem;
1067 0 : struct k_mutex tx_mtx;
1068 0 : void *custom;
1069 : } __aligned(4);
1070 :
1071 : /**
1072 : * @brief Bosch M_CAN driver front-end callback for reading a register value
1073 : *
1074 : * @param dev Pointer to the device structure for the driver instance.
1075 : * @param reg Register offset
1076 : * @param[out] val Register value
1077 : *
1078 : * @retval 0 If successful.
1079 : * @retval -ENOTSUP Register not supported.
1080 : * @retval -EIO General input/output error.
1081 : */
1082 1 : typedef int (*can_mcan_read_reg_t)(const struct device *dev, uint16_t reg, uint32_t *val);
1083 :
1084 : /**
1085 : * @brief Bosch M_CAN driver front-end callback for writing a register value
1086 : *
1087 : * @param dev Pointer to the device structure for the driver instance.
1088 : * @param reg Register offset
1089 : * @param val Register value
1090 : *
1091 : * @retval 0 If successful.
1092 : * @retval -ENOTSUP Register not supported.
1093 : * @retval -EIO General input/output error.
1094 : */
1095 1 : typedef int (*can_mcan_write_reg_t)(const struct device *dev, uint16_t reg, uint32_t val);
1096 :
1097 : /**
1098 : * @brief Bosch M_CAN driver front-end callback for reading from Message RAM
1099 : *
1100 : * @param dev Pointer to the device structure for the driver instance.
1101 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1102 : * offset must be 32-bit aligned.
1103 : * @param[out] dst Destination for the data read. The destination address must be 32-bit aligned.
1104 : * @param len Number of bytes to read. Must be a multiple of 4.
1105 : *
1106 : * @retval 0 If successful.
1107 : * @retval -EIO General input/output error.
1108 : */
1109 1 : typedef int (*can_mcan_read_mram_t)(const struct device *dev, uint16_t offset, void *dst,
1110 : size_t len);
1111 :
1112 : /**
1113 : * @brief Bosch M_CAN driver front-end callback for writing to Message RAM
1114 : *
1115 : * @param dev Pointer to the device structure for the driver instance.
1116 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1117 : * offset must be 32-bit aligned.
1118 : * @param src Source for the data to be written. The source address must be 32-bit aligned.
1119 : * @param len Number of bytes to write. Must be a multiple of 4.
1120 : *
1121 : * @retval 0 If successful.
1122 : * @retval -EIO General input/output error.
1123 : */
1124 1 : typedef int (*can_mcan_write_mram_t)(const struct device *dev, uint16_t offset, const void *src,
1125 : size_t len);
1126 :
1127 : /**
1128 : * @brief Bosch M_CAN driver front-end callback for clearing Message RAM
1129 : *
1130 : * Clear Message RAM by writing 0 to all words.
1131 : *
1132 : * @param dev Pointer to the device structure for the driver instance.
1133 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1134 : * offset must be 32-bit aligned.
1135 : * @param len Number of bytes to clear. Must be a multiple of 4.
1136 : *
1137 : * @retval 0 If successful.
1138 : * @retval -EIO General input/output error.
1139 : */
1140 1 : typedef int (*can_mcan_clear_mram_t)(const struct device *dev, uint16_t offset, size_t len);
1141 :
1142 : /**
1143 : * @brief Bosch M_CAN driver front-end operations.
1144 : */
1145 1 : struct can_mcan_ops {
1146 0 : can_mcan_read_reg_t read_reg;
1147 0 : can_mcan_write_reg_t write_reg;
1148 0 : can_mcan_read_mram_t read_mram;
1149 0 : can_mcan_write_mram_t write_mram;
1150 0 : can_mcan_clear_mram_t clear_mram;
1151 : };
1152 :
1153 : /**
1154 : * @brief Bosch M_CAN driver internal Tx callback structure.
1155 : */
1156 1 : struct can_mcan_tx_callback {
1157 0 : can_tx_callback_t function;
1158 0 : void *user_data;
1159 : };
1160 :
1161 : /**
1162 : * @brief Bosch M_CAN driver internal Rx callback structure.
1163 : */
1164 1 : struct can_mcan_rx_callback {
1165 0 : can_rx_callback_t function;
1166 0 : void *user_data;
1167 : };
1168 :
1169 : /**
1170 : * @brief Bosch M_CAN driver internal Tx + Rx callbacks structure.
1171 : */
1172 1 : struct can_mcan_callbacks {
1173 0 : struct can_mcan_tx_callback *tx;
1174 0 : struct can_mcan_rx_callback *std;
1175 0 : struct can_mcan_rx_callback *ext;
1176 0 : uint8_t num_tx;
1177 0 : uint8_t num_std;
1178 0 : uint8_t num_ext;
1179 : };
1180 :
1181 : /**
1182 : * @brief Define Bosch M_CAN TX and RX callbacks
1183 : *
1184 : * This macro allows a Bosch M_CAN driver frontend using a fixed Message RAM configuration to limit
1185 : * the required software resources (e.g. limit the number of the standard (11-bit) or extended
1186 : * (29-bit) filters in use).
1187 : *
1188 : * Frontend drivers supporting dynamic Message RAM configuration should use @ref
1189 : * CAN_MCAN_DT_CALLBACKS_DEFINE() or @ref CAN_MCAN_DT_INST_CALLBACKS_DEFINE() instead.
1190 : *
1191 : * @param _name callbacks variable name
1192 : * @param _tx Number of Tx callbacks
1193 : * @param _std Number of standard (11-bit) filter callbacks
1194 : * @param _ext Number of extended (29-bit) filter callbacks
1195 : * @see CAN_MCAN_DT_CALLBACKS_DEFINE()
1196 : */
1197 1 : #define CAN_MCAN_CALLBACKS_DEFINE(_name, _tx, _std, _ext) \
1198 : static struct can_mcan_tx_callback _name##_tx_cbs[_tx]; \
1199 : static struct can_mcan_rx_callback _name##_std_cbs[_std]; \
1200 : static struct can_mcan_rx_callback _name##_ext_cbs[_ext]; \
1201 : static const struct can_mcan_callbacks _name = { \
1202 : .tx = _name##_tx_cbs, \
1203 : .std = _name##_std_cbs, \
1204 : .ext = _name##_ext_cbs, \
1205 : .num_tx = _tx, \
1206 : .num_std = _std, \
1207 : .num_ext = _ext, \
1208 : }
1209 :
1210 : /**
1211 : * @brief Define Bosch M_CAN TX and RX callbacks
1212 : * @param node_id node identifier
1213 : * @param _name callbacks variable name
1214 : * @see CAN_MCAN_CALLBACKS_DEFINE()
1215 : */
1216 1 : #define CAN_MCAN_DT_CALLBACKS_DEFINE(node_id, _name) \
1217 : CAN_MCAN_CALLBACKS_DEFINE(_name, CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id), \
1218 : CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id), \
1219 : CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id))
1220 :
1221 : /**
1222 : * @brief Equivalent to CAN_MCAN_DT_CALLBACKS_DEFINE(DT_DRV_INST(inst))
1223 : * @param inst DT_DRV_COMPAT instance number
1224 : * @param _name callbacks variable name
1225 : * @see CAN_MCAN_DT_CALLBACKS_DEFINE()
1226 : */
1227 1 : #define CAN_MCAN_DT_INST_CALLBACKS_DEFINE(inst, _name) \
1228 : CAN_MCAN_DT_CALLBACKS_DEFINE(DT_DRV_INST(inst), _name)
1229 :
1230 : /**
1231 : * @brief Bosch M_CAN driver internal configuration structure.
1232 : */
1233 1 : struct can_mcan_config {
1234 0 : const struct can_driver_config common;
1235 0 : const struct can_mcan_ops *ops;
1236 0 : const struct can_mcan_callbacks *callbacks;
1237 0 : uint16_t mram_elements[CAN_MCAN_MRAM_CFG_NUM_CELLS];
1238 0 : uint16_t mram_offsets[CAN_MCAN_MRAM_CFG_NUM_CELLS];
1239 0 : size_t mram_size;
1240 0 : const void *custom;
1241 : };
1242 :
1243 : /**
1244 : * @brief Get an array containing the number of elements in Bosch M_CAN Message RAM
1245 : *
1246 : * The order of the array entries is given by the @ref CAN_MCAN_MRAM_CFG definitions.
1247 : *
1248 : * @param node_id node identifier
1249 : * @return array of number of elements
1250 : */
1251 1 : #define CAN_MCAN_DT_MRAM_ELEMENTS_GET(node_id) \
1252 : { \
1253 : 0, /* offset cell */ \
1254 : CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id), \
1255 : CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id), \
1256 : CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id), \
1257 : CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id), \
1258 : CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id), \
1259 : CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id), \
1260 : CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id) \
1261 : }
1262 :
1263 : /**
1264 : * @brief Get an array containing the base offsets for element in Bosch M_CAN Message RAM
1265 : *
1266 : * The order of the array entries is given by the @ref CAN_MCAN_MRAM_CFG definitions.
1267 : *
1268 : * @param node_id node identifier
1269 : * @return array of base offsets for elements
1270 : */
1271 1 : #define CAN_MCAN_DT_MRAM_OFFSETS_GET(node_id) \
1272 : { \
1273 : 0, /* offset cell */ \
1274 : CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(node_id), \
1275 : CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(node_id), \
1276 : CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(node_id), \
1277 : CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(node_id), \
1278 : CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(node_id), \
1279 : CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(node_id), \
1280 : CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(node_id) \
1281 : }
1282 :
1283 : /**
1284 : * @brief Static initializer for @p can_mcan_config struct
1285 : *
1286 : * @param node_id Devicetree node identifier
1287 : * @param _custom Pointer to custom driver frontend configuration structure
1288 : * @param _ops Pointer to front-end @a can_mcan_ops
1289 : * @param _cbs Pointer to front-end @a can_mcan_callbacks
1290 : */
1291 : #ifdef CONFIG_CAN_FD_MODE
1292 : #define CAN_MCAN_DT_CONFIG_GET(node_id, _custom, _ops, _cbs) \
1293 : { \
1294 : .common = CAN_DT_DRIVER_CONFIG_GET(node_id, 0, 8000000), \
1295 : .ops = _ops, \
1296 : .callbacks = _cbs, \
1297 : .mram_elements = CAN_MCAN_DT_MRAM_ELEMENTS_GET(node_id), \
1298 : .mram_offsets = CAN_MCAN_DT_MRAM_OFFSETS_GET(node_id), \
1299 : .mram_size = CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id), \
1300 : .custom = _custom, \
1301 : }
1302 : #else /* CONFIG_CAN_FD_MODE */
1303 1 : #define CAN_MCAN_DT_CONFIG_GET(node_id, _custom, _ops, _cbs) \
1304 : { \
1305 : .common = CAN_DT_DRIVER_CONFIG_GET(node_id, 0, 1000000), \
1306 : .ops = _ops, \
1307 : .callbacks = _cbs, \
1308 : .mram_elements = CAN_MCAN_DT_MRAM_ELEMENTS_GET(node_id), \
1309 : .mram_offsets = CAN_MCAN_DT_MRAM_OFFSETS_GET(node_id), \
1310 : .mram_size = CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id), \
1311 : .custom = _custom, \
1312 : }
1313 : #endif /* !CONFIG_CAN_FD_MODE */
1314 :
1315 : /**
1316 : * @brief Static initializer for @p can_mcan_config struct from DT_DRV_COMPAT instance
1317 : *
1318 : * @param inst DT_DRV_COMPAT instance number
1319 : * @param _custom Pointer to custom driver frontend configuration structure
1320 : * @param _ops Pointer to front-end @a can_mcan_ops
1321 : * @param _cbs Pointer to front-end @a can_mcan_callbacks
1322 : * @see CAN_MCAN_DT_CONFIG_GET()
1323 : */
1324 1 : #define CAN_MCAN_DT_CONFIG_INST_GET(inst, _custom, _ops, _cbs) \
1325 : CAN_MCAN_DT_CONFIG_GET(DT_DRV_INST(inst), _custom, _ops, _cbs)
1326 :
1327 : /**
1328 : * @brief Initializer for a @a can_mcan_data struct
1329 : * @param _custom Pointer to custom driver frontend data structure
1330 : */
1331 1 : #define CAN_MCAN_DATA_INITIALIZER(_custom) \
1332 : { \
1333 : .custom = _custom, \
1334 : }
1335 :
1336 : /**
1337 : * @brief Bosch M_CAN driver front-end callback helper for reading a memory mapped register
1338 : *
1339 : * @param base Register base address
1340 : * @param reg Register offset
1341 : * @param[out] val Register value
1342 : *
1343 : * @retval 0 Memory mapped register read always succeeds.
1344 : */
1345 1 : static inline int can_mcan_sys_read_reg(mm_reg_t base, uint16_t reg, uint32_t *val)
1346 : {
1347 : *val = sys_read32(base + reg);
1348 :
1349 : return 0;
1350 : }
1351 :
1352 : /**
1353 : * @brief Bosch M_CAN driver front-end callback helper for writing a memory mapped register
1354 : *
1355 : * @param base Register base address
1356 : * @param reg Register offset
1357 : * @param val Register value
1358 : *
1359 : * @retval 0 Memory mapped register write always succeeds.
1360 : */
1361 1 : static inline int can_mcan_sys_write_reg(mm_reg_t base, uint16_t reg, uint32_t val)
1362 : {
1363 : sys_write32(val, base + reg);
1364 :
1365 : return 0;
1366 : }
1367 :
1368 : /**
1369 : * @brief Bosch M_CAN driver front-end callback helper for reading from memory mapped Message RAM
1370 : *
1371 : * @param base Base address of the Message RAM for the given Bosch M_CAN instance. The base address
1372 : * must be 32-bit aligned.
1373 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1374 : * offset must be 32-bit aligned.
1375 : * @param[out] dst Destination for the data read. The destination address must be 32-bit aligned.
1376 : * @param len Number of bytes to read. Must be a multiple of 4.
1377 : *
1378 : * @retval 0 If successful.
1379 : * @retval -EIO General input/output error.
1380 : */
1381 1 : static inline int can_mcan_sys_read_mram(mem_addr_t base, uint16_t offset, void *dst, size_t len)
1382 : {
1383 : volatile uint32_t *src32 = (volatile uint32_t *)(base + offset);
1384 : uint32_t *dst32 = (uint32_t *)dst;
1385 : size_t len32 = len / sizeof(uint32_t);
1386 :
1387 : __ASSERT(base % 4U == 0U, "base must be a multiple of 4");
1388 : __ASSERT(offset % 4U == 0U, "offset must be a multiple of 4");
1389 : __ASSERT(POINTER_TO_UINT(dst) % 4U == 0U, "dst must be 32-bit aligned");
1390 : __ASSERT(len % 4U == 0U, "len must be a multiple of 4");
1391 :
1392 : #if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
1393 : int err;
1394 :
1395 : err = sys_cache_data_invd_range((void *)(base + offset), len);
1396 : if (err != 0) {
1397 : return err;
1398 : }
1399 : #endif /* !defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
1400 :
1401 : while (len32-- > 0) {
1402 : *dst32++ = *src32++;
1403 : }
1404 :
1405 : return 0;
1406 : }
1407 :
1408 : /**
1409 : * @brief Bosch M_CAN driver front-end callback helper for writing to memory mapped Message RAM
1410 : *
1411 : * @param base Base address of the Message RAM for the given Bosch M_CAN instance. The base address
1412 : * must be 32-bit aligned.
1413 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1414 : * offset must be 32-bit aligned.
1415 : * @param src Source for the data to be written. The source address must be 32-bit aligned.
1416 : * @param len Number of bytes to write. Must be a multiple of 4.
1417 : *
1418 : * @retval 0 If successful.
1419 : * @retval -EIO General input/output error.
1420 : */
1421 1 : static inline int can_mcan_sys_write_mram(mem_addr_t base, uint16_t offset, const void *src,
1422 : size_t len)
1423 : {
1424 : volatile uint32_t *dst32 = (volatile uint32_t *)(base + offset);
1425 : const uint32_t *src32 = (const uint32_t *)src;
1426 : size_t len32 = len / sizeof(uint32_t);
1427 :
1428 : __ASSERT(base % 4U == 0U, "base must be a multiple of 4");
1429 : __ASSERT(offset % 4U == 0U, "offset must be a multiple of 4");
1430 : __ASSERT(POINTER_TO_UINT(src) % 4U == 0U, "src must be 32-bit aligned");
1431 : __ASSERT(len % 4U == 0U, "len must be a multiple of 4");
1432 :
1433 : while (len32-- > 0) {
1434 : *dst32++ = *src32++;
1435 : }
1436 :
1437 : #if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
1438 : return sys_cache_data_flush_range((void *)(base + offset), len);
1439 : #else /* defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
1440 : return 0;
1441 : #endif /* !defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
1442 : }
1443 :
1444 : /**
1445 : * @brief Bosch M_CAN driver front-end callback helper for clearing memory mapped Message RAM
1446 : *
1447 : * Clear Message RAM by writing 0 to all words.
1448 : *
1449 : * @param base Base address of the Message RAM for the given Bosch M_CAN instance. The base address
1450 : * must be 32-bit aligned.
1451 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1452 : * offset must be 32-bit aligned.
1453 : * @param len Number of bytes to clear. Must be a multiple of 4.
1454 : *
1455 : * @retval 0 If successful.
1456 : * @retval -EIO General input/output error.
1457 : */
1458 1 : static inline int can_mcan_sys_clear_mram(mem_addr_t base, uint16_t offset, size_t len)
1459 : {
1460 : volatile uint32_t *dst32 = (volatile uint32_t *)(base + offset);
1461 : size_t len32 = len / sizeof(uint32_t);
1462 :
1463 : __ASSERT(base % 4U == 0U, "base must be a multiple of 4");
1464 : __ASSERT(offset % 4U == 0U, "offset must be a multiple of 4");
1465 : __ASSERT(len % 4U == 0U, "len must be a multiple of 4");
1466 :
1467 : while (len32-- > 0) {
1468 : *dst32++ = 0U;
1469 : }
1470 :
1471 : #if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
1472 : return sys_cache_data_flush_range((void *)(base + offset), len);
1473 : #else /* defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
1474 : return 0;
1475 : #endif /* !defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
1476 : }
1477 :
1478 : /**
1479 : * @brief Read a Bosch M_CAN register
1480 : *
1481 : * @param dev Pointer to the device structure for the driver instance.
1482 : * @param reg Register offset
1483 : * @param[out] val Register value
1484 : *
1485 : * @retval 0 If successful.
1486 : * @retval -ENOTSUP Register not supported.
1487 : * @retval -EIO General input/output error.
1488 : */
1489 1 : int can_mcan_read_reg(const struct device *dev, uint16_t reg, uint32_t *val);
1490 :
1491 : /**
1492 : * @brief Write a Bosch M_CAN register
1493 : *
1494 : * @param dev Pointer to the device structure for the driver instance.
1495 : * @param reg Register offset
1496 : * @param val Register value
1497 : *
1498 : * @retval 0 If successful.
1499 : * @retval -ENOTSUP Register not supported.
1500 : * @retval -EIO General input/output error.
1501 : */
1502 1 : int can_mcan_write_reg(const struct device *dev, uint16_t reg, uint32_t val);
1503 :
1504 : /**
1505 : * @brief Read from Bosch M_CAN Message RAM
1506 : *
1507 : * @param dev Pointer to the device structure for the driver instance.
1508 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1509 : * offset must be 32-bit aligned.
1510 : * @param[out] dst Destination for the data read.
1511 : * @param len Number of bytes to read. Must be a multiple of 4.
1512 : *
1513 : * @retval 0 If successful.
1514 : * @retval -EIO General input/output error.
1515 : */
1516 1 : static inline int can_mcan_read_mram(const struct device *dev, uint16_t offset, void *dst,
1517 : size_t len)
1518 : {
1519 : const struct can_mcan_config *config = dev->config;
1520 :
1521 : return config->ops->read_mram(dev, offset, dst, len);
1522 : }
1523 :
1524 : /**
1525 : * @brief Write to Bosch M_CAN Message RAM
1526 : *
1527 : * @param dev Pointer to the device structure for the driver instance.
1528 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1529 : * offset must be 32-bit aligned.
1530 : * @param src Source for the data to be written
1531 : * @param len Number of bytes to write. Must be a multiple of 4.
1532 : *
1533 : * @retval 0 If successful.
1534 : * @retval -EIO General input/output error.
1535 : */
1536 1 : static inline int can_mcan_write_mram(const struct device *dev, uint16_t offset, const void *src,
1537 : size_t len)
1538 : {
1539 : const struct can_mcan_config *config = dev->config;
1540 :
1541 : return config->ops->write_mram(dev, offset, src, len);
1542 : }
1543 :
1544 : /**
1545 : * @brief Clear Bosch M_CAN Message RAM
1546 : *
1547 : * Clear Message RAM by writing 0 to all words.
1548 : *
1549 : * @param dev Pointer to the device structure for the driver instance.
1550 : * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
1551 : * offset must be 32-bit aligned.
1552 : * @param len Number of bytes to clear. Must be a multiple of 4.
1553 : *
1554 : * @retval 0 If successful.
1555 : * @retval -EIO General input/output error.
1556 : */
1557 1 : static inline int can_mcan_clear_mram(const struct device *dev, uint16_t offset, size_t len)
1558 : {
1559 : const struct can_mcan_config *config = dev->config;
1560 :
1561 : return config->ops->clear_mram(dev, offset, len);
1562 : }
1563 :
1564 : /**
1565 : * @brief Configure Bosch M_MCAN Message RAM start addresses.
1566 : *
1567 : * Bosch M_CAN driver front-end callback helper function for configuring the start addresses of the
1568 : * Bosch M_CAN Rx FIFO0 (RXFOC), Rx FIFO1 (RXF1C), Rx Buffer (RXBCC), Tx Buffer (TXBC), and Tx Event
1569 : * FIFO (TXEFC) in Message RAM.
1570 : *
1571 : * The start addresses (containing bits 15:2 since Bosch M_CAN message RAM is accessed as 32 bit
1572 : * words) are calculated relative to the provided Message RAM Base Address (mrba).
1573 : *
1574 : * Some Bosch M_CAN implementations use a fixed Message RAM configuration, other use a fixed memory
1575 : * area and relative addressing, others again have custom registers for configuring the Message
1576 : * RAM. It is the responsibility of the front-end driver to call this function during driver
1577 : * initialization as needed.
1578 : *
1579 : * @param dev Pointer to the device structure for the driver instance.
1580 : * @param mrba Message RAM Base Address.
1581 : * @param mram Message RAM Address.
1582 : *
1583 : * @retval 0 If successful.
1584 : * @retval -EIO General input/output error.
1585 : */
1586 1 : int can_mcan_configure_mram(const struct device *dev, uintptr_t mrba, uintptr_t mram);
1587 :
1588 : /**
1589 : * @brief Bosch M_CAN driver initialization callback.
1590 : *
1591 : * @param dev Pointer to the device structure for the driver instance.
1592 : */
1593 1 : int can_mcan_init(const struct device *dev);
1594 :
1595 : /**
1596 : * @brief Bosch M_CAN driver m_can_int0 IRQ handler.
1597 : *
1598 : * @param dev Pointer to the device structure for the driver instance.
1599 : */
1600 1 : void can_mcan_line_0_isr(const struct device *dev);
1601 :
1602 : /**
1603 : * @brief Bosch M_CAN driver m_can_int1 IRQ handler.
1604 : *
1605 : * @param dev Pointer to the device structure for the driver instance.
1606 : */
1607 1 : void can_mcan_line_1_isr(const struct device *dev);
1608 :
1609 : /**
1610 : * @brief Enable Bosch M_CAN configuration change.
1611 : *
1612 : * @param dev Pointer to the device structure for the driver instance.
1613 : */
1614 1 : void can_mcan_enable_configuration_change(const struct device *dev);
1615 :
1616 : /**
1617 : * @brief Bosch M_CAN driver callback API upon getting CAN controller capabilities
1618 : * See @a can_get_capabilities() for argument description
1619 : */
1620 1 : int can_mcan_get_capabilities(const struct device *dev, can_mode_t *cap);
1621 :
1622 : /**
1623 : * @brief Bosch M_CAN driver callback API upon starting CAN controller
1624 : * See @a can_start() for argument description
1625 : */
1626 1 : int can_mcan_start(const struct device *dev);
1627 :
1628 : /**
1629 : * @brief Bosch M_CAN driver callback API upon stopping CAN controller
1630 : * See @a can_stop() for argument description
1631 : */
1632 1 : int can_mcan_stop(const struct device *dev);
1633 :
1634 : /**
1635 : * @brief Bosch M_CAN driver callback API upon setting CAN controller mode
1636 : * See @a can_set_mode() for argument description
1637 : */
1638 1 : int can_mcan_set_mode(const struct device *dev, can_mode_t mode);
1639 :
1640 : /**
1641 : * @brief Bosch M_CAN driver callback API upon setting CAN bus timing
1642 : * See @a can_set_timing() for argument description
1643 : */
1644 1 : int can_mcan_set_timing(const struct device *dev, const struct can_timing *timing);
1645 :
1646 : /**
1647 : * @brief Bosch M_CAN driver callback API upon setting CAN bus data phase timing
1648 : * See @a can_set_timing_data() for argument description
1649 : */
1650 1 : int can_mcan_set_timing_data(const struct device *dev, const struct can_timing *timing_data);
1651 :
1652 : #ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
1653 : /**
1654 : * @brief Bosch M_CAN driver callback API upon recovering the CAN bus
1655 : * See @a can_recover() for argument description
1656 : */
1657 : int can_mcan_recover(const struct device *dev, k_timeout_t timeout);
1658 : #endif /* CONFIG_CAN_MANUAL_RECOVERY_MODE */
1659 :
1660 0 : int can_mcan_send(const struct device *dev, const struct can_frame *frame, k_timeout_t timeout,
1661 : can_tx_callback_t callback, void *user_data);
1662 :
1663 0 : int can_mcan_get_max_filters(const struct device *dev, bool ide);
1664 :
1665 : /**
1666 : * @brief Bosch M_CAN driver callback API upon adding an RX filter
1667 : * See @a can_add_rx_callback() for argument description
1668 : */
1669 1 : int can_mcan_add_rx_filter(const struct device *dev, can_rx_callback_t callback, void *user_data,
1670 : const struct can_filter *filter);
1671 :
1672 : /**
1673 : * @brief Bosch M_CAN driver callback API upon removing an RX filter
1674 : * See @a can_remove_rx_filter() for argument description
1675 : */
1676 1 : void can_mcan_remove_rx_filter(const struct device *dev, int filter_id);
1677 :
1678 : /**
1679 : * @brief Bosch M_CAN driver callback API upon getting the CAN controller state
1680 : * See @a can_get_state() for argument description
1681 : */
1682 1 : int can_mcan_get_state(const struct device *dev, enum can_state *state,
1683 : struct can_bus_err_cnt *err_cnt);
1684 :
1685 : /**
1686 : * @brief Bosch M_CAN driver callback API upon setting a state change callback
1687 : * See @a can_set_state_change_callback() for argument description
1688 : */
1689 1 : void can_mcan_set_state_change_callback(const struct device *dev,
1690 : can_state_change_callback_t callback, void *user_data);
1691 :
1692 : #endif /* ZEPHYR_INCLUDE_DRIVERS_CAN_CAN_MCAN_H_ */
|