summaryrefslogtreecommitdiff
path: root/ecos/packages/hal/arm/arm9/aaed2000/current/include/aaed2000.h
blob: be88f318b61b0f7a78bdb9ec284223f73ac74c66 (plain)
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
#ifndef CYGONCE_AAED2000_H
#define CYGONCE_AAED2000_H
/*=============================================================================
//
//      aaed2000.h
//
//      Platform specific support (register layout, etc)
//
//=============================================================================
// ####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):    gthomas
// Contributors: gthomas, jskov
// Date:         2001-10-30
// Purpose:      Agilent/AAED2000 platform specific support routines
// Description: 
// Usage:        #include <cyg/hal/aaed2000.h>
//
//####DESCRIPTIONEND####
//
//===========================================================================*/

//---------------------------------------------------------------------------
// Memory layout details needed by conversion macro
#define AAED2000_SDRAM_PHYS_BASE         0xF0000000
#define AAED2000_SDRAM_VIRT_BASE         0x00000000
#define AAED2000_SDRAM_SIZE              0x02000000
#define AAED2000_SDRAM_MASK              (AAED2000_SDRAM_SIZE-1)

#define AAED2000_FLASH_PHYS_BASE         0x00000000
#define AAED2000_FLASH_VIRT_BASE         0x60000000
#define AAED2000_FLASH_SIZE              0x02000000
#define AAED2000_FLASH_MASK              (AAED2000_FLASH_SIZE-1)

//---------------------------------------------------------------------------
// Clock and state controller
#define AAEC_CSC_BLEOI            0x80000410 // battery low end of interrupt
#define AAEC_CSC_MCEOI            0x80000414 // media changed end of interrupt
#define AAEC_CSC_TEOI             0x80000418 // tick end of interrupt
#define AAEC_CSC_CLKSET           0x80000420

#define AAEC_CSC_CLKSET_PLL       0x80000000
#define AAEC_CSC_CLKSET_SMCROM    0x01000000
#define AAEC_CSC_CLKSET_PS(_n_)       ((_n_)<<18) // values 0-3
#define AAEC_CSC_CLKSET_PCLKDIV(_n_)  ((_n_)<<16) // values 0-3
#define AAEC_CSC_CLKSET_MAINDIV2(_n_) ((_n_)<<11) // values 0-31
#define AAEC_CSC_CLKSET_MAINDIV1(_n_) ((_n_)<<7)  // values 0-15
#define AAEC_CSC_CLKSET_PREDIV(_n_)   ((_n_)<<2)  // values 0-31
#define AAEC_CSC_CLKSET_HCLKDIV(_n_)  ((_n_))     // values 0-3


#define CYGNUM_HAL_ARM_AAED2000_BUS_CLOCK_MHZ ((CYGNUM_HAL_ARM_AAED2000_BUS_CLOCK+500000)/1000000)

#define AAEC_CSC_CLKSET_INIT                                            \
  (  AAEC_CSC_CLKSET_HCLKDIV(CYGNUM_HAL_ARM_AAED2000_CLOCK_HCLKDIV)     \
   | AAEC_CSC_CLKSET_PREDIV(CYGNUM_HAL_ARM_AAED2000_CLOCK_PREDIV)       \
   | AAEC_CSC_CLKSET_MAINDIV1(CYGNUM_HAL_ARM_AAED2000_CLOCK_MAINDIV1)   \
   | AAEC_CSC_CLKSET_MAINDIV2(CYGNUM_HAL_ARM_AAED2000_CLOCK_MAINDIV2)   \
   | AAEC_CSC_CLKSET_PCLKDIV(CYGNUM_HAL_ARM_AAED2000_CLOCK_PCLKDIV)     \
   | AAEC_CSC_CLKSET_PS(CYGNUM_HAL_ARM_AAED2000_CLOCK_PS)               \
   | AAEC_CSC_CLKSET_SMCROM)

//---------------------------------------------------------------------------
// Interrupt controller
#define AAEC_INT_SR               0x80000500
#define AAEC_INT_RSR              0x80000504  // Raw [unmasked] interrupt status
#define AAEC_INT_ENS              0x80000508
#define AAEC_INT_ENC              0x8000050c
#define AAEC_INT_TEST1            0x80000514
#define AAEC_INT_TEST2            0x80000518

#define AAEC_INTS_T3OI            CYGNUM_HAL_INTERRUPT_TC3OI // Timer #3 overflow

