summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc43xx/chip/lpc43_can.h
blob: cebeaccd8ce4e1f35003f285243d0514e19c37f8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
/************************************************************************************
 * arch/arm/src/lpc43xx/chip/lpc43_can.h
 *
 *   Copyright (C) 2012 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ************************************************************************************/

#ifndef __ARCH_ARM_SRC_LPC43XX_CHIP_LPC43_CAN_H
#define __ARCH_ARM_SRC_LPC43XX_CHIP_LPC43_CAN_H

/************************************************************************************
 * Included Files
 ************************************************************************************/

#include <nuttx/config.h>

/************************************************************************************
 * Pre-processor Definitions
 ************************************************************************************/
/* Register Offsets *****************************************************************/

#define LPC43_CAN_CNTL_OFFSET        0x0000 /* CAN control register */
#define LPC43_CAN_STAT_OFFSET        0x0004 /* Status register */
#define LPC43_CAN_EC_OFFSET          0x0008 /* Error counter register */
#define LPC43_CAN_BT_OFFSET          0x000c /* Bit timing register */
#define LPC43_CAN_INT_OFFSET         0x0010 /* Interrupt register */
#define LPC43_CAN_TEST_OFFSET        0x0014 /* Test register */
#define LPC43_CAN_BRPE_OFFSET        0x0018 /* Baud rate prescaler extension register */

#define LPC43_CAN_IF1_CMDREQ_OFFSET  0x0020 /* Message interface 1 command request */
#define LPC43_CAN_IF1_CMDMSKW_OFFSET 0x0024 /* Message interface 1 command mask (write) */
#define LPC43_CAN_IF1_CMDMSKR_OFFSET 0x0024 /* Message interface 1 command mask (read) */
#define LPC43_CAN_IF1_MSK1_OFFSET    0x0028 /* Message interface 1 mask 1 */
#define LPC43_CAN_IF1_MSK2_OFFSET    0x002c /* Message interface 1 mask 2 */
#define LPC43_CAN_IF1_ARB1_OFFSET    0x0030 /* Message interface 1 arbitration */
#define LPC43_CAN_IF1_ARB2_OFFSET    0x0034 /* Message interface 1 arbitration */
#define LPC43_CAN_IF1_MCTRL_OFFSET   0x0038 /* Message interface 1 message control */
#define LPC43_CAN_IF1_DA1_OFFSET     0x003c /* Message interface 1 data A1 */
#define LPC43_CAN_IF1_DA2_OFFSET     0x0040 /* Message interface 1 data A2 */
#define LPC43_CAN_IF1_DB1_OFFSET     0x0044 /* Message interface 1 data B1 */
#define LPC43_CAN_IF1_DB2_OFFSET     0x0048 /* Message interface 1 data B2 */

#define LPC43_CAN_IF2_CMDREQ_OFFSET  0x0080 /* Message interface 2 command request */
#define LPC43_CAN_IF2_CMDMSKW_OFFSET 0x0084 /* Message interface 2 command mask (write) */
#define LPC43_CAN_IF2_CMDMSKR_OFFSET 0x0084 /* Message interface 2 command mask (read) */
#define LPC43_CAN_IF2_MSK1_OFFSET    0x0088 /* Message interface 2 mask 1 */
#define LPC43_CAN_IF2_MSK2_OFFSET    0x008c /* Message interface 2 mask 2 */
#define LPC43_CAN_IF2_ARB1_OFFSET    0x0090 /* Message interface 2 arbitration 1 */
#define LPC43_CAN_IF2_ARB2_OFFSET    0x0094 /* Message interface 2 arbitration 2 */
#define LPC43_CAN_IF2_MCTRL_OFFSET   0x0098 /* Message interface 2 message control */
#define LPC43_CAN_IF2_DA1_OFFSET     0x009c /* Message interface 2 data A1 */
#define LPC43_CAN_IF2_DA2_OFFSET     0x00a0 /* Message interface 2 data A2 */
#define LPC43_CAN_IF2_DB1_OFFSET     0x00a4 /* Message interface 2 data B1 */
#define LPC43_CAN_IF2_DB2_OFFSET     0x00a8 /* Message interface 2 data B2 */

