1 /*!
2     \file    gd32a50x_can.h
3     \brief   definitions for the CAN
4 
5     \version 2022-01-30, V1.0.0, firmware for GD32A50x
6 */
7 
8 /*
9     Copyright (c) 2022, GigaDevice Semiconductor Inc.
10 
11     Redistribution and use in source and binary forms, with or without modification,
12 are permitted provided that the following conditions are met:
13 
14     1. Redistributions of source code must retain the above copyright notice, this
15        list of conditions and the following disclaimer.
16     2. Redistributions in binary form must reproduce the above copyright notice,
17        this list of conditions and the following disclaimer in the documentation
18        and/or other materials provided with the distribution.
19     3. Neither the name of the copyright holder nor the names of its contributors
20        may be used to endorse or promote products derived from this software without
21        specific prior written permission.
22 
23     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
32 OF SUCH DAMAGE.
33 */
34 
35 #ifndef GD32A50X_CAN_H
36 #define GD32A50X_CAN_H
37 
38 #include "gd32a50x.h"
39 
40 /* CAN definitions */
41 #define CAN0                           CAN_BASE                                          /*!< CAN0 base address */
42 #define CAN1                           (CAN_BASE + 0x00001000U)                          /*!< CAN1 base address */
43 #define CAN_RAM(canx)                  ((uint32_t)((canx) + 0x00000080U))                /*!< can ram base address */
44 #define CAN_PN_RAM(canx)               ((uint32_t)(canx) + 0x00000B40U)                  /*!< Pretended Networking ram base address */
45 
46 /* registers definitions */
47 #define CAN_CTL0(canx)                 REG32((canx) + 0x00000000U)                       /*!< CAN control register 0 */
48 #define CAN_CTL1(canx)                 REG32((canx) + 0x00000004U)                       /*!< CAN control register 1 */
49 #define CAN_TIMER(canx)                REG32((canx) + 0x00000008U)                       /*!< CAN timer register */
50 #define CAN_RMPUBF(canx)               REG32((canx) + 0x00000010U)                       /*!< CAN receive mailbox public filter register */
51 #define CAN_ERR0(canx)                 REG32((canx) + 0x0000001CU)                       /*!< CAN error register 0 */
52 #define CAN_ERR1(canx)                 REG32((canx) + 0x00000020U)                       /*!< CAN error register 1 */
53 #define CAN_INTEN(canx)                REG32((canx) + 0x00000028U)                       /*!< CAN interrupt enable register */
54 #define CAN_STAT(canx)                 REG32((canx) + 0x00000030U)                       /*!< CAN status register */
55 #define CAN_CTL2(canx)                 REG32((canx) + 0x00000034U)                       /*!< CAN control register 2 */
56 #define CAN_CRCC(canx)                 REG32((canx) + 0x00000044U)                       /*!< CAN crc for classical frame register */
57 #define CAN_RFIFOPUBF(canx)            REG32((canx) + 0x00000048U)                       /*!< CAN receive fifo public filter register */
58 #define CAN_RFIFOIFMN(canx)            REG32((canx) + 0x0000004CU)                       /*!< CAN receive fifo identifier filter matching number register */
59 #define CAN_BT(canx)                   REG32((canx) + 0x00000050U)                       /*!< CAN bit timing register */
60 #define CAN_RFIFOMPF0(canx)            REG32((canx) + 0x00000880U)                       /*!< CAN receive fifo / mailbox private filter 0 register */
61 #define CAN_RFIFOMPF1(canx)            REG32((canx) + 0x00000884U)                       /*!< CAN receive fifo / mailbox private filter 1 register */
62 #define CAN_RFIFOMPF2(canx)            REG32((canx) + 0x00000888U)                       /*!< CAN receive fifo / mailbox private filter 2 register */
63 #define CAN_RFIFOMPF3(canx)            REG32((canx) + 0x0000088CU)                       /*!< CAN receive fifo / mailbox private filter 3 register */
64 #define CAN_RFIFOMPF4(canx)            REG32((canx) + 0x00000890U)                       /*!< CAN receive fifo / mailbox private filter 4 register */
65 #define CAN_RFIFOMPF5(canx)            REG32((canx) + 0x00000894U)                       /*!< CAN receive fifo / mailbox private filter 5 register */
66 #define CAN_RFIFOMPF6(canx)            REG32((canx) + 0x00000898U)                       /*!< CAN receive fifo / mailbox private filter 6 register */
67 #define CAN_RFIFOMPF7(canx)            REG32((canx) + 0x0000089CU)                       /*!< CAN receive fifo / mailbox private filter 7 register */
68 #define CAN_RFIFOMPF8(canx)            REG32((canx) + 0x000008A0U)                       /*!< CAN receive fifo / mailbox private filter 8 register */
69 #define CAN_RFIFOMPF9(canx)            REG32((canx) + 0x000008A4U)                       /*!< CAN receive fifo / mailbox private filter 9 register */
70 #define CAN_RFIFOMPF10(canx)           REG32((canx) + 0x000008A8U)                       /*!< CAN receive fifo / mailbox private filter 10 register */
71 #define CAN_RFIFOMPF11(canx)           REG32((canx) + 0x000008ACU)                       /*!< CAN receive fifo / mailbox private filter 11 register */
72 #define CAN_RFIFOMPF12(canx)           REG32((canx) + 0x000008B0U)                       /*!< CAN receive fifo / mailbox private filter 12 register */
73 #define CAN_RFIFOMPF13(canx)           REG32((canx) + 0x000008B4U)                       /*!< CAN receive fifo / mailbox private filter 13 register */
74 #define CAN_RFIFOMPF14(canx)           REG32((canx) + 0x000008B8U)                       /*!< CAN receive fifo / mailbox private filter 14 register */
75 #define CAN_RFIFOMPF15(canx)           REG32((canx) + 0x000008BCU)                       /*!< CAN receive fifo / mailbox private filter 15 register */
76 #define CAN_RFIFOMPF16(canx)           REG32((canx) + 0x000008C0U)                       /*!< CAN receive fifo / mailbox private filter 16 register */
77 #define CAN_RFIFOMPF17(canx)           REG32((canx) + 0x000008C4U)                       /*!< CAN receive fifo / mailbox private filter 17 register */
78 #define CAN_RFIFOMPF18(canx)           REG32((canx) + 0x000008C8U)                       /*!< CAN receive fifo / mailbox private filter 18 register */
79 #define CAN_RFIFOMPF19(canx)           REG32((canx) + 0x000008CCU)                       /*!< CAN receive fifo / mailbox private filter 19 register */
80 #define CAN_RFIFOMPF20(canx)           REG32((canx) + 0x000008D0U)                       /*!< CAN receive fifo / mailbox private filter 20 register */
81 #define CAN_RFIFOMPF21(canx)           REG32((canx) + 0x000008D4U)                       /*!< CAN receive fifo / mailbox private filter 21 register */
82 #define CAN_RFIFOMPF22(canx)           REG32((canx) + 0x000008D8U)                       /*!< CAN receive fifo / mailbox private filter 22 register */
83 #define CAN_RFIFOMPF23(canx)           REG32((canx) + 0x000008DCU)                       /*!< CAN receive fifo / mailbox private filter 23 register */
84 #define CAN_RFIFOMPF24(canx)           REG32((canx) + 0x000008E0U)                       /*!< CAN receive fifo / mailbox private filter 24 register */
85 #define CAN_RFIFOMPF25(canx)           REG32((canx) + 0x000008E4U)                       /*!< CAN receive fifo / mailbox private filter 25 register */
86 #define CAN_RFIFOMPF26(canx)           REG32((canx) + 0x000008E8U)                       /*!< CAN receive fifo / mailbox private filter 26 register */
87 #define CAN_RFIFOMPF27(canx)           REG32((canx) + 0x000008ECU)                       /*!< CAN receive fifo / mailbox private filter 27 register */
88 #define CAN_RFIFOMPF28(canx)           REG32((canx) + 0x000008F0U)                       /*!< CAN receive fifo / mailbox private filter 28 register */
89 #define CAN_RFIFOMPF29(canx)           REG32((canx) + 0x000008F4U)                       /*!< CAN receive fifo / mailbox private filter 29 register */
90 #define CAN_RFIFOMPF30(canx)           REG32((canx) + 0x000008F8U)                       /*!< CAN receive fifo / mailbox private filter 30 register */
91 #define CAN_RFIFOMPF31(canx)           REG32((canx) + 0x000008FCU)                       /*!< CAN receive fifo / mailbox private filter 31 register */
92 #define CAN_PN_CTL0(canx)              REG32((canx) + 0x00000B00U)                       /*!< Pretended Networking mode control register 0 */
93 #define CAN_PN_TO(canx)                REG32((canx) + 0x00000B04U)                       /*!< Pretended Networking mode timeout register */
94 #define CAN_PN_STAT(canx)              REG32((canx) + 0x00000B08U)                       /*!< Pretended Networking mode status register */
95 #define CAN_PN_EID0(canx)              REG32((canx) + 0x00000B0CU)                       /*!< Pretended Networking mode expected identifier 0 register */
96 #define CAN_PN_EDLC(canx)              REG32((canx) + 0x00000B10U)                       /*!< Pretended Networking mode expected dlc register */
97 #define CAN_PN_EDL0(canx)              REG32((canx) + 0x00000B14U)                       /*!< Pretended Networking mode expected data low 0 register */
98 #define CAN_PN_EDL1(canx)              REG32((canx) + 0x00000B18U)                       /*!< Pretended Networking mode expected data low 1 register */
99 #define CAN_PN_IFEID1(canx)            REG32((canx) + 0x00000B1CU)                       /*!< Pretended Networking mode identifier filter / expected identifier 1 register */
100 #define CAN_PN_DF0EDH0(canx)           REG32((canx) + 0x00000B20U)                       /*!< Pretended Networking mode data 0 filter / expected data high 0 register */
101 #define CAN_PN_DF1EDH1(canx)           REG32((canx) + 0x00000B24U)                       /*!< Pretended Networking mode data 1 filter / expected data high 1 register */
102 #define CAN_PN_RWM0CS(canx)            REG32((canx) + 0x00000B40U)                       /*!< Pretended Networking mode received wakeup mailbox 0 control status information register */
103 #define CAN_PN_RWM0I(canx)             REG32((canx) + 0x00000B44U)                       /*!< Pretended Networking mode received wakeup mailbox 0 identifier register */
104 #define CAN_PN_RWM0D0(canx)            REG32((canx) + 0x00000B48U)                       /*!< Pretended Networking mode received wakeup mailbox 0 data 0 register */
105 #define CAN_PN_RWM0D1(canx)            REG32((canx) + 0x00000B4CU)                       /*!< Pretended Networking mode received wakeup mailbox 0 data 1 register */
106 #define CAN_PN_RWM1CS(canx)            REG32((canx) + 0x00000B50U)                       /*!< Pretended Networking mode received wakeup mailbox 1 control status information register */
107 #define CAN_PN_RWM1I(canx)             REG32((canx) + 0x00000B54U)                       /*!< Pretended Networking mode received wakeup mailbox 1 identifier register */
108 #define CAN_PN_RWM1D0(canx)            REG32((canx) + 0x00000B58U)                       /*!< Pretended Networking mode received wakeup mailbox 1 data 0 register */
109 #define CAN_PN_RWM1D1(canx)            REG32((canx) + 0x00000B5CU)                       /*!< Pretended Networking mode received wakeup mailbox 1 data 1 register */
110 #define CAN_PN_RWM2CS(canx)            REG32((canx) + 0x00000B60U)                       /*!< Pretended Networking mode received wakeup mailbox 2 control status information register */
111 #define CAN_PN_RWM2I(canx)             REG32((canx) + 0x00000B64U)                       /*!< Pretended Networking mode received wakeup mailbox 2 identifier register */
112 #define CAN_PN_RWM2D0(canx)            REG32((canx) + 0x00000B68U)                       /*!< Pretended Networking mode received wakeup mailbox 2 data 0 register */
113 #define CAN_PN_RWM2D1(canx)            REG32((canx) + 0x00000B6CU)                       /*!< Pretended Networking mode received wakeup mailbox 2 data 1 register */
114 #define CAN_PN_RWM3CS(canx)            REG32((canx) + 0x00000B70U)                       /*!< Pretended Networking mode received wakeup mailbox 3 control status information register */
115 #define CAN_PN_RWM3I(canx)             REG32((canx) + 0x00000B74U)                       /*!< Pretended Networking mode received wakeup mailbox 3 identifier register */
116 #define CAN_PN_RWM3D0(canx)            REG32((canx) + 0x00000B78U)                       /*!< Pretended Networking mode received wakeup mailbox 3 data 0 register */
117 #define CAN_PN_RWM3D1(canx)            REG32((canx) + 0x00000B7CU)                       /*!< Pretended Networking mode received wakeup mailbox 3 data 1 register */
118 #define CAN_FDCTL(canx)                REG32((canx) + 0x00000C00U)                       /*!< CAN FD control register */
119 #define CAN_FDBT(canx)                 REG32((canx) + 0x00000C04U)                       /*!< CAN bit timing register */
120 #define CAN_CRCCFD(canx)               REG32((canx) + 0x00000C08U)                       /*!< CAN CRC for classical and FD frame register */
121 
122 /* bits definitions */
123 /* CAN_CTL0 */
124 #define CAN_CTL0_MSZ                   BITS(0, 4)                                        /*!< memory size */
125 #define CAN_CTL0_FS                    BITS(8, 9)                                        /*!< format selection */
126 #define CAN_CTL0_FDEN                  BIT(11)                                           /*!< CAN FD operation enable */
127 #define CAN_CTL0_MST                   BIT(12)                                           /*!< mailbox stop transmission */
128 #define CAN_CTL0_LAPRIOEN              BIT(13)                                           /*!< enable local arbitration priority */
129 #define CAN_CTL0_PNMOD                 BIT(14)                                           /*!< Pretended Networking mode selection */
130 #define CAN_CTL0_DMAEN                 BIT(15)                                           /*!< enable DMA */
131 #define CAN_CTL0_RPFQEN                BIT(16)                                           /*!< enable rx private filters enable & rx mailbox queue */
132 #define CAN_CTL0_SRDIS                 BIT(17)                                           /*!< enable self reception */
133 #define CAN_CTL0_PNS                   BIT(18)                                           /*!< Pretended Networking state */
134 #define CAN_CTL0_PNEN                  BIT(19)                                           /*!< enable Pretended Networking mode */
135 #define CAN_CTL0_LPS                   BIT(20)                                           /*!< low power state */
136 #define CAN_CTL0_WERREN                BIT(21)                                           /*!< enable error warning */
137 #define CAN_CTL0_INAS                  BIT(24)                                           /*!< inactive mode state */
138 #define CAN_CTL0_SWRST                 BIT(25)                                           /*!< software reset */
139 #define CAN_CTL0_NRDY                  BIT(27)                                           /*!< not ready */
140 #define CAN_CTL0_HALT                  BIT(28)                                           /*!< halt CAN */
141 #define CAN_CTL0_RFEN                  BIT(29)                                           /*!< rx fifo enable */
142 #define CAN_CTL0_INAMOD                BIT(30)                                           /*!< enable inactive mode */
143 #define CAN_CTL0_CANDIS                BIT(31)                                           /*!< disable CAN */
144 
145 /* CAN_CTL1 */
146 #define CAN_CTL1_MMOD                  BIT(3)                                            /*!< monitor mode */
147 #define CAN_CTL1_MTO                   BIT(4)                                            /*!< mailbox transmission order */
148 #define CAN_CTL1_TSYNC                 BIT(5)                                            /*!< enable time synchronization */
149 #define CAN_CTL1_ABORDIS               BIT(6)                                            /*!< not enable automatic bus off recovery */
150 #define CAN_CTL1_BSPMOD                BIT(7)                                            /*!< bit sampling mode */
151 #define CAN_CTL1_RWERRIE               BIT(10)                                           /*!< enable rx error warning interrupt */
152 #define CAN_CTL1_TWERRIE               BIT(11)                                           /*!< enable tx error warning interrupt */
153 #define CAN_CTL1_LSCMOD                BIT(12)                                           /*!< loopback and silent communication mode */
154 #define CAN_CTL1_ERRSIE                BIT(14)                                           /*!< enable error summary interrupt */
155 #define CAN_CTL1_BOIE                  BIT(15)                                           /*!< enable bus off interrupt */
156 
157 /* CAN_TIMER */
158 #define CAN_TIMER_CNT                  BITS(0,15)                                        /*!< counter value */
159 
160 /* CAN_RMPUBF */
161 #define CAN_RMPUBF_MFD0                BIT(0)                                            /*!< mailbox filter data bit 0 */
162 #define CAN_RMPUBF_MFD1                BIT(1)                                            /*!< mailbox filter data bit 1 */
163 #define CAN_RMPUBF_MFD2                BIT(2)                                            /*!< mailbox filter data bit 2 */
164 #define CAN_RMPUBF_MFD3                BIT(3)                                            /*!< mailbox filter data bit 3 */
165 #define CAN_RMPUBF_MFD4                BIT(4)                                            /*!< mailbox filter data bit 4 */
166 #define CAN_RMPUBF_MFD5                BIT(5)                                            /*!< mailbox filter data bit 5 */
167 #define CAN_RMPUBF_MFD6                BIT(6)                                            /*!< mailbox filter data bit 6 */
168 #define CAN_RMPUBF_MFD7                BIT(7)                                            /*!< mailbox filter data bit 7 */
169 #define CAN_RMPUBF_MFD8                BIT(8)                                            /*!< mailbox filter data bit 8 */
170 #define CAN_RMPUBF_MFD9                BIT(9)                                            /*!< mailbox filter data bit 9 */
171 #define CAN_RMPUBF_MFD10               BIT(10)                                           /*!< mailbox filter data bit 10 */
172 #define CAN_RMPUBF_MFD11               BIT(11)                                           /*!< mailbox filter data bit 11 */
173 #define CAN_RMPUBF_MFD12               BIT(12)                                           /*!< mailbox filter data bit 12 */
174 #define CAN_RMPUBF_MFD13               BIT(13)                                           /*!< mailbox filter data bit 13 */
175 #define CAN_RMPUBF_MFD14               BIT(14)                                           /*!< mailbox filter data bit 14 */
176 #define CAN_RMPUBF_MFD15               BIT(15)                                           /*!< mailbox filter data bit 15 */
177 #define CAN_RMPUBF_MFD16               BIT(16)                                           /*!< mailbox filter data bit 16 */
178 #define CAN_RMPUBF_MFD17               BIT(17)                                           /*!< mailbox filter data bit 17 */
179 #define CAN_RMPUBF_MFD18               BIT(18)                                           /*!< mailbox filter data bit 18 */
180 #define CAN_RMPUBF_MFD19               BIT(19)                                           /*!< mailbox filter data bit 19 */
181 #define CAN_RMPUBF_MFD20               BIT(20)                                           /*!< mailbox filter data bit 20 */
182 #define CAN_RMPUBF_MFD21               BIT(21)                                           /*!< mailbox filter data bit 21 */
183 #define CAN_RMPUBF_MFD22               BIT(22)                                           /*!< mailbox filter data bit 22 */
184 #define CAN_RMPUBF_MFD23               BIT(23)                                           /*!< mailbox filter data bit 23 */
185 #define CAN_RMPUBF_MFD24               BIT(24)                                           /*!< mailbox filter data bit 24 */
186 #define CAN_RMPUBF_MFD25               BIT(25)                                           /*!< mailbox filter data bit 25 */
187 #define CAN_RMPUBF_MFD26               BIT(26)                                           /*!< mailbox filter data bit 26 */
188 #define CAN_RMPUBF_MFD27               BIT(27)                                           /*!< mailbox filter data bit 27 */
189 #define CAN_RMPUBF_MFD28               BIT(28)                                           /*!< mailbox filter data bit 28 */
190 #define CAN_RMPUBF_MFD29               BIT(29)                                           /*!< mailbox filter data bit 29 */
191 #define CAN_RMPUBF_MFD30               BIT(30)                                           /*!< mailbox filter data bit 30 */
192 #define CAN_RMPUBF_MFD31               BIT(31)                                           /*!< mailbox filter data bit 31 */
193 
194 /* CAN_ERR0 */
195 #define CAN_ERR0_TECNT                 BITS(0, 7)                                        /*!< transmit error count defined by the CAN standard */
196 #define CAN_ERR0_RECNT                 BITS(8, 15)                                       /*!< receive error count defined by the CAN standard */
197 #define CAN_ERR0_TEFCNT                BITS(16, 23)                                      /*!< transmit error count for the data phase of FD frames with BRS bit set */
198 #define CAN_ERR0_REFCNT                BITS(24, 31)                                      /*!< receive error count for the data phase of FD frames with BRS bit set */
199 
200 /* CAN_ERR1 */
201 #define CAN_ERR1_ERRSF                 BIT(1)                                            /*!< error summary flag */
202 #define CAN_ERR1_BOF                   BIT(2)                                            /*!< bus off flag */
203 #define CAN_ERR1_RS                    BIT(3)                                            /*!< receiving state */
204 #define CAN_ERR1_ERRSI                 BITS(4, 5)                                        /*!< error state indicator */
205 #define CAN_ERR1_TS                    BIT(6)                                            /*!< transmitting state */
206 #define CAN_ERR1_IDLEF                 BIT(7)                                            /*!< idle flag */
207 #define CAN_ERR1_RWERRF                BIT(8)                                            /*!< rx error warning flag */
208 #define CAN_ERR1_TWERRF                BIT(9)                                            /*!< tx error warning flag */
209 #define CAN_ERR1_STFERR                BIT(10)                                           /*!< stuff error */
210 #define CAN_ERR1_FMERR                 BIT(11)                                           /*!< form error */
211 #define CAN_ERR1_CRCERR                BIT(12)                                           /*!< CRC error */
212 #define CAN_ERR1_ACKERR                BIT(13)                                           /*!< ACK error */
213 #define CAN_ERR1_BDERR                 BIT(14)                                           /*!< bit dominant error for all format frames */
214 #define CAN_ERR1_BRERR                 BIT(15)                                           /*!< bit recessive error for all format frames */
215 #define CAN_ERR1_RWERRIF               BIT(16)                                           /*!< rx error warning interrupt flag */
216 #define CAN_ERR1_TWERRIF               BIT(17)                                           /*!< tx error warning interrupt flag */
217 #define CAN_ERR1_SYN                   BIT(18)                                           /*!< synchronization flag */
218 #define CAN_ERR1_BORF                  BIT(19)                                           /*!< bus off recovery flag */
219 #define CAN_ERR1_ERRFSF                BIT(20)                                           /*!< error summary flag for data phase of FD frames with BRS bit set */
220 #define CAN_ERR1_ERROVR                BIT(21)                                           /*!< error overrun */
221 #define CAN_ERR1_STFFERR               BIT(26)                                           /*!< stuff error in data phase of FD frames with BRS bit set */
222 #define CAN_ERR1_FMFERR                BIT(27)                                           /*!< form error in data phase of FD frames with BRS bit set */
223 #define CAN_ERR1_CRCFERR               BIT(28)                                           /*!< CRC error in data phase of FD frames with BRS bit set */
224 #define CAN_ERR1_BDFERR                BIT(30)                                           /*!< bit dominant error in data phase of FD frames with BRS bit set */
225 #define CAN_ERR1_BRFERR                BIT(31)                                           /*!< bit recessive error in data phase of FD frames with BRS bit set */
226 
227 /* CAN_INTEN */
228 #define CAN_INTEN_MIE0                 BIT(0)                                            /*!< enable message 0 transmission and reception interrupt */
229 #define CAN_INTEN_MIE1                 BIT(1)                                            /*!< enable message 1 transmission and reception interrupt */
230 #define CAN_INTEN_MIE2                 BIT(2)                                            /*!< enable message 2 transmission and reception interrupt */
231 #define CAN_INTEN_MIE3                 BIT(3)                                            /*!< enable message 3 transmission and reception interrupt */
232 #define CAN_INTEN_MIE4                 BIT(4)                                            /*!< enable message 4 transmission and reception interrupt */
233 #define CAN_INTEN_MIE5                 BIT(5)                                            /*!< enable message 5 transmission and reception interrupt */
234 #define CAN_INTEN_MIE6                 BIT(6)                                            /*!< enable message 6 transmission and reception interrupt */
235 #define CAN_INTEN_MIE7                 BIT(7)                                            /*!< enable message 7 transmission and reception interrupt */
236 #define CAN_INTEN_MIE8                 BIT(8)                                            /*!< enable message 8 transmission and reception interrupt */
237 #define CAN_INTEN_MIE9                 BIT(9)                                            /*!< enable message 9 transmission and reception interrupt */
238 #define CAN_INTEN_MIE10                BIT(10)                                           /*!< enable message 10 transmission and reception interrupt */
239 #define CAN_INTEN_MIE11                BIT(11)                                           /*!< enable message 11 transmission and reception interrupt */
240 #define CAN_INTEN_MIE12                BIT(12)                                           /*!< enable message 12 transmission and reception interrupt */
241 #define CAN_INTEN_MIE13                BIT(13)                                           /*!< enable message 13 transmission and reception interrupt */
242 #define CAN_INTEN_MIE14                BIT(14)                                           /*!< enable message 14 transmission and reception interrupt */
243 #define CAN_INTEN_MIE15                BIT(15)                                           /*!< enable message 15 transmission and reception interrupt */
244 #define CAN_INTEN_MIE16                BIT(16)                                           /*!< enable message 16 transmission and reception interrupt */
245 #define CAN_INTEN_MIE17                BIT(17)                                           /*!< enable message 17 transmission and reception interrupt */
246 #define CAN_INTEN_MIE18                BIT(18)                                           /*!< enable message 18 transmission and reception interrupt */
247 #define CAN_INTEN_MIE19                BIT(19)                                           /*!< enable message 19 transmission and reception interrupt */
248 #define CAN_INTEN_MIE20                BIT(20)                                           /*!< enable message 20 transmission and reception interrupt */
249 #define CAN_INTEN_MIE21                BIT(21)                                           /*!< enable message 21 transmission and reception interrupt */
250 #define CAN_INTEN_MIE22                BIT(22)                                           /*!< enable message 22 transmission and reception interrupt */
251 #define CAN_INTEN_MIE23                BIT(23)                                           /*!< enable message 23 transmission and reception interrupt */
252 #define CAN_INTEN_MIE24                BIT(24)                                           /*!< enable message 24 transmission and reception interrupt */
253 #define CAN_INTEN_MIE25                BIT(25)                                           /*!< enable message 25 transmission and reception interrupt */
254 #define CAN_INTEN_MIE26                BIT(26)                                           /*!< enable message 26 transmission and reception interrupt */
255 #define CAN_INTEN_MIE27                BIT(27)                                           /*!< enable message 27 transmission and reception interrupt */
256 #define CAN_INTEN_MIE28                BIT(28)                                           /*!< enable message 28 transmission and reception interrupt */
257 #define CAN_INTEN_MIE29                BIT(29)                                           /*!< enable message 29 transmission and reception interrupt */
258 #define CAN_INTEN_MIE30                BIT(30)                                           /*!< enable message 30 transmission and reception interrupt */
259 #define CAN_INTEN_MIE31                BIT(31)                                           /*!< enable message 31 transmission and reception interrupt */
260 
261 /* CAN_STAT */
262 #define CAN_STAT_MS0_RFC               BIT(0)                                            /*!< mailbox 0 state / clear rx fifo bit */
263 #define CAN_STAT_MS1_RES               BIT(1)                                            /*!< mailbox 1 state */
264 #define CAN_STAT_MS2_RES               BIT(2)                                            /*!< mailbox 2 state */
265 #define CAN_STAT_MS3_RES               BIT(3)                                            /*!< mailbox 3 state */
266 #define CAN_STAT_MS4_RES               BIT(4)                                            /*!< mailbox 4 state */
267 #define CAN_STAT_MS5_RFNE              BIT(5)                                            /*!< mailbox 5 state / rx fifo not empty */
268 #define CAN_STAT_MS6_RFW               BIT(6)                                            /*!< mailbox 6 state / rx fifo warning */
269 #define CAN_STAT_MS7_RFO               BIT(7)                                            /*!< mailbox 7 state / rx fifo overflow */
270 #define CAN_STAT_MS8                   BIT(8)                                            /*!< mailbox 8 state */
271 #define CAN_STAT_MS9                   BIT(9)                                            /*!< mailbox 9 state */
272 #define CAN_STAT_MS10                  BIT(10)                                           /*!< mailbox 10 state */
273 #define CAN_STAT_MS11                  BIT(11)                                           /*!< mailbox 11 state */
274 #define CAN_STAT_MS12                  BIT(12)                                           /*!< mailbox 12 state */
275 #define CAN_STAT_MS13                  BIT(13)                                           /*!< mailbox 13 state */
276 #define CAN_STAT_MS14                  BIT(14)                                           /*!< mailbox 14 state */
277 #define CAN_STAT_MS15                  BIT(15)                                           /*!< mailbox 15 state */
278 #define CAN_STAT_MS16                  BIT(16)                                           /*!< mailbox 16 state */
279 #define CAN_STAT_MS17                  BIT(17)                                           /*!< mailbox 17 state */
280 #define CAN_STAT_MS18                  BIT(18)                                           /*!< mailbox 18 state */
281 #define CAN_STAT_MS19                  BIT(19)                                           /*!< mailbox 19 state */
282 #define CAN_STAT_MS20                  BIT(20)                                           /*!< mailbox 20 state */
283 #define CAN_STAT_MS21                  BIT(21)                                           /*!< mailbox 21 state */
284 #define CAN_STAT_MS22                  BIT(22)                                           /*!< mailbox 22 state */
285 #define CAN_STAT_MS23                  BIT(23)                                           /*!< mailbox 23 state */
286 #define CAN_STAT_MS24                  BIT(24)                                           /*!< mailbox 24 state */
287 #define CAN_STAT_MS25                  BIT(25)                                           /*!< mailbox 25 state */
288 #define CAN_STAT_MS26                  BIT(26)                                           /*!< mailbox 26 state */
289 #define CAN_STAT_MS27                  BIT(27)                                           /*!< mailbox 27 state */
290 #define CAN_STAT_MS28                  BIT(28)                                           /*!< mailbox 28 state */
291 #define CAN_STAT_MS29                  BIT(29)                                           /*!< mailbox 29 state */
292 #define CAN_STAT_MS30                  BIT(30)                                           /*!< mailbox 30 state */
293 #define CAN_STAT_MS31                  BIT(31)                                           /*!< mailbox 31 state */
294 
295 /* CAN_CTL2 */
296 #define CAN_CTL2_EFDIS                 BIT(11)                                           /*!< disable edge filtering */
297 #define CAN_CTL2_ISO                   BIT(12)                                           /*!< ISO CAN FD */
298 #define CAN_CTL2_PREEN                 BIT(14)                                           /*!< protocol exception detection enable by CAN standard */
299 #define CAN_CTL2_ITSRC                 BIT(15)                                           /*!< internal counter source */
300 #define CAN_CTL2_IDERTR_RMF            BIT(16)                                           /*!< IDE and RTR field filter type for rx mailbox reception */
301 #define CAN_CTL2_RRFRMS                BIT(17)                                           /*!< remote request frame is stored */
302 #define CAN_CTL2_RFO                   BIT(18)                                           /*!< receive filter order */
303 #define CAN_CTL2_ASD                   BITS(19, 23)                                      /*!< arbitration start delay */
304 #define CAN_CTL2_RFFN                  BITS(24, 27)                                      /*!< rx fifo filter number */
305 #define CAN_CTL2_BORIE                 BIT(30)                                           /*!< enable bus off recovery interrupt */
306 #define CAN_CTL2_ERRFSIE               BIT(31)                                           /*!< error summary interrupt enable bit for data phase of FD frames with BRS bit set */
307 
308 /* CAN_CRCC */
309 #define CAN_CRCC_CRCTC                 BITS(0, 14)                                       /*!< transmitted CRC value for classical frames */
310 #define CAN_CRCC_ANTM                  BITS(16, 20)                                      /*!< associated number of mailbox for transmitting the CRCTC[14:0] value */
311 
312 /* CAN_RFIFOPUBF */
313 #define CAN_RFIFOPUBF_FFD0             BIT(0)                                            /*!< rx fifo filter data bit 0 */
314 #define CAN_RFIFOPUBF_FFD1             BIT(1)                                            /*!< rx fifo filter data bit 1 */
315 #define CAN_RFIFOPUBF_FFD2             BIT(2)                                            /*!< rx fifo filter data bit 2 */
316 #define CAN_RFIFOPUBF_FFD3             BIT(3)                                            /*!< rx fifo filter data bit 3 */
317 #define CAN_RFIFOPUBF_FFD4             BIT(4)                                            /*!< rx fifo filter data bit 4 */
318 #define CAN_RFIFOPUBF_FFD5             BIT(5)                                            /*!< rx fifo filter data bit 5 */
319 #define CAN_RFIFOPUBF_FFD6             BIT(6)                                            /*!< rx fifo filter data bit 6 */
320 #define CAN_RFIFOPUBF_FFD7             BIT(7)                                            /*!< rx fifo filter data bit 7 */
321 #define CAN_RFIFOPUBF_FFD8             BIT(8)                                            /*!< rx fifo filter data bit 8 */
322 #define CAN_RFIFOPUBF_FFD9             BIT(9)                                            /*!< rx fifo filter data bit 9 */
323 #define CAN_RFIFOPUBF_FFD10            BIT(10)                                           /*!< rx fifo filter data bit 10 */
324 #define CAN_RFIFOPUBF_FFD11            BIT(11)                                           /*!< rx fifo filter data bit 11 */
325 #define CAN_RFIFOPUBF_FFD12            BIT(12)                                           /*!< rx fifo filter data bit 12 */
326 #define CAN_RFIFOPUBF_FFD13            BIT(13)                                           /*!< rx fifo filter data bit 13 */
327 #define CAN_RFIFOPUBF_FFD14            BIT(14)                                           /*!< rx fifo filter data bit 14 */
328 #define CAN_RFIFOPUBF_FFD15            BIT(15)                                           /*!< rx fifo filter data bit 15 */
329 #define CAN_RFIFOPUBF_FFD16            BIT(16)                                           /*!< rx fifo filter data bit 16 */
330 #define CAN_RFIFOPUBF_FFD17            BIT(17)                                           /*!< rx fifo filter data bit 17 */
331 #define CAN_RFIFOPUBF_FFD18            BIT(18)                                           /*!< rx fifo filter data bit 18 */
332 #define CAN_RFIFOPUBF_FFD19            BIT(19)                                           /*!< rx fifo filter data bit 19 */
333 #define CAN_RFIFOPUBF_FFD20            BIT(20)                                           /*!< rx fifo filter data bit 20 */
334 #define CAN_RFIFOPUBF_FFD21            BIT(21)                                           /*!< rx fifo filter data bit 21 */
335 #define CAN_RFIFOPUBF_FFD22            BIT(22)                                           /*!< rx fifo filter data bit 22 */
336 #define CAN_RFIFOPUBF_FFD23            BIT(23)                                           /*!< rx fifo filter data bit 23 */
337 #define CAN_RFIFOPUBF_FFD24            BIT(24)                                           /*!< rx fifo filter data bit 24 */
338 #define CAN_RFIFOPUBF_FFD25            BIT(25)                                           /*!< rx fifo filter data bit 25 */
339 #define CAN_RFIFOPUBF_FFD26            BIT(26)                                           /*!< rx fifo filter data bit 26 */
340 #define CAN_RFIFOPUBF_FFD27            BIT(27)                                           /*!< rx fifo filter data bit 27 */
341 #define CAN_RFIFOPUBF_FFD28            BIT(28)                                           /*!< rx fifo filter data bit 28 */
342 #define CAN_RFIFOPUBF_FFD29            BIT(29)                                           /*!< rx fifo filter data bit 29 */
343 #define CAN_RFIFOPUBF_FFD30            BIT(30)                                           /*!< rx fifo filter data bit 30 */
344 #define CAN_RFIFOPUBF_FFD31            BIT(31)                                           /*!< rx fifo filter data bit 31 */
345 
346 /* CAN_RFIFOIFMN */
347 #define CAN_RFIFOIFMN_IDFMN            BITS(0, 8)                                        /*!< identifier filter matching number */
348 
349 /* CAN_BT */
350 #define CAN_BT_PBS2                    BITS(0, 4)                                        /*!< phase buffer segment 2 */
351 #define CAN_BT_PBS1                    BITS(5, 9)                                        /*!< phase buffer segment 1 */
352 #define CAN_BT_PTS                     BITS(10, 15)                                      /*!< propagation time segment */
353 #define CAN_BT_SJW                     BITS(16, 20)                                      /*!< resynchronization jump width */
354 #define CAN_BT_BAUDPSC                 BITS(21, 30)                                      /*!< baud rate prescaler */
355 
356 /* CAN_RFIFOMPFx, x = 0..31 */
357 #define CAN_RFIFOMPF_FMFD0             BIT(0)                                            /*!< fifo / mailbox filter data bit 0 */
358 #define CAN_RFIFOMPF_FMFD1             BIT(1)                                            /*!< fifo / mailbox filter data bit 1 */
359 #define CAN_RFIFOMPF_FMFD2             BIT(2)                                            /*!< fifo / mailbox filter data bit 2 */
360 #define CAN_RFIFOMPF_FMFD3             BIT(3)                                            /*!< fifo / mailbox filter data bit 3 */
361 #define CAN_RFIFOMPF_FMFD4             BIT(4)                                            /*!< fifo / mailbox filter data bit 4 */
362 #define CAN_RFIFOMPF_FMFD5             BIT(5)                                            /*!< fifo / mailbox filter data bit 5 */
363 #define CAN_RFIFOMPF_FMFD6             BIT(6)                                            /*!< fifo / mailbox filter data bit 6 */
364 #define CAN_RFIFOMPF_FMFD7             BIT(7)                                            /*!< fifo / mailbox filter data bit 7 */
365 #define CAN_RFIFOMPF_FMFD8             BIT(8)                                            /*!< fifo / mailbox filter data bit 8 */
366 #define CAN_RFIFOMPF_FMFD9             BIT(9)                                            /*!< fifo / mailbox filter data bit 9 */
367 #define CAN_RFIFOMPF_FMFD10            BIT(10)                                           /*!< fifo / mailbox filter data bit 10 */
368 #define CAN_RFIFOMPF_FMFD11            BIT(11)                                           /*!< fifo / mailbox filter data bit 11 */
369 #define CAN_RFIFOMPF_FMFD12            BIT(12)                                           /*!< fifo / mailbox filter data bit 12 */
370 #define CAN_RFIFOMPF_FMFD13            BIT(13)                                           /*!< fifo / mailbox filter data bit 13 */
371 #define CAN_RFIFOMPF_FMFD14            BIT(14)                                           /*!< fifo / mailbox filter data bit 14 */
372 #define CAN_RFIFOMPF_FMFD15            BIT(15)                                           /*!< fifo / mailbox filter data bit 15 */
373 #define CAN_RFIFOMPF_FMFD16            BIT(16)                                           /*!< fifo / mailbox filter data bit 16 */
374 #define CAN_RFIFOMPF_FMFD17            BIT(17)                                           /*!< fifo / mailbox filter data bit 17 */
375 #define CAN_RFIFOMPF_FMFD18            BIT(18)                                           /*!< fifo / mailbox filter data bit 18 */
376 #define CAN_RFIFOMPF_FMFD19            BIT(19)                                           /*!< fifo / mailbox filter data bit 19 */
377 #define CAN_RFIFOMPF_FMFD20            BIT(20)                                           /*!< fifo / mailbox filter data bit 20 */
378 #define CAN_RFIFOMPF_FMFD21            BIT(21)                                           /*!< fifo / mailbox filter data bit 21 */
379 #define CAN_RFIFOMPF_FMFD22            BIT(22)                                           /*!< fifo / mailbox filter data bit 22 */
380 #define CAN_RFIFOMPF_FMFD23            BIT(23)                                           /*!< fifo / mailbox filter data bit 23 */
381 #define CAN_RFIFOMPF_FMFD24            BIT(24)                                           /*!< fifo / mailbox filter data bit 24 */
382 #define CAN_RFIFOMPF_FMFD25            BIT(25)                                           /*!< fifo / mailbox filter data bit 25 */
383 #define CAN_RFIFOMPF_FMFD26            BIT(26)                                           /*!< fifo / mailbox filter data bit 26 */
384 #define CAN_RFIFOMPF_FMFD27            BIT(27)                                           /*!< fifo / mailbox filter data bit 27 */
385 #define CAN_RFIFOMPF_FMFD28            BIT(28)                                           /*!< fifo / mailbox filter data bit 28 */
386 #define CAN_RFIFOMPF_FMFD29            BIT(29)                                           /*!< fifo / mailbox filter data bit 29 */
387 #define CAN_RFIFOMPF_FMFD30            BIT(30)                                           /*!< fifo / mailbox filter data bit 30 */
388 #define CAN_RFIFOMPF_FMFD31            BIT(31)                                           /*!< fifo / mailbox filter data bit 31 */
389 
390 /* CAN_PN_CTL0 */
391 #define CAN_PN_CTL0_FFT                BITS(0, 1)                                        /*!< frame filtering type in Pretended Networking mode */
392 #define CAN_PN_CTL0_IDFT               BITS(2, 3)                                        /*!< ID field filtering type in Pretended Networking mode */
393 #define CAN_PN_CTL0_DATAFT             BITS(4, 5)                                        /*!< data field filtering type in Pretended Networking mode */
394 #define CAN_PN_CTL0_NMM                BITS(8, 15)                                       /*!< number of messages matching times */
395 #define CAN_PN_CTL0_WMIE               BIT(16)                                           /*!< enable wakeup match interrupt */
396 #define CAN_PN_CTL0_WTOIE              BIT(17)                                           /*!< enable wakeup timeout interrupt */
397 
398 /* CAN_PN_TO */
399 #define CAN_PN_TO_WTO                  BITS(0, 15)                                       /*!< wakeup timeout */
400 
401 /* CAN_PN_STAT */
402 #define CAN_PN_STAT_MMCNTS             BIT(7)                                            /*!< matching message counter state */
403 #define CAN_PN_STAT_MMCNT              BITS(8, 15)                                       /*!< matching message counter in Pretended Networking mode */
404 #define CAN_PN_STAT_WMS                BIT(16)                                           /*!< wakeup match flag status */
405 #define CAN_PN_STAT_WTOS               BIT(17)                                           /*!< wakeup timeout flag status */
406 
407 /* CAN_PN_EID0 */
408 #define CAN_PN_EID0_EID_ELT            BITS(0, 28)                                       /*!< expected ID field / expected ID low threshold in Pretended Networking mode */
409 #define CAN_PN_EID0_ERTR               BIT(29)                                           /*!< expected RTR in Pretended Networking mode */
410 #define CAN_PN_EID0_EIDE               BIT(30)                                           /*!< expected IDE in Pretended Networking mode */
411 
412 /* CAN_PN_EDLC */
413 #define CAN_PN_EDLC_DLCEHT             BITS(0, 3)                                        /*!< DLC expected high threshold in Pretended Networking mode */
414 #define CAN_PN_EDLC_DLCELT             BITS(16, 19)                                      /*!< DLC expected low threshold in Pretended Networking mode */
415 
416 /* CAN_PN_EDL0 */
417 #define CAN_PN_EDL0_DB3ELT             BITS(0, 7)                                        /*!< data byte 3 expected low threshold in Pretended Networking mode */
418 #define CAN_PN_EDL0_DB2ELT             BITS(8, 15)                                       /*!< data byte 2 expected low threshold in Pretended Networking mode */
419 #define CAN_PN_EDL0_DB1ELT             BITS(16, 23)                                      /*!< data byte 1 expected low threshold in Pretended Networking mode */
420 #define CAN_PN_EDL0_DB0ELT             BITS(24, 31)                                      /*!< data byte 0 expected low threshold in Pretended Networking mode */
421 
422 /* CAN_PN_EDL1 */
423 #define CAN_PN_EDL1_DB7ELT             BITS(0, 7)                                        /*!< data byte 7 expected low threshold in Pretended Networking mode */
424 #define CAN_PN_EDL1_DB6ELT             BITS(8, 15)                                       /*!< data byte 6 expected low threshold in Pretended Networking mode */
425 #define CAN_PN_EDL1_DB5ELT             BITS(16, 23)                                      /*!< data byte 5 expected low threshold in Pretended Networking mode */
426 #define CAN_PN_EDL1_DB4ELT             BITS(24, 31)                                      /*!< data byte 4 expected low threshold in Pretended Networking mode */
427 
428 /* CAN_PN_IFEID1 */
429 #define CAN_PN_IFEID1_IDFD_EHT         BITS(0, 28)                                       /*!< IDE filter data in Pretended Networking mode */
430 #define CAN_PN_IFEID1_RTRFD            BIT(29)                                           /*!< RTR filter data in Pretended Networking mode */
431 #define CAN_PN_IFEID1_IDEFD            BIT(30)                                           /*!< ID filter data / ID expected high threshold in Pretended Networking mode */
432 
433 /* CAN_PN_DF0EDH0 */
434 #define CAN_PN_DF0EDH0_DB3FD_EHT       BITS(0, 7)                                        /*!< data byte 3 filter data / data byte 3 expected high threshold in Pretended Networking mode */
435 #define CAN_PN_DF0EDH0_DB2FD_EHT       BITS(8, 15)                                       /*!< data byte 2 filter data / data byte 2 expected high threshold in Pretended Networking mode */
436 #define CAN_PN_DF0EDH0_DB1FD_EHT       BITS(16, 23)                                      /*!< data byte 1 filter data / data byte 1 expected high threshold in Pretended Networking mode */
437 #define CAN_PN_DF0EDH0_DB0FD_EHT       BITS(24, 31)                                      /*!< data byte 0 filter data / data byte 0 expected high threshold in Pretended Networking mode */
438 
439 /* CAN_PN_DF1EDH1 */
440 #define CAN_PN_DF1EDH1_DB7FD_EHT       BITS(0, 7)                                        /*!< data byte 7 filter data / data byte 7 expected high threshold in Pretended Networking mode */
441 #define CAN_PN_DF1EDH1_DB6FD_EHT       BITS(8, 15)                                       /*!< data byte 6 filter data / data byte 6 expected high threshold in Pretended Networking mode */
442 #define CAN_PN_DF1EDH1_DB5FD_EHT       BITS(16, 23)                                      /*!< data byte 5 filter data / data byte 5 expected high threshold in Pretended Networking mode */
443 #define CAN_PN_DF1EDH1_DB4FD_EHT       BITS(24, 31)                                      /*!< data byte 4 filter data / data byte 4 expected high threshold in Pretended Networking mode */
444 
445 /* CAN_PN_RWMxCS, x = 0..3 */
446 #define CAN_PN_RWMXCS_RDLC             BITS(16, 19)                                      /*!< received DLC bits */
447 #define CAN_PN_RWMXCS_RRTR             BIT(20)                                           /*!< received RTR bit */
448 #define CAN_PN_RWMXCS_RIDE             BIT(21)                                           /*!< received IDE bit */
449 #define CAN_PN_RWMXCS_RSRR             BIT(22)                                           /*!< received SRR bit */
450 
451 /* CAN_PN_RWMxI, x = 0..3 */
452 #define CAN_PN_RWMXI_RID               BITS(0, 28)                                       /*!< received ID bits */
453 
454 /* CAN_PN_RWMxD0, x = 0..3 */
455 #define CAN_PN_RWMXD0_RDB3             BITS(0, 7)                                        /*!< received data byte 3 */
456 #define CAN_PN_RWMXD0_RDB2             BITS(8, 15)                                       /*!< received data byte 2 */
457 #define CAN_PN_RWMXD0_RDB1             BITS(16, 23)                                      /*!< received data byte 1 */
458 #define CAN_PN_RWMXD0_RDB0             BITS(24, 31)                                      /*!< received data byte 0 */
459 
460 /* CAN_PN_RWMxD1, x = 0..3 */
461 #define CAN_PN_RWMXD1_RDB7             BITS(0, 7)                                        /*!< received data byte 7 */
462 #define CAN_PN_RWMXD1_RDB6             BITS(8, 15)                                       /*!< received data byte 6 */
463 #define CAN_PN_RWMXD1_RDB5             BITS(16, 23)                                      /*!< received data byte 5 */
464 #define CAN_PN_RWMXD1_RDB4             BITS(24, 31)                                      /*!< received data byte 4 */
465 
466 /* CAN_FDCTL */
467 #define CAN_FDCTL_TDCV                 BITS(0, 5)                                        /*!< transmitter delay compensation value */
468 #define CAN_FDCTL_TDCO                 BITS(8, 12)                                       /*!< transmitter delay compensation offset */
469 #define CAN_FDCTL_TDCS                 BIT(14)                                           /*!< transmitter delay compensation status */
470 #define CAN_FDCTL_TDCEN                BIT(15)                                           /*!< transmitter delay compensation enable */
471 #define CAN_FDCTL_MDSZ                 BITS(16, 17)                                      /*!< mailbox data size */
472 #define CAN_FDCTL_BRSEN                BIT(31)                                           /*!< bit rate of data switch enable */
473 
474 /* CAN_FDBT */
475 #define CAN_FDBT_DPBS2                 BITS(0, 2)                                        /*!< phase buffer segment 2 for data bit time */
476 #define CAN_FDBT_DPBS1                 BITS(5, 7)                                        /*!< phase buffer segment 1 for data bit time */
477 #define CAN_FDBT_DPTS                  BITS(10, 14)                                      /*!< propagation time segment for data bit time */
478 #define CAN_FDBT_DSJW                  BITS(16, 18)                                      /*!< resynchronization jump width for data bit time */
479 #define CAN_FDBT_DBAUDPSC              BITS(20, 29)                                      /*!< baud rate prescaler for data bit time */
480 
481 /* CAN_CRCCFD */
482 #define CAN_CRCCFD_CRCTCI              BITS(0, 20)                                       /*!< transmitted CRC value for classical and ISO / non-ISO frames */
483 #define CAN_CRCCFD_ANTM                BITS(24, 28)                                      /*!< associated number of mailbox for transmitting the CRCTCI[20:0] value */
484 
485 /* CAN_MDES0 */
486 #define CAN_MDES0_TIMESTAMP            BITS(0, 15)                                       /*!< free-running counter timestamp */
487 #define CAN_MDES0_DLC                  BITS(16, 19)                                      /*!< data length code in bytes */
488 #define CAN_MDES0_RTR                  BIT(20)                                           /*!< remote transmission request */
489 #define CAN_MDES0_IDE                  BIT(21)                                           /*!< ID extended bit */
490 #define CAN_MDES0_SRR                  BIT(22)                                           /*!< substitute remote request */
491 #define CAN_MDES0_CODE                 BITS(24, 27)                                      /*!< mailbox code */
492 #define CAN_MDES0_ESI                  BIT(29)                                           /*!< error state indicator */
493 #define CAN_MDES0_BRS                  BIT(30)                                           /*!< bit rate switch */
494 #define CAN_MDES0_FDF                  BIT(31)                                           /*!< FD format indicator */
495 
496 /* CAN_MDES1 */
497 #define CAN_MDES1_ID_EXD               BITS(0, 17)                                       /*!< identifier for extended frame */
498 #define CAN_MDES1_ID_STD               BITS(18, 28)                                      /*!< identifier for standard frame */
499 #define CAN_MDES1_PRIO                 BITS(29, 31)                                      /*!< local priority */
500 
501 /* CAN_FDES0 */
502 #define CAN_FDES0_TIMESTAMP            BITS(0, 15)                                       /*!< free-running counter timestamp */
503 #define CAN_FDES0_DLC                  BITS(16, 19)                                      /*!< data length code in bytes */
504 #define CAN_FDES0_RTR                  BIT(20)                                           /*!< remote transmission request */
505 #define CAN_FDES0_IDE                  BIT(21)                                           /*!< ID extended bit */
506 #define CAN_FDES0_SRR                  BIT(22)                                           /*!< substitute remote request */
507 #define CAN_FDES0_IDFMN                BITS(23, 31)                                      /*!< identifier filter matching number */
508 
509 /* CAN_FDES1 */
510 #define CAN_FDES1_ID_EXT               BITS(0, 17)                                       /*!< identifier for extended frame */
511 #define CAN_FDES1_ID_STD               BITS(18, 28)                                      /*!< identifier for standard frame */
512 
513 /* CAN_FDESX_A */
514 #define CAN_FDESX_ID_EXD_A             BITS(0, 28)                                       /*!< extended ID in format A */
515 #define CAN_FDESX_ID_STD_A             BITS(18, 28)                                      /*!< standard ID in format A */
516 #define CAN_FDESX_IDE_A                BIT(30)                                           /*!< ID extended frame for format A */
517 #define CAN_FDESX_RTR_A                BIT(31)                                           /*!< remote frame for format A */
518 
519 /* CAN_FDESX_B */
520 #define CAN_FDESX_ID_EXD_B_1           BITS(0, 13)                                       /*!< extended ID 1 in format B */
521 #define CAN_FDESX_ID_STD_B_1           BITS(3, 13)                                       /*!< standard ID 1 in format B */
522 #define CAN_FDESX_IDE_B1               BIT(14)                                           /*!< ID extended frame 1 for format B */
523 #define CAN_FDESX_RTR_B1               BIT(15)                                           /*!< remote frame 1 for format B */
524 #define CAN_FDESX_ID_EXD_B_0           BITS(16, 29)                                      /*!< extended ID 0 in format B */
525 #define CAN_FDESX_ID_STD_B_0           BITS(19, 29)                                      /*!< standard ID 0 in format B */
526 #define CAN_FDESX_IDE_B0               BIT(30)                                           /*!< ID extended frame 0 for format B */
527 #define CAN_FDESX_RTR_B0               BIT(31)                                           /*!< remote frame 0 for format B */
528 
529 /* CAN_FDESX_C */
530 #define CAN_FDESX_ID_C_3               BITS(0, 7)                                        /*!< ID for frame 3 for format C */
531 #define CAN_FDESX_ID_C_2               BITS(8, 15)                                       /*!< ID for frame 2 for format C */
532 #define CAN_FDESX_ID_C_1               BITS(16, 23)                                      /*!< ID for frame 1 for format C */
533 #define CAN_FDESX_ID_C_0               BITS(24, 31)                                      /*!< ID for frame 0 for format C */
534 
535 /* consts definitions */
536 /* define the CAN bit position and its register index offset */
537 #define CAN_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6U) | (uint32_t)(bitpos))
538 #define CAN_REG_VAL(canx, offset)      (REG32((uint32_t)(canx) + ((uint32_t)(offset) >> 6U)))
539 #define CAN_BIT_POS(val)               ((uint32_t)(val) & 0x0000001FU)
540 #define CAN_RFIFOMPF(canx, num)        REG32((canx) + 0x00000880U + (num) * 0x00000004U) /*!< CAN receive fifo / mailbox private filter x register */
541 
542 /* register offset */
543 #define CTL0_REG_OFFSET                ((uint32_t)0x00000000U)                           /*!< CTL0 register offset */
544 #define CTL1_REG_OFFSET                ((uint32_t)0x00000004U)                           /*!< CTL1 register offset */
545 #define ERR1_REG_OFFSET                ((uint32_t)0x00000020U)                           /*!< ERR1 register offset */
546 #define INTEN_REG_OFFSET               ((uint32_t)0x00000028U)                           /*!< INTEN register offset */
547 #define STAT_REG_OFFSET                ((uint32_t)0x00000030U)                           /*!< STAT register offset */
548 #define CTL2_REG_OFFSET                ((uint32_t)0x00000034U)                           /*!< CTL2 register offset */
549 #define PN_CTL0_REG_OFFSET             ((uint32_t)0x00000B00U)                           /*!< PN_CTL0 register offset */
550 #define PN_STAT_REG_OFFSET             ((uint32_t)0x00000B08U)                           /*!< PN_STAT register offset */
551 #define FDCTL_REG_OFFSET               ((uint32_t)0x00000C00U)                           /*!< FDCTL register offset */
552 
553 /* CAN interrupt enable or disable */
554 typedef enum {
555     /* interrupt in CLT1 register */
556     CAN_INT_RX_WARNING            = CAN_REGIDX_BIT(CTL1_REG_OFFSET, 10U),                /*!< receive warning interrupt */
557     CAN_INT_TX_WARNING            = CAN_REGIDX_BIT(CTL1_REG_OFFSET, 11U),                /*!< transmit warning interrupt */
558     CAN_INT_ERR_SUMMARY           = CAN_REGIDX_BIT(CTL1_REG_OFFSET, 14U),                /*!< error interrupt */
559     CAN_INT_BUSOFF                = CAN_REGIDX_BIT(CTL1_REG_OFFSET, 15U),                /*!< bus off interrupt */
560     /* interrupt in CLT2 register */
561     CAN_INT_BUSOFF_RECOVERY       = CAN_REGIDX_BIT(CTL2_REG_OFFSET, 30U),                /*!< bus off recovery interrupt */
562     CAN_INT_ERR_SUMMARY_FD        = CAN_REGIDX_BIT(CTL2_REG_OFFSET, 31U),                /*!< fd error interrupt */
563     /* interrupt in INTEN register */
564     CAN_INT_MB0                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 0U),                /*!< mailbox 0 interrupt */
565     CAN_INT_MB1                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 1U),                /*!< mailbox 1 interrupt */
566     CAN_INT_MB2                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 2U),                /*!< mailbox 2 interrupt */
567     CAN_INT_MB3                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 3U),                /*!< mailbox 3 interrupt */
568     CAN_INT_MB4                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 4U),                /*!< mailbox 4 interrupt */
569     CAN_INT_MB5                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 5U),                /*!< mailbox 5 interrupt */
570     CAN_INT_MB6                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 6U),                /*!< mailbox 6 interrupt */
571     CAN_INT_MB7                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 7U),                /*!< mailbox 7 interrupt */
572     CAN_INT_MB8                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 8U),                /*!< mailbox 8 interrupt */
573     CAN_INT_MB9                   = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 9U),                /*!< mailbox 9 interrupt */
574     CAN_INT_MB10                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 10U),               /*!< mailbox 10 interrupt */
575     CAN_INT_MB11                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 11U),               /*!< mailbox 11 interrupt */
576     CAN_INT_MB12                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 12U),               /*!< mailbox 12 interrupt */
577     CAN_INT_MB13                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 13U),               /*!< mailbox 13 interrupt */
578     CAN_INT_MB14                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 14U),               /*!< mailbox 14 interrupt */
579     CAN_INT_MB15                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 15U),               /*!< mailbox 15 interrupt */
580     CAN_INT_MB16                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 16U),               /*!< mailbox 16 interrupt */
581     CAN_INT_MB17                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 17U),               /*!< mailbox 17 interrupt */
582     CAN_INT_MB18                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 18U),               /*!< mailbox 18 interrupt */
583     CAN_INT_MB19                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 19U),               /*!< mailbox 19 interrupt */
584     CAN_INT_MB20                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 20U),               /*!< mailbox 20 interrupt */
585     CAN_INT_MB21                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 21U),               /*!< mailbox 21 interrupt */
586     CAN_INT_MB22                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 22U),               /*!< mailbox 22 interrupt */
587     CAN_INT_MB23                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 23U),               /*!< mailbox 23 interrupt */
588     CAN_INT_MB24                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 24U),               /*!< mailbox 24 interrupt */
589     CAN_INT_MB25                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 25U),               /*!< mailbox 25 interrupt */
590     CAN_INT_MB26                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 26U),               /*!< mailbox 26 interrupt */
591     CAN_INT_MB27                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 27U),               /*!< mailbox 27 interrupt */
592     CAN_INT_MB28                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 28U),               /*!< mailbox 28 interrupt */
593     CAN_INT_MB29                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 29U),               /*!< mailbox 29 interrupt */
594     CAN_INT_MB30                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 30U),               /*!< mailbox 30 interrupt */
595     CAN_INT_MB31                  = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 31U),               /*!< mailbox 31 interrupt */
596     CAN_INT_FIFO_AVAILABLE        = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 5U),                /*!< fifo availabe interrupt */
597     CAN_INT_FIFO_WARNING          = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 6U),                /*!< fifo warning interrupt */
598     CAN_INT_FIFO_OVERFLOW         = CAN_REGIDX_BIT(INTEN_REG_OFFSET, 7U),                /*!< fifo overflow interrupt */
599     /* interrupt in PN_CTL0 registeister */
600     CAN_INT_WAKEUP_MATCH          = CAN_REGIDX_BIT(PN_CTL0_REG_OFFSET, 16U),             /*!< Pretended Networking match interrupt */
601     CAN_INT_WAKEUP_TIMEOUT        = CAN_REGIDX_BIT(PN_CTL0_REG_OFFSET, 17U)              /*!< Pretended Networking timeout wakeup interrupt */
602 } can_interrupt_enum;
603 
604 /* CAN flags */
605 typedef enum {
606     /* flags in CTL0 register */
607     CAN_FLAG_CAN_PN            = CAN_REGIDX_BIT(CTL0_REG_OFFSET, 18U),                   /*!< Pretended Networking state flag */
608     CAN_FLAG_SOFT_RST             = CAN_REGIDX_BIT(CTL0_REG_OFFSET, 25U),                /*!< software reset flag */
609     /* flags in ERR1 register */
610     CAN_FLAG_ERR_SUMMARY          = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 1U),                 /*!< error summary flag */
611     CAN_FLAG_BUSOFF               = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 2U),                 /*!< bus off flag */
612     CAN_FLAG_RECEIVING            = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 3U),                 /*!< receiving state flag */
613     CAN_FLAG_TRANSMITTING         = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 6U),                 /*!< transmitting state flag */
614     CAN_FLAG_IDLE                 = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 7U),                 /*!< IDLE state flag */
615     CAN_FLAG_RX_WARNING           = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 8U),                 /*!< receive warning flag */
616     CAN_FLAG_TX_WARNING           = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 9U),                 /*!< transmit warning flag */
617     CAN_FLAG_STUFF_ERR            = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 10U),                /*!< stuff error flag */
618     CAN_FLAG_FORM_ERR             = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 11U),                /*!< form error flag */
619     CAN_FLAG_CRC_ERR              = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 12U),                /*!< CRC error flag */
620     CAN_FLAG_ACK_ERR              = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 13U),                /*!< ACK error flag */
621     CAN_FLAG_BIT_DOMINANT_ERR     = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 14U),                /*!< bit dominant error flag */
622     CAN_FLAG_BIT_RECESSIVE_ERR    = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 15U),                /*!< bit recessive error flag */
623     CAN_FLAG_SYNC_ERR             = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 18U),                /*!< synchronization flag */
624     CAN_FLAG_BUSOFF_RECOVERY      = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 19U),                /*!< bus off recovery flag */
625     CAN_FLAG_ERR_SUMMARY_FD       = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 20U),                /*!< FD error summary flag */
626     CAN_FLAG_ERR_OVERRUN          = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 21U),                /*!< error overrun flag */
627     CAN_FLAG_STUFF_ERR_FD         = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 26U),                /*!< stuff error in FD data phase flag */
628     CAN_FLAG_FORM_ERR_FD          = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 27U),                /*!< form error in FD data phase flag */
629     CAN_FLAG_CRC_ERR_FD           = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 28U),                /*!< CRC error in FD data phase flag */
630     CAN_FLAG_BIT_DOMINANT_ERR_FD  = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 30U),                /*!< bit dominant error in FD data phase flag */
631     CAN_FLAG_BIT_RECESSIVE_ERR_FD = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 31U),                /*!< bit recessive error in FD data phase flag */
632     /* flags in STAT register */
633     CAN_FLAG_MB0                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 0U),                 /*!< mailbox 0 flag */
634     CAN_FLAG_MB1                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 1U),                 /*!< mailbox 1 flag */
635     CAN_FLAG_MB2                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 2U),                 /*!< mailbox 2 flag */
636     CAN_FLAG_MB3                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 3U),                 /*!< mailbox 3 flag */
637     CAN_FLAG_MB4                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 4U),                 /*!< mailbox 4 flag */
638     CAN_FLAG_MB5                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 5U),                 /*!< mailbox 5 flag */
639     CAN_FLAG_MB6                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 6U),                 /*!< mailbox 6 flag */
640     CAN_FLAG_MB7                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 7U),                 /*!< mailbox 7 flag */
641     CAN_FLAG_MB8                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 8U),                 /*!< mailbox 8 flag */
642     CAN_FLAG_MB9                  = CAN_REGIDX_BIT(STAT_REG_OFFSET, 9U),                 /*!< mailbox 9 flag */
643     CAN_FLAG_MB10                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 10U),                /*!< mailbox 10 flag */
644     CAN_FLAG_MB11                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 11U),                /*!< mailbox 11 flag */
645     CAN_FLAG_MB12                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 12U),                /*!< mailbox 12 flag */
646     CAN_FLAG_MB13                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 13U),                /*!< mailbox 13 flag */
647     CAN_FLAG_MB14                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 14U),                /*!< mailbox 14 flag */
648     CAN_FLAG_MB15                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 15U),                /*!< mailbox 15 flag */
649     CAN_FLAG_MB16                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 16U),                /*!< mailbox 16 flag */
650     CAN_FLAG_MB17                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 17U),                /*!< mailbox 17 flag */
651     CAN_FLAG_MB18                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 18U),                /*!< mailbox 18 flag */
652     CAN_FLAG_MB19                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 19U),                /*!< mailbox 19 flag */
653     CAN_FLAG_MB20                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 20U),                /*!< mailbox 20 flag */
654     CAN_FLAG_MB21                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 21U),                /*!< mailbox 21 flag */
655     CAN_FLAG_MB22                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 22U),                /*!< mailbox 22 flag */
656     CAN_FLAG_MB23                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 23U),                /*!< mailbox 23 flag */
657     CAN_FLAG_MB24                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 24U),                /*!< mailbox 24 flag */
658     CAN_FLAG_MB25                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 25U),                /*!< mailbox 25 flag */
659     CAN_FLAG_MB26                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 26U),                /*!< mailbox 26 flag */
660     CAN_FLAG_MB27                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 27U),                /*!< mailbox 27 flag */
661     CAN_FLAG_MB28                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 28U),                /*!< mailbox 28 flag */
662     CAN_FLAG_MB29                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 29U),                /*!< mailbox 29 flag */
663     CAN_FLAG_MB30                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 30U),                /*!< mailbox 30 flag */
664     CAN_FLAG_MB31                 = CAN_REGIDX_BIT(STAT_REG_OFFSET, 31U),                /*!< mailbox 31 flag */
665     CAN_FLAG_FIFO_AVAILABLE       = CAN_REGIDX_BIT(STAT_REG_OFFSET, 5U),                 /*!< fifo availabe flag */
666     CAN_FLAG_FIFO_WARNING         = CAN_REGIDX_BIT(STAT_REG_OFFSET, 6U),                 /*!< fifo warning flag */
667     CAN_FLAG_FIFO_OVERFLOW        = CAN_REGIDX_BIT(STAT_REG_OFFSET, 7U),                 /*!< fifo overflow flag */
668     /* flags in PN_STAT register */
669     CAN_FLAG_WAKEUP_MATCH         = CAN_REGIDX_BIT(PN_STAT_REG_OFFSET, 16U),             /*!< Pretended Networking match flag */
670     CAN_FLAG_WAKEUP_TIMEOUT       = CAN_REGIDX_BIT(PN_STAT_REG_OFFSET, 17U),             /*!< Pretended Networking timeout wakeup flag */
671     /* flags in FDCTL register */
672     CAN_FLAG_TDC_OUT_OF_RANGE     = CAN_REGIDX_BIT(FDCTL_REG_OFFSET, 14U),               /*!< transmitter delay is out of compensation range flag */
673 } can_flag_enum;
674 
675 /* CAN interrupt flags */
676 typedef enum {
677     /* interrupt flags in ERR1 register */
678     CAN_INT_FLAG_ERR_SUMMARY      = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 1U),                 /*!< error summary interrupt flag */
679     CAN_INT_FLAG_BUSOFF           = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 2U),                 /*!< bus off interrupt flag */
680     CAN_INT_FLAG_RX_WARNING       = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 16U),                /*!< receive warning interrupt flag */
681     CAN_INT_FLAG_TX_WARNING       = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 17U),                /*!< transmit warning interrupt flag */
682     CAN_INT_FLAG_BUSOFF_RECOVERY  = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 19U),                /*!< bus off recovery interrupt flag */
683     CAN_INT_FLAG_ERR_SUMMARY_FD   = CAN_REGIDX_BIT(ERR1_REG_OFFSET, 20U),                /*!< fd error summary interrupt flag */
684     /* interrupt flags in STAT register */
685     CAN_INT_FLAG_MB0              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 0U),                 /*!< mailbox 0 interrupt flag */
686     CAN_INT_FLAG_MB1              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 1U),                 /*!< mailbox 1 interrupt flag */
687     CAN_INT_FLAG_MB2              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 2U),                 /*!< mailbox 2 interrupt flag */
688     CAN_INT_FLAG_MB3              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 3U),                 /*!< mailbox 3 interrupt flag */
689     CAN_INT_FLAG_MB4              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 4U),                 /*!< mailbox 4 interrupt flag */
690     CAN_INT_FLAG_MB5              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 5U),                 /*!< mailbox 5 interrupt flag */
691     CAN_INT_FLAG_MB6              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 6U),                 /*!< mailbox 6 interrupt flag */
692     CAN_INT_FLAG_MB7              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 7U),                 /*!< mailbox 7 interrupt flag */
693     CAN_INT_FLAG_MB8              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 8U),                 /*!< mailbox 8 interrupt flag */
694     CAN_INT_FLAG_MB9              = CAN_REGIDX_BIT(STAT_REG_OFFSET, 9U),                 /*!< mailbox 9 interrupt flag */
695     CAN_INT_FLAG_MB10             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 10U),                /*!< mailbox 10 interrupt flag */
696     CAN_INT_FLAG_MB11             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 11U),                /*!< mailbox 11 interrupt flag */
697     CAN_INT_FLAG_MB12             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 12U),                /*!< mailbox 12 interrupt flag */
698     CAN_INT_FLAG_MB13             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 13U),                /*!< mailbox 13 interrupt flag */
699     CAN_INT_FLAG_MB14             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 14U),                /*!< mailbox 14 interrupt flag */
700     CAN_INT_FLAG_MB15             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 15U),                /*!< mailbox 15 interrupt flag */
701     CAN_INT_FLAG_MB16             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 16U),                /*!< mailbox 16 interrupt flag */
702     CAN_INT_FLAG_MB17             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 17U),                /*!< mailbox 17 interrupt flag */
703     CAN_INT_FLAG_MB18             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 18U),                /*!< mailbox 18 interrupt flag */
704     CAN_INT_FLAG_MB19             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 19U),                /*!< mailbox 19 interrupt flag */
705     CAN_INT_FLAG_MB20             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 20U),                /*!< mailbox 20 interrupt flag */
706     CAN_INT_FLAG_MB21             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 21U),                /*!< mailbox 21 interrupt flag */
707     CAN_INT_FLAG_MB22             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 22U),                /*!< mailbox 22 interrupt flag */
708     CAN_INT_FLAG_MB23             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 23U),                /*!< mailbox 23 interrupt flag */
709     CAN_INT_FLAG_MB24             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 24U),                /*!< mailbox 24 interrupt flag */
710     CAN_INT_FLAG_MB25             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 25U),                /*!< mailbox 25 interrupt flag */
711     CAN_INT_FLAG_MB26             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 26U),                /*!< mailbox 26 interrupt flag */
712     CAN_INT_FLAG_MB27             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 27U),                /*!< mailbox 27 interrupt flag */
713     CAN_INT_FLAG_MB28             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 28U),                /*!< mailbox 28 interrupt flag */
714     CAN_INT_FLAG_MB29             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 29U),                /*!< mailbox 29 interrupt flag */
715     CAN_INT_FLAG_MB30             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 30U),                /*!< mailbox 30 interrupt flag */
716     CAN_INT_FLAG_MB31             = CAN_REGIDX_BIT(STAT_REG_OFFSET, 31U),                /*!< mailbox 31 interrupt flag */
717     CAN_INT_FLAG_FIFO_AVAILABLE   = CAN_REGIDX_BIT(STAT_REG_OFFSET, 5U),                 /*!< fifo availabe interrupt flag */
718     CAN_INT_FLAG_FIFO_WARNING     = CAN_REGIDX_BIT(STAT_REG_OFFSET, 6U),                 /*!< fifo warning interrupt flag */
719     CAN_INT_FLAG_FIFO_OVERFLOW    = CAN_REGIDX_BIT(STAT_REG_OFFSET, 7U),                 /*!< fifo overflow interrupt flag */
720     /* interrupt flags in PN_STAT register */
721     CAN_INT_FLAG_WAKEUP_MATCH     = CAN_REGIDX_BIT(PN_STAT_REG_OFFSET, 16U),             /*!< Pretended Networking match interrupt flag */
722     CAN_INT_FLAG_WAKEUP_TIMEOUT   = CAN_REGIDX_BIT(PN_STAT_REG_OFFSET, 17U)              /*!< Pretended Networking timeout wakeup interrupt flag */
723 } can_interrupt_flag_enum;
724 
725 /* operation modes */
726 typedef enum {
727     GD32_CAN_NORMAL_MODE               = 0U,                                                  /*!< normal mode */
728     GD32_CAN_MONITOR_MODE              = 1U,                                                  /*!< monitor mode */
729     GD32_CAN_LOOPBACK_SILENT_MODE      = 2U,                                                  /*!< loopback mode */
730     GD32_CAN_INACTIVE_MODE             = 3U,                                                  /*!< inactive mode */
731     GD32_CAN_DISABLE_MODE              = 4U,                                                  /*!< disable mode */
732     GD32_CAN_PN_MODE                   = 5U                                                   /*!< Pretended Networking mode */
733 } can_operation_modes_enum;
734 
735 /* initiliaze parameter type */
736 typedef enum {
737     CAN_INIT_STRUCT               = 0U,                                                  /*!< CAN initiliaze parameters struct */
738     CAN_FD_INIT_STRUCT            = 1U,                                                  /*!< CAN FD parameters struct */
739     CAN_FIFO_INIT_STRUCT          = 2U,                                                  /*!< CAN fifo parameters struct */
740     CAN_PN_MODE_INIT_STRUCT       = 3U,                                                  /*!< Pretended Networking mode parameter strcut */
741     CAN_PN_MODE_FILTER_STRUCT     = 4U,                                                  /*!< Pretended Networking mode filter parameter strcut */
742     CAN_MDSC_STRUCT               = 5U,                                                  /*!< mailbox descriptor strcut */
743     CAN_FDES_STRUCT               = 6U,                                                  /*!< Rx fifo descriptor strcut */
744     CAN_FIFO_ID_FILTER_STRUCT     = 7U,                                                  /*!< Rx fifo id filter strcut */
745     CAN_CRC_STRUCT                = 8U,                                                  /*!< CRC strcut */
746     CAN_ERRCNT_STRUCT             = 9U,                                                  /*!< error counter strcut */
747 } can_struct_type_enum;
748 
749 /* error state indicator */
750 typedef enum {
751     CAN_ERROR_STATE_ACTIVE        = 0U,                                                  /*!< CAN in error active */
752     CAN_ERROR_STATE_PASSIVE       = 1U,                                                  /*!< CAN in error passive */
753     CAN_ERROR_STATE_BUS_OFF       = 2U                                                   /*!< CAN in bus off */
754 } can_error_state_enum;
755 
756 /* error counter structure */
757 typedef struct {
758     uint8_t fd_data_phase_rx_errcnt;                                                     /*!< receive error counter for data phase of FD frames with BRS bit set */
759     uint8_t fd_data_phase_tx_errcnt;                                                     /*!< transmit error count for the data phase of FD frames with BRS bit set */
760     uint8_t rx_errcnt;                                                                   /*!< receive error count defined by the CAN standard */
761     uint8_t tx_errcnt;                                                                   /*!< transmit error count defined by the CAN standard */
762 } can_error_counter_struct;
763 
764 /* CAN initiliaze parameters structure */
765 typedef struct {
766     uint32_t internal_counter_source;                                                    /*!< internal counter source */
767     uint32_t mb_tx_order;                                                                /*!< mailbox transmit order */
768     uint32_t mb_rx_ide_rtr_type;                                                         /*!< IDE and RTR field fitler type  */
769     uint32_t mb_remote_frame;                                                            /*!< remote request frame is stored */
770     uint8_t self_reception;                                                              /*!< enable or disable self reception */
771     uint8_t mb_tx_abort_enable;                                                          /*!< enable or disable transmit abort */
772     uint8_t local_priority_enable;                                                       /*!< enable or disable local priority */
773     uint8_t rx_private_filter_queue_enable;                                              /*!< private filter and queue enable */
774     uint32_t edge_filter_enable;                                                         /*!< edge filter enable*/
775     uint32_t protocol_exception_enable;                                                  /*!< protocol exception enable */
776     uint32_t rx_filter_order;                                                            /*!< receive filter order */
777     uint32_t memory_size;                                                                /*!< memory size */
778     uint32_t mb_public_filter;                                                           /*!< mailbox public filter */
779     uint32_t prescaler;                                                                  /*!< baudrate prescaler */
780     uint8_t resync_jump_width;                                                           /*!< resynchronization jump width */
781     uint8_t prop_time_segment;                                                           /*!< propagation time segment */
782     uint8_t time_segment_1;                                                              /*!< time segment 1 */
783     uint8_t time_segment_2;                                                              /*!< time segment 2 */
784 } can_parameter_struct;
785 
786 /* mailbox descriptor struct */
787 typedef struct {
788     uint32_t timestamp : 16;                                                             /*!< free-running counter timestamp */
789     uint32_t dlc : 4;                                                                    /*!< data length code in bytes */
790     uint32_t rtr : 1;                                                                    /*!< remote transmission request */
791     uint32_t ide : 1;                                                                    /*!< ID extended bit */
792     uint32_t srr : 1;                                                                    /*!< substitute remote request */
793     uint32_t reserve1 : 1;                                                               /*!< reserve bit 1 */
794     uint32_t code : 4;                                                                   /*!< mailbox code */
795     uint32_t reserve2 : 1;                                                               /*!< reserve bit 2 */
796     uint32_t esi : 1;                                                                    /*!< error state indicator */
797     uint32_t brs : 1;                                                                    /*!< bit rate switch */
798     uint32_t fdf : 1;                                                                    /*!< FD format indicator */
799     uint32_t id : 29;                                                                    /*!< identifier for frame */
800     uint32_t prio : 3;                                                                   /*!< local priority */
801     uint32_t *data;                                                                      /*!< data */
802     uint32_t data_bytes;                                                                 /*!< data bytes */
803     uint8_t padding;                                                                     /*!< FD mode padding data */
804 } can_mailbox_descriptor_struct;
805 
806 /* fifo descriptor struct */
807 typedef struct {
808     uint32_t timestamp : 16;                                                             /*!< free-running counter timestamp */
809     uint32_t dlc : 4;                                                                    /*!< data length code in bytes */
810     uint32_t rtr : 1;                                                                    /*!< remote transmission request */
811     uint32_t ide : 1;                                                                    /*!< ID extended bit */
812     uint32_t srr : 1;                                                                    /*!< substitute remote request */
813     uint32_t idhit : 9;                                                                  /*!< identifier filter matching number */
814     uint32_t id;                                                                         /*!< identifier for frame */
815     uint32_t data[2];                                                                    /*!< fifo data */
816 } can_rx_fifo_struct;
817 
818 /* FD initiliaze parameter struct */
819 typedef struct {
820     uint32_t iso_can_fd_enable;                                                          /*!< ISO CAN FD protocol enable */
821     uint32_t bitrate_switch_enable;                                                      /*!< data bit rate switch */
822     uint32_t mailbox_data_size;                                                          /*!< mailbox data size */
823     uint32_t tdc_enable;                                                                 /*!< trnasmitter delay compensation enable */
824     uint32_t tdc_offset;                                                                 /*!< trnasmitter delay compensation offset */
825     uint32_t prescaler;                                                                  /*!< baudrate prescaler */
826     uint8_t resync_jump_width;                                                           /*!< resynchronization jump width */
827     uint8_t prop_time_segment;                                                           /*!< propagation time segment */
828     uint8_t time_segment_1;                                                              /*!< time segment 1 */
829     uint8_t time_segment_2;                                                              /*!< time segment 2 */
830 } can_fd_parameter_struct;
831 
832 /* FIFO ID filter table struct */
833 typedef struct {
834     uint32_t remote_frame;                                                               /*!< expected remote frame*/
835     uint32_t extended_frame;                                                             /*!< expected extended frame */
836     uint32_t id;                                                                         /*!< expected id */
837 } can_rx_fifo_id_filter_struct;
838 
839 /* FIFO initiliaze parameter struct */
840 typedef struct {
841     uint8_t dma_enable;                                                                  /*!< DMA enable */
842     uint32_t filter_format_and_number;                                                   /*!< FIFO ID filter format and number */
843     uint32_t fifo_public_filter;                                                         /*!< FIFO ID public filter */
844 } can_fifo_parameter_struct;
845 
846 /* Pretended Networking mode filter parameter struct */
847 typedef struct {
848     uint32_t remote_frame;                                                               /*!< remote frame */
849     uint32_t extended_frame;                                                             /*!< extended frame */
850     uint32_t id;                                                                         /*!< id */
851     uint32_t dlc_high_threshold;                                                         /*!< DLC expected high threshold */
852     uint32_t dlc_low_threshold;                                                          /*!< DLC expected low threshold */
853     uint32_t payload[2];                                                                 /*!< data */
854 } can_pn_mode_filter_struct;
855 
856 /* Pretended Networking mode initiliaze parameter struct */
857 typedef struct {
858     uint32_t timeout_int;                                                                /*!< enable or disable timeout interrupt */
859     uint32_t match_int;                                                                  /*!< enable or disable match interrupt */
860     uint32_t num_matches;                                                                /*!< set number of message matching times */
861     uint32_t match_timeout;                                                              /*!< set wakeup timeout value */
862     uint32_t frame_filter;                                                               /*!< set frame filtering type */
863     uint32_t id_filter;                                                                  /*!< set id filtering type */
864     uint32_t data_filter;                                                                /*!< set data filtering type */
865 } can_pn_mode_config_struct;
866 
867 /* CRC parameter struct */
868 typedef struct {
869     uint32_t classical_frm_mb_number;                                                    /*!< associated number of mailbox for transmitting the CRCTC[14:0] value */
870     uint32_t classical_frm_transmitted_crc;                                              /*!< transmitted CRC value for classical frames */
871     uint32_t classical_fd_frm_mb_number;                                                 /*!< associated number of mailbox for transmitting the CRCTCI[20:0] value */
872     uint32_t classical_fd_frm_transmitted_crc;                                           /*!< transmitted CRC value for classical and ISO / non-ISO FD frames */
873 } can_crc_struct;
874 
875 /* CAN_CTL0 register */
876 #define CTL0_MSZ(regval)                     (CAN_CTL0_MSZ & ((uint32_t)(regval) << 0U)) /*!< write value to CAN_CTL0_MSZ bit field */
877 #define CAN_MEMSIZE_1_UNIT                   CTL0_MSZ(0U)                                /*!< 1 unit for message transmission and reception */
878 #define CAN_MEMSIZE_2_UNIT                   CTL0_MSZ(1U)                                /*!< 2 units for message transmission and reception */
879 #define CAN_MEMSIZE_3_UNIT                   CTL0_MSZ(2U)                                /*!< 3 units for message transmission and reception */
880 #define CAN_MEMSIZE_4_UNIT                   CTL0_MSZ(3U)                                /*!< 4 units for message transmission and reception */
881 #define CAN_MEMSIZE_5_UNIT                   CTL0_MSZ(4U)                                /*!< 5 units for message transmission and reception */
882 #define CAN_MEMSIZE_6_UNIT                   CTL0_MSZ(5U)                                /*!< 6 units for message transmission and reception */
883 #define CAN_MEMSIZE_7_UNIT                   CTL0_MSZ(6U)                                /*!< 7 units for message transmission and reception */
884 #define CAN_MEMSIZE_8_UNIT                   CTL0_MSZ(7U)                                /*!< 8 units for message transmission and reception */
885 #define CAN_MEMSIZE_9_UNIT                   CTL0_MSZ(8U)                                /*!< 9 units for message transmission and reception */
886 #define CAN_MEMSIZE_10_UNIT                  CTL0_MSZ(9U)                                /*!< 10 units for message transmission and reception */
887 #define CAN_MEMSIZE_11_UNIT                  CTL0_MSZ(10U)                               /*!< 11 units for message transmission and reception */
888 #define CAN_MEMSIZE_12_UNIT                  CTL0_MSZ(11U)                               /*!< 12 units for message transmission and reception */
889 #define CAN_MEMSIZE_13_UNIT                  CTL0_MSZ(12U)                               /*!< 13 units for message transmission and reception */
890 #define CAN_MEMSIZE_14_UNIT                  CTL0_MSZ(13U)                               /*!< 14 units for message transmission and reception */
891 #define CAN_MEMSIZE_15_UNIT                  CTL0_MSZ(14U)                               /*!< 15 units for message transmission and reception */
892 #define CAN_MEMSIZE_16_UNIT                  CTL0_MSZ(15U)                               /*!< 16 units for message transmission and reception */
893 #define CAN_MEMSIZE_17_UNIT                  CTL0_MSZ(16U)                               /*!< 17 units for message transmission and reception */
894 #define CAN_MEMSIZE_18_UNIT                  CTL0_MSZ(17U)                               /*!< 18 units for message transmission and reception */
895 #define CAN_MEMSIZE_19_UNIT                  CTL0_MSZ(18U)                               /*!< 19 units for message transmission and reception */
896 #define CAN_MEMSIZE_20_UNIT                  CTL0_MSZ(19U)                               /*!< 20 units for message transmission and reception */
897 #define CAN_MEMSIZE_21_UNIT                  CTL0_MSZ(20U)                               /*!< 21 units for message transmission and reception */
898 #define CAN_MEMSIZE_22_UNIT                  CTL0_MSZ(21U)                               /*!< 22 units for message transmission and reception */
899 #define CAN_MEMSIZE_23_UNIT                  CTL0_MSZ(22U)                               /*!< 23 units for message transmission and reception */
900 #define CAN_MEMSIZE_24_UNIT                  CTL0_MSZ(23U)                               /*!< 24 units for message transmission and reception */
901 #define CAN_MEMSIZE_25_UNIT                  CTL0_MSZ(24U)                               /*!< 25 units for message transmission and reception */
902 #define CAN_MEMSIZE_26_UNIT                  CTL0_MSZ(25U)                               /*!< 26 units for message transmission and reception */
903 #define CAN_MEMSIZE_27_UNIT                  CTL0_MSZ(26U)                               /*!< 27 units for message transmission and reception */
904 #define CAN_MEMSIZE_28_UNIT                  CTL0_MSZ(27U)                               /*!< 28 units for message transmission and reception */
905 #define CAN_MEMSIZE_29_UNIT                  CTL0_MSZ(28U)                               /*!< 29 units for message transmission and reception */
906 #define CAN_MEMSIZE_30_UNIT                  CTL0_MSZ(29U)                               /*!< 30 units for message transmission and reception */
907 #define CAN_MEMSIZE_31_UNIT                  CTL0_MSZ(30U)                               /*!< 31 units for message transmission and reception */
908 #define CAN_MEMSIZE_32_UNIT                  CTL0_MSZ(31U)                               /*!< 32 units for message transmission and reception */
909 
910 #define CTL0_FS(regval)                      (CAN_CTL0_FS & ((uint32_t)(regval) << 8U))  /*!< write value to CAN_CTL0_FS bit field */
911 #define CAN_FIFO_FILTER_FORMAT_A             CTL0_FS(0U)                                 /*!< FIFO filter format A */
912 #define CAN_FIFO_FILTER_FORMAT_B             CTL0_FS(1U)                                 /*!< FIFO filter format B */
913 #define CAN_FIFO_FILTER_FORMAT_C             CTL0_FS(2U)                                 /*!< FIFO filter format C */
914 #define CAN_FIFO_FILTER_FORMAT_D             CTL0_FS(3U)                                 /*!< FIFO filter format D */
915 
916 #define GET_CTL0_FS(regval)                  GET_BITS((regval),8,9)                       /*!< get CAN_CTL0_FS bit field */
917 
918 /* CAN_CTL1 register */
919 #define CAN_TX_HIGH_PRIORITY_MB_FIRST        ((uint32_t)0x00000000U)                      /*!< highest priority mailbox first */
920 #define CAN_TX_LOW_NUM_MB_FIRST              CAN_CTL1_MTO                                 /*!< low number mailbox first */
921 
922 #define CAN_BSP_MODE_ONE_SAMPLE              ((uint32_t)0x00000000U)                      /*!< one sample for the received bit */
923 #define CAN_BSP_MODE_THREE_SAMPLES           CAN_CTL1_BSPMOD                              /*!< three sample for received bit */
924 
925 /* CAN_ERR0 register */
926 #define GET_ERR0_REFCNT(regval)              GET_BITS((regval),24,31)                     /*!< get receive error counter for data phase of FD frames with BRS bit set */
927 #define GET_ERR0_TEFCNT(regval)              GET_BITS((regval),16,23)                     /*!< get transmit error counter for data phase of FD frames with BRS bit set */
928 #define GET_ERR0_RECNT(regval)               GET_BITS((regval),8,15)                      /*!< get receive error counter defined by the CAN standard */
929 #define GET_ERR0_TECNT(regval)               GET_BITS((regval),0,7)                       /*!< get transmit error counter defined by the CAN standard */
930 #define ERR0_REFCNT(regval)                  (BITS(24,31) & ((uint32_t)(regval) << 24U))  /*!< set receive error counter for data phase of FD frames with BRS bit set */
931 #define ERR0_TEFCNT(regval)                  (BITS(16,23) & ((uint32_t)(regval) << 16U))  /*!< set transmit error counter for data phase of FD frames with BRS bit set */
932 #define ERR0_RECNT(regval)                   (BITS(8,15) & ((uint32_t)(regval) << 8U))    /*!< set receive error counter defined by the CAN standard */
933 #define ERR0_TECNT(regval)                   (BITS(0,7) & ((uint32_t)(regval) << 0U))     /*!< set transmit error counter defined by the CAN standard */
934 
935 /* CAN_ERR1 register */
936 #define GET_ERR1_ERRSI(regval)               GET_BITS((regval),4,5)                       /*!< read CAN_ERR1_ERRSI bit field */
937 
938 /* CAN_STAT register */
939 #define STAT_MS(regval)                      BIT(regval)                                  /*!< write value to CAN_STAT_MS bit field */
940 
941 /* CAN_CTL2 register */
942 #define CAN_TIMER_SOURCE_BIT_CLOCK           ((uint32_t)0x00000000U)                      /*!< internal counter source is CAN bit clock */
943 #define CAN_TIMER_SOURCE_EXTERNAL_TIME_TICK  CAN_CTL2_ITSRC                               /*!< internal counter source is external time tick */
944 
945 #define CAN_IDE_RTR_COMPARED                 ((uint32_t)0x00000000U)                      /*!< always compare IDE bit, never compare RTR bit */
946 #define CAN_IDE_RTR_FILTERED                 CAN_CTL2_IDERTR_RMF                          /*!< filtering IDE and RTR fields */
947 
948 #define CAN_GEN_REMOTE_RESPONSE_FRAME        ((uint32_t)0x00000000U)                      /* remote response frame is generated when a mailbox with CODE RANSWER is found with the same ID */
949 #define CAN_STORE_REMOTE_REQUEST_FRAME       CAN_CTL2_RRFRMS                              /* remote request frame is stored as a data frame without automatic remote response frame transmitted */
950 
951 #define CAN_RX_FILTER_ORDER_FIFO_FIRST       ((uint32_t)0x00000000U)                      /*!< receive search FIFO first */
952 #define CAN_RX_FILTER_ORDER_MAILBOX_FIRST    CAN_CTL2_RFO                                 /*!< receive search mailbox first */
953 
954 #define CTL2_ASD(regval)                     (BITS(19,23) & ((uint32_t)(regval) << 19U))  /*!< write value to CAN_CTL2_ASD bit field */
955 
956 #define CTL2_RFFN(regval)                    (BITS(24,27) & ((uint32_t)(regval) << 24U))  /*!< write value to CAN_CTL2_RFFN bit field */
957 #define GET_CTL2_RFFN(regval)                GET_BITS((regval),24,27)                     /*!< get CAN_CTL2_RFFN bit field */
958 #define CAN_RXFIFO_FILTER_A_NUM_8            (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(0U))   /*!< FIFO ID filter format A and 8 filters */
959 #define CAN_RXFIFO_FILTER_A_NUM_16           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(1U))   /*!< FIFO ID filter format A and 16 filters */
960 #define CAN_RXFIFO_FILTER_A_NUM_24           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(2U))   /*!< FIFO ID filter format A and 24 filters */
961 #define CAN_RXFIFO_FILTER_A_NUM_32           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(3U))   /*!< FIFO ID filter format A and 32 filters */
962 #define CAN_RXFIFO_FILTER_A_NUM_40           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(4U))   /*!< FIFO ID filter format A and 40 filters */
963 #define CAN_RXFIFO_FILTER_A_NUM_48           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(5U))   /*!< FIFO ID filter format A and 48 filters */
964 #define CAN_RXFIFO_FILTER_A_NUM_56           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(6U))   /*!< FIFO ID filter format A and 56 filters */
965 #define CAN_RXFIFO_FILTER_A_NUM_64           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(7U))   /*!< FIFO ID filter format A and 64 filters */
966 #define CAN_RXFIFO_FILTER_A_NUM_72           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(8U))   /*!< FIFO ID filter format A and 72 filters */
967 #define CAN_RXFIFO_FILTER_A_NUM_80           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(9U))   /*!< FIFO ID filter format A and 80 filters */
968 #define CAN_RXFIFO_FILTER_A_NUM_88           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(10U))  /*!< FIFO ID filter format A and 88 filters */
969 #define CAN_RXFIFO_FILTER_A_NUM_96           (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(11U))  /*!< FIFO ID filter format A and 96 filters */
970 #define CAN_RXFIFO_FILTER_A_NUM_104          (CAN_FIFO_FILTER_FORMAT_A | CTL2_RFFN(12U))  /*!< FIFO ID filter format A and 104 filters */
971 #define CAN_RXFIFO_FILTER_B_NUM_16           (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(0U))   /*!< FIFO ID filter format B and 16 filters */
972 #define CAN_RXFIFO_FILTER_B_NUM_32           (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(1U))   /*!< FIFO ID filter format B and 32 filters */
973 #define CAN_RXFIFO_FILTER_B_NUM_48           (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(2U))   /*!< FIFO ID filter format B and 48 filters */
974 #define CAN_RXFIFO_FILTER_B_NUM_64           (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(3U))   /*!< FIFO ID filter format B and 64 filters */
975 #define CAN_RXFIFO_FILTER_B_NUM_80           (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(4U))   /*!< FIFO ID filter format B and 80 filters */
976 #define CAN_RXFIFO_FILTER_B_NUM_96           (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(5U))   /*!< FIFO ID filter format B and 96 filters */
977 #define CAN_RXFIFO_FILTER_B_NUM_112          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(6U))   /*!< FIFO ID filter format B and 112 filters */
978 #define CAN_RXFIFO_FILTER_B_NUM_128          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(7U))   /*!< FIFO ID filter format B and 128 filters */
979 #define CAN_RXFIFO_FILTER_B_NUM_144          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(8U))   /*!< FIFO ID filter format B and 144 filters */
980 #define CAN_RXFIFO_FILTER_B_NUM_160          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(9U))   /*!< FIFO ID filter format B and 160 filters */
981 #define CAN_RXFIFO_FILTER_B_NUM_176          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(10U))  /*!< FIFO ID filter format B and 176 filters */
982 #define CAN_RXFIFO_FILTER_B_NUM_192          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(11U))  /*!< FIFO ID filter format B and 192 filters */
983 #define CAN_RXFIFO_FILTER_B_NUM_208          (CAN_FIFO_FILTER_FORMAT_B | CTL2_RFFN(12U))  /*!< FIFO ID filter format B and 208 filters */
984 #define CAN_RXFIFO_FILTER_C_NUM_32           (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(0U))   /*!< FIFO ID filter format C and 32 filters */
985 #define CAN_RXFIFO_FILTER_C_NUM_64           (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(1U))   /*!< FIFO ID filter format C and 64 filters */
986 #define CAN_RXFIFO_FILTER_C_NUM_96           (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(2U))   /*!< FIFO ID filter format C and 96 filters */
987 #define CAN_RXFIFO_FILTER_C_NUM_128          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(3U))   /*!< FIFO ID filter format C and 128 filters */
988 #define CAN_RXFIFO_FILTER_C_NUM_160          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(4U))   /*!< FIFO ID filter format C and 160 filters */
989 #define CAN_RXFIFO_FILTER_C_NUM_192          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(5U))   /*!< FIFO ID filter format C and 192 filters */
990 #define CAN_RXFIFO_FILTER_C_NUM_224          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(6U))   /*!< FIFO ID filter format C and 224 filters */
991 #define CAN_RXFIFO_FILTER_C_NUM_256          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(7U))   /*!< FIFO ID filter format C and 256 filters */
992 #define CAN_RXFIFO_FILTER_C_NUM_288          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(8U))   /*!< FIFO ID filter format C and 288 filters */
993 #define CAN_RXFIFO_FILTER_C_NUM_320          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(9U))   /*!< FIFO ID filter format C and 320 filters */
994 #define CAN_RXFIFO_FILTER_C_NUM_352          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(10U))  /*!< FIFO ID filter format C and 352 filters */
995 #define CAN_RXFIFO_FILTER_C_NUM_384          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(11U))  /*!< FIFO ID filter format C and 384 filters */
996 #define CAN_RXFIFO_FILTER_C_NUM_416          (CAN_FIFO_FILTER_FORMAT_C | CTL2_RFFN(12U))  /*!< FIFO ID filter format C and 416 filters */
997 #define CAN_RXFIFO_FILTER_D                  CAN_FIFO_FILTER_FORMAT_D                     /*!< FIFO ID filter format D */
998 
999 /* CAN_CRCC register */
1000 #define GET_CRCC_ANTM(regval)                GET_BITS((regval),16,20)                     /*!< get associated number of mailbox for transmitting the CRCTC[14:0] value */
1001 #define GET_CRCC_CRCTC(regval)               GET_BITS((regval),0,14)                      /*!< get transmitted CRC value for classical frames */
1002 
1003 /* CAN_RFIFOIFMN register */
1004 #define GET_RFIFOIFMN_IDFMN(regval)          GET_BITS((regval),0,8)                       /*!< get identifier filter matching number */
1005 
1006 /* CAN_BT register */
1007 #define BT_PBS2(regval)                      (BITS(0,4) & ((uint32_t)(regval) << 0U))     /*!< write value to CAN_BT_PBS2 bit field */
1008 #define BT_PBS1(regval)                      (BITS(5,9) & ((uint32_t)(regval) << 5U))     /*!< write value to CAN_BT_PBS1 bit field */
1009 #define BT_PTS(regval)                       (BITS(10,15) & ((uint32_t)(regval) << 10U))  /*!< write value to CAN_BT_PTS bit field */
1010 #define BT_SJW(regval)                       (BITS(16,20) & ((uint32_t)(regval) << 16U))  /*!< write value to CAN_BT_SJW bit field */
1011 #define BT_BAUDPSC(regval)                   (BITS(21,30) & ((uint32_t)(regval) << 21U))  /*!< write value to CAN_BT_BAUDPSC bit field */
1012 
1013 /* CAN_FDCTL register */
1014 #define GET_FDCTL_MDSZ(regval)               GET_BITS((regval),16,17)                     /*!< get mailbox data size */
1015 
1016 /* CAN_PN_CTL0 register */
1017 #define PN_CTL0_FFT(regval)                  (BITS(0,1) & ((uint32_t)(regval) << 0U))     /*!< write value to CAN_PN_CTL0_FFT bit field */
1018 #define CAN_PN_FRAME_FILTERING_ID            PN_CTL0_FFT(0U)                              /*!< all fields except DATA field, DLC field are filtered */
1019 #define CAN_PN_FRAME_FILTERING_ID_DATA       PN_CTL0_FFT(1U)                              /*!< all fields are filtered */
1020 #define CAN_PN_FRAME_FILTERING_ID_NMM        PN_CTL0_FFT(2U)                              /*!< all fields except DATA field, DLC field are filtered with NMM[7:0] matching times */
1021 #define CAN_PN_FRAME_FILTERING_ID_DATA_NMM   PN_CTL0_FFT(3U)                              /*!< all fields are filtered with NMM[7:0] matching times */
1022 
1023 #define PN_CTL0_IDFT(regval)                 (BITS(2,3) & ((uint32_t)(regval) << 2U))     /*!< write value to CAN_PN_CTL0_IDFT bit field */
1024 #define CAN_PN_ID_FILTERING_EXACT            PN_CTL0_IDFT(0U)                             /*!< DATA field equal to the expected data field */
1025 #define CAN_PN_ID_FILTERING_GREATER          PN_CTL0_IDFT(1U)                             /*!< DATA field greater than or equal to the expected data */
1026 #define CAN_PN_ID_FILTERING_SMALLER          PN_CTL0_IDFT(2U)                             /*!< DATA field greater than or equal to the expected data */
1027 #define CAN_PN_ID_FILTERING_RANGE            PN_CTL0_IDFT(3U)                             /*!< DATA field is between expected data high threshold and low threshold */
1028 
1029 #define PN_CTL0_DATAFT(regval)               (BITS(4,5) & ((uint32_t)(regval) << 4U))     /*!< write value to CAN_PN_CTL0_DATAFT bit field */
1030 #define CAN_PN_DATA_FILTERING_EXACT          PN_CTL0_DATAFT(0U)                           /*!< ID field equal to the expected identifie */
1031 #define CAN_PN_DATA_FILTERING_GREATER        PN_CTL0_DATAFT(1U)                           /*!< ID field greater than or equal to the expected identifier */
1032 #define CAN_PN_DATA_FILTERING_SMALLER        PN_CTL0_DATAFT(2U)                           /*!< ID field smaller than or equal to the expected identifier */
1033 #define CAN_PN_DATA_FILTERING_RANGE          PN_CTL0_DATAFT(3U)                           /*!< ID field is between expected idetifier high threshold and low threshold */
1034 
1035 #define PN_CTL0_NMM(regval)                  (BITS(8,15) & ((uint32_t)(regval) << 8U))    /*!< write value to CAN_PN_CTL0_NMM bit field */
1036 
1037 #define PN_CTL0_WMIE(regval)                 (BIT(16) & ((uint32_t)(regval) << 16U))      /*!< write value to CAN_PN_CTL0_WMIE bit */
1038 
1039 #define PN_CTL0_WTOIE(regval)                (BIT(17) & ((uint32_t)(regval) << 17U))      /*!< write value to CAN_PN_CTL0_WTOIE bit */
1040 
1041 /* CAN_PN_TO register */
1042 #define PN_TO_WTO(regval)                    (BITS(0,15) & ((uint32_t)(regval) << 0U))    /*!< write value to CAN_PN_TO_WTO bit field */
1043 
1044 /* CAN_PN_STAT register */
1045 #define GET_PN_STAT_MMCNT(regval)            GET_BITS((regval),8,15)                      /*!< get matching message counter in Pretended Networking mode */
1046 
1047 /* CAN_PN_EID0 register */
1048 #define PN_EID0_EIDF_ELT_STD(regval)         (BITS(18,28) & ((uint32_t)(regval) << 18U))  /*!< write value to CAN_PN_EID0_EIDF_ELT bit field for standard frames */
1049 #define PN_EID0_EIDF_ELT_EXD(regval)         (BITS(0,28) & ((uint32_t)(regval) << 0U))    /*!< write value to CAN_PN_EID0_EIDF_ELT bit field for extended frames */
1050 
1051 /* CAN_PN_EDLC register */
1052 #define PN_EDLC_DLCEHT(regval)               (BITS(0,3) & ((uint32_t)(regval) << 0U))     /*!< write value to CAN_PN_EDLC_DLCEHT bit field */
1053 #define PN_EDLC_DLCELT(regval)               (BITS(16,19) & ((uint32_t)(regval) << 16U))  /*!< write value to CAN_PN_EDLC_DLCELT bit field */
1054 
1055 /* CAN_PN_IFEID1 register */
1056 #define PN_IFEID1_IDEFD_STD(regval)          (BITS(18,28) & ((uint32_t)(regval) << 18U))  /*!< write value to CAN_PN_IFEID1_IDEFD bit field for standard frames */
1057 #define PN_IFEID1_IDEFD_EXD(regval)          (BITS(0,28) & ((uint32_t)(regval) << 0U))    /*!< write value to CAN_PN_IFEID1_IDEFD bit field for extended frames */
1058 
1059 /* CAN_FDCTL register */
1060 #define GET_FDCTL_TDCV(regval)               GET_BITS((regval),0,5)                       /*!< get transmitter delay compensation value */
1061 
1062 #define FDCTL_TDCO(regval)                   (BITS(8,12) & ((uint32_t)(regval) << 8U))    /*!< write value to CAN_FDCTL_TDCO bit field */
1063 
1064 #define FDCTL_MDSZ(regval)                   (BITS(16,17) & ((uint32_t)(regval) << 16U))  /*!< write value to CAN_FDCTL_MDSZ bit field */
1065 #define CAN_MAILBOX_DATA_SIZE_8_BYTES        FDCTL_MDSZ(0U)                               /*!< mailbox data size is 8 bytes */
1066 #define CAN_MAILBOX_DATA_SIZE_16_BYTES       FDCTL_MDSZ(1U)                               /*!< mailbox data size is 16 bytes */
1067 #define CAN_MAILBOX_DATA_SIZE_32_BYTES       FDCTL_MDSZ(2U)                               /*!< mailbox data size is 32 bytes */
1068 #define CAN_MAILBOX_DATA_SIZE_64_BYTES       FDCTL_MDSZ(3U)                               /*!< mailbox data size is 64 bytes */
1069 
1070 /* CAN_FDBT register */
1071 #define FDBT_DPBS2(regval)                   (BITS(0,2) & ((uint32_t)(regval) << 0U))     /*!< write value to CAN_FDBT_DPBS2 bit field */
1072 #define FDBT_DPBS1(regval)                   (BITS(5,7) & ((uint32_t)(regval) << 5U))     /*!< write value to CAN_FDBT_DPBS1 bit field */
1073 #define FDBT_DPTS(regval)                    (BITS(10,14) & ((uint32_t)(regval) << 10U))  /*!< write value to CAN_FDBT_DPTS bit field */
1074 #define FDBT_DSJW(regval)                    (BITS(16,18) & ((uint32_t)(regval) << 16U))  /*!< write value to CAN_FDBT_DSJW bit field */
1075 #define FDBT_DBAUDPSC(regval)                (BITS(20,29) & ((uint32_t)(regval) << 20U))  /*!< write value to CAN_FDBT_DBAUDPSC bit field */
1076 
1077 /* CAN_CRCCFD register */
1078 #define GET_CRCCFD_CRCTCI(regval)            GET_BITS((regval),0,20)                      /*!< get transmitted CRC value for classical and ISO / non-ISO FD frames */
1079 #define GET_CRCCFD_ANTM(regval)              GET_BITS((regval),24,28)                     /*!< get associated number of mailbox for transmitting the CRCTCI[20:0] value */
1080 
1081 /* MDES0 descriptor */
1082 #define MDES0_DLC(regval)                    (BITS(16,19) & ((uint32_t)(regval) << 16U))  /*!< write value to MDES0 descriptor DLC bit field */
1083 
1084 #define MDES0_CODE(regval)                   (((uint32_t)(regval) << 24U) & CAN_MDES0_CODE)
1085 #define CAN_MB_RX_STATUS_INACTIVE            (0U)                                         /*!< mailbox receive status inactive */
1086 #define CAN_MB_RX_STATUS_FULL                (2U)                                         /*!< mailbox receive status full */
1087 #define CAN_MB_RX_STATUS_EMPTY               (4U)                                         /*!< mailbox receive status empty */
1088 #define CAN_MB_RX_STATUS_OVERRUN             (6U)                                         /*!< mailbox receive status overrun */
1089 #define CAN_MB_RX_STATUS_RANSWER             (10U)                                        /*!< mailbox receive status answer */
1090 #define CAN_MB_RX_STATUS_BUSY                (1U)                                         /*!< mailbox receive status busy */
1091 #define CAN_MB_TX_STATUS_INACTIVE            (8U)                                         /*!< mailbox transmit status inactive */
1092 #define CAN_MB_TX_STATUS_ABORT               (9U)                                         /*!< mailbox transmit status abort */
1093 #define CAN_MB_TX_STATUS_DATA                (12U)                                        /*!< mailbox transmit status data */
1094 
1095 #define GET_MDES0_CODE(regval)               GET_BITS((regval),24,27)                     /*!< get MDES0 descriptor CODE bit field */
1096 
1097 /* MDES1 descriptor */
1098 #define GET_MDES1_ID_EXD(regval)             GET_BITS((regval),0,28)                      /*!< get MDES1 descriptor ID_STD and ID_EXD bit field */
1099 #define MDES1_ID_EXD(regval)                 (BITS(0,28) & ((uint32_t)(regval) << 0U))    /*!< write value to MDES1 descriptor ID_STD and ID_EXD bit field */
1100 
1101 #define GET_MDES1_ID_STD(regval)             GET_BITS((regval),18,28)                     /*!< get MDES1 descriptor ID_STD bit field */
1102 #define MDES1_ID_STD(regval)                 (BITS(18,28) & ((uint32_t)(regval) << 18U))  /*!< write value to MDES1 descriptor ID_STD bit field */
1103 
1104 #define MDES1_PRIO(regval)                   (BITS(29,31) & ((uint32_t)(regval) << 29U))  /*!< write value to MDES1 descriptor PRIO bit field */
1105 
1106 /* FDES1 descriptor */
1107 #define GET_FDES1_ID_EXD(regval)             GET_BITS((regval),0,28)                      /*!< get FDES1 descriptor ID_STD and ID_EXD bit field */
1108 #define FDES1_ID_EXD(regval)                 (BITS(0,28) & ((uint32_t)(regval) << 0U))    /*!< write value to FDES1 descriptor ID_STD and ID_EXD bit field */
1109 
1110 #define GET_FDES1_ID_STD(regval)             GET_BITS((regval),18,28)                     /*!< get FDES1 descriptor ID_STD bit field */
1111 #define FDES1_ID_STD(regval)                 (BITS(18,28) & ((uint32_t)(regval) << 18U))  /*!< write value to FDES1 descriptor ID_STD bit field */
1112 
1113 /* FDESx descriptor */
1114 #define CAN_DATA_FRAME_ACCEPTED              ((uint32_t)0x00000000U)                      /*!< remote frames are rejected and data frames can be stored */
1115 #define CAN_REMOTE_FRAME_ACCEPTED            ((uint32_t)0x00000001U)                      /*!< remote frames can be stored and data frames are rejected */
1116 
1117 #define CAN_STANDARD_FRAME_ACCEPTED          ((uint32_t)0x00000000U)                      /*!< extended frames are rejected and standard frames can be stored */
1118 #define CAN_EXTENDED_FRAME_ACCEPTED          ((uint32_t)0x00000001U)                      /*!< extended frames can be stored and standard frames are rejected */
1119 
1120 #define FIFO_FILTER_ID_EXD_A(val)            (((uint32_t)(val) << 0U) & CAN_FDESX_ID_EXD_A) /*!< valid extended ID filter field in format A */
1121 #define FIFO_FILTER_ID_STD_A(val)            (((uint32_t)(val) << 18U) & CAN_FDESX_ID_STD_A)/*!< valid standard ID filter field in format A */
1122 #define FIFO_FILTER_ID_EXD_B0(val)           (GET_BITS((val),15,28) << 16U)                 /*!< valid extended ID filter field in format B */
1123 #define FIFO_FILTER_ID_EXD_B1(val)           (GET_BITS((val),15,28) << 0U)                  /*!< valid extended ID filter field in format B */
1124 #define FIFO_FILTER_ID_STD_B0(val)           (GET_BITS((val),0,10) << 19U)                  /*!< valid standard ID filter field in format B */
1125 #define FIFO_FILTER_ID_STD_B1(val)           (GET_BITS((val),0,10) << 3U)                   /*!< valid standard ID filter field in format B */
1126 #define FIFO_FILTER_ID_EXD_C0(val)           (GET_BITS((val),21,28) << 24U)                 /*!< valid extended ID filter field in format C */
1127 #define FIFO_FILTER_ID_EXD_C1(val)           (GET_BITS((val),21,28) << 16U)                 /*!< valid extended ID filter field in format C */
1128 #define FIFO_FILTER_ID_EXD_C2(val)           (GET_BITS((val),21,28) << 8U)                  /*!< valid extended ID filter field in format C */
1129 #define FIFO_FILTER_ID_EXD_C3(val)           (GET_BITS((val),21,28) << 0U)                  /*!< valid extended ID filter field in format C */
1130 #define FIFO_FILTER_ID_STD_C0(val)           (GET_BITS((val),3,10) << 24U)                  /*!< valid standard ID filter field in format C */
1131 #define FIFO_FILTER_ID_STD_C1(val)           (GET_BITS((val),3,10) << 16U)                  /*!< valid standard ID filter field in format C */
1132 #define FIFO_FILTER_ID_STD_C2(val)           (GET_BITS((val),3,10) << 8U)                   /*!< valid standard ID filter field in format C */
1133 #define FIFO_FILTER_ID_STD_C3(val)           (GET_BITS((val),3,10) << 0U)                   /*!< valid standard ID filter field in format C */
1134 
1135 /* timeout definitions */
1136 #define CAN_DELAY                           ((uint32_t)0x01FFFFFFU)                        /*!< state timeout */
1137 #define CAN_MAX_MAILBOX_NUM                  32U                                            /*!< the supported maximum mailbox number */
1138 #define CAN_MAX_RAM_SIZE                     (CAN_MAX_MAILBOX_NUM * 4U)                     /*!< the maximum RAM size used for CAN mailbox */
1139 
1140 
1141 /* function declarations */
1142 /* CAN module initialize */
1143 /* deinitialize CAN */
1144 void can_deinit(uint32_t can_periph);
1145 /* reset CAN interanl state machines and CAN registers */
1146 ErrStatus can_software_reset(uint32_t can_periph);
1147 /* CAN module initialization */
1148 ErrStatus can_init(uint32_t can_periph, can_parameter_struct *can_parameter_init);
1149 /* initialize CAN parameter structure with a default value */
1150 void can_struct_para_init(can_struct_type_enum type, void *p_struct);
1151 /* configure receive fifo/mailbox private filter */
1152 void can_private_filter_config(uint32_t can_periph, uint32_t index, uint32_t filter_data);
1153 
1154 /* CAN operation modes */
1155 /* enter the corresponding mode */
1156 ErrStatus can_operation_mode_enter(uint32_t can_periph, can_operation_modes_enum mode);
1157 /* get operation mode */
1158 can_operation_modes_enum can_operation_mode_get(uint32_t can_periph);
1159 /* exit inactive mode */
1160 ErrStatus can_inactive_mode_exit(uint32_t can_periph);
1161 /* exit Pretended Networking mode */
1162 ErrStatus can_pn_mode_exit(uint32_t can_periph);
1163 
1164 /* CAN FD mode configuration */
1165 /* can FD initialize */
1166 void can_fd_config(uint32_t can_periph, can_fd_parameter_struct *can_fd_para_init);
1167 /* enable bit rate switching */
1168 void can_bitrate_switch_enable(uint32_t can_periph);
1169 /* disable bit rate switching */
1170 void can_bitrate_switch_disable(uint32_t can_periph);
1171 /* get transmitter delay compensation value */
1172 uint32_t can_tdc_get(uint32_t can_periph);
1173 /* enable transmitter delay compensation */
1174 void can_tdc_enable(uint32_t can_periph);
1175 /* disable transmitter delay compensation */
1176 void can_tdc_disable(uint32_t can_periph);
1177 
1178 /* CAN FIFO configuration */
1179 /* configure rx FIFO */
1180 void can_rx_fifo_config(uint32_t can_periph, can_fifo_parameter_struct *can_fifo_para_init);
1181 /* configure rx FIFO filter table */
1182 void can_rx_fifo_filter_table_config(uint32_t can_periph, can_rx_fifo_id_filter_struct id_filter_table[]);
1183 /* read rx FIFO data */
1184 void can_rx_fifo_read(uint32_t can_periph, can_rx_fifo_struct *rx_fifo);
1185 /* get rx FIFO filter matching number */
1186 uint32_t can_rx_fifo_filter_matching_number_get(uint32_t can_periph);
1187 /* clear rx FIFO */
1188 void can_rx_fifo_clear(uint32_t can_periph);
1189 
1190 /* CAN mailbox operation */
1191 /* get mailbox RAM address */
1192 uint32_t *can_ram_address_get(uint32_t can_periph, uint32_t index);
1193 /* config mailbox */
1194 void can_mailbox_config(uint32_t can_periph, uint32_t index, can_mailbox_descriptor_struct *mdpara);
1195 /* abort mailbox transmit */
1196 void can_mailbox_transmit_abort(uint32_t can_periph, uint32_t index);
1197 /* inactive transmit mailbox */
1198 void can_mailbox_transmit_inactive(uint32_t can_periph, uint32_t index);
1199 /* read receive mailbox data */
1200 ErrStatus can_mailbox_receive_data_read(uint32_t can_periph, uint32_t index, can_mailbox_descriptor_struct *mdpara);
1201 /* lock the receive mailbox */
1202 void can_mailbox_receive_lock(uint32_t can_periph, uint32_t index);
1203 /* unlock the receive mailbox */
1204 void can_mailbox_receive_unlock(uint32_t can_periph);
1205 /* inactive the receive mailbox */
1206 void can_mailbox_receive_inactive(uint32_t can_periph, uint32_t index);
1207 /* get mailbox code value */
1208 uint32_t can_mailbox_code_get(uint32_t can_periph, uint32_t index);
1209 
1210 /* errors & CRC */
1211 /* configure error counter */
1212 void can_error_counter_config(uint32_t can_periph, can_error_counter_struct *errcnt_struct);
1213 /* get error count */
1214 void can_error_counter_get(uint32_t can_periph, can_error_counter_struct *errcnt_struct);
1215 /* get error state indicator */
1216 can_error_state_enum can_error_state_get(uint32_t can_periph);
1217 /* get mailbox CRC value */
1218 void can_crc_get(uint32_t can_periph, can_crc_struct *crc_struct);
1219 
1220 /* Pretended Networking mode configuration */
1221 /* configure Pretended Networking mode parameter */
1222 void can_pn_mode_config(uint32_t can_periph, can_pn_mode_config_struct *pnmod_config);
1223 /* configure pn mode filter */
1224 void can_pn_mode_filter_config(uint32_t can_periph, can_pn_mode_filter_struct *expect, can_pn_mode_filter_struct *filter);
1225 /* get matching message counter of Pretended Networking mode */
1226 int32_t can_pn_mode_num_of_match_get(uint32_t can_periph);
1227 /* get matching message */
1228 void can_pn_mode_data_read(uint32_t can_periph, uint32_t index, can_mailbox_descriptor_struct *mdpara);
1229 
1230 /* others */
1231 /* enable self reception */
1232 void can_self_reception_enable(uint32_t can_periph);
1233 /* disable self reception */
1234 void can_self_reception_disable(uint32_t can_periph);
1235 /* enable transmit abort */
1236 void can_transmit_abort_enable(uint32_t can_periph);
1237 /* disable transmit abort */
1238 void can_transmit_abort_disable(uint32_t can_periph);
1239 /* enable auto bus off recovery mode */
1240 void can_auto_busoff_recovery_enable(uint32_t can_periph);
1241 /* disable auto bus off recovery mode */
1242 void can_auto_busoff_recovery_disable(uint32_t can_periph);
1243 /* enable time sync mode */
1244 void can_time_sync_enable(uint32_t can_periph);
1245 /* disable time sync mode */
1246 void can_time_sync_disable(uint32_t can_periph);
1247 /* enable edge filter mode */
1248 void can_edge_filter_mode_enable(uint32_t can_periph);
1249 /* disable edge filter mode */
1250 void can_edge_filter_mode_disable(uint32_t can_periph);
1251 /* enable protocol exception detection mode */
1252 void can_ped_mode_enable(uint32_t can_periph);
1253 /* disable protocol exception detection mode */
1254 void can_ped_mode_disable(uint32_t can_periph);
1255 /* configure arbitation delay bits */
1256 void can_arbitation_delay_bits_config(uint32_t can_periph, uint32_t delay_bits);
1257 /* configure bit sampling mode */
1258 void can_bsp_mode_config(uint32_t can_periph, uint32_t sampling_mode);
1259 
1260 /* CAN interrupt and flag */
1261 /* get CAN flag */
1262 FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag);
1263 /* clear CAN flag */
1264 void can_flag_clear(uint32_t can_periph, can_flag_enum flag);
1265 /* enable CAN interrupt */
1266 void can_interrupt_enable(uint32_t can_periph, can_interrupt_enum interrupt);
1267 /* disable CAN interrupt */
1268 void can_interrupt_disable(uint32_t can_periph, can_interrupt_enum interrupt);
1269 /* get CAN interrupt flag */
1270 FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum int_flag);
1271 /* clear CAN interrupt flag */
1272 void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum int_flag);
1273 
1274 #endif /* GD32A50X_CAN_H */
1275