//---------------------------------------------------------------------------
// UARTs
#define AAEC_UART1                0x80000600
#define AAEC_UART2                0x80000700
#define AAEC_UART3                0x80000800

#define AAEC_UART2_UMS2EOI        0x80000714 // modem end of interrupt
#define AAEC_UART2_UMS3EOI        0x80000814 // modem end of interrupt

#define AAEC_UART_DATA    0x0000  // Data/FIFO register
#define AAEC_UART_LCR     0x0004  // Control register
#define AAEC_UART_LCR_BRK      0x0001 // Send break
#define AAEC_UART_LCR_PEN      0x0002 // Enable parity
#define AAEC_UART_LCR_EP       0x0004 // Odd/Even parity
#define AAEC_UART_LCR_S2       0x0008 // One/Two stop bits
#define AAEC_UART_LCR_FIFO     0x0010 // Enable FIFO
#define AAEC_UART_LCR_WL5      0x0000 // Word length - 5 bits
#define AAEC_UART_LCR_WL6      0x0020 // Word length - 6 bits
#define AAEC_UART_LCR_WL7      0x0040 // Word length - 7 bits
#define AAEC_UART_LCR_WL8      0x0060 // Word length - 8 bits
#define AAEC_UART_BAUD    0x0008  // Baud rate
#define AAEC_UART_CTRL    0x000C  // Control register
#define AAEC_UART_CTRL_ENAB    0x0001 // Enable uart
#define AAEC_UART_CTRL_SIR     0x0002 // Enable SIR IrDA
#define AAEC_UART_CTRL_SIRLP   0x0004 // Enable low power IrDA
#define AAEC_UART_CTRL_RXP     0x0008 // Receive pin polarity
#define AAEC_UART_CTRL_TXP     0x0010 // Transmit pin polarity
#define AAEC_UART_CTRL_MXP     0x0020 // Modem pin polarity
#define AAEC_UART_CTRL_LOOP    0x0040 // Loopback mode
#define AAEC_UART_CTRL_SIRBD   0x0080 // blanking disable
#define AAEC_UART_STATUS  0x0010  // Status
#define AAEC_UART_STATUS_CTS   0x0001 // Clear-to-send status
#define AAEC_UART_STATUS_DSR   0x0002 // Data-set-ready status
#define AAEC_UART_STATUS_DCD   0x0004 // Data-carrier-detect status
#define AAEC_UART_STATUS_TxBSY 0x0008 // Transmitter busy
#define AAEC_UART_STATUS_RxFE  0x0010 // Receive FIFO empty
#define AAEC_UART_STATUS_TxFF  0x0020 // Transmit FIFO full
#define AAEC_UART_STATUS_RxFF  0x0040 // Receive FIFO full
#define AAEC_UART_STATUS_TxFE  0x0080 // Transmit FIFO empty
#define AAEC_UART_INT     0x0014  // Interrupt status
#define AAEC_UART_INTM    0x0018  // Interrupt mask register
#define AAEC_UART_INTRES  0x001c  // Interrupt result (masked interrupt status)
#define AAEC_UART_INT_RIS      0x0001 // Rx interrupt
#define AAEC_UART_INT_TIS      0x0002 // Tx interrupt
#define AAEC_UART_INT_MIS      0x0004 // Modem status interrupt
#define AAEC_UART_INT_RTIS     0x0008 // Rx timeout interrupt
//#define AAEC_UART_MCTRL   0x0100  // Modem control

//---------------------------------------------------------------------------
// Pump control
#define AAEC_PUMP_CONTROL         0x80000900   // Control
#define AAEC_PUMP_FREQUENCY       0x80000908   // Frequency

//---------------------------------------------------------------------------
// Codec
#define AAEC_COD_CDEOI            0x80000a0c // codec end of interrupt