#define LPC43_CAN_TXREQ1_OFFSET      0x0100 /* Transmission request 1 */
#define LPC43_CAN_TXREQ2_OFFSET      0x0104 /* Transmission request 2 */
#define LPC43_CAN_ND1_OFFSET         0x0120 /* New data 1 */
#define LPC43_CAN_ND2_OFFSET         0x0124 /* New data 2 */
#define LPC43_CAN_IR1_OFFSET         0x0140 /* Interrupt pending 1 */
#define LPC43_CAN_IR2_OFFSET         0x0144 /* Interrupt pending 2 */
#define LPC43_CAN_MSGV1_OFFSET       0x0160 /* Message valid 1 */
#define LPC43_CAN_MSGV2_OFFSET       0x0164 /* Message valid 2 */
#define LPC43_CAN_CLKDIV_OFFSET      0x0180 /* CAN clock divider register */

/* Register Addresses ***************************************************************/

#define LPC43_CAN1_CNTL              (LPC43_CAN1_BASE+LPC43_CAN_CNTL_OFFSET)
#define LPC43_CAN1_STAT              (LPC43_CAN1_BASE+LPC43_CAN_STAT_OFFSET)
#define LPC43_CAN1_EC                (LPC43_CAN1_BASE+LPC43_CAN_EC_OFFSET)
#define LPC43_CAN1_BT                (LPC43_CAN1_BASE+LPC43_CAN_BT_OFFSET)
#define LPC43_CAN1_INT               (LPC43_CAN1_BASE+LPC43_CAN_INT_OFFSET)
#define LPC43_CAN1_TEST              (LPC43_CAN1_BASE+LPC43_CAN_TEST_OFFSET)
#define LPC43_CAN1_BRPE              (LPC43_CAN1_BASE+LPC43_CAN_BRPE_OFFSET)

#define LPC43_CAN1_IF1_CMDREQ        (LPC43_CAN1_BASE+LPC43_CAN_IF1_CMDREQ_OFFSET)
#define LPC43_CAN1_IF1_CMDMSKW       (LPC43_CAN1_BASE+LPC43_CAN_IF1_CMDMSKW_OFFSET)
#define LPC43_CAN1_IF1_CMDMSKR       (LPC43_CAN1_BASE+LPC43_CAN_IF1_CMDMSKR_OFFSET)
#define LPC43_CAN1_IF1_MSK1          (LPC43_CAN1_BASE+LPC43_CAN_IF1_MSK1_OFFSET)
#define LPC43_CAN1_IF1_MSK2          (LPC43_CAN1_BASE+LPC43_CAN_IF1_MSK2_OFFSET)
#define LPC43_CAN1_IF1_ARB1          (LPC43_CAN1_BASE+LPC43_CAN_IF1_ARB1_OFFSET)
#define LPC43_CAN1_IF1_ARB2          (LPC43_CAN1_BASE+LPC43_CAN_IF1_ARB2_OFFSET)
#define LPC43_CAN1_IF1_MCTRL         (LPC43_CAN1_BASE+LPC43_CAN_IF1_MCTRL_OFFSET)
#define LPC43_CAN1_IF1_DA1           (LPC43_CAN1_BASE+LPC43_CAN_IF1_DA1_OFFSET)
#define LPC43_CAN1_IF1_DA2           (LPC43_CAN1_BASE+LPC43_CAN_IF1_DA2_OFFSET)
#define LPC43_CAN1_IF1_DB1           (LPC43_CAN1_BASE+LPC43_CAN_IF1_DB1_OFFSET)
#define LPC43_CAN1_IF1_DB2           (LPC43_CAN1_BASE+LPC43_CAN_IF1_DB2_OFFSET)

#define LPC43_CAN1_IF2_CMDREQ        (LPC43_CAN1_BASE+LPC43_CAN_IF2_CMDREQ_OFFSET)
#define LPC43_CAN1_IF2_CMDMSKW       (LPC43_CAN1_BASE+LPC43_CAN_IF2_CMDMSKW_OFFSET)
#define LPC43_CAN1_IF2_CMDMSKR       (LPC43_CAN1_BASE+LPC43_CAN_IF2_CMDMSKR_OFFSET)
#define LPC43_CAN1_IF2_MSK1          (LPC43_CAN1_BASE+LPC43_CAN_IF2_MSK1_OFFSET)
#define LPC43_CAN1_IF2_MSK2          (LPC43_CAN1_BASE+LPC43_CAN_IF2_MSK2_OFFSET)
#define LPC43_CAN1_IF2_ARB1          (LPC43_CAN1_BASE+LPC43_CAN_IF2_ARB1_OFFSET)
#define LPC43_CAN1_IF2_ARB2          (LPC43_CAN1_BASE+LPC43_CAN_IF2_ARB2_OFFSET)
#define LPC43_CAN1_IF2_MCTRL         (LPC43_CAN1_BASE+LPC43_CAN_IF2_MCTRL_OFFSET)
#define LPC43_CAN1_IF2_DA1           (LPC43_CAN1_BASE+LPC43_CAN_IF2_DA1_OFFSET)
#define LPC43_CAN1_IF2_DA2           (LPC43_CAN1_BASE+LPC43_CAN_IF2_DA2_OFFSET)
#define LPC43_CAN1_IF2_DB1           (LPC43_CAN1_BASE+LPC43_CAN_IF2_DB1_OFFSET)
#define LPC43_CAN1_IF2_DB2           (LPC43_CAN1_BASE+LPC43_CAN_IF2_DB2_OFFSET)

