1 | | /** |
2 | | * @file |
3 | | * |
4 | | * @brief Definitions for Motorola MC68302 Processor |
5 | | * |
6 | | * Section references in this file refer to revision 2 of Motorola's |
7 | | * "MC68302 Integrated Multiprotocol Processor User's Manual". |
8 | | * (Motorola document MC68302UM/AD REV 2.) |
9 | | * |
10 | | * Based on Don Meyer's cpu68302.h that was posted in comp.sys.m68k |
11 | | * on 17 February, 1993. |
12 | | */ |
13 | | |
14 | | /* |
15 | | * COPYRIGHT 1995 David W. Glessner. |
16 | | * |
17 | | * Redistribution and use in source and binary forms are permitted |
18 | | * provided that the following conditions are met: |
19 | | * 1. Redistribution of source code and documentation must retain |
20 | | * the above copyright notice, this list of conditions and the |
21 | | * following disclaimer. |
22 | | * 2. The name of the author may not be used to endorse or promote |
23 | | * products derived from this software without specific prior |
24 | | * written permission. |
25 | | * |
26 | | * This software is provided "AS IS" without warranty of any kind, |
27 | | * either expressed or implied, including, but not limited to, the |
28 | | * implied warranties of merchantability, title and fitness for a |
29 | | * particular purpose. |
30 | | * |
31 | | *------------------------------------------------------------------ |
32 | | */ |
33 | | |
34 | | #ifndef _RTEMS_M68K_M68302_H |
35 | | #define _RTEMS_M68K_M68302_H |
36 | | |
37 | | /* |
38 | | * BAR - Base Address Register |
39 | | * Section 2.7 |
40 | | */ |
41 | | #define M302_BAR (*((volatile uint16_t *) 0xf2)) |
42 | | |
43 | | /* |
44 | | * SCR - System Control Register |
45 | | * Section 3.8.1 |
46 | | */ |
47 | | #define M302_SCR (*((volatile uint32_t *) 0xf4)) |
48 | | /* |
49 | | * SCR bits |
50 | | */ |
51 | | #define RBIT_SCR_IPA 0x08000000 |
52 | | #define RBIT_SCR_HWT 0x04000000 |
53 | | #define RBIT_SCR_WPV 0x02000000 |
54 | | #define RBIT_SCR_ADC 0x01000000 |
55 | | |
56 | | #define RBIT_SCR_ERRE 0x00400000 |
57 | | #define RBIT_SCR_VGE 0x00200000 |
58 | | #define RBIT_SCR_WPVE 0x00100000 |
59 | | #define RBIT_SCR_RMCST 0x00080000 |
60 | | #define RBIT_SCR_EMWS 0x00040000 |
61 | | #define RBIT_SCR_ADCE 0x00020000 |
62 | | #define RBIT_SCR_BCLM 0x00010000 |
63 | | |
64 | | #define RBIT_SCR_FRZW 0x00008000 |
65 | | #define RBIT_SCR_FRZ2 0x00004000 |
66 | | #define RBIT_SCR_FRZ1 0x00002000 |
67 | | #define RBIT_SCR_SAM 0x00001000 |
68 | | #define RBIT_SCR_HWDEN 0x00000800 |
69 | | #define RBIT_SCR_HWDCN2 0x00000400 |
70 | | #define RBIT_SCR_HWDCN1 0x00000200 /* 512 clocks */ |
71 | | #define RBIT_SCR_HWDCN0 0x00000100 /* 128 clocks */ |
72 | | |
73 | | #define RBIT_SCR_LPREC 0x00000080 |
74 | | #define RBIT_SCR_LPP16 0x00000040 |
75 | | #define RBIT_SCR_LPEN 0x00000020 |
76 | | #define RBIT_SCR_LPCLKDIV 0x0000001f |
77 | | |
78 | | |
79 | | /* |
80 | | * 68000 interrupt and trap vector numbers |
81 | | */ |
82 | | #define M68K_IVEC_BUS_ERROR 2 |
83 | | #define M68K_IVEC_ADDRESS_ERROR 3 |
84 | | #define M68K_IVEC_ILLEGAL_OPCODE 4 |
85 | | #define M68K_IVEC_ZERO_DIVIDE 5 |
86 | | #define M68K_IVEC_CHK 6 |
87 | | #define M68K_IVEC_TRAPV 7 |
88 | | #define M68K_IVEC_PRIVILEGE 8 |
89 | | #define M68K_IVEC_TRACE 9 |
90 | | #define M68K_IVEC_LINE_A 10 |
91 | | #define M68K_IVEC_LINE_F 11 |
92 | | /* Unassigned, Reserved 12-14 */ |
93 | | #define M68K_IVEC_UNINITIALIZED_INT 15 |
94 | | /* Unassigned, Reserved 16-23 */ |
95 | | #define M68K_IVEC_SPURIOUS_INT 24 |
96 | | |
97 | | #define M68K_IVEC_LEVEL1_AUTOVECTOR 25 |
98 | | #define M68K_IVEC_LEVEL2_AUTOVECTOR 26 |
99 | | #define M68K_IVEC_LEVEL3_AUTOVECTOR 27 |
100 | | #define M68K_IVEC_LEVEL4_AUTOVECTOR 28 |
101 | | #define M68K_IVEC_LEVEL5_AUTOVECTOR 29 |
102 | | #define M68K_IVEC_LEVEL6_AUTOVECTOR 30 |
103 | | #define M68K_IVEC_LEVEL7_AUTOVECTOR 31 |
104 | | |
105 | | #define M68K_IVEC_TRAP0 32 |
106 | | #define M68K_IVEC_TRAP1 33 |
107 | | #define M68K_IVEC_TRAP2 34 |
108 | | #define M68K_IVEC_TRAP3 35 |
109 | | #define M68K_IVEC_TRAP4 36 |
110 | | #define M68K_IVEC_TRAP5 37 |
111 | | #define M68K_IVEC_TRAP6 38 |
112 | | #define M68K_IVEC_TRAP7 39 |
113 | | #define M68K_IVEC_TRAP8 40 |
114 | | #define M68K_IVEC_TRAP9 41 |
115 | | #define M68K_IVEC_TRAP10 42 |
116 | | #define M68K_IVEC_TRAP11 43 |
117 | | #define M68K_IVEC_TRAP12 44 |
118 | | #define M68K_IVEC_TRAP13 45 |
119 | | #define M68K_IVEC_TRAP14 46 |
120 | | #define M68K_IVEC_TRAP15 47 |
121 | | /* |
122 | | * Unassigned, Reserved 48-59 |
123 | | * |
124 | | * Note: Vectors 60-63 are used by the MC68302 (e.g. BAR, SCR). |
125 | | */ |
126 | | |
127 | | /* |
128 | | * MC68302 Interrupt Vectors |
129 | | * Section 3.2 |
130 | | */ |
131 | | enum m68302_ivec_e { |
132 | | M302_IVEC_ERR =0, |
133 | | M302_IVEC_PB8 =1, /* General-Purpose Interrupt 0 */ |
134 | | M302_IVEC_SMC2 =2, |
135 | | M302_IVEC_SMC1 =3, |
136 | | M302_IVEC_TIMER3 =4, |
137 | | M302_IVEC_SCP =5, |
138 | | M302_IVEC_TIMER2 =6, |
139 | | M302_IVEC_PB9 =7, /* General-Purpose Interrupt 1 */ |
140 | | M302_IVEC_SCC3 =8, |
141 | | M302_IVEC_TIMER1 =9, |
142 | | M302_IVEC_SCC2 =10, |
143 | | M302_IVEC_IDMA =11, |
144 | | M302_IVEC_SDMA =12, /* SDMA Channels Bus Error */ |
145 | | M302_IVEC_SCC1 =13, |
146 | | M302_IVEC_PB10 =14, /* General-Purpose Interrupt 2 */ |
147 | | M302_IVEC_PB11 =15, /* General-Purpose Interrupt 3 */ |
148 | | M302_IVEC_IRQ1 =17, /* External Device */ |
149 | | M302_IVEC_IRQ6 =22, /* External Device */ |
150 | | M302_IVEC_IRQ7 =23 /* External Device */ |
151 | | }; |
152 | | |
153 | | |
154 | | /* |
155 | | * GIMR - Global Interrupt Mode Register |
156 | | * Section 3.2.5.1 |
157 | | */ |
158 | | #define RBIT_GIMR_MOD (1<<15) |
159 | | #define RBIT_GIMR_IV7 (1<<14) |
160 | | #define RBIT_GIMR_IV6 (1<<13) |
161 | | #define RBIT_GIMR_IV1 (1<<12) |
162 | | #define RBIT_GIMR_ET7 (1<<10) |
163 | | #define RBIT_GIMR_ET6 (1<<9) |
164 | | #define RBIT_GIMR_ET1 (1<<8) |
165 | | #define RBIT_GIMR_VECTOR (7<<5) |
166 | | |
167 | | /* |
168 | | * IPR - Interrupt Pending Register (Section 3.2.5.2) |
169 | | * IMR - Interrupt Mask Register (Section 3.2.5.3) |
170 | | * ISR - Interrupt In-Service Register (Section 3.2.5.4) |
171 | | */ |
172 | | #define RBIT_IPR_PB11 (1<<15) |
173 | | #define RBIT_IPR_PB10 (1<<14) |
174 | | #define RBIT_IPR_SCC1 (1<<13) |
175 | | #define RBIT_IPR_SDMA (1<<12) |
176 | | #define RBIT_IPR_IDMA (1<<11) |
177 | | #define RBIT_IPR_SCC2 (1<<10) |
178 | | #define RBIT_IPR_TIMER1 (1<<9) |
179 | | #define RBIT_IPR_SCC3 (1<<8) |
180 | | #define RBIT_IPR_PB9 (1<<7) |
181 | | #define RBIT_IPR_TIMER2 (1<<6) |
182 | | #define RBIT_IPR_SCP (1<<5) |
183 | | #define RBIT_IPR_TIMER3 (1<<4) |
184 | | #define RBIT_IPR_SMC1 (1<<3) |
185 | | #define RBIT_IPR_SMC2 (1<<2) |
186 | | #define RBIT_IPR_PB8 (1<<1) |
187 | | #define RBIT_IPR_ERR (1<<0) |
188 | | |
189 | | #define RBIT_ISR_PB11 (1<<15) |
190 | | #define RBIT_ISR_PB10 (1<<14) |
191 | | #define RBIT_ISR_SCC1 (1<<13) |
192 | | #define RBIT_ISR_SDMA (1<<12) |
193 | | #define RBIT_ISR_IDMA (1<<11) |
194 | | #define RBIT_ISR_SCC2 (1<<10) |
195 | | #define RBIT_ISR_TIMER1 (1<<9) |
196 | | #define RBIT_ISR_SCC3 (1<<8) |
197 | | #define RBIT_ISR_PB9 (1<<7) |
198 | | #define RBIT_ISR_TIMER2 (1<<6) |
199 | | #define RBIT_ISR_SCP (1<<5) |
200 | | #define RBIT_ISR_TIMER3 (1<<4) |
201 | | #define RBIT_ISR_SMC1 (1<<3) |
202 | | #define RBIT_ISR_SMC2 (1<<2) |
203 | | #define RBIT_ISR_PB8 (1<<1) |
204 | | |
205 | | #define RBIT_IMR_PB11 (1<<15) /* PB11 Interrupt Mask */ |
206 | | #define RBIT_IMR_PB10 (1<<14) /* PB10 Interrupt Mask */ |
207 | | #define RBIT_IMR_SCC1 (1<<13) /* SCC1 Interrupt Mask */ |
208 | | #define RBIT_IMR_SDMA (1<<12) /* SDMA Interrupt Mask */ |
209 | | #define RBIT_IMR_IDMA (1<<11) /* IDMA Interrupt Mask */ |
210 | | #define RBIT_IMR_SCC2 (1<<10) /* SCC2 Interrupt Mask */ |
211 | | #define RBIT_IMR_TIMER1 (1<<9) /* TIMER1 Interrupt Mask */ |
212 | | #define RBIT_IMR_SCC3 (1<<8) /* SCC3 Interrupt Mask */ |
213 | | #define RBIT_IMR_PB9 (1<<7) /* PB9 Interrupt Mask */ |
214 | | #define RBIT_IMR_TIMER2 (1<<6) /* TIMER2 Interrupt Mask */ |
215 | | #define RBIT_IMR_SCP (1<<5) /* SCP Interrupt Mask */ |
216 | | #define RBIT_IMR_TIMER3 (1<<4) /* TIMER3 Interrupt Mask */ |
217 | | #define RBIT_IMR_SMC1 (1<<3) /* SMC1 Interrupt Mask */ |
218 | | #define RBIT_IMR_SMC2 (1<<2) /* SMC2 Interrupt Mask */ |
219 | | #define RBIT_IMR_PB8 (1<<1) /* PB8 Interrupt Mask */ |
220 | | |
221 | | |
222 | | /* |
223 | | * DRAM Refresh |
224 | | * Section 3.9 |
225 | | * |
226 | | * The DRAM refresh memory map replaces the SCC2 Tx BD 6 and Tx BD 7 |
227 | | * structures in the parameter RAM. |
228 | | * |
229 | | * Access to the DRAM registers can be accomplished by |
230 | | * the following approach: |
231 | | * |
232 | | * volatile m302_DRAM_refresh_t *dram; |
233 | | * dram = (volatile m302_DRAM_refresh_t *) &m302.scc2.bd.tx[6]; |
234 | | * |
235 | | * Then simply use pointer references (e.g. dram->count = 3). |
236 | | */ |
237 | | typedef struct { |
238 | | uint16_t dram_high; /* DRAM high address and FC */ |
239 | | uint16_t dram_low; /* DRAM low address */ |
240 | | uint16_t increment; /* increment step (bytes/row) */ |
241 | | uint16_t count; /* RAM refresh cycle count (#rows) */ |
242 | | uint16_t t_ptr_h; /* temporary refresh high addr & FC */ |
243 | | uint16_t t_ptr_l; /* temporary refresh low address */ |
244 | | uint16_t t_count; /* temporary refresh cycles count */ |
245 | | uint16_t res; /* reserved */ |
246 | | } m302_DRAM_refresh_t; |
247 | | |
248 | | |
249 | | /* |
250 | | * TMR - Timer Mode Register (for timers 1 and 2) |
251 | | * Section 3.5.2.1 |
252 | | */ |
253 | | #define RBIT_TMR_ICLK_STOP (0<<1) |
254 | | #define RBIT_TMR_ICLK_MASTER (1<<1) |
255 | | #define RBIT_TMR_ICLK_MASTER16 (2<<1) |
256 | | #define RBIT_TMR_ICLK_TIN (3<<1) |
257 | | |
258 | | #define RBIT_TMR_OM (1<<5) |
259 | | #define RBIT_TMR_ORI (1<<4) |
260 | | #define RBIT_TMR_FRR (1<<3) |
261 | | #define RBIT_TMR_RST (1<<0) |
262 | | |
263 | | |
264 | | /* |
265 | | * TER - Timer Event Register (for timers 1 and 2) |
266 | | * Section 3.5.2.5 |
267 | | */ |
268 | | #define RBIT_TER_REF (1<<1) /* Output Reference Event */ |
269 | | #define RBIT_TER_CAP (1<<0) /* Capture Event */ |
270 | | |
271 | | |
272 | | /* |
273 | | * SCC Buffer Descriptors and Buffer Descriptors Table |
274 | | * Section 4.5.5 |
275 | | */ |
276 | | typedef struct m302_SCC_bd { |
277 | | uint16_t status; /* status and control */ |
278 | | uint16_t length; /* data length */ |
279 | | volatile uint8_t *buffer; /* data buffer pointer */ |
280 | | } m302_SCC_bd_t; |
281 | | |
282 | | typedef struct { |
283 | | m302_SCC_bd_t rx[8]; /* receive buffer descriptors */ |
284 | | m302_SCC_bd_t tx[8]; /* transmit buffer descriptors */ |
285 | | } m302_SCC_bd_table_t; |
286 | | |
287 | | |
288 | | /* |
289 | | * SCC Parameter RAM (offset 0x080 from an SCC Base) |
290 | | * Section 4.5.6 |
291 | | * |
292 | | * Each SCC parameter RAM area begins at offset 0x80 from each SCC base |
293 | | * area (0x400, 0x500, or 0x600 from the dual-port RAM base). |
294 | | * |
295 | | * Offsets 0x9c-0xbf from each SCC base area compose the protocol-specific |
296 | | * portion of the SCC parameter RAM. |
297 | | */ |
298 | | typedef struct { |
299 | | uint8_t rfcr; /* Rx Function Code */ |
300 | | uint8_t tfcr; /* Tx Function Code */ |
301 | | uint16_t mrblr; /* Maximum Rx Buffer Length */ |
302 | | uint16_t _rstate; /* Rx Internal State */ |
303 | | uint8_t res2; |
304 | | uint8_t rbd; /* Rx Internal Buffer Number */ |
305 | | uint32_t _rdptr; /* Rx Internal Data Pointer */ |
306 | | uint16_t _rcount; /* Rx Internal Byte Count */ |
307 | | uint16_t _rtmp; /* Rx Temp */ |
308 | | uint16_t _tstate; /* Tx Internal State */ |
309 | | uint8_t res7; |
310 | | uint8_t tbd; /* Tx Internal Buffer Number */ |
311 | | uint32_t _tdptr; /* Tx Internal Data Pointer */ |
312 | | uint16_t _tcount; /* Tx Internal Byte Count */ |
313 | | uint16_t _ttmp; /* Tx Temp */ |
314 | | } m302_SCC_parameters_t; |
315 | | |
316 | | /* |
317 | | * UART-Specific SCC Parameter RAM |
318 | | * Section 4.5.11.3 |
319 | | */ |
320 | | typedef struct { |
321 | | uint16_t max_idl; /* Maximum IDLE Characters (rx) */ |
322 | | uint16_t idlc; /* Temporary rx IDLE counter */ |
323 | | uint16_t brkcr; /* Break Count Register (tx) */ |
324 | | uint16_t parec; /* Receive Parity Error Counter */ |
325 | | uint16_t frmec; /* Receive Framing Error Counter */ |
326 | | uint16_t nosec; /* Receive Noise Counter */ |
327 | | uint16_t brkec; /* Receive Break Condition Counter */ |
328 | | uint16_t uaddr1; /* UART ADDRESS Character 1 */ |
329 | | uint16_t uaddr2; /* UART ADDRESS Character 2 */ |
330 | | uint16_t rccr; /* Receive Control Character Register */ |
331 | | uint16_t character[8]; /* Control Characters 1 through 8*/ |
332 | | } m302_SCC_UartSpecific_t; |
333 | | /* |
334 | | * This definition allows for the checking of receive buffers |
335 | | * for errors. |
336 | | */ |
337 | | |
338 | | #define RCV_ERR 0x003F |
339 | | |
340 | | /* |
341 | | * UART receive buffer descriptor bit definitions. |
342 | | * Section 4.5.11.14 |
343 | | */ |
344 | | #define RBIT_UART_CTRL (1<<11) /* buffer contains a control char */ |
345 | | #define RBIT_UART_ADDR (1<<10) /* first byte contains an address */ |
346 | | #define RBIT_UART_MATCH (1<<9) /* indicates which addr char matched */ |
347 | | #define RBIT_UART_IDLE (1<<8) /* buffer closed due to IDLE sequence */ |
348 | | #define RBIT_UART_BR (1<<5) /* break sequence was received */ |
349 | | #define RBIT_UART_FR (1<<4) /* framing error was received */ |
350 | | #define RBIT_UART_PR (1<<3) /* parity error was received */ |
351 | | #define RBIT_UART_OV (1<<1) /* receiver overrun occurred */ |
352 | | #define RBIT_UART_CD (1<<0) /* carrier detect lost */ |
353 | | #define RBIT_UART_STATUS 0x003B /* all status bits */ |
354 | | |
355 | | /* |
356 | | * UART transmit buffer descriptor bit definitions. |
357 | | * Section 4.5.11.15 |
358 | | */ |
359 | | #define RBIT_UART_CR (1<<11) /* clear-to-send report |
360 | | * this results in two idle bits |
361 | | * between back-to-back frames |
362 | | */ |
363 | | #define RBIT_UART_A (1<<10) /* buffer contains address characters |
364 | | * only valid in multidrop mode (UM0=1) |
365 | | */ |
366 | | #define RBIT_UART_PREAMBLE (1<<9) /* send preamble before data */ |
367 | | #define RBIT_UART_CTS_LOST (1<<0) /* CTS lost */ |
368 | | |
369 | | /* |
370 | | * UART event register |
371 | | * Section 4.5.11.16 |
372 | | */ |
373 | | #define M302_UART_EV_CTS (1<<7) /* CTS status changed */ |
374 | | #define M302_UART_EV_CD (1<<6) /* carrier detect status changed */ |
375 | | #define M302_UART_EV_IDL (1<<5) /* IDLE sequence status changed */ |
376 | | #define M302_UART_EV_BRK (1<<4) /* break character was received */ |
377 | | #define M302_UART_EV_CCR (1<<3) /* control character received */ |
378 | | #define M302_UART_EV_TX (1<<1) /* buffer has been transmitted */ |
379 | | #define M302_UART_EV_RX (1<<0) /* buffer has been received */ |
380 | | |
381 | | |
382 | | /* |
383 | | * HDLC-Specific SCC Parameter RAM |
384 | | * Section 4.5.12.3 |
385 | | * |
386 | | * c_mask_l should be 0xF0B8 for 16-bit CRC, 0xdebb for 32-bit CRC |
387 | | * c_mask_h is a don't care for 16-bit CRC, 0x20E2 for 32-bit CRC |
388 | | */ |
389 | | typedef struct { |
390 | | uint16_t rcrc_l; /* Temp Receive CRC Low */ |
391 | | uint16_t rcrc_h; /* Temp Receive CRC High */ |
392 | | uint16_t c_mask_l; /* CRC Mask Low */ |
393 | | uint16_t c_mask_h; /* CRC Mask High */ |
394 | | uint16_t tcrc_l; /* Temp Transmit CRC Low */ |
395 | | uint16_t tcrc_h; /* Temp Transmit CRC High */ |
396 | | |
397 | | uint16_t disfc; /* Discard Frame Counter */ |
398 | | uint16_t crcec; /* CRC Error Counter */ |
399 | | uint16_t abtsc; /* Abort Sequence Counter */ |
400 | | uint16_t nmarc; /* Nonmatching Address Received Cntr */ |
401 | | uint16_t retrc; /* Frame Retransmission Counter */ |
402 | | |
403 | | uint16_t mflr; /* Maximum Frame Length Register */ |
404 | | uint16_t max_cnt; /* Maximum_Length Counter */ |
405 | | |
406 | | uint16_t hmask; /* User Defined Frame Address Mask */ |
407 | | uint16_t haddr1; /* User Defined Frame Address */ |
408 | | uint16_t haddr2; /* " */ |
409 | | uint16_t haddr3; /* " */ |
410 | | uint16_t haddr4; /* " */ |
411 | | } m302_SCC_HdlcSpecific_t; |
412 | | /* |
413 | | * HDLC receiver buffer descriptor bit definitions |
414 | | * Section 4.5.12.10 |
415 | | */ |
416 | | #define RBIT_HDLC_EMPTY_BIT 0x8000 /* buffer associated with BD is empty */ |
417 | | #define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in a frame */ |
418 | | #define RBIT_HDLC_FIRST_BIT 0x0400 /* buffer is first in a frame */ |
419 | | #define RBIT_HDLC_FRAME_LEN 0x0020 /* receiver frame length violation */ |
420 | | #define RBIT_HDLC_NONOCT_Rx 0x0010 /* received non-octet aligned frame */ |
421 | | #define RBIT_HDLC_ABORT_SEQ 0x0008 /* received abort sequence */ |
422 | | #define RBIT_HDLC_CRC_ERROR 0x0004 /* frame contains a CRC error */ |
423 | | #define RBIT_HDLC_OVERRUN 0x0002 /* receiver overrun occurred */ |
424 | | #define RBIT_HDLC_CD_LOST 0x0001 /* carrier detect lost */ |
425 | | |
426 | | /* |
427 | | * HDLC transmit buffer descriptor bit definitions |
428 | | * Section 4.5.12.11 |
429 | | */ |
430 | | #define RBIT_HDLC_READY_BIT 0x8000 /* buffer is ready to transmit */ |
431 | | #define RBIT_HDLC_EXT_BUFFER 0x4000 /* buffer is in external memory */ |
432 | | #define RBIT_HDLC_WRAP_BIT 0x2000 /* last buffer in bd table, so wrap */ |
433 | | #define RBIT_HDLC_WAKE_UP 0x1000 /* interrupt when buffer serviced */ |
434 | | #define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in the frame */ |
435 | | #define RBIT_HDLC_TxCRC_BIT 0x0400 /* transmit a CRC sequence */ |
436 | | #define RBIT_HDLC_UNDERRUN 0x0002 /* transmitter underrun */ |
437 | | #define RBIT_HDLC_CTS_LOST 0x0001 /* CTS lost */ |
438 | | |
439 | | /* |
440 | | * HDLC event register bit definitions |
441 | | * Section 4.5.12.12 |
442 | | */ |
443 | | #define RBIT_HDLC_CTS 0x80 /* CTS status changed */ |
444 | | #define RBIT_HDLC_CD 0x40 /* carrier detect status changed */ |
445 | | #define RBIT_HDLC_IDL 0x20 /* IDLE sequence status changed */ |
446 | | #define RBIT_HDLC_TXE 0x10 /* transmit error */ |
447 | | #define RBIT_HDLC_RXF 0x08 /* received frame */ |
448 | | #define RBIT_HDLC_BSY 0x04 /* frame rcvd and discarded due to |
449 | | * lack of buffers |
450 | | */ |
451 | | #define RBIT_HDLC_TXB 0x02 /* buffer has been transmitted */ |
452 | | #define RBIT_HDLC_RXB 0x01 /* received buffer */ |
453 | | |
454 | | |
455 | | |
456 | | typedef struct { |
457 | | m302_SCC_bd_table_t bd; /* +000 Buffer Descriptor Table */ |
458 | | m302_SCC_parameters_t parm; /* +080 Common Parameter RAM */ |
459 | | union { /* +09C Protocol-Specific Parm RAM */ |
460 | | m302_SCC_UartSpecific_t uart; |
461 | | m302_SCC_HdlcSpecific_t hdlc; |
462 | | } prot; |
463 | | uint8_t res[0x040]; /* +0C0 reserved, (not implemented) */ |
464 | | } m302_SCC_t; |
465 | | |
466 | | |
467 | | /* |
468 | | * Common SCC Registers |
469 | | */ |
470 | | typedef struct { |
471 | | uint16_t res1; |
472 | | uint16_t scon; /* SCC Configuration Register 4.5.2 */ |
473 | | uint16_t scm; /* SCC Mode Register 4.5.3 */ |
474 | | uint16_t dsr; /* SCC Data Synchronization Register 4.5.4 */ |
475 | | uint8_t scce; /* SCC Event Register 4.5.8.1 */ |
476 | | uint8_t res2; |
477 | | uint8_t sccm; /* SCC Mask Register 4.5.8.2 */ |
478 | | uint8_t res3; |
479 | | uint8_t sccs; /* SCC Status Register 4.5.8.3 */ |
480 | | uint8_t res4; |
481 | | uint16_t res5; |
482 | | } m302_SCC_Registers_t; |
483 | | |
484 | | /* |
485 | | * SCON - SCC Configuration Register |
486 | | * Section 4.5.2 |
487 | | */ |
488 | | #define RBIT_SCON_WOMS (1<<15) /* Wired-OR Mode Select (NMSI mode only) |
489 | | * When set, the TXD driver is an |
490 | | * open-drain output */ |
491 | | #define RBIT_SCON_EXTC (1<<14) /* External Clock Source */ |
492 | | #define RBIT_SCON_TCS (1<<13) /* Transmit Clock Source */ |
493 | | #define RBIT_SCON_RCS (1<<12) /* Receive Clock Source */ |
494 | | |
495 | | /* |
496 | | * SCM - SCC Mode Register bit definitions |
497 | | * Section 4.5.3 |
498 | | * The parameter-specific mode bits occupy bits 15 through 6. |
499 | | */ |
500 | | #define RBIT_SCM_ENR (1<<3) /* Enable receiver */ |
501 | | #define RBIT_SCM_ENT (1<<2) /* Enable transmitter */ |
502 | | |
503 | | |
504 | | /* |
505 | | * Internal MC68302 Registers |
506 | | * starts at offset 0x800 from dual-port RAM base |
507 | | * Section 2.8 |
508 | | */ |
509 | | typedef struct { |
510 | | /* offset +800 */ |
511 | | uint16_t res0; |
512 | | uint16_t cmr; /* IDMA Channel Mode Register */ |
513 | | uint32_t sapr; /* IDMA Source Address Pointer */ |
514 | | uint32_t dapr; /* IDMA Destination Address Pointer */ |
515 | | uint16_t bcr; /* IDMA Byte Count Register */ |
516 | | uint8_t csr; /* IDMA Channel Status Register */ |
517 | | uint8_t res1; |
518 | | uint8_t fcr; /* IDMA Function Code Register */ |
519 | | uint8_t res2; |
520 | | |
521 | | /* offset +812 */ |
522 | | uint16_t gimr; /* Global Interrupt Mode Register */ |
523 | | uint16_t ipr; /* Interrupt Pending Register */ |
524 | | uint16_t imr; /* Interrupt Mask Register */ |
525 | | uint16_t isr; /* Interrupt In-Service Register */ |
526 | | uint16_t res3; |
527 | | uint16_t res4; |
528 | | |
529 | | /* offset +81e */ |
530 | | uint16_t pacnt; /* Port A Control Register */ |
531 | | uint16_t paddr; /* Port A Data Direction Register */ |
532 | | uint16_t padat; /* Port A Data Register */ |
533 | | uint16_t pbcnt; /* Port B Control Register */ |
534 | | uint16_t pbddr; /* Port B Data Direction Register */ |
535 | | uint16_t pbdat; /* Port B Data Register */ |
536 | | uint16_t res5; |
537 | | |
538 | | /* offset +82c */ |
539 | | uint16_t res6; |
540 | | uint16_t res7; |
541 | | |
542 | | uint16_t br0; /* Base Register (CS0) */ |
543 | | uint16_t or0; /* Option Register (CS0) */ |
544 | | uint16_t br1; /* Base Register (CS1) */ |
545 | | uint16_t or1; /* Option Register (CS1) */ |
546 | | uint16_t br2; /* Base Register (CS2) */ |
547 | | uint16_t or2; /* Option Register (CS2) */ |
548 | | uint16_t br3; /* Base Register (CS3) */ |
549 | | uint16_t or3; /* Option Register (CS3) */ |
550 | | |
551 | | /* offset +840 */ |
552 | | uint16_t tmr1; /* Timer Unit 1 Mode Register */ |
553 | | uint16_t trr1; /* Timer Unit 1 Reference Register */ |
554 | | uint16_t tcr1; /* Timer Unit 1 Capture Register */ |
555 | | uint16_t tcn1; /* Timer Unit 1 Counter */ |
556 | | uint8_t res8; |
557 | | uint8_t ter1; /* Timer Unit 1 Event Register */ |
558 | | uint16_t wrr; /* Watchdog Reference Register */ |
559 | | uint16_t wcn; /* Watchdog Counter */ |
560 | | uint16_t res9; |
561 | | uint16_t tmr2; /* Timer Unit 2 Mode Register */ |
562 | | uint16_t trr2; /* Timer Unit 2 Reference Register */ |
563 | | uint16_t tcr2; /* Timer Unit 2 Capture Register */ |
564 | | uint16_t tcn2; /* Timer Unit 2 Counter */ |
565 | | uint8_t resa; |
566 | | uint8_t ter2; /* Timer Unit 2 Event Register */ |
567 | | uint16_t resb; |
568 | | uint16_t resc; |
569 | | uint16_t resd; |
570 | | |
571 | | /* offset +860 */ |
572 | | uint8_t cr; /* Command Register */ |
573 | | uint8_t rese[0x1f]; |
574 | | |
575 | | /* offset +880, +890, +8a0 */ |
576 | | m302_SCC_Registers_t scc[3]; /* SCC1, SCC2, SCC3 Registers */ |
577 | | |
578 | | /* offset +8b0 */ |
579 | | uint16_t spmode; /* SCP,SMC Mode and Clock Cntrl Reg */ |
580 | | uint16_t simask; /* Serial Interface Mask Register */ |
581 | | uint16_t simode; /* Serial Interface Mode Register */ |
582 | | } m302_internalReg_t ; |
583 | | |
584 | | |
585 | | /* |
586 | | * MC68302 dual-port RAM structure. |
587 | | * (Includes System RAM, Parameter RAM, and Internal Registers). |
588 | | * Section 2.8 |
589 | | */ |
590 | | typedef struct { |
591 | | uint8_t mem[0x240]; /* +000 User Data Memory */ |
592 | | uint8_t res1[0x1c0]; /* +240 reserved, (not implemented) */ |
593 | | m302_SCC_t scc1; /* +400 SCC1 */ |
594 | | m302_SCC_t scc2; /* +500 SCC2 */ |
595 | | m302_SCC_t scc3; /* +600 SCC3 */ |
596 | | uint8_t res2[0x100]; /* +700 reserved, (not implemented) */ |
597 | | m302_internalReg_t reg; /* +800 68302 Internal Registers */ |
598 | | } m302_dualPortRAM_t; |
599 | | |
600 | | /* some useful defines the some of the registers above */ |
601 | | |
602 | | |
603 | | /* ---- |
604 | | MC68302 Chip Select Registers |
605 | | p3-46 2nd Edition |
606 | | |
607 | | */ |
608 | | #define BR_ENABLED 1 |
609 | | #define BR_DISABLED 0 |
610 | | #define BR_FC_NULL 0 |
611 | | #define BR_READ_ONLY 0 |
612 | | #define BR_READ_WRITE 2 |
613 | | #define OR_DTACK_0 0x0000 |
614 | | #define OR_DTACK_1 0x2000 |
615 | | #define OR_DTACK_2 0x4000 |
616 | | #define OR_DTACK_3 0x6000 |
617 | | #define OR_DTACK_4 0x8000 |
618 | | #define OR_DTACK_5 0xA000 |
619 | | #define OR_DTACK_6 0xC000 |
620 | | #define OR_DTACK_EXT 0xE000 |
621 | | #define OR_SIZE_64K 0x1FE0 |
622 | | #define OR_SIZE_128K 0x1FC0 |
623 | | #define OR_SIZE_256K 0x1F80 |
624 | | #define OR_SIZE_512K 0x1F00 |
625 | | #define OR_SIZE_1M 0x1E00 |
626 | | #define OR_SIZE_2M 0x1C00 |
627 | | #define OR_MASK_RW 0x0000 |
628 | | #define OR_NO_MASK_RW 0x0002 |
629 | | #define OR_MASK_FC 0x0000 |
630 | | #define OR_NO_MASK_FC 0x0001 |
631 | | |
632 | | #define MAKE_BR(base_address, enable, rw, fc) \ |
633 | | ((base_address >> 11) | fc | rw | enable) |
634 | | |
635 | | #define MAKE_OR(bsize, DtAck, RW_Mask, FC_Mask) \ |
636 | | (DtAck | ((~(bsize - 1) & 0x00FFFFFF) >> 11) | FC_Mask | RW_Mask) |
637 | | |
638 | | #define __REG_CAT(r, n) r ## n |
639 | | #define WRITE_BR(csel, base_address, enable, rw, fc) \ |
640 | | __REG_CAT(m302.reg.br, csel) = MAKE_BR(base_address, enable, rw, fc) |
641 | | #define WRITE_OR(csel, bsize, DtAck, RW_Mask, FC_Mask) \ |
642 | | __REG_CAT(m302.reg.or, csel) = MAKE_OR(bsize, DtAck, RW_Mask, FC_Mask) |
643 | | |
644 | | /* ---- |
645 | | MC68302 Watchdog Timer Enable Bit |
646 | | |
647 | | */ |
648 | | #define WATCHDOG_ENABLE (1) |
649 | | #define WATCHDOG_TRIGGER() (m302.reg.wrr = 0x10 | WATCHDOG_ENABLE, m302.reg.wcn = 0) |
650 | | #define WATCHDOG_TOGGLE() (m302.reg.wcn = WATCHDOG_TIMEOUT_PERIOD) |
651 | | #define DISABLE_WATCHDOG() (m302.reg.wrr = 0) |
652 | | |
653 | | /* |
654 | | * Declare the variable that's used to reference the variables in |
655 | | * the dual-port RAM. |
656 | | */ |
657 | | extern volatile m302_dualPortRAM_t m302; |
658 | | |
659 | | #endif |