//---------------------------------------------------------------------------
// Synchronous Serial Peripheral (SSP)
#define AAEC_SSP_CR0              0x80000B00   // Control Register 0
#define AAEC_SSP_CR0_SCR            8            // Serial clock rate - Bits 15..8
#define AAEC_SSP_CR0_SCR_MASK       (0x7F<<AAEC_SSP_CR0_SCR)    
#define AAEC_SSP_CR0_SSE            7            // SSP enable/disable
#define AAEC_SSP_CR0_SSE_MASK       (1<<AAEC_SSP_CR0_SSE)
#define AAEC_SSP_CR0_SSE_ON         1
#define AAEC_SSP_CR0_SSE_OFF        0
#define AAEC_SSP_CR0_FRF            4            // Frame format
#define AAEC_SSP_CR0_FRF_MASK       (0x3<<AAEC_SSP_CR0_FRF)
#define AAEC_SSP_CR0_FRF_MOT        0               // Motorola SPI
#define AAEC_SSP_CR0_FRF_TI         1               // TI synchronous serial frame
#define AAEC_SSP_CR0_FRF_NAT        2               // National microwire
#define AAEC_SSP_CR0_SIZE           0            // Data size
#define AAEC_SSP_CR0_SIZE_MASK      (0xF<<AAEC_SSP_CR0_SIZE)
#define AAEC_SSP_CR1              0x80000B04   // Control Register 1
#define AAEC_SSP_CR1_TXIDLE         7            // Tx idle interrupt
#define AAEC_SSP_CR1_FEN            6            // FIFO enable
#define AAEC_SSP_CR1_RORIE          5            // Rx FIFO overrun interrupt
#define AAEC_SSP_CR1_SPH            4            // SCLK phase
#define AAEC_SSP_CR1_SPO            3            // SCLK polarity
#define AAEC_SSP_CR1_LBM            2            // Lookpback
#define AAEC_SSP_CR1_TIE            1            // Tx interrupt
#define AAEC_SSP_CR1_RIE            0            // Rx Interrupt
#define AAEC_SSP_IIR              0x80000B08   // Interrupt ID register (read)
#define AAEC_SSP_IIR_TXIDLE         7            // Tx idle interrupt
#define AAEC_SSP_IIR_ROR            6            // Rx overrun
#define AAEC_SSP_IIR_TI             1            // Tx FIFO less than half full
#define AAEC_SSP_IIR_RI             0            // Rx FIFO more than half full
#define AAEC_SSP_ICR              0x80000B08   // Interrupt Clear register (write)
#define AAEC_SSP_DR               0x80000B0C   // Data [FIFO] register
#define AAEC_SSP_CPSR             0x80000B10   // Clock prescale
#define AAEC_SSP_SR               0x80000B14   // Status register
#define AAEC_SSP_SR_RFF             8            // Rx FIFO full
#define AAEC_SSP_SR_TFE             7            // Tx FIFO empty
#define AAEC_SSP_SR_ROR             6            // Rx FIFO overrun
#define AAEC_SSP_SR_RHF             5            // Rx FIFO half full
#define AAEC_SSP_SR_THE             4            // Tx FIFO half empty
#define AAEC_SSP_SR_BSY             3            // SSP is busy
#define AAEC_SSP_SR_RNE             2            // Rx FIFO not empty
#define AAEC_SSP_SR_TNF             1            // Tx FIFO not full

//---------------------------------------------------------------------------
// Timer/counter
#define AAEC_TMR_T1_BASE          0x80000C00   // Timer #1 - preload
#define AAEC_TMR_T1LOAD           0x80000C00   // Timer #1 - preload
#define AAEC_TMR_T1VALUE          0x80000C04   // Timer #1 - current value
#define AAEC_TMR_T1CONTROL        0x80000C08   // Timer #1 - control
#define AAEC_TMR_T1EOI            0x80000C0C   // Timer #1 - clear [end] interrupt
#define AAEC_TMR_T2LOAD           0x80000C20   // Timer #2 - preload
#define AAEC_TMR_T2VALUE          0x80000C24   // Timer #2 - current value
#define AAEC_TMR_T2CONTROL        0x80000C28   // Timer #2 - control
#define AAEC_TMR_T2EOI            0x80000C2C   // Timer #2 - clear [end] interrupt
#define AAEC_TMR_BZCONT           0x80000C40
#define AAEC_TMR_T3LOAD           0x80000C80   // Timer #3 - preload
#define AAEC_TMR_T3VALUE          0x80000C84   // Timer #3 - current value
#define AAEC_TMR_T3CONTROL        0x80000C88   // Timer #3 - control
#define AAEC_TMR_T3EOI            0x80000C8C   // Timer #3 - clear [end] interrupt

#define AAEC_TMR_TxLOAD_OFFSET    0
#define AAEC_TMR_TxVALUE_OFFSET   4
#define AAEC_TMR_TxCONTROL_OFFSET 8
#define AAEC_TMR_TxEOI_OFFSET     12