#define LPC43_CAN1_TXREQ1            (LPC43_CAN1_BASE+LPC43_CAN_TXREQ1_OFFSET)
#define LPC43_CAN1_TXREQ2            (LPC43_CAN1_BASE+LPC43_CAN_TXREQ2_OFFSET)
#define LPC43_CAN1_ND1               (LPC43_CAN1_BASE+LPC43_CAN_ND1_OFFSET)
#define LPC43_CAN1_ND2               (LPC43_CAN1_BASE+LPC43_CAN_ND2_OFFSET)
#define LPC43_CAN1_IR1               (LPC43_CAN1_BASE+LPC43_CAN_IR1_OFFSET)
#define LPC43_CAN1_IR2               (LPC43_CAN1_BASE+LPC43_CAN_IR2_OFFSET)
#define LPC43_CAN1_MSGV1             (LPC43_CAN1_BASE+LPC43_CAN_MSGV1_OFFSET)
#define LPC43_CAN1_MSGV2             (LPC43_CAN1_BASE+LPC43_CAN_MSGV2_OFFSET)
#define LPC43_CAN1_CLKDIV            (LPC43_CAN1_BASE+LPC43_CAN_CLKDIV_OFFSET)

#define LPC43_CAN2_CNTL              (LPC43_CAN2_BASE+LPC43_CAN_CNTL_OFFSET)
#define LPC43_CAN2_STAT              (LPC43_CAN2_BASE+LPC43_CAN_STAT_OFFSET)
#define LPC43_CAN2_EC                (LPC43_CAN2_BASE+LPC43_CAN_EC_OFFSET)
#define LPC43_CAN2_BT                (LPC43_CAN2_BASE+LPC43_CAN_BT_OFFSET)
#define LPC43_CAN2_INT               (LPC43_CAN2_BASE+LPC43_CAN_INT_OFFSET)
#define LPC43_CAN2_TEST              (LPC43_CAN2_BASE+LPC43_CAN_TEST_OFFSET)
#define LPC43_CAN2_BRPE              (LPC43_CAN2_BASE+LPC43_CAN_BRPE_OFFSET)

#define LPC43_CAN2_IF1_CMDREQ        (LPC43_CAN2_BASE+LPC43_CAN_IF1_CMDREQ_OFFSET)
#define LPC43_CAN2_IF1_CMDMSKW       (LPC43_CAN2_BASE+LPC43_CAN_IF1_CMDMSKW_OFFSET)
#define LPC43_CAN2_IF1_CMDMSKR       (LPC43_CAN2_BASE+LPC43_CAN_IF1_CMDMSKR_OFFSET)
#define LPC43_CAN2_IF1_MSK1          (LPC43_CAN2_BASE+LPC43_CAN_IF1_MSK1_OFFSET)
#define LPC43_CAN2_IF1_MSK2          (LPC43_CAN2_BASE+LPC43_CAN_IF1_MSK2_OFFSET)
#define LPC43_CAN2_IF1_ARB1          (LPC43_CAN2_BASE+LPC43_CAN_IF1_ARB1_OFFSET)
#define LPC43_CAN2_IF1_ARB2          (LPC43_CAN2_BASE+LPC43_CAN_IF1_ARB2_OFFSET)
#define LPC43_CAN2_IF1_MCTRL         (LPC43_CAN2_BASE+LPC43_CAN_IF1_MCTRL_OFFSET)
#define LPC43_CAN2_IF1_DA1           (LPC43_CAN2_BASE+LPC43_CAN_IF1_DA1_OFFSET)
#define LPC43_CAN2_IF1_DA2           (LPC43_CAN2_BASE+LPC43_CAN_IF1_DA2_OFFSET)
#define LPC43_CAN2_IF1_DB1           (LPC43_CAN2_BASE+LPC43_CAN_IF1_DB1_OFFSET)
#define LPC43_CAN2_IF1_DB2           (LPC43_CAN2_BASE+LPC43_CAN_IF1_DB2_OFFSET)

