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
|
#ifndef CYGONCE_HAL_VAR_ARCH_H
#define CYGONCE_HAL_VAR_ARCH_H
//==========================================================================
//
// var_arch.h
//
// Architecture specific abstractions
//
//==========================================================================
// ####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later
// version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License
// along with eCos; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// As a special exception, if other files instantiate templates or use
// macros or inline functions from this file, or you compile this file
// and link it with other works to produce a work based on this file,
// this file does not by itself cause the resulting work to be covered by
// the GNU General Public License. However the source code for this file
// must still be made available in accordance with section (3) of the GNU
// General Public License v2.
//
// This exception does not invalidate any other reasons why a work based
// on this file might be covered by the GNU General Public License.
// -------------------------------------------
// ####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): hmt, nickg
// Contributors: nickg
// Date: 2001-05-24
// Purpose: Define architecture abstractions
// Description: This file contains any extra or modified definitions for
// this variant of the architecture.
// Usage: #include <cyg/hal/var_arch.h>
//
//####DESCRIPTIONEND####
//
//==========================================================================
// -------------------------------------------------------------------------
// Although the VR4100 is really a 64 bit CPU, we have defined
// target_register_t elsewhere to be 32-bits because we only support
// 32-bit mode. Registers will still be sent to GDB as 64-bit, but that's
// not relevant for CYG_HAL_GDB_REG.
#define CYG_HAL_GDB_REG CYG_WORD32
//--------------------------------------------------------------------------
// Now defines for all the system controller registers
//
// These all exist at base 0x1000_0000 in physical memory.
#define MIPS_KSEG0_BASE (0x80000000u)
#define MIPS_KSEG1_BASE (0xA0000000u)
#define UPD985XX_SYSTEM_BASE (0x10000000u)
#define MIPS_IO_BASE (MIPS_KSEG1_BASE + UPD985XX_SYSTEM_BASE)
#define UPD985XX_SYSCTL_OFF (0x0000u)
#define UPD985XX_SYSUSB_OFF (0x1000u)
#define UPD985XX_SYSETH_OFF (0x2000u)
#define UPD985XX_SYSCTL_REG( n ) ((volatile unsigned int *)\
(MIPS_IO_BASE + UPD985XX_SYSCTL_OFF + (unsigned)(n)))
#define UPD985XX_SYSUSB_REG( n ) ((volatile unsigned int *)\
(MIPS_IO_BASE + UPD985XX_SYSUSB_OFF + (unsigned)(n)))
#define UPD985XX_SYSETH_REG( n ) ((volatile unsigned int *)\
(MIPS_IO_BASE + UPD985XX_SYSETH_OFF + (unsigned)(n)))
// This for the few that we need in assembly
#define UPD985XX_SYSCTL_ADDR( n ) (0xb0000000 + (n))
// (the noise at the end of these lines is the default value)
#define S_GMR UPD985XX_SYSCTL_REG( 0x00) // General Mode Register 00000000H
#define S_GSR UPD985XX_SYSCTL_REG( 0x04) // General Status Register unknown
#define S_ISR UPD985XX_SYSCTL_REG( 0x08) // Interrupt Status Register 00000000H
#define S_IMR UPD985XX_SYSCTL_REG( 0x0C) // Interrupt Mask Register 00000000H
#define S_NSR UPD985XX_SYSCTL_REG( 0x10) // NMI Status Register 00000000H
#define S_NMR UPD985XX_SYSCTL_REG( 0x14) // NMI Mask Register 00000000H
#define S_VER UPD985XX_SYSCTL_REG( 0x18) // Version Register 00000301H
// N/A UPD985XX_SYSCTL_REG( 0x1C) reserved 00000000H
#define S_GIOER UPD985XX_SYSCTL_REG( 0x20) // GPIO Output Enable Register 00000000H
#define S_GOPR UPD985XX_SYSCTL_REG( 0x24) // GPIO Output (Write) Register 00000000H
#define S_GIPR UPD985XX_SYSCTL_REG( 0x28) // GPIO Input (Read) Register 00000000H
// N/A UPD985XX_SYSCTL_REG( 0x2C) // Reserved unknown
#define S_WRCR UPD985XX_SYSCTL_REG( 0x30) // Warm Reset Control Register 00000000H
#define S_WRSR UPD985XX_SYSCTL_REG( 0x34) // Warm Reset Status Register 00000000H
#define S_PWCR UPD985XX_SYSCTL_REG( 0x38) // Power Control Register 00000000H
#define S_PWSR UPD985XX_SYSCTL_REG( 0x3C) // Power Control Status Register 00000000H
// N/A UPD985XX_SYSCTL_REG( 0x40) Reserved unknown
#define ITCNTR UPD985XX_SYSCTL_REG( 0x4C) // IBUS Timeout Timer Control Register 00000000H
#define ITSETR UPD985XX_SYSCTL_REG( 0x50) // IBUS Timeout Timer Set Register 80000000H
// N/A UPD985XX_SYSCTL_REG( 0x54) Reserved unknown
// UPD985XX_SYSCTL_REG( 0x7F)
#define UARTRBR UPD985XX_SYSCTL_REG( 0x80) // UART, Receiver Buffer Register [DLAB=0,READ] unknown
#define UARTTHR UPD985XX_SYSCTL_REG( 0x80) // UART, Transmitter Holding Register [DLAB=0,WRITE] unknown
#define UARTDLL UPD985XX_SYSCTL_REG( 0x80) // UART, Divisor Latch LSB Register [DLAB=1] unknown
#define UARTIER UPD985XX_SYSCTL_REG( 0x84) // UART, Interrupt Enable Register [DLAB=0] unknown
#define UARTDLM UPD985XX_SYSCTL_REG( 0x84) // UART, Divisor Latch MSB Register [DLAB=1] unknown
#define UARTIIR UPD985XX_SYSCTL_REG( 0x88) // UART, Interrupt ID Register [READ] unknown
// The uPD985xx devices do not support UART FIFOs.
#define UARTFCR UPD985XX_SYSCTL_REG( 0x88) // UART, FIFO control Register [WRITE]
#define UARTLCR UPD985XX_SYSCTL_REG( 0x8C) // UART, Line control Register unknown
#define UARTMCR UPD985XX_SYSCTL_REG( 0x90) // UART, Modem Control Register unknown
#define UARTLSR UPD985XX_SYSCTL_REG( 0x94) // UART, Line status Register unknown
#define UARTMSR UPD985XX_SYSCTL_REG( 0x98) // UART, Modem Status Register unknown
#define UARTSCR UPD985XX_SYSCTL_REG( 0x9C) // UART, Scratch Register unknown
#define DSUCNTR UPD985XX_SYSCTL_REG( 0xA0) // DSU Control Register 00000000H
#define DSUSETR UPD985XX_SYSCTL_REG( 0xA4) // DSU Dead Time Set Register 80000000H
#define DSUCLRR UPD985XX_SYSCTL_REG( 0xA8) // DSU Clear Register 00000000H
#define DSUTIMR UPD985XX_SYSCTL_REG( 0xAC) // DSU Elapsed Time Register 00000000H
#define TMMR UPD985XX_SYSCTL_REG( 0xB0) // Timer Mode Register 00000000H
#define TM0CSR UPD985XX_SYSCTL_REG( 0xB4) // Timer CH0 Count Set Register 00000000H
#define TM1CSR UPD985XX_SYSCTL_REG( 0xB8) // Timer CH1 Count Set Register 00000000H
#define TM0CCR UPD985XX_SYSCTL_REG( 0xBC) // Timer CH0 Current Count Register FFFFFFFFH
#define TM1CCR UPD985XX_SYSCTL_REG( 0xC0) // Timer CH1 Current Count Register FFFFFFFFH
// N/A UPD985XX_SYSCTL_REG( 0xC4) Reserved unknown
// UPD985XX_SYSCTL_REG( 0xCF)
#define ECCR UPD985XX_SYSCTL_REG( 0xD0) // EEPROM Command Control Register 00000000H
#define ERDR UPD985XX_SYSCTL_REG( 0xD4) // EEPROM Read Data Register 80000000H
#define MACAR1 UPD985XX_SYSCTL_REG( 0xD8) // MAC Address Register 1 00000000H
#define MACAR2 UPD985XX_SYSCTL_REG( 0xDC) // MAC Address Register 2 00000000H
#define MACAR3 UPD985XX_SYSCTL_REG( 0xE0) // MAC Address Register 3 00000000H
// N/A UPD985XX_SYSCTL_REG( 0xE4) Reserved unknown
// UPD985XX_SYSCTL_REG( 0xFF)
#define RMMDR UPD985XX_SYSCTL_REG(0x100) // Boot ROM Mode Register 00000000H
#define RMATR UPD985XX_SYSCTL_REG(0x104) // Boot ROM Access Timing Register 00000000H
#define SDMDR UPD985XX_SYSCTL_REG(0x108) // SDRAM Mode Register 00000330H
#define SDTSR UPD985XX_SYSCTL_REG(0x10C) // SDRAM Type Selection Register 00000000H
#define SDPTR UPD985XX_SYSCTL_REG(0x110) // SDRAM Precharge Timing Register 00000142H
// N/A UPD985XX_SYSCTL_REG(0x114) ---- ---- Reserved unknown
// UPD985XX_SYSCTL_REG(0x11B)
#define SDRMR UPD985XX_SYSCTL_REG(0x11C) // SDRAM Refresh Mode Register 00000200H
#define SDRCR UPD985XX_SYSCTL_REG(0x120) // SDRAM Refresh Timer Count Register 00000200H
#define MBCR UPD985XX_SYSCTL_REG(0x124) // Memory Bus Control Register 00000000H
#define MESR UPD985XX_SYSCTL_REG(0x128) // Memory Error Status Register 00000000H
#define MEAR UPD985XX_SYSCTL_REG(0x12C) // Memory Error Address Register 00000000H
// The few that we need from assembly
#define S_ISR_ADR UPD985XX_SYSCTL_ADDR( 0x08) // Interrupt Status Register 00000000H
#define S_IMR_ADR UPD985XX_SYSCTL_ADDR( 0x0C) // Interrupt Mask Register 00000000H
#define RMMDR_ADR UPD985XX_SYSCTL_ADDR(0x100) // Boot ROM Mode Register 00000000H
#define RMATR_ADR UPD985XX_SYSCTL_ADDR(0x104) // Boot ROM Access Timing Register 00000000H
#define SDMDR_ADR UPD985XX_SYSCTL_ADDR(0x108) // SDRAM Mode Register 00000330H
#define SDTSR_ADR UPD985XX_SYSCTL_ADDR(0x10C) // SDRAM Type Selection Register 00000000H
#define SDPTR_ADR UPD985XX_SYSCTL_ADDR(0x110) // SDRAM Precharge Timing Register 00000142H
#define SDRMR_ADR UPD985XX_SYSCTL_ADDR(0x11C) // SDRAM Refresh Mode Register 00000200H
#define SDRCR_ADR UPD985XX_SYSCTL_ADDR(0x120) // SDRAM Refresh Timer Count Register 00000200H
#define MBCR_ADR UPD985XX_SYSCTL_ADDR(0x124) // Memory Bus Control Register 00000000H
#define MESR_ADR UPD985XX_SYSCTL_ADDR(0x128) // Memory Error Status Register 00000000H
#define MEAR_ADR UPD985XX_SYSCTL_ADDR(0x12C) // Memory Error Address Register 00000000H
// ---------------------------------------------------------------------------
// Contents of all these glorious registers:
// --------- general ---------
// S_GMR General Mode Register 00000000H
#define S_GMR_CRST 1 // Cold Reset
#define S_GMR_IAEN 2 // IBUS Arbiter Enable
#define S_GMR_MPFD 4 // Memory-to-CPU Prefetch FIFO disable
#define S_GMR_UCSEL 8 // UART Source Clock Selection (0 = CPU, 1 = ext)
#define S_GMR_HSWP (1<<8) // HIF Block Data swap function disable
#define S_GMR_MSWP (1<<9) // MIF Block Data swap function disable
// S_GSR General Status Register
#define S_GSR_ENDCEN 1
#define S_GSR_CCLKSEL 2
// S_ISR Interrupt Status Register 00000000H
#define S_ISR_TM0IS (1<<0) // TIMER CH0 interrupt.
#define S_ISR_TM1IS (1<<1) // TIMER CH1 interrupt.
#define S_ISR_UARTIS (1<<2) // UART interrupt.
#define S_ISR_EXTIS (1<<3) // External Interrupt.
#define S_ISR_WUIS (1<<4) // Wakeup Interrupt.
// S_IMR Interrupt Mask Register 00000000H
// see S_ISR; write a 1 to unmask, 0 to mask.
// S_NSR NMI Status Register 00000000H
// S_NMR NMI Mask Register 00000000H
// S_VER Version Register 00000301H
// --------- GPIO ---------
// S_GIOER GPIO Output Enable Register 00000000H
// S_GOPR GPIO Output (Write) Register 00000000H
// S_GIPR GPIO Input (Read) Register 00000000H
// 16-bit regsiters that do the utterly obvious thing.
// --------- reset ---------
// S_WRCR Warm Reset Control Register 00000000H
#define S_WRCR_USBWR (1<<0) // Warm Reset request for USB Controller
#define S_WRCR_MACWR (1<<1) // Warm Reset request for Ethernet Controller
#define S_WRCR_UARTWR (1<<4) // Warm Reset request for UART
// S_WRSR Warm Reset Status Register 00000000H
// See S_WRCR; 1 <=> Ready, 0 <=> performing warm reset.
// --------- power control of USB/ETH peripherals ---------
// S_PWCR Power Control Register 00000000H
// S_PWSR Power Control Status Register 00000000H
// --------- bus timouts ---------
// ITCNTR IBUS Timeout Timer Control Register 00000000H
// ITSETR IBUS Timeout Timer Set Register 80000000H
// --------- UART ---------
// UARTRBR UART, Receiver Buffer Register [DLAB=0,READ]
// UARTTHR UART, Transmitter Holding Register [DLAB=0,WRITE]
// UARTDLL UART, Divisor Latch LSB Register [DLAB=1]
// The external (18.432MHz) clock is not present. See S_GMR_UCSEL.
// See also UARTDLM below. So we use the internal 50MHz clock.
//#define UARTCLOCK (18432000)
#define UARTCLOCK (50 * 1000 * 1000)
#define UARTDLL_VAL( _baud_ ) ((UARTCLOCK / 16) / (_baud_) )
// UARTIER UART, Interrupt Enable Register [DLAB=0]
#define UARTIER_ERBFI (1<<0) // UART Receive data Buffer Full Interrupt
#define UARTIER_ERBEI (1<<1) // UART Transmitter Buffer empty Interrupt
#define UARTIER_ERBLI (1<<2) // UART Line status Interrupts
#define UARTIER_ERBMI (1<<3) // UART Modem status Interrupts
// UARTDLM UART, Divisor Latch MSB Register [DLAB=1]
#define UARTDLM_ANY_BAUD (0)
#define UARTDLM_VAL( _baud_ ) (UARTDLL_VAL( _baud_ ) >> 8)
// UARTIIR UART, Interrupt ID Register [READ]
#define UARTIIR_INTPENDL (1<<0) // No Pending interrupts
// mask to give one of:
#define UARTIIR_UIID_MASK (7<<1) // Indicates the priority level of pending interrupt.
#define UARTIIR_RXERROR (3<<1) // Receiver Line Error
#define UARTIIR_RXD_AVAIL (2<<1) // Received data available
#define UARTIIR_CHAR_TO (6<<1) // Character timeout
#define UARTIIR_TX_EMPTY (1<<1) // Transmitter Register Empty
#define UARTIIR_MODEM (0<<1) // Modem Status: CTS_L, DSR_L or DCD_L
// UARTFCR UART, FIFO control Register [WRITE]
// ...is not supported. But nontheless it appears necessary to write it.
#define UARTFCR_16550_MODE (6) // and clear the FIFOs.
// UARTLCR UART, Line control Register
// Word length
#define UARTLCR_8 (0x03)
#define UARTLCR_7 (0x02)
// Stop bits
#define UARTLCR_STB1 (0x00)
#define UARTLCR_STB2 (0x04)
// Parity
#define UARTLCR_NOP (0x00)
#define UARTLCR_EP (0x18)
#define UARTLCR_OP (0x08)
// Just predefine the pattern for 8-N-1...
#define UARTLCR_8N1 (0x03)
// Divisor latch access bit; or this with one of the above.
#define UARTLCR_DLAB (0x80)
// UARTMCR UART, Modem Control Register
#define UARTMCR_DTR (1<<0) // Data Terminal Ready.
#define UARTMCR_RTS (1<<1) // Request To Send.
// UARTLSR UART, Line status Register
#define UARTLSR_DR (1<<0) // Receive-Data Ready.
#define UARTLSR_OE (1<<1) // Receive-Data Overrun Error.
#define UARTLSR_PE (1<<2) // Receive-Data Parity Error.
#define UARTLSR_FE (1<<3) // Receive-Data Framing Error.
#define UARTLSR_BI (1<<4) // Break Interrupt.
#define UARTLSR_THRE (1<<5) // Transmitter Holding Register Empty.
#define UARTLSR_TEMT (1<<6) // Transmitter Empty.
#define UARTLSR_RFERR (1<<7) // Receiver FIFO Error.
// UARTMSR UART, Modem Status Register
#define UARTMSR_DCTS (1<<0) // Delta Clear To Send.
#define UARTMSR_DDSR (1<<1) // Delta Data Set Ready.
#define UARTMSR_TERI (1<<2) // Trailing Edge Ring Indicato
#define UARTMSR_DDCD (1<<3) // Delta Data Carrier Detect.
#define UARTMSR_CTS (1<<4) // Clear To Send.
#define UARTMSR_DSR (1<<5) // Data Set Ready.
#define UARTMSR_RI (1<<6) // Ring Indicator.
#define UARTMSR_DCD (1<<7) // Data Carrier Detect.
// UARTSCR UART, Scratch Register unknown
// --------- watchdog aka dead man's switch ---------
// DSUCNTR DSU Control Register 00000000H
// DSUSETR DSU Dead Time Set Register 80000000H
// DSUCLRR DSU Clear Register 00000000H
// DSUTIMR DSU Elapsed Time Register 00000000H
// --------- additional timers ---------
// TMMR Timer Mode Register 00000000H
// TM0CSR Timer CH0 Count Set Register 00000000H
// TM1CSR Timer CH1 Count Set Register 00000000H
// TM0CCR Timer CH0 Current Count Register FFFFFFFFH
// TM1CCR Timer CH1 Current Count Register FFFFFFFFH
// --------- serial eeprom ---------
// ECCR EEPROM Command Control Register 00000000H
// ERDR EEPROM Read Data Register 80000000H
// MACAR1 MAC Address Register 1 00000000H
// MACAR2 MAC Address Register 2 00000000H
// MACAR3 MAC Address Register 3 00000000H
// --------- memory control ---------
// RMMDR Boot ROM Mode Register 00000000H
// RMATR Boot ROM Access Timing Register 00000000H
#define RMMDR_FLASH_WRITE_ENABLE (0x100)
#define RMMDR_28F640 (0)
#define RMMDR_28F320 (0)
#define RMMDR_29LV160_120 (3) // sic. from customer doc
#define RMMDR_29LV160_90 (3) // even though "3" is a reserved value
#define RMMDR_29LV160_70 (3) // maybe it means "1".
#define RMATR_28F640 (5)
#define RMATR_28F320 (4)
#define RMATR_29LV160_120 (5)
#define RMATR_29LV160_90 (4)
#define RMATR_29LV160_70 (3)
// SDMDR SDRAM Mode Register 00000330H
// SDTSR SDRAM Type Selection Register 00000000H
// SDPTR SDRAM Precharge Timing Register 00000142H
// SDRMR SDRAM Refresh Mode Register 00000200H
// SDRCR SDRAM Refresh Timer Count Register 00000200H
#if 1
// initial settings from customer doc.
#define SDMDR_INIT (0x230) // 230 from the hardware, 330 from doc
#define SDTSR_INIT (0x180 | 0x20 | 0x1)
#define SDPTR_INIT (0x111)
#define SDRMR_INIT (0x600)
#else
// optimized setting "don't be used before qualification"
#define SDMDR_INIT (0x120)
#define SDTSR_INIT (0x180 | 0x20 | 0x1)
#define SDPTR_INIT (0x100)
#define SDRMR_INIT (0x600)
#endif
// These are used for decoding SEGV types.
// MBCR Memory Bus Control Register 00000000H
// MESR Memory Error Status Register 00000000H
// MEAR Memory Error Address Register 00000000H
// --------------------------------------------------------------------------
#endif // CYGONCE_HAL_VAR_ARCH_H
// End of var_arch.h
|