#define AAEC_TMR_TxCONTROL_ENABLE   (1<<7)       // Enable (start) timer
#define AAEC_TMR_TxCONTROL_MODE     (1<<6)       // Operating mode
#define AAEC_TMR_TxCONTROL_MODE_FREE     (0x00&AAEC_TMR_TxCONTROL_MODE)
#define AAEC_TMR_TxCONTROL_MODE_PERIODIC (0xFF&AAEC_TMR_TxCONTROL_MODE)
#define AAEC_TMR_TxCONTROL_CLKSEL   (1<<3)       // Clock select (timer 1,2)
#define AAEC_TMR_TxCONTROL_508KHZ   (1<<3)
#define AAEC_TMR_TxCONTROL_2KHZ     (0<<3)

#define AAEC_TMR_TxCONTROL_508KHZ_uS(_n_) ((_n_)*508000/1000000)

//---------------------------------------------------------------------------
// RTC
#define AAEC_RTC_RTCEOI           0x80000d10   // RTC end of interrupt

//---------------------------------------------------------------------------
// GPIO registers
#define AAEC_PCDR                 0x80000e08
#define AAEC_PBDDR                0x80000e14
#define AAEC_PCCDR                0x80000e18
#define AAEC_KSCAN                0x80000e28
#define AAEC_PINMUX               0x80000e2c
#define AAEC_PFDR                 0x80000e30
#define AAEC_PFDDR                0x80000e34
#define AAEC_GPIO_INT_TYPE1       0x80000e4c
#define AAEC_GPIO_INT_TYPE2       0x80000e50
#define AAEC_GPIO_FEOI            0x80000e54
#define AAEC_GPIO_INTEN           0x80000e58
#define AAEC_GPIO_INT_STATUS      0x80000e5c
#define AAEC_PINMUX_UART3CON      0x00000008
#define AAEC_PINMUX_CODECON       0x00000004
#define AAEC_PINMUX_PD0CON        0x00000002
#define AAEC_PINMUX_PE0CON        0x00000001


//---------------------------------------------------------------------------
// Static memory controller
#define AAEC_SMCBCR0              0x80002000
#define AAEC_SMCBCR1              0x80002004
#define AAEC_SMCBCR2              0x80002008
#define AAEC_SMCBCR3              0x8000200c

#define AAEC_SMCBCR_MW8           0x00000000
#define AAEC_SMCBCR_MW16          0x10000000
#define AAEC_SMCBCR_MW32          0x30000000
#define AAEC_SMCBCR_PME           0x08000000
#define AAEC_SMCBCR_WP            0x04000000
#define AAEC_SMCBCR_WPERR         0x02000000
#define AAEC_SMCBCR_WST(_n_)      (((((_n_)-1)&0x1f)<<11) | ((((_n_)-1)&0x1f)<<5)) // for n 1-32
#define AAEC_SMCBCR_IDCY(_n_)     ((((_n_)-1)&0x0f)<<0)  // for n 1-16

// These settings come from the Agilent startup.s file
// [note, the WST values match their values, not the comments]
// CS0: Flash, access=90ns, hold=30ns
// CS1: ethernet, access=162ns, hold=47ns
// CS2: GPIO, access=14ns, hold=14ns
#if (75 == CYGNUM_HAL_ARM_AAED2000_BUS_CLOCK_MHZ)
# define _CS0_WST   8
# define _CS0_IDCY  3
# define _CS1_WST  14
# define _CS1_IDCY  4
# define _CS3_WST   3
# define _CS3_IDCY  2
#elif (83 == CYGNUM_HAL_ARM_AAED2000_BUS_CLOCK_MHZ)
# define _CS0_WST   9
# define _CS0_IDCY  3
# define _CS1_WST  15
# define _CS1_IDCY  4
# define _CS3_WST   3
# define _CS3_IDCY  2
#else
# error "Unsupported clocking"
#endif


//---------------------------------------------------------------------------
// Synchronous memory controller
#define AAEC_SMC_GLOBAL           0x80002404
#define AAEC_SMC_REFRESH_TIME     0x80002408
#define AAEC_SMC_BOOT_STATUS      0x8000240c
#define AAEC_SMC_DEV0             0x80002410
#define AAEC_SMC_DEV1             0x80002414
#define AAEC_SMC_DEV2             0x80002418
#define AAEC_SMC_DEV3             0x8000241c