#define LPC43_CAN2_IF2_CMDREQ        (LPC43_CAN2_BASE+LPC43_CAN_IF2_CMDREQ_OFFSET)
#define LPC43_CAN2_IF2_CMDMSKW       (LPC43_CAN2_BASE+LPC43_CAN_IF2_CMDMSKW_OFFSET)
#define LPC43_CAN2_IF2_CMDMSKR       (LPC43_CAN2_BASE+LPC43_CAN_IF2_CMDMSKR_OFFSET)
#define LPC43_CAN2_IF2_MSK1          (LPC43_CAN2_BASE+LPC43_CAN_IF2_MSK1_OFFSET)
#define LPC43_CAN2_IF2_MSK2          (LPC43_CAN2_BASE+LPC43_CAN_IF2_MSK2_OFFSET)
#define LPC43_CAN2_IF2_ARB1          (LPC43_CAN2_BASE+LPC43_CAN_IF2_ARB1_OFFSET)
#define LPC43_CAN2_IF2_ARB2          (LPC43_CAN2_BASE+LPC43_CAN_IF2_ARB2_OFFSET)
#define LPC43_CAN2_IF2_MCTRL         (LPC43_CAN2_BASE+LPC43_CAN_IF2_MCTRL_OFFSET)
#define LPC43_CAN2_IF2_DA1           (LPC43_CAN2_BASE+LPC43_CAN_IF2_DA1_OFFSET)
#define LPC43_CAN2_IF2_DA2           (LPC43_CAN2_BASE+LPC43_CAN_IF2_DA2_OFFSET)
#define LPC43_CAN2_IF2_DB1           (LPC43_CAN2_BASE+LPC43_CAN_IF2_DB1_OFFSET)
#define LPC43_CAN2_IF2_DB2           (LPC43_CAN2_BASE+LPC43_CAN_IF2_DB2_OFFSET)

#define LPC43_CAN2_TXREQ1            (LPC43_CAN2_BASE+LPC43_CAN_TXREQ1_OFFSET)
#define LPC43_CAN2_TXREQ2            (LPC43_CAN2_BASE+LPC43_CAN_TXREQ2_OFFSET)
#define LPC43_CAN2_ND1               (LPC43_CAN2_BASE+LPC43_CAN_ND1_OFFSET)
#define LPC43_CAN2_ND2               (LPC43_CAN2_BASE+LPC43_CAN_ND2_OFFSET)
#define LPC43_CAN2_IR1               (LPC43_CAN2_BASE+LPC43_CAN_IR1_OFFSET)
#define LPC43_CAN2_IR2               (LPC43_CAN2_BASE+LPC43_CAN_IR2_OFFSET)
#define LPC43_CAN2_MSGV1             (LPC43_CAN2_BASE+LPC43_CAN_MSGV1_OFFSET)
#define LPC43_CAN2_MSGV2             (LPC43_CAN2_BASE+LPC43_CAN_MSGV2_OFFSET)
#define LPC43_CAN2_CLKDIV            (LPC43_CAN2_BASE+LPC43_CAN_CLKDIV_OFFSET)

/* Register Bit Definitions *********************************************************/

/* CAN control register */

#define CAN_CNTL_INIT                (1 << 0)  /* Bit 0:  Initialization */
#define CAN_CNTL_IE                  (1 << 1)  /* Bit 1:  Module interrupt enable */
#define CAN_CNTL_SIE                 (1 << 2)  /* Bit 2:  Status change interrupt enable */
#define CAN_CNTL_EIE                 (1 << 3)  /* Bit 3:  Error interrupt enable */
                                               /* Bit 4:  Reserved */
#define CAN_CNTL_DAR                 (1 << 5)  /* Bit 5:  Disable automatic retransmission */
#define CAN_CNTL_CCE                 (1 << 6)  /* Bit 6:  Configuration change enable */
#define CAN_CNTL_TEST                (1 << 7)  /* Bit 7:  Test mode enable */
                                               /* Bits 8-31: Reserved */
/* Status register */

#define CAN_STAT_LEC_SHIFT           (0)       /* Bits 0-2: Last error code */
#define CAN_STAT_LEC_MASK            (7 << CAN_STAT_LEC_SHIFT)
#define CAN_STAT_LEC_NOE             (0 << CAN_STAT_LEC_SHIFT) /* No error */
#define CAN_STAT_LEC_STUFFE          (1 << CAN_STAT_LEC_SHIFT) /* Stuff error */
#define CAN_STAT_LEC_FORME           (2 << CAN_STAT_LEC_SHIFT) /* Form error */
#define CAN_STAT_LEC_ACKE            (3 << CAN_STAT_LEC_SHIFT) /* AckError */
#define CAN_STAT_LEC_BI1E            (4 << CAN_STAT_LEC_SHIFT) /* Bit1Error */
#define CAN_STAT_LEC_BIT0E           (5 << CAN_STAT_LEC_SHIFT) /* Bit0Error */
#define CAN_STAT_LEC_CRCE            (6 << CAN_STAT_LEC_SHIFT) /* CRCError */
#define CAN_STAT_TXOK                (1 << 3)  /* Bit 3:  Transmitted a message successfully */
#define CAN_STAT_RXOK                (1 << 4)  /* Bit 4:  Received a message successfully */
#define CAN_STAT_EPASS               (1 << 5)  /* Bit 5:  Error passive */
#define CAN_STAT_EWARN               (1 << 6)  /* Bit 6:  Warning status */
#define CAN_STAT_BOFF                (1 << 7)  /* Bit 7:  Busoff status */
                                               /* Bits 8-31: Reserved */
/* Error counter register */

#define CAN_EC_TEC_SHIFT             (0)       /* Bits 0-7: Transmit error counter */
#define CAN_EC_TEC_MASK              (0xff << CAN_EC_TEC_SHIFT)
#define CAN_EC_REC_SHIFT             (8)       /* Bits 8-14: Receive error counter */
#define CAN_EC_REC_MASK              (0x7f << CAN_EC_REC_SHIFT)
#define CAN_EC_RP                    (1 << 15)  /* Bit 15:  Receive error passive */
                                                /* Bits 16-31: Reserved */
/* Bit timing register */

#define CAN_BT_BRP_SHIFT             (0)        /* Bits 0-5: Baud rate prescaler */
#define CAN_BT_BRP_MASK              (0x3f << CAN_BT_BRP_SHIFT)
#define CAN_BT_SJW_SHIFT             (6)        /* Bits 6-7: (Re)synchronization jump width */
#define CAN_BT_SJW_MASK              (3 << CAN_BT_SJW_SHIFT)
#define CAN_BT_TSEG1_SHIFT           (8)        /* Bits 8-11: Time segment after the sample point */
#define CAN_BT_TSEG1_MASK            (15 << CAN_BT_TSEG1_SHIFT)
#define CAN_BT_TSEG2_SHIFT           (12)       /* Bits 12-14: Time segment before the sample point */
#define CAN_BT_TSEG2_MASK            (7 << CAN_BT_TSEG2_SHIFT)
                                                /* Bits 15-31: Reserved */
/* Interrupt register */

#define CAN_INT_SHIFT                (0)       /* Bits 0-15: Interrupt ID */
#define CAN_INT_MASK                 (0xffff << CAN_INT_SHIFT)
#  define CAN_INT_NONE               (0 << CAN_INT_SHIFT)  /* No interrupt pending */
#  define CAN_INT_MSG1               (1 << CAN_INT_SHIFT)  /* Message 1 */
#  define CAN_INT_MSG2               (2 << CAN_INT_SHIFT)  /* Message 2 */
#  define CAN_INT_MSG3               (3 << CAN_INT_SHIFT)  /* Message 3 */
#  define CAN_INT_MSG4               (4 << CAN_INT_SHIFT)  /* Message 4 */
#  define CAN_INT_MSG5               (5 << CAN_INT_SHIFT)  /* Message 5 */
#  define CAN_INT_MSG6               (6 << CAN_INT_SHIFT)  /* Message 6 */
#  define CAN_INT_MSG7               (7 << CAN_INT_SHIFT)  /* Message 7 */
#  define CAN_INT_MSG8               (8 << CAN_INT_SHIFT)  /* Message 8 */
#  define CAN_INT_MSG9               (9 << CAN_INT_SHIFT)  /* Message 9 */
#  define CAN_INT_MSG10              (10 << CAN_INT_SHIFT) /* Message 10 */
#  define CAN_INT_MSG11              (11 << CAN_INT_SHIFT) /* Message 11 */
#  define CAN_INT_MSG12              (12 << CAN_INT_SHIFT) /* Message 12 */
#  define CAN_INT_MSG13              (13 << CAN_INT_SHIFT) /* Message 13 */
#  define CAN_INT_MSG14              (14 << CAN_INT_SHIFT) /* Message 14 */
#  define CAN_INT_MSG15              (15 << CAN_INT_SHIFT) /* Message 15 */
#  define CAN_INT_MSG16              (16 << CAN_INT_SHIFT) /* Message 16 */
#  define CAN_INT_MSG17              (17 << CAN_INT_SHIFT) /* Message 17 */
#  define CAN_INT_MSG18              (18 << CAN_INT_SHIFT) /* Message 18 */
#  define CAN_INT_MSG19              (19 << CAN_INT_SHIFT) /* Message 19 */
#  define CAN_INT_MSG20              (20 << CAN_INT_SHIFT) /* Message 20 */
#  define CAN_INT_MSG21              (21 << CAN_INT_SHIFT) /* Message 21 */
#  define CAN_INT_MSG22              (22 << CAN_INT_SHIFT) /* Message 22 */
#  define CAN_INT_MSG23              (23 << CAN_INT_SHIFT) /* Message 23 */
#  define CAN_INT_MSG24              (24 << CAN_INT_SHIFT) /* Message 24 */
#  define CAN_INT_MSG25              (25 << CAN_INT_SHIFT) /* Message 25 */
#  define CAN_INT_MSG26              (26 << CAN_INT_SHIFT) /* Message 26 */
#  define CAN_INT_MSG27              (27 << CAN_INT_SHIFT) /* Message 27 */
#  define CAN_INT_MSG28              (28 << CAN_INT_SHIFT) /* Message 28 */
#  define CAN_INT_MSG29              (29 << CAN_INT_SHIFT) /* Message 29 */
#  define CAN_INT_MSG30              (30 << CAN_INT_SHIFT) /* Message 30 */
#  define CAN_INT_MSG31              (31 << CAN_INT_SHIFT) /* Message 31 */
#  define CAN_INT_MSG32              (32 << CAN_INT_SHIFT) /* Message 32 */
#  define CAN_INT_MSG32              (0x8000 << CAN_INT_SHIFT) /* Status interrupt */
                                               /* Bits 16-31: Reserved */
/* Test register */
                                               /* Bits 0-1: Reserved */
#define CAN_TEST_BASIC               (1 << 2)  /* Bit 2:  Basic mode */
#define CAN_TEST_SILENT              (1 << 3)  /* Bit 3:  Silent mode */
#define CAN_TEST_LBACK               (1 << 4)  /* Bit 4:  Loop back mode */
#define CAN_TEST_TX_SHIFT            (5)       /* Bits 5-6: Control of TD pins */
#define CAN_TEST_TX_MASK             (3 << CAN_TEST_TX_SHIFT)
#  define CAN_TEST_TX_CAN            (0 << CAN_TEST_TX_SHIFT) /* Level controlled CAN controller */
#  define CAN_TEST_TX_MONITOR        (1 << CAN_TEST_TX_SHIFT) /* Sample point monitored TD pin */
#  define CAN_TEST_TX_DOMINANT       (2 << CAN_TEST_TX_SHIFT) /* TD pin LOW/dominant */
#  define CAN_TEST_TX_RECESSIVE      (3 << CAN_TEST_TX_SHIFT) /* TD pin HIGH/recessive */
#define CAN_TEST_RX                  (1 << 7)  /* Bit 7:  Monitors actual value of RD Pin */
                                               /* Bits 8-31: Reserved */
/* Baud rate prescaler extension register */

#define CAN_BRPE_SHIFT               (0)       /* Bits 0-3: Baud rate prescaler extension */
#define CAN_BRPE_MASK                (15 << CAN_BRPE_SHIFT)
                                               /* Bits 4-31: Reserved */
/* Message interface 1/2 command request */

#define CAN_CMDREQ_MSGNO_SHIFT       (0)       /* Bits 0-5: Message number */
#define CAN_CMDREQ_MSGNO_MASK        (0x3f << CAN_CMDREQ_MSGNO_SHIFT)
                                               /* Bits 6-14: Reserved */
#define CAN_CMDREQ_BUSY              (1 << 15) /* Bit 15: BUSY flag */
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 command mask (write) */

#define CAN_CMDMSKW_DATAB            (1 << 0)  /* Bit 0:  Access data bytes 4-7 */
#define CAN_CMDMSKW_DATAA            (1 << 1)  /* Bit 1:  Access data bytes 0-3 */
#define CAN_CMDMSKW_TXRQST           (1 << 2)  /* Bit 2:  Access transmission request bit */
#define CAN_CMDMSKW_CLRINTPND        (1 << 3)  /* Bit 3:  Ignored in the write direction */
#define CAN_CMDMSKW_CTRL             (1 << 4)  /* Bit 4:  Access control bits */
#define CAN_CMDMSKW_ARB              (1 << 5)  /* Bit 5:  Access arbitration bits */
#define CAN_CMDMSKW_MASK             (1 << 6)  /* Bit 6:  Access mask bits */
#define CAN_CMDMSKW_WRRD             (1 << 7)  /* Bit 7:  Write transfer (1) */
                                               /* Bits 8-31: Reserved */
/* Message interface 1/2 command mask (read) */

#define CAN_CMDMSKR_DATAB            (1 << 0)  /* Bit 0:  Access data bytes 4-7 */
#define CAN_CMDMSKR_DATAA            (1 << 1)  /* Bit 1:  Access data bytes 0-3 */
#define CAN_CMDMSKR_NEWDAT           (1 << 2)  /* Bit 2:  Access new data bit */
#define CAN_CMDMSKR_CLRINTPND        (1 << 3)  /* Bit 3:  Clear interrupt pending bit */
#define CAN_CMDMSKR_CTRL             (1 << 4)  /* Bit 4:  Access control bits */
#define CAN_CMDMSKR_ARB              (1 << 5)  /* Bit 5:  Access arbitration bits */
#define CAN_CMDMSKR_MASK             (1 << 6)  /* Bit 6:  Access mask bits */
#define CAN_CMDMSKR_WRRD             (1 << 7)  /* Bit 7:  Read transfer (0) */
                                               /* Bits 8-31: Reserved */
/* Message interface 1/2 mask 1 */

#define CAN_MSK1                     0xffff    /* Bits 0-15: Identifier mask 0-15 */
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 mask 2 */

#define CAN_MSK2                     0x1fff    /* Bits 0-12: Identifier mask 16-28 */
                                               /* Bit 13: Reserved */
#define CAN_MSK2_MDIR                (1 << 14) /* Bit 14: Mask message direction */
#define CAN_MSK2_MXTD                (1 << 15) /* Bit 15: Mask extend identifier */
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 arbitration */

#define CAN_ARB1                     0xffff    /* Bits 0-15: Identifier mask 0-15 */
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 arbitration */

#define CAN_MSK2                     0x1fff    /* Bits 0-12: Identifier mask 16-28 */
#define CAN_MSK2_DIR                 (1 << 13) /* Bit 13: Message direction */
#define CAN_MSK2_XTD                 (1 << 14) /* Bit 14: Extend identifier */
#define CAN_MSK2_MSGVAL              (1 << 15) /* Bit 15: Message valid */
                                               /* Bits 16-31: Reserved */
/* Message interface 1 message control */

#define CAN_MCTRL_DLC_SHIFT          (0)       /* Bits 0-3: Data length code */
#define CAN_MCTRL_DLC_MASK           (15 << CAN_MCTRL_DLC_SHIFT)
                                               /* Bits 4-6: Reserved */
#define CAN_MCTRL_EOB                (1 << 7)  /* Bit 7:  End of buffer */
#define CAN_MCTRL_TXRQST             (1 << 8)  /* Bit 8:  Transmit request */
#define CAN_MCTRL_RMTEN              (1 << 9)  /* Bit 9:  Remote enable */
#define CAN_MCTRL_RXIE               (1 << 10) /* Bit 10: Receive interrupt enable */
#define CAN_MCTRL_TXIE               (1 << 11) /* Bit 11: Transmit interrupt enable */
#define CAN_MCTRL_UMASK              (1 << 12) /* Bit 12: Use acceptance mask */
#define CAN_MCTRL_INTPND             (1 << 13) /* Bit 13: Interrupt pending */
#define CAN_MCTRL_MSGLST             (1 << 14) /* Bit 14: Message lost */
#define CAN_MCTRL_NEWDAT             (1 << 15) /* Bit 15: New data */
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 data A1 */

#define CAN_DA1_DATA0_SHIFT          (0)       /* Bits 0-7: Data byte 0 */
#define CAN_DA1_DATA0_MASK           (0xff << CAN_DA1_DATA0_SHIFT)
#define CAN_DA1_DATA1_SHIFT          (8)       /* Bits 8-15: Data byte 1 */
#define CAN_DA1_DATA1_MASK           (0xff << CAN_DA1_DATA1_SHIFT)
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 data A2 */

#define CAN_DA2_DATA2_SHIFT          (0)       /* Bits 0-7: Data byte 2 */
#define CAN_DA2_DATA2_MASK           (0xff << CAN_DA2_DATA2_SHIFT)
#define CAN_DA2_DATA3_SHIFT          (8)       /* Bits 8-15: Data byte 3 */
#define CAN_DA2_DATA3_MASK           (0xff << CAN_DA2_DATA3_SHIFT)
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 data B1 */

#define CAN_DB1_DATA4_SHIFT          (0)       /* Bits 0-7: Data byte 4 */
#define CAN_DB1_DATA4_MASK           (0xff << CAN_DB1_DATA4_SHIFT)
#define CAN_DB1_DATA5_SHIFT          (8)       /* Bits 8-15: Data byte 5 */
#define CAN_DB1_DATA5_MASK           (0xff << CAN_DB1_DATA5_SHIFT)
                                               /* Bits 16-31: Reserved */
/* Message interface 1/2 data B2 */

#define CAN_DB2_DATA6_SHIFT          (0)       /* Bits 0-7: Data byte 6 */
#define CAN_DB2_DATA6_MASK           (0xff << CAN_DB2_DATA6_SHIFT)
#define CAN_DB2_DATA7_SHIFT          (8)       /* Bits 8-15: Data byte 7 */
#define CAN_DB2_DATA7_MASK           (0xff << CAN_DB2_DATA6_SHIFT)
                                               /* Bits 16-31: Reserved */
/* Transmission request 1 */

#define CAN_TXREQ1_MASK              0xffff    /* Bits 0-15: TX request bit msg 1-16 */
#define CAN_TXREQ1(n)                (1 << ((n)-1)
                                               /* Bits 16-31: Reserved */
/* Transmission request 2 */

#define CAN_TXREQ2_MASK              0xffff    /* Bits 0-15: TX request bit msg 17-32 */
#define CAN_TXREQ2(n)                (1 << ((n)-17)
                                               /* Bits 16-31: Reserved */
/* New data 1 */

#define CAN_ND1_MASK                 0xffff    /* Bits 0-15: New data bits msg 1-16 */
#define CAN_ND1(n)                   (1 << ((n)-1)
                                               /* Bits 16-31: Reserved */
/* New data 2 */

#define CAN_ND2_MASK                 0xffff    /* Bits 0-15: New data bits msg 17-32 */
#define CAN_ND2(n)                   (1 << ((n)-17)
                                               /* Bits 16-31: Reserved */
/* Interrupt pending 1 */

#define CAN_IR1_MASK                 0xffff    /* Bits 0-15: Interrup pending msg 1-16 */
#define CAN_IR1(n)                   (1 << ((n)-1)
                                               /* Bits 16-31: Reserved */
/* Interrupt pending 2 */

#define CAN_IR2_MASK                 0xffff    /* Bits 0-15: Interrup pending msg 17-32 */
#define CAN_IR2(n)                   (1 << ((n)-17)
                                               /* Bits 16-31: Reserved */
/* Message valid 1 */

#define CAN_MSGV1_MASK               0xffff    /* Bits 0-15: Interrup pending msg 1-16 */
#define CAN_MSGV1(n)                 (1 << ((n)-1)
                                               /* Bits 16-31: Reserved */
/* Message valid 2 */

#define CAN_MSGV2_MASK               0xffff    /* Bits 0-15: Interrup pending msg 17-32 */
#define CAN_MSGV2(n)                 (1 << ((n)-17)
                                               /* Bits 16-31: Reserved */
/* CAN clock divider register */

#define CAN_CLKDIV_SHIFT            (0)       /* Bits 0-3: Clock divider value */
#define CAN_CLKDIV_MASK             (15 << CAN_CLKDIV_SHIFT)
#  define CAN_CLKDIV_DIV1           (0 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 1 */
#  define CAN_CLKDIV_DIV2           (1 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 2 */
#  define CAN_CLKDIV_DIV3           (2 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 3 */
#  define CAN_CLKDIV_DIV5           (3 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 5 */
#  define CAN_CLKDIV_DIV9           (4 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 9 */
#  define CAN_CLKDIV_DIV 17         (5 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 17 */
#  define CAN_CLKDIV_DIV33          (6 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 33 */
#  define CAN_CLKDIV_DIV65          (7 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 65 */
#  define CAN_CLKDIV_DIV129         (8 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 129 */
#  define CAN_CLKDIV_DIV257         (9 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 257 */
#  define CAN_CLKDIV_DIV513         (10 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 513 */
#  define CAN_CLKDIV_DIV1025        (11 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 1025 */
#  define CAN_CLKDIV_DIV2049        (12 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 2049 */
#  define CAN_CLKDIV_DIV4097        (13 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 4097 */
#  define CAN_CLKDIV_DIV8093        (14 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 8093 */
#  define CAN_CLKDIV_DIV16385       (15 << CAN_CLKDIV_SHIFT) /* CAN_CLK = PCLK / 16385 */
                                               /* Bits 4-31: Reserved */

/************************************************************************************
 * Public Types
 ************************************************************************************/

/************************************************************************************
 * Public Data
 ************************************************************************************/

/************************************************************************************
 * Public Functions
 ************************************************************************************/

#endif /* __ARCH_ARM_SRC_LPC43XX_CHIP_LPC43_CAN_H */