summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/gen5200/include/bsp/mscan-base.h
blob: a2b8737d8e6aa380d3f250a555e5577f26b2d9a6 (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
/**
 * @file
 *
 * @ingroup m
 *
 * @brief MSCAN register definitions and support functions.
 */

/*
 * Copyright (c) 2008
 * Embedded Brains GmbH
 * Obere Lagerstr. 30
 * D-82178 Puchheim
 * Germany
 * rtems@embedded-brains.de
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.org/license/LICENSE.
 */

#ifndef LIBBSP_MSCAN_BASE_H
#define LIBBSP_MSCAN_BASE_H

#include <stdbool.h>

#include <bsp/mpc5200.h>

/**
 * @defgroup m MSCAN
 *
 * @{
 */

#define MSCAN_BIT_RATE_MIN 10000

#define MSCAN_BIT_RATE_MAX 1000000

#define MSCAN_BIT_RATE_DEFAULT 125000

#define MSCAN_FILTER_NUMBER_MIN 0

#define MSCAN_FILTER_NUMBER_2 2

#define MSCAN_FILTER_NUMBER_4 4

#define MSCAN_FILTER_NUMBER_MAX 8

#define MSCAN_FILTER_ID_DEFAULT 0U

#define MSCAN_FILTER_MASK_DEFAULT 0xffffffffU

#define MSCAN_TRANSMIT_BUFFER_NUMBER 3

/**
 * @name MSCAN Control Register 0 (CANCTL0)
 *
 * @{
 */

#define CTL0_RXFRM               (1 << 7)
#define CTL0_RXACT               (1 << 6)
#define CTL0_CSWAI               (1 << 5)
#define CTL0_SYNCH               (1 << 4)
#define CTL0_TIME                (1 << 3)
#define CTL0_WUPE                (1 << 2)
#define CTL0_SLPRQ               (1 << 1)
#define CTL0_INITRQ              (1 << 0)

/** @} */

/**
 * @name MSCAN Control Register 1 (CANCTL1)
 *
 * @{
 */

#define CTL1_CANE                (1 << 7)
#define CTL1_CLKSRC              (1 << 6)
#define CTL1_LOOPB               (1 << 5)
#define CTL1_LISTEN              (1 << 4)
#define CTL1_WUPM                (1 << 2)
#define CTL1_SLPAK               (1 << 1)
#define CTL1_INITAK              (1 << 0)

/** @} */

/**
 * @name MSCAN Bus Timing Register 0 (CANBTR0)
 *
 * @{
 */

#define BTR0_SJW_MASK            0xc0
#define BTR0_BRP_MASK            0x3f

#define BTR0_SJW( btr0)          ((btr0) << 6)
#define BTR0_BRP( btr0)          ((btr0) << 0)

#define BTR0_GET_SJW( btr0)      (((btr0) & BTR0_SJW_MASK) >> 6)
#define BTR0_GET_BRP( btr0)      (((btr0) & BTR0_BRP_MASK) >> 0)

/** @} */

/**
 * @name MSCAN Bus Timing Register 1 (CANBTR1)
 *
 * @{
 */

#define BTR1_SAMP_MASK           0x80
#define BTR1_TSEG1_MASK          0x0f
#define BTR1_TSEG2_MASK          0x70

#define BTR1_SAMP                (1 << 7)
#define BTR1_TSEG1( btr1)        ((btr1) << 0)
#define BTR1_TSEG2( btr1)        ((btr1) << 4)

#define BTR1_GET_TSEG1( btr0)    (((btr0) & BTR1_TSEG1_MASK) >> 0)
#define BTR1_GET_TSEG2( btr0)    (((btr0) & BTR1_TSEG2_MASK) >> 4)

/** @} */

/**
 * @name MSCAN Receiver Flag Register (CANRFLG)
 *
 * @{
 */

#define RFLG_WUPIF               (1 << 7)
#define RFLG_CSCIF               (1 << 6)
#define RFLG_RSTAT_MASK          (3 << 4)
#define RFLG_RSTAT_OK            (0 << 4)
#define RFLG_RSTAT_WRN           (1 << 4)
#define RFLG_RSTAT_ERR           (2 << 4)
#define RFLG_RSTAT_OFF           (3 << 4)
#define RFLG_TSTAT_MASK          (3 << 2)
#define RFLG_TSTAT_OK            (0 << 2)
#define RFLG_TSTAT_WRN           (1 << 2)
#define RFLG_TSTAT_ERR           (2 << 2)
#define RFLG_TSTAT_OFF           (3 << 2)
#define RFLG_OVRIF               (1 << 1)
#define RFLG_RXF                 (1 << 0)
#define RFLG_GET_RX_STATE(rflg)  (((rflg) >> 4) & 0x03)
#define RFLG_GET_TX_STATE(rflg)  (((rflg) >> 2) & 0x03)

/** @} */

/**
 * @name MSCAN Receiver Interrupt Enable Register (CANRIER)
 *
 * @{
 */

#define RIER_WUPIE               (1 << 7)
#define RIER_CSCIE               (1 << 6)
#define RIER_RSTAT(rier)         ((rier) << 4)
#define RIER_TSTAT(rier)         ((rier) << 2)
#define RIER_OVRIE               (1 << 1)
#define RIER_RXFIE               (1 << 0)

/** @} */

/**
 * @name MSCAN Transmitter Flag Register (CANTFLG)
 *
 * @{
 */

#define TFLG_TXE2                (1 << 2)
#define TFLG_TXE1                (1 << 1)
#define TFLG_TXE0                (1 << 0)

/** @} */

/**
 * @name MSCAN Transmitter Interrupt Enable Register (CANTIER)
 *
 * @{
 */

#define TIER_TXEI2               (1 << 2)
#define TIER_TXEI1               (1 << 1)
#define TIER_TXEI0               (1 << 0)

/** @} */

/**
 * @name MSCAN Transmitter Message Abort Request (CANTARQ)
 *
 * @{
 */

#define TARQ_ABTRQ2              (1 << 2)
#define TARQ_ABTRQ1              (1 << 1)
#define TARQ_ABTRQ0              (1 << 0)

/** @} */

/**
 * @name MSCAN Transmitter Message Abort Acknoledge (CANTAAK)
 *
 * @{
 */

#define TAAK_ABTRQ2              (1 << 2)
#define TAAK_ABTRQ1              (1 << 1)
#define TAAK_ABTRQ0              (1 << 0)

/** @} */

/**
 * @name MSCAN Transmit Buffer Selection (CANBSEL)
 *
 * @{
 */

#define BSEL_TX2                 (1 << 2)
#define BSEL_TX1                 (1 << 1)
#define BSEL_TX0                 (1 << 0)

/** @} */

/**
 * @name MSCAN ID Acceptance Control Register (CANIDAC)
 *
 * @{
 */

#define IDAC_IDAM1               (1 << 5)
#define IDAC_IDAM0               (1 << 4)
#define IDAC_IDAM                (IDAC_IDAM1 | IDAC_IDAM0)
#define IDAC_IDHIT( idac)        ((idac) & 0x7)

/** @} */

/**
 * @brief MSCAN registers.
 */
typedef struct mpc5200_mscan mscan;

/**
 * @brief MSCAN context that has to be saved throughout the initialization
 * mode.
 */
typedef struct {
  uint8_t ctl0;
  uint8_t rier;
  uint8_t tier;
} mscan_context;

bool mscan_enable( volatile mscan *m, unsigned bit_rate);

void mscan_disable( volatile mscan *m);

void mscan_interrupts_disable( volatile mscan *m);

bool mscan_set_bit_rate( volatile mscan *m, unsigned bit_rate);

void mscan_initialization_mode_enter( volatile mscan *m, mscan_context *context);

void mscan_initialization_mode_leave( volatile mscan *m, const mscan_context *context);

void mscan_sleep_mode_enter( volatile mscan *m);

void mscan_sleep_mode_leave( volatile mscan *m);

volatile uint8_t *mscan_id_acceptance_register( volatile mscan *m, unsigned i);

volatile uint8_t *mscan_id_mask_register( volatile mscan *m, unsigned i);

unsigned mscan_filter_number( volatile mscan *m);

bool mscan_set_filter_number( volatile mscan *m, unsigned number);

bool mscan_filter_operation( volatile mscan *m, bool set, unsigned index, uint32_t *id, uint32_t *mask);

void mscan_filter_clear( volatile mscan *m);

void mscan_get_error_counters( volatile mscan *m, unsigned *rec, unsigned *tec);

/** @} */

#endif /* LIBBSP_MSCAN_BASE_H */