#define AAEC_SMC_GLOBAL_CKE       0x80000000
#define AAEC_SMC_GLOBAL_CS        0x40000000
#define AAEC_SMC_GLOBAL_LCR       0x00000040
#define AAEC_SMC_GLOBAL_BUSY      0x00000020
#define AAEC_SMC_GLOBAL_MRS       0x00000002
#define AAEC_SMC_GLOBAL_INIT      0x00000001

#define AAEC_SMC_GLOBAL_CMD_NOP    (AAEC_SMC_GLOBAL_INIT|AAEC_SMC_GLOBAL_MRS)
#define AAEC_SMC_GLOBAL_CMD_PREALL (AAEC_SMC_GLOBAL_INIT)
#define AAEC_SMC_GLOBAL_CMD_MODE   (AAEC_SMC_GLOBAL_MRS)
#define AAEC_SMC_GLOBAL_CMD_ENABLE (AAEC_SMC_GLOBAL_CKE)


#define AAEC_SMC_DEV_AUTOP        0x01000000
#define AAEC_SMC_DEV_RAS_2        0x00200000
#define AAEC_SMC_DEV_RAS_3        0x00300000
#define AAEC_SMC_DEV_WBL_4        0x00080000
#define AAEC_SMC_DEV_WBL_1        0x00000000
#define AAEC_SMC_DEV_CASLAT(_n_)  (((_n_)-1)<<16) // 2-7
#define AAEC_SMC_DEV_2KPAGE       0x00000040
#define AAEC_SMC_DEV_SROMLL       0x00000020
#define AAEC_SMC_DEV_SROM512      0x00000010
#define AAEC_SMC_DEV_BANKS_2      0x00000008
#define AAEC_SMC_DEV_BANKS_4      0x00000000
#define AAEC_SMC_DEV_WIDTH16      0x00000004
#define AAEC_SMC_DEV_WIDTH32      0x00000000

#define AAEC_SMC_DEV_INIT         ( AAEC_SMC_DEV_RAS_2 \
                                   |AAEC_SMC_DEV_CASLAT(3) \
                                   |AAEC_SMC_DEV_BANKS_2)

//---------------------------------------------------------------------------
// LCD controller
#define AAEC_LCD_TIMING0          0x80003000   // Timing registers
#define AAEC_LCD_TIMING1          0x80003004
#define AAEC_LCD_TIMING2          0x80003008
#define AAEC_LCD_TIMING3          0x8000300C
#define AAEC_LCD_UPBASE           0x80003010   // Upper panel DMA address
#define AAEC_LCD_LPBASE           0x80003014   // Lower panel DMA address
#define AAEC_LCD_MASK             0x80003018   // Status mask
#define AAEC_LCD_CONTROL          0x8000301C   // Control
#define AAEC_LCD_CONTROL_ENAB       0x00000001    // Enable controller
#define AAEC_LCD_CONTROL_PWR_ENAB   0x00000800    // Enables signals
#define AAEC_LCD_STATUS           0x80003020   // Status
#define AAEC_LCD_INTERRUPT        0x80003024   // Interrupts
#define AAEC_LCD_UPCURR           0x80003028   // Upper panel current address
#define AAEC_LCD_LPCURR           0x8000302C   // Lower panel current address
#define AAEC_LCD_LPOVERFLOW       0x80003030   // Panel overflow 
#define AAEC_LCD_PALETTE          0x80003200   // Palette

//---------------------------------------------------------------------------
// Extended GPIO bits [platform specific]
#define AAED_EXT_GPIO             0x30000000
#define AAED_EXT_GPIO_KBD_SCAN      0x00003FFF // Keyboard scan data
#define AAED_EXT_GPIO_PWR_INT       0x00008FFF // Smart battery charger interrupt
#define AAED_EXT_GPIO_SWITCHES      0x000F0000 // DIP switches
#define AAED_EXT_GPIO_SWITCHES_SHIFT 16
#define AAED_EXT_GPIO_USB_VBUS      0x00400000 // USB Vbus sense
#define AAED_EXT_GPIO_LCD_PWR_EN    0x02000000 // LCD (& backlight) power enable
#define AAED_EXT_GPIO_LED0          0x20000000 // LED 0 (0=>ON, 1=>OFF)
#define AAED_EXT_GPIO_LED1          0x40000000 // LED 1 (0=>ON, 1=>OFF)
#define AAED_EXT_GPIO_LED2          0x80000000 // LED 2 (0=>ON, 1=>OFF)

/*---------------------------------------------------------------------------*/
/* end of aaed2000.h                                                          */
#endif /* CYGONCE_AAED2